|
Здравствуйте. Делаю свое пользовательское поле для главного модуля и 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
|