<commit_before><?php
namespace DigitalWand\AdminHelper\Widget;

use DigitalWand\AdminHelper\Helper\AdminBaseHelper;
use Bitrix\Main\Entity\DataManager;
use Bitrix\Main\Entity\EntityError;
use Bitrix\Main\Entity\Result;
use Bitrix\Highloadblock as HL;
use Bitrix\Main\Localization\Loc;
use DigitalWand\AdminHelper\Helper\AdminEditHelper;
use DigitalWand\AdminHelper\Helper\AdminListHelper;

Loc::loadMessages(__FILE__);

/**
 * Виджет, отображающийстандартные поля, создаваемые в HL-инфоблоке в админке.
 *
 * Настройки:
 * <ul>
 * <li><b>MODEL</b> - Название модели, из которой будет производиться выборка данных. По-умолчанию - модель текущего
 * хэлпера</li>
 * </ul>
 * Class HLIBlockFieldWidget
 * @package DigitalWand\AdminHelper\Widget
 */
class HLIBlockFieldWidget extends HelperWidget
{
    static protected $userFieldsCache = array();
    static protected $defaults = array(
        'USE_BX_API' => true
    );

    /**
     * Генерирует HTML для редактирования поля
     *
     * @see \CAdminForm::ShowUserFieldsWithReadyData
     * @return mixed
     */
    protected function genEditHTML()
    {
        $info = $this->getUserFieldInfo();
        if ($info) {

            /** @var \CAllUserTypeManager $USER_FIELD_MANAGER */
            global $USER_FIELD_MANAGER;
            $FIELD_NAME = $this->getCode();
            $GLOBALS[$FIELD_NAME] = isset($GLOBALS[$FIELD_NAME]) ? $GLOBALS[$FIELD_NAME] : $this->data[$this->getCode()];
            $bVarsFromForm = false;

            $info["VALUE_ID"] = intval($this->data['ID']);
            $info['EDIT_FORM_LABEL'] = $this->getSettings('TITLE');

            if (isset($_REQUEST['def_' . $FIELD_NAME])) {
                $info['SETTINGS']['DEFAULT_VALUE'] = $_REQUEST['def_' . $FIELD_NAME];
            }
            print $USER_FIELD_MANAGER->GetEditFormHTML($bVarsFromForm, $GLOBALS[$FIELD_NAME], $info);

        }
    }

    /**
     * @see Bitrix\Highloadblock\DataManager
     * @see /bitrix/modules/highloadblock/admin/highloadblock_row_edit.php
     *
     * @throws \Bitrix\Main\ArgumentException
     * @throws \Bitrix\Main\SystemException
     */
    public function processEditAction()
    {
        /** @var \CAllUserTypeManager $USER_FIELD_MANAGER */
        global $USER_FIELD_MANAGER;
        global $APPLICATION;
        $iblockId = 'HLBLOCK_' . $this->getHLId();

        $data = $this->data;
        $USER_FIELD_MANAGER->EditFormAddFields($iblockId, $data);

        $entity_data_class = AdminBaseHelper::getHLEntity($this->getSettings('MODEL'));

        $oldData = $this->getOldFieldData($entity_data_class);
        $fields = $USER_FIELD_MANAGER->getUserFieldsWithReadyData($iblockId, $oldData, LANGUAGE_ID, false, 'ID');
        list($data, $multiValues) = $this->convertValuesBeforeSave($data, $fields);
        // use save modifiers
        foreach ($data as $fieldName => $value) {
            $field = $entity_data_class::getEntity()->getField($fieldName);
            $data[$fieldName] = $field->modifyValueBeforeSave($value, $data);
        }

        //Чтобы не терялись старые данные
        if (!isset($data[$this->getCode()]) AND isset($data[$this->getCode() . '_old_id'])) {
            $data[$this->getCode()] = $data[$this->getCode() . '_old_id'];
        }

        if ($unserialized = unserialize($data[$this->getCode()])) {
            $this->data[$this->getCode()] = $unserialized;
        } else {
            $this->data[$this->getCode()] = $data[$this->getCode()];
        }
    }

    /**
     * Битриксу надо получить поля, кторые сохранены в базе для этого пользовательского свойства.
     * Иначе множественные свойства он затрёт.
     * Проблема в том, что пользовательские свойства могут браться из связанной сущности.
     * @param HL\DataManager $entity_data_class
     *
     * @return mixed
     */
    protected function getOldFieldData($entity_data_class)<commit_msg>Цикл не нужен.<commit_after><?php
namespace DigitalWand\AdminHelper\Widget;

use DigitalWand\AdminHelper\Helper\AdminBaseHelper;
use Bitrix\Main\Entity\DataManager;
use Bitrix\Main\Entity\EntityError;
use Bitrix\Main\Entity\Result;
use Bitrix\Highloadblock as HL;
use Bitrix\Main\Localization\Loc;
use DigitalWand\AdminHelper\Helper\AdminEditHelper;
use DigitalWand\AdminHelper\Helper\AdminListHelper;

Loc::loadMessages(__FILE__);

/**
 * Виджет, отображающийстандартные поля, создаваемые в HL-инфоблоке в админке.
 *
 * Настройки:
 * <ul>
 * <li><b>MODEL</b> - Название модели, из которой будет производиться выборка данных. По-умолчанию - модель текущего
 * хэлпера</li>
 * </ul>
 * Class HLIBlockFieldWidget
 * @package DigitalWand\AdminHelper\Widget
 */
class HLIBlockFieldWidget extends HelperWidget
{
    static protected $userFieldsCache = array();
    static protected $defaults = array(
        'USE_BX_API' => true
    );

    /**
     * Генерирует HTML для редактирования поля
     *
     * @see \CAdminForm::ShowUserFieldsWithReadyData
     * @return mixed
     */
    protected function genEditHTML()
    {
        $info = $this->getUserFieldInfo();
        if ($info) {

            /** @var \CAllUserTypeManager $USER_FIELD_MANAGER */
            global $USER_FIELD_MANAGER;
            $FIELD_NAME = $this->getCode();
            $GLOBALS[$FIELD_NAME] = isset($GLOBALS[$FIELD_NAME]) ? $GLOBALS[$FIELD_NAME] : $this->data[$this->getCode()];
            $bVarsFromForm = false;

            $info["VALUE_ID"] = intval($this->data['ID']);
            $info['EDIT_FORM_LABEL'] = $this->getSettings('TITLE');

            if (isset($_REQUEST['def_' . $FIELD_NAME])) {
                $info['SETTINGS']['DEFAULT_VALUE'] = $_REQUEST['def_' . $FIELD_NAME];
            }
            print $USER_FIELD_MANAGER->GetEditFormHTML($bVarsFromForm, $GLOBALS[$FIELD_NAME], $info);

        }
    }

    /**
     * @see Bitrix\Highloadblock\DataManager
     * @see /bitrix/modules/highloadblock/admin/highloadblock_row_edit.php
     *
     * @throws \Bitrix\Main\ArgumentException
     * @throws \Bitrix\Main\SystemException
     */
    public function processEditAction()
    {
        /** @var \CAllUserTypeManager $USER_FIELD_MANAGER */
        global $USER_FIELD_MANAGER;
        global $APPLICATION;
        $iblockId = 'HLBLOCK_' . $this->getHLId();

        $data = $this->data;
        $USER_FIELD_MANAGER->EditFormAddFields($iblockId, $data);

        $entity_data_class = AdminBaseHelper::getHLEntity($this->getSettings('MODEL'));

        $oldData = $this->getOldFieldData($entity_data_class);
        $fields = $USER_FIELD_MANAGER->getUserFieldsWithReadyData($iblockId, $oldData, LANGUAGE_ID, false, 'ID');
        list($data, $multiValues) = $this->convertValuesBeforeSave($data, $fields);

        // use save modifiers
        $field = $entity_data_class::getEntity()->getField($this->getCode());
        $data[$this->getCode()] = $field->modifyValueBeforeSave($data[$this->getCode()], $data);

        //Чтобы не терялись старые данные
        if (!isset($data[$this->getCode()]) AND isset($data[$this->getCode() . '_old_id'])) {
            $data[$this->getCode()] = $data[$this->getCode() . '_old_id'];
        }

        if ($unserialized = unserialize($data[$this->getCode()])) {
            $this->data[$this->getCode()] = $unserialized;
        } else {
            $this->data[$this->getCode()] = $data[$this->getCode()];
        }
    }

    /**
     * Битриксу надо получить поля, кторые сохранены в базе для этого пользовательского свойства.
     * Иначе множественные свойства он затрёт.
     * Проблема в том, что пользовательские свойства могут браться из связанной сущности.
     * @param HL\DataManager $entity_data_class
     *
     * @return mixed
     */
    protected function getOldFieldData($entity_data_class)
{'fraction_non_alphanumeric': 0.141120165567197, 'fraction_numerical': 0.0, 'mean_word_length': 3.1127659574468085, 'pattern_counts': {'":': 0, '<': 17, '<?xml version=': 0, '>': 73, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '4132529', 'n_tokens_mistral': 2546, 'n_tokens_neox': 2632, 'n_words': 428}