Здравствуйте.
Делаю свое пользовательское поле для главного модуля и crm (хочу использовать в лидах, профиле пользователя)
Поле должно быть списком с возможностью ввести свой вариант
Создал свой класс и отнаследовался от CUserTypeEnum
Перекрыл методы GetPublicViewи GetPublicEdit, добавив туда вывод инпута для своего варианта (результат на скриншоте)
А вот сохранить данные в БД не выходит.
В метод OnBeforeSave мое значение приходит, просто передаю его далее (json_encode, serialize - пробовал)
Смотрел в сторону CheckFields, но там и у родителя просто идет далее
Подскажите, пожалуйста, в какую сторону копать, чтобы сохранить и свое значение?
Сейчас в БД сохраняется 0
Делаю свое пользовательское поле для главного модуля и crm (хочу использовать в лидах, профиле пользователя)
Поле должно быть списком с возможностью ввести свой вариант
Создал свой класс и отнаследовался от CUserTypeEnum
Перекрыл методы GetPublicViewи GetPublicEdit, добавив туда вывод инпута для своего варианта (результат на скриншоте)
А вот сохранить данные в БД не выходит.
GetPublicView |
---|
public static function GetPublicView($arUserField, $arAdditionalParameters = array()) { static::getEnumList($arUserField, $arAdditionalParameters); file_put_contents($_SERVER['DOCUMENT_ROOT']."/log/logEnumShow.txt", "UF: ".var_export($arUserField, true).PHP_EOL, FILE_APPEND); $value = static::normalizeFieldValue($arUserField["VALUE"]); file_put_contents($_SERVER['DOCUMENT_ROOT']."/log/logEnumShow.txt", "VAL: ".var_export($value, true).PHP_EOL, FILE_APPEND); $html = ''; // $first = true; $empty = true; foreach($value as $res) { if(array_key_exists($res, $arUserField["USER_TYPE"]["FIELDS"])) { $textRes = $arUserField['USER_TYPE']['FIELDS'][$res]; $empty = false; } else { $html .= static::getHelper()->wrapSingleField(htmlspecialcharsbx($res)); continue; } // if(!$first) // { // $html .= static::getHelper()->getMultipleValuesSeparator(); // } // $first = false; if(strlen($arUserField['PROPERTY_VALUE_LINK']) > 0) { $res = '<a href="'.htmlspecialcharsbx(str_replace('#VALUE#', $res, $arUserField['PROPERTY_VALUE_LINK'])).'">'.htmlspecialcharsbx($textRes).'</a>'; } else { $res = htmlspecialcharsbx($textRes); } $html .= static::getHelper()->wrapSingleField($res); } if($empty) { $html .= static::getHelper()->wrapSingleField( htmlspecialcharsbx(static::getEmptyCaption($arUserField)) ); } static::initDisplay(); return static::getHelper()->wrapDisplayResult($html); } |
GetPublicEdit |
---|
public function getPublicEdit($arUserField, $arAdditionalParameters = array()) { static::getEnumList($arUserField, $arAdditionalParameters); $fieldName = static::getFieldName($arUserField, $arAdditionalParameters); $value = static::getFieldValue($arUserField, $arAdditionalParameters); $bWasSelect = false; $html = '<input type="hidden" name="' . $arUserField['FIELD_NAME'] . '" value="">'; if($arUserField["SETTINGS"]["DISPLAY"] == "UI") { $html .= '<input type="hidden" name="'.htmlspecialcharsbx($fieldName).'" value="" id="'.htmlspecialcharsbx($arUserField['FIELD_NAME']).'_default" />'; \CJSCore::Init('ui'); $startValue = array(); $itemList = array(); foreach($arUserField['USER_TYPE']['FIELDS'] as $key => $val) { if($key === '' && $arUserField['MULTIPLE'] === 'Y') { continue; } $item = array( 'NAME' => $val, 'VALUE' => $key, ); if(in_array($key, $value)) { $startValue[] = $item; } $itemList[] = $item; } $params = \Bitrix\Main\Web\Json::encode(array( 'isMulti' => $arUserField['MULTIPLE'] === 'Y', 'fieldName' => $arUserField['FIELD_NAME'] )); $result = ''; $suffix = strtolower(RandString(4)); $controlNodeId = $arUserField['FIELD_NAME'].'_control_'.$suffix; $valueContainerId = $arUserField['FIELD_NAME'].'_value_'.$suffix; $attrList = array( 'id' => $valueContainerId, 'style' => 'display: none' ); $result .= '<span '.static::buildTagAttributes($attrList).'>'; for($i = 0, $n = count($startValue); $i < $n; $i++) { $attrList = array( 'type' => 'hidden', 'name' => $fieldName, 'value' => $startValue[$i]['VALUE'], ); $result .= '<input '.static::buildTagAttributes($attrList).' />'; } $result .= '</span>'; if($arUserField['MULTIPLE'] !== 'Y') { $startValue = $startValue[0]; } $items = \Bitrix\Main\Web\Json::encode($itemList); $currentValue = \Bitrix\Main\Web\Json::encode($startValue); $fieldNameJS = \CUtil::JSEscape($arUserField['FIELD_NAME']); $htmlFieldNameJS = \CUtil::JSEscape($fieldName); $controlNodeIdJS = \CUtil::JSEscape($controlNodeId); $valueContainerIdJS = \CUtil::JSEscape($valueContainerId); $block = $arUserField['MULTIPLE'] === 'Y' ? 'main-ui-multi-select' : 'main-ui-select'; $result .= <<<EOT <span id="{$controlNodeId}"></span> <script> function changeHandler_{$fieldNameJS}(controlObject, value) { if(controlObject.params.fieldName === '{$fieldNameJS}' && !!BX('{$valueContainerIdJS}')) { var currentValue = JSON.parse(controlObject.node.getAttribute('data-value')); var s = ''; if(!BX.type.isArray(currentValue)) { if(currentValue === null) { currentValue = [{VALUE:''}]; } else { currentValue = [currentValue]; } } if(currentValue.length > 0) { for(var i = 0; i < currentValue.length; i++) { s += '<input type="hidden" name="{$htmlFieldNameJS}" value="'+BX.util.htmlspecialchars(currentValue.VALUE)+'" />'; } } else { s += '<input type="hidden" name="{$htmlFieldNameJS}" value="" />'; } BX('{$valueContainerIdJS}').innerHTML = s; BX.fireEvent(BX('{$fieldNameJS}_default'), 'change'); } } BX.ready(function(){ var params = {$params}; BX('{$controlNodeIdJS}').appendChild(BX.decl({ block: '{$block}', name: '{$fieldNameJS}', items: {$items}, value: {$currentValue}, params: params, valueDelete: false })); BX.addCustomEvent( window, 'UI::Select::change', changeHandler_{$fieldNameJS} ); BX.bind(BX('{$controlNodeIdJS}'), 'click', BX.defer(function(){ changeHandler_{$fieldNameJS}( { params: params, node: BX('{$controlNodeIdJS}').firstChild }); })); }); </script> EOT; $html .= static::getHelper()->wrapSingleField($result); } elseif($arUserField["SETTINGS"]["DISPLAY"] == "CHECKBOX") { $first = true; if($arUserField['MULTIPLE'] === 'Y') { $html .= '<input '.static::buildTagAttributes([ 'type' => 'hidden', 'name' => $fieldName, 'value' => '' ]).' />'; } foreach($arUserField["USER_TYPE"]["FIELDS"] as $key => $val) { $tag = ''; if($first) { $first = false; } else { $tag .= static::getHelper()->getMultipleValuesSeparator(); } $bSelected = in_array($key, $value) && ( (!$bWasSelect) || ($arUserField["MULTIPLE"] == "Y") ); $bWasSelect = $bWasSelect || $bSelected; $attrList = array( 'type' => $arUserField['MULTIPLE'] === 'Y' ? 'checkbox' : 'radio', 'value' => $key, 'name' => $fieldName, ); if($bSelected) { $attrList['checked'] = 'checked'; } $attrList['tabindex'] = '0'; $tag .= '<label><input '.static::buildTagAttributes($attrList).'>'.htmlspecialcharsbx($val).'</label><br />'; $html .= static::getHelper()->wrapSingleField($tag, array(static::USER_TYPE_ID.'-checkbox')); } } else { $attrList = array( 'name' => $fieldName, 'tabindex' => '0', ); if($arUserField["SETTINGS"]["LIST_HEIGHT"] > 1) { $attrList['size'] = $arUserField["SETTINGS"]["LIST_HEIGHT"]; } if($arUserField["MULTIPLE"] == "Y") { $attrList['multiple'] = 'multiple'; } $tag = '<select '.static::buildTagAttributes($attrList).'>'; foreach($arUserField["USER_TYPE"]["FIELDS"] as $key => $val) { $bSelected = in_array($key, $value) && ( (!$bWasSelect) || ($arUserField["MULTIPLE"] == "Y") ); $bWasSelect = $bWasSelect || $bSelected; $attrList = array( 'value' => $key, ); if($bSelected) { $attrList['selected'] = 'selected'; } $tag .= '<option '.static::buildTagAttributes($attrList).'>'.htmlspecialcharsbx($val).'</option>'; } $tag .= '</select>'; $html .= static::getHelper()->wrapSingleField($tag, array(static::USER_TYPE_ID.($arUserField['MULTIPLE'] === 'Y' ? '-multiselect' : '-select'))); } $html .= '<div class="fields listext field-wrap">'; $html .= '<label for="' . $arUserField["FIELD_NAME"] . '">' . Loc::getMessage("IKIGAI_LIST_EXT_OWN_VALUE_LABEL"). '</label>'; $html .= '<span class="fields listext field-item"><textarea name="' . $arUserField["FIELD_NAME"] . '"></textarea></span>'; $html .= '</div>'; static::initDisplay(); return static::getHelper()->wrapDisplayResult($html); } |
В метод OnBeforeSave мое значение приходит, просто передаю его далее (json_encode, serialize - пробовал)
OnBeforeSave_log |
---|
VALUE: 'yhu' REQ: array ( 'sessid' => 'af48067a7178af6da8c9fc2f120a281a', 'PARAMS' => array ( 'PATH_TO_PRODUCT_SHOW' => '/crm/product/show/#product_id#/', 'PATH_TO_USER_PROFILE' => '/company/personal/user/#user_id#/', 'NAME_TEMPLATE' => '#LAST_NAME# #NAME# #SECOND_NAME#', ), 'EDITOR_CONFIG_ID' => 'lead_details', 'UF_LIST_EXT' => 'yhu', 'LEAD_PRODUCT_DATA' => '', 'LEAD_PRODUCT_DATA_SETTINGS' => '{"ENABLE_DISCOUNT": "N","ENABLE_TAX": "N"}', 'ACTION' => 'SAVE', 'ACTION_ENTITY_ID' => '121', 'ACTION_ENTITY_TYPE' => 'L', 'ENABLE_REQUIRED_USER_FIELD_CHECK' => 'Y', ) RETURN_VALUE: 'yhu' |
Смотрел в сторону CheckFields, но там и у родителя просто идет далее
Цитата |
---|
function CheckFields($arUserField, $value) { $aMsg = array(); return $aMsg; } |
Подскажите, пожалуйста, в какую сторону копать, чтобы сохранить и свое значение?
Сейчас в БД сохраняется 0