%PDF- %PDF-
Direktori : /home/bitrix/www/bitrix/modules/sale/lib/helpers/admin/ |
Current File : //home/bitrix/www/bitrix/modules/sale/lib/helpers/admin/businessvalue.php |
<?php namespace Bitrix\Sale\Helpers\Admin; use Bitrix\Sale\BusinessValue; use Bitrix\Sale\Internals\BusinessValueTable; use Bitrix\Sale\Internals\Input; use Bitrix\Main\SystemException; use Bitrix\Main\Localization\Loc; Loc::loadMessages(__FILE__); final class BusinessValueControl { private $name; private $consumerCodePersonMapping = array(); private $errors = array(); public function __construct($name) { $this->name = $name.'BizVal'; } public function setMapFromPost() { if ($this->consumerCodePersonMapping) throw new SystemException('Map is already set from post!'); if (is_array($_POST[$this->name]['MAP'])) { $_POST = Input\File::getPostWithFiles($_POST, $_FILES); $consumerCodePersonMapping = $_POST[$this->name]['MAP']; unset($_POST[$this->name]['MAP']); $errors = array(); $consumers = BusinessValue::getConsumers(); foreach ($consumerCodePersonMapping as $consumerKey => &$codePersonMapping) { if ($consumerKey === BusinessValueTable::COMMON_CONSUMER_KEY) { $consumerKey = null; $consumerCodePersonMapping[null] = &$codePersonMapping; unset($consumerCodePersonMapping[BusinessValueTable::COMMON_CONSUMER_KEY]); } if (! (($consumer = $consumers[$consumerKey]) && is_array($consumer) && is_array($codePersonMapping))) { unset($consumerCodePersonMapping[$consumerKey]); continue; } if (! (($codes = $consumer['CODES']) && is_array($codes))) $codes = array(); $skipNewCodeSanitation = $consumer['SKIP_NEW_CODE_SANITATION']; if (! (($sanitizeMapping = $consumer['SANITIZE_MAPPING']) && is_callable($sanitizeMapping))) $sanitizeMapping = null; if ( (! $codes && ! $skipNewCodeSanitation) || ($skipNewCodeSanitation && ! $sanitizeMapping) || (is_callable($consumer['RENDER_COLUMNS']) && ! $sanitizeMapping)) { unset($consumerCodePersonMapping[$consumerKey]); continue; } foreach ($codePersonMapping as $codeKey => &$personMapping) { $code = $codes[$codeKey]; if (! (is_array($personMapping) && (is_array($code) || $skipNewCodeSanitation))) { unset($codePersonMapping[$codeKey]); continue; } foreach ($personMapping as $personTypeId => &$mapping) { if ($personTypeId === BusinessValueTable::COMMON_PERSON_TYPE_ID) // must be === coz 0 & null { $personTypeId = null; $personMapping[null] = &$mapping; unset($personMapping[BusinessValueTable::COMMON_PERSON_TYPE_ID]); } if (! is_array($code) && $skipNewCodeSanitation) { //$skipNewCodeSanitation } elseif (! (is_array($code) && ($personType = self::$personTypes[$personTypeId]) && (! isset($code['PERSON_TYPE_ID']) || $code['PERSON_TYPE_ID'] == $personTypeId) && (! is_array($code['DOMAINS']) || in_array($personType['DOMAIN'], $code['DOMAINS'], true)) && is_array($mapping))) { unset($personMapping[$personTypeId]); continue; } // delete record if ($mapping['DELETE'] || ! ($mapping['PROVIDER_KEY'] && $mapping['PROVIDER_VALUE'])) { continue; } if ($sanitizeMapping) { if ($e = call_user_func_array($sanitizeMapping, array($codeKey, $personTypeId, &$mapping))) $errors[$consumerKey][$codeKey][$personTypeId] = $e; } elseif (is_array($code['INPUT'])) { $mapping['PROVIDER_KEY'] = 'INPUT'; if ($e = Input\Manager::getError($code['INPUT'], $mapping['PROVIDER_VALUE'])) $errors[$consumerKey][$codeKey][$personTypeId]['PROVIDER_VALUE'] = $e; } else { if ($e = self::sanitizeMapping($personTypeId, $mapping, $code['PROVIDERS'] ?: $consumer['PROVIDERS'])) $errors[$consumerKey][$codeKey][$personTypeId] = $e; } if (! $mapping) { unset($personMapping[$personTypeId]); // remove from post } } } } $this->consumerCodePersonMapping = $consumerCodePersonMapping; $this->errors = $errors; } return ! $this->errors; } /** @internal @deprecated */ public static function sanitizeMapping($personTypeId, array &$mapping, array $providerKeys = null) { $error = array(); if (($providerInput = self::getProviderInput($personTypeId, $providerKeys)) && ($providerValueInput = self::$personProviderValueInput[$personTypeId]) && ($valueInput = $providerValueInput[$mapping['PROVIDER_KEY']])) { if ($e = Input\Manager::getError($providerInput, $mapping['PROVIDER_KEY'])) $error['PROVIDER_KEY'] = $e; else $mapping['PROVIDER_KEY'] = Input\Manager::getValue($providerInput, $mapping['PROVIDER_KEY']); if ($e = Input\Manager::getError($valueInput, $mapping['PROVIDER_VALUE'])) $error['PROVIDER_VALUE'] = $e; else $mapping['PROVIDER_VALUE'] = Input\Manager::getValue($valueInput, $mapping['PROVIDER_VALUE']); } else { $mapping = array(); // remove from post } return $error; } public function changeConsumerKey($fromConsumerKey, $toConsumerKey) { BusinessValue::changeConsumerKey($fromConsumerKey, $toConsumerKey); if (isset($this->consumerCodePersonMapping[$fromConsumerKey])) { $this->consumerCodePersonMapping[$toConsumerKey] = $this->consumerCodePersonMapping[$fromConsumerKey]; unset($this->consumerCodePersonMapping[$fromConsumerKey]); } } public function saveMap() { if ($this->errors) throw new SystemException('There are errors in map!'); $consumers = BusinessValue::getConsumers(); foreach ($this->consumerCodePersonMapping as $consumerKey => $codePersonMapping) { $consumer = $consumers[$consumerKey] ?: array(); $setMapping = is_callable($consumer['SET_MAPPING']) ? $consumer['SET_MAPPING'] : null; $codes = $consumer['CODES'] ?: array(); foreach ($codePersonMapping as $codeKey => $personMapping) { $code = $codes[$codeKey] ?: array(); $fileInput = $code['INPUT']; if (! (is_array($fileInput) && $fileInput['TYPE'] == 'FILE')) $fileInput = null; foreach ($personMapping as $personTypeId => $mapping) { if ($setMapping) { $result = call_user_func($setMapping, $codeKey, $personTypeId, $mapping); } else { if ($fileInput && ($file =& $mapping['PROVIDER_VALUE'])) { if (Input\File::isDeletedSingle($file)) { if (is_numeric($file['ID'])) \CFile::Delete($file['ID']); // TODO isSuccess $file = null; } elseif (Input\File::isUploadedSingle($file)) { if (($file = \CFile::SaveFile(array('MODULE_ID' => 'sale') + $file, 'sale/bizval')) && is_numeric($file)) { if (($oldFile = BusinessValue::getMapping($codeKey, $consumerKey, $personTypeId, array('MATCH' => BusinessValue::MATCH_EXACT))) && is_numeric($oldFile['PROVIDER_VALUE'])) \CFile::Delete($oldFile['PROVIDER_VALUE']); // TODO isSuccess } else { $this->errors[$consumerKey][$codeKey][$personTypeId]['DATABASE'] = 'unable to save file'; continue; } } $file = Input\Manager::getValue($fileInput, $file); } $common = IsModuleInstalled('bitrix24') ? false : true; $result = BusinessValue::setMapping($codeKey, $consumerKey, $personTypeId, $mapping, $common); } if (! $result->isSuccess()) $this->errors[$consumerKey][$codeKey][$personTypeId]['DATABASE'] = $result->getErrorMessages(); } } } return ! $this->errors; } private static function getTabControl($name, $personGroupCodes) { $domains = array( '' => Loc::getMessage('BIZVAL_DOMAIN_COMMON_DSC'), BusinessValue::INDIVIDUAL_DOMAIN => Loc::getMessage('BIZVAL_DOMAIN_INDIVIDUAL'), BusinessValue::ENTITY_DOMAIN => Loc::getMessage('BIZVAL_DOMAIN_ENTITY' ), ); $tabs = array(); foreach ($personGroupCodes as $personTypeId => $groupCodes) { $personType = self::$personTypes[$personTypeId]; $tabs []= array( 'DIV' => 'map'.$personTypeId, 'TAB' => htmlspecialcharsbx($personType['TITLE']), 'TITLE' => $domains[$personType['DOMAIN']], ); } return new \CAdminViewTabControl($name.'TabControl', $tabs); } private static function getPersonGroupCodes(array $consumers, array $filter) { $personGroupCodes = array(); $consumerCodePersonMapping = BusinessValue::getConsumerCodePersonMapping(); $consumer = $consumers[$filter['CONSUMER_KEY']]; if ((! $filter['PROVIDER_KEY'] && ! $filter['CODE_KEY']) || $filter['CONSUMER_KEY']) $consumers = array($filter['CONSUMER_KEY'] => $consumer); foreach (self::$personTypes as $personTypeId => $personType) { foreach ($consumers as $consumerKey => $consumer) { if (is_array($consumer) && ($consumerCodes = $consumer['CODES']) && is_array($consumerCodes)) { foreach ($consumerCodes as $codeKey => $code) { if (is_array($code) && (! $filter['CODE_KEY'] || $filter['CODE_KEY'] == $codeKey) && (! isset($code['PERSON_TYPE_ID']) || $code['PERSON_TYPE_ID'] == $personTypeId) && (! is_array($code['DOMAINS']) || in_array($personType['DOMAIN'], $code['DOMAINS'], true))) { $code['CONSUMER_KEY'] = $consumerKey; if ($filter['PROVIDER_KEY']) { if (isset($consumerCodePersonMapping[$consumerKey][$codeKey][$personTypeId])) { $mapping = $consumerCodePersonMapping[$consumerKey][$codeKey][$personTypeId]; if ($mapping['PROVIDER_KEY' ] == $filter['PROVIDER_KEY' ] && $mapping['PROVIDER_VALUE'] == $filter['PROVIDER_VALUE']) { $personGroupCodes[$personTypeId][$consumer['NAME'] ?: $consumerKey][$codeKey] = $code; // CONSUMER } } } elseif ($filter['CODE_KEY']) { $personGroupCodes[$personTypeId][$consumer['NAME'] ?: $consumerKey][$codeKey] = $code; // CONSUMER } else { $personGroupCodes[$personTypeId][$code['GROUP']][$codeKey] = $code; // GROUP } } } } } if (isset($personGroupCodes[$personTypeId]) && ! $filter['PROVIDER_KEY'] && ! $filter['CODE_KEY']) // GROUP self::sortRenameGroups($personGroupCodes[$personTypeId], self::$groups); } return $personGroupCodes; } public function renderMap(array $options = array()) { $hideFilledCodes = $options['HIDE_FILLED_CODES'] === false ? false : true; $consumers = BusinessValue::getConsumers(); $personGroupCodes = self::getPersonGroupCodes($consumers, $options); $tabControl = self::getTabControl($this->name, $personGroupCodes); $consumerCodePersonMapping = BusinessValue::getConsumerCodePersonMapping(); if ($this->errors) { foreach ($this->consumerCodePersonMapping as $consumerKey => $codePersonMapping) foreach ($codePersonMapping as $codeKey => $personMapping) foreach ($personMapping as $personTypeId => $mapping) if ($mapping['PROVIDER_KEY']) $consumerCodePersonMapping[$consumerKey][$codeKey][$personTypeId] = $mapping; } $tabControl->Begin(); foreach ($personGroupCodes as $personTypeId => $groupCodes) { $tabControl->BeginNextTab(); ?> <table border="0" cellspacing="0" cellpadding="0" width="100%" class="adm-detail-content-table edit-table"> <colgroup> <col class="adm-detail-content-cell-l" width="40%"> <col class="adm-detail-content-cell-r" width="60%"> </colgroup> <? $personHasHiddenRows = 0; foreach ($groupCodes as $groupName => $codes) { $groupHasVisibleRows = false; ?> <tbody> <? ob_start(); // $rowsHTML foreach ($codes as $codeKey => $code) { if ($codeKey === 'USER_COLUMNS') continue; $consumerKey = $code['CONSUMER_KEY']; $consumer = $consumers[$consumerKey]; if (isset($this->errors[$consumerKey][$codeKey][$personTypeId]) && ($error = $this->errors[$consumerKey][$codeKey][$personTypeId])) { if (! is_array($error)) $error = array($error); ?> <tr> <td></td> <td style="color:#ff1118; padding: 1em 0 0 13em;"> <? foreach ($error as $k => $e) echo htmlspecialcharsbx(is_array($e) ? implode(', ', $e) : $e).'<br>'; ?> </td> </tr> <? } // $mappings = array( // 'EXACT' => isset($consumerCodePersonMapping[$consumerKey][$codeKey][$personTypeId]) // ? $consumerCodePersonMapping[$consumerKey][$codeKey][$personTypeId] // : array(), // 'COMMON' => BusinessValue::getMapping($codeKey, $consumerKey, $personTypeId, BusinessValue::MATCH_COMMON, $consumerCodePersonMapping) ?: array(), // 'DEFAULT' => is_array($code['DEFAULT']) ? $code['DEFAULT'] : array(), // ); // $mappings = array( // 'EXACT' => BusinessValue::correctMapping(BusinessValue::getMapping($codeKey, $consumerKey, $personTypeId, BusinessValue::MATCH_EXACT , $consumerCodePersonMapping), $personTypeId), // 'COMMON' => BusinessValue::correctMapping(BusinessValue::getMapping($codeKey, $consumerKey, $personTypeId, BusinessValue::MATCH_COMMON , $consumerCodePersonMapping), $personTypeId), // 'DEFAULT' => BusinessValue::correctMapping(BusinessValue::getMapping($codeKey, $consumerKey, $personTypeId, BusinessValue::MATCH_DEFAULT, $consumerCodePersonMapping), $personTypeId), // ); $o = array( 'consumerCodePersonMapping' => $consumerCodePersonMapping, 'GET_VALUE' => array('PROPERTY' => 'BY_ID'), ); $mappings = array( 'EXACT' => BusinessValue::getMapping($codeKey, $consumerKey, $personTypeId, array('MATCH' => BusinessValue::MATCH_EXACT ) + $o), 'COMMON' => BusinessValue::getMapping($codeKey, $consumerKey, $personTypeId, array('MATCH' => BusinessValue::MATCH_COMMON ) + $o), 'DEFAULT' => BusinessValue::getMapping($codeKey, $consumerKey, $personTypeId, array('MATCH' => BusinessValue::MATCH_DEFAULT) + $o), ); $inputNamePrefix = $this->name.'[MAP][' .($consumerKey ?: BusinessValueTable::COMMON_CONSUMER_KEY).'][' .$codeKey.'][' .($personTypeId ?: BusinessValueTable::COMMON_PERSON_TYPE_ID).']'; $hideCode = false; ob_start(); // $columnsHTML if (is_callable($consumer['RENDER_COLUMNS'])) { $hideCode = call_user_func($consumer['RENDER_COLUMNS'], $codeKey, $personTypeId, $mappings, $inputNamePrefix); } else { ?> <td> <? if (is_array($code['CONSUMERS']) && count($code['CONSUMERS']) > 1) { echo implode(', ', array_map(function ($i) {return htmlspecialcharsbx($i);}, array_flip($code['NAMES']))); ?> <img src="/bitrix/js/main/core/images/hint.gif" style="cursor: help;" title="<?=htmlspecialcharsbx(implode(', ', $code['CONSUMERS']))?>"> <? } else { echo htmlspecialcharsbx($code['NAME'] ?: $codeKey); } if (is_string($code['DESCRIPTION'])) { ?> <div style="font-size:10px;"><?=htmlspecialcharsbx($code['DESCRIPTION'])?></div> <? } ?> </td> <td> <? $commonProviderInput = $commonProviderValueInput = null; if (is_array($code['INPUT'])) { $providerInput = array('TYPE' => 'ENUM', 'HIDDEN' => true, 'OPTIONS' => array('INPUT' => '')); $providerValueInput = array( 'INPUT' => array( 'REQUIRED' => true, 'ONCHANGE' => "bizvalChangeValue(this)", ) + $code['INPUT'] ); } else { $providerInput = self::getProviderInput($personTypeId, $code['PROVIDERS'] ?: $consumer['PROVIDERS']); $providerValueInput = self::getValueInput($personTypeId); if ($personTypeId) { $commonProviderInput = self::getProviderInput('', $code['PROVIDERS'] ?: $consumer['PROVIDERS']); $commonProviderValueInput = self::getValueInput(''); } } $hideCode = self::renderMapping($mappings, $inputNamePrefix, $providerInput, $providerValueInput, $commonProviderInput, $commonProviderValueInput); ?> </td> <? } $columnsHTML = ob_get_clean(); ?> <tr<? if ($hideFilledCodes && $hideCode) { ?> class="<?=$this->name.$personTypeId?>row-with-value" style="display:none;"<? $personHasHiddenRows = true; } else { $groupHasVisibleRows = true; } ?>> <?=$columnsHTML?> </tr> <? } $rowsHTML = ob_get_clean(); if ($groupName) { ?> <tr<? if ($hideFilledCodes && ! $groupHasVisibleRows) echo ' class="'.$this->name.$personTypeId.'row-with-value" style="display:none;"'; ?>> <td colspan="2" style=" padding: 15px 15px 3px; text-align: center; color: #4B6267; font-weight: bold; border-bottom: 5px solid #E0E8EA;"> <?=htmlspecialcharsbx($groupName)?> </td> </tr> <? } echo $rowsHTML; ?> </tbody> <? } ?> </table> <? if ($hideFilledCodes && $personHasHiddenRows) { ?> <p> <a href="#" onclick="bizvalToggleRowsVisibility(this, '<?=$this->name.$personTypeId.'row-with-value'?>'); return false;"> <?=Loc::getMessage('BIZVAL_PAGE_SHOW_ROWS')?> </a> </p> <? } } $tabControl->End(); self::renderScript(); } /** @internal */ public static function renderMapping(array $mappings, $inputNamePrefix, array $providerInput, array $providerValueInput, array $commonProviderInput = null, array $commonProviderValueInput = null) { foreach ($mappings as &$m) $m = self::correctMapping($providerInput, $providerValueInput, $m); unset($m); if ($m = ($mappings['EXACT'] ?: $mappings['COMMON'] ?: $mappings['DEFAULT'])) { $providerKey = $m['PROVIDER_KEY' ]; $providerValue = $m['PROVIDER_VALUE']; $valueInput = $providerValueInput[$providerKey]; } else { $providerKey = is_array($providerInput['OPTIONS']) ? key($providerInput['OPTIONS']) : null; $providerValue = null; $valueInput = $providerValueInput[$providerKey] ?: array('TYPE' => 'STRING', 'HIDDEN' => true); } if ($providerKey == 'INPUT') { switch ($valueInput['TYPE']) { case 'ENUM': $valueInput['OPTIONS'] = is_array($valueInput['OPTIONS']) ? array('' => '') + $valueInput['OPTIONS'] : array('' => ''); break; case 'FILE': if ($providerValue) $providerValue = Input\File::loadInfoSingle($providerValue); $valueInput['CLASS'] = 'adm-designed-file'; break; } } else { if ($commonProviderInput && $commonProviderValueInput && ! $mappings['EXACT'] && ! $mappings['COMMON'] && $mappings['DEFAULT'] && $mappings['DEFAULT'] == self::correctMapping($commonProviderInput, $commonProviderValueInput, $mappings['DEFAULT'])) { $mappings['COMMON'] = $mappings['DEFAULT']; } } // if (! $mappings['COMMON'] && is_array($code['DEFAULT'])) // { // if ($personTypeId) // TODO // $defaultMapping = $code['DEFAULT']; // elseif (! $mapping) // $mapping = $code['DEFAULT']; // } if (! $mappings['EXACT'] && $mappings['COMMON']) $providerInput['DISABLED'] = $valueInput['DISABLED'] = true; // !!! Do not change DOM !!! ?><span><?= Input\Manager::getEditHtml($inputNamePrefix.'[PROVIDER_KEY]', $providerInput, $providerKey) ?> </span><span><?= Input\Manager::getEditHtml($inputNamePrefix.'[PROVIDER_VALUE]', $valueInput, $providerValue) ?> </span><label<?=$mappings['COMMON'] ? '' : ' style="display:none"'?>> <?=Loc::getMessage('BIZVAL_PAGE_DELETE_MAPPING')?> <input type="checkbox" name="<?=$inputNamePrefix?>[DELETE]"' <?if (! $mappings['EXACT'] && $mappings['COMMON']):?> checked <?endif?> <?if ($m = $mappings['EXACT']):?> data-initial-key="<?=htmlspecialcharsbx($m['PROVIDER_KEY'])?>" data-initial-value="<?=htmlspecialcharsbx($m['PROVIDER_VALUE'])?>" <?endif?> <?if ($m = $mappings['COMMON']):?> data-default-key="<?=htmlspecialcharsbx($m['PROVIDER_KEY'])?>" data-default-value="<?=htmlspecialcharsbx($m['PROVIDER_VALUE'])?>" <?endif?> onclick="bizvalToggleDelete(this)"> </label><? return $providerValue; // $hideCode TODO } private static function correctMapping(array $providerInput, array $providerValueInput, array $mapping) { if (! (! Input\Manager::getError($providerInput, $mapping['PROVIDER_KEY']) && ($valueInput = $providerValueInput[$mapping['PROVIDER_KEY']]) && ! Input\Manager::getError($valueInput, $mapping['PROVIDER_VALUE']))) { $mapping = array(); } return $mapping; } private static function renderScript() { static $done; if ($done) return; $done = true; ?> <script> function bizvalChangeConsumer(keyElement) { 'use strict'; var consumerKey = keyElement.options[keyElement.selectedIndex].value, wrapElement = keyElement.parentNode.nextSibling, name = wrapElement.firstChild.name, consumerCodeInput = <?= \CUtil::PhpToJSObject( array_map( function ($i) {return Input\Manager::getEditHtml('', $i);}, self::$consumerCodeInput ) ) ?>; wrapElement.innerHTML = consumerCodeInput[consumerKey]; wrapElement.firstChild.name = name; } function bizvalChangeProvider(keyElement, personTypeId, filterMode) { 'use strict'; var providerKey = keyElement.options[keyElement.selectedIndex].value, wrapElement = keyElement.parentNode.nextSibling, name = wrapElement.firstChild.name, personProviderValueInput = <? $personProviderValueInput = self::$personProviderValueInput; echo \CUtil::PhpToJSObject( call_user_func( function () use ($personProviderValueInput) { foreach ($personProviderValueInput as &$providerFieldInput) foreach ($providerFieldInput as &$fieldInput) $fieldInput = Input\Manager::getEditHtml('', $fieldInput); return $personProviderValueInput; } ) ); ?>; wrapElement.innerHTML = personProviderValueInput[personTypeId][providerKey]; wrapElement.firstChild.name = name; if (! filterMode) { if (! personTypeId) bizvalChangeValue(wrapElement.firstChild); } return wrapElement.firstChild; } function bizvalToggleDelete(deleteElement) { 'use strict'; var path = deleteElement.name.split('['); if (! (path.length == 6 && path[1] == 'MAP]' && path[5] == 'DELETE]' )) return; // [ 0 ][ 1 ][ 2 ][ 3 ][4][ 5 ] // mBizVal[MAP][1CC][ZIP][2][PROVIDER_VALUE] var elements = deleteElement.parentNode.parentNode.parentNode.querySelectorAll('input, select, textarea'), // TODO i = 0, length = elements.length, personTypeId = path[4].slice(0, -1); if (personTypeId == '<?=BusinessValueTable::COMMON_PERSON_TYPE_ID?>') personTypeId = ''; for (; i < length; ++i) { var keyElement = elements[i], p = keyElement.name.split('['); if (p.length == 6 && p[0] == path[0] && p[1] == path[1] && p[2] == path[2] && p[3] == path[3] && p[4] == path[4] && p[5] == 'PROVIDER_KEY]') { // note that, data-default.., must be set since checkbox only visible with default mapping! var valueElement, key, val; if (deleteElement.checked) { key = deleteElement.getAttribute('data-default-key'); val = deleteElement.getAttribute('data-default-value'); } else { key = deleteElement.hasAttribute('data-initial-key') ? deleteElement.getAttribute('data-initial-key') : deleteElement.getAttribute('data-default-key'); val = deleteElement.hasAttribute('data-initial-value') ? deleteElement.getAttribute('data-initial-value') : deleteElement.getAttribute('data-default-value'); } if (keyElement.value == 'INPUT') { valueElement = keyElement.parentNode.nextSibling.firstChild; if (valueElement.type == 'hidden') // checkbox { valueElement = valueElement.nextSibling; valueElement.checked = val; } else { valueElement.value = val; } } else { keyElement.value = key; valueElement = bizvalChangeProvider(keyElement, personTypeId, true); valueElement.value = val; } keyElement.disabled = deleteElement.checked; var parentElement = valueElement.parentNode; var tagList = ['input', 'select']; for (var tagIndex in tagList) { if (tagList.hasOwnProperty(tagIndex)) { var inputs = BX.findChildren(parentElement, {tag : tagList[tagIndex]}, true); for (var k in inputs) { if (inputs.hasOwnProperty(k)) { if (inputs[k].type != 'button') inputs[k].disabled = deleteElement.checked; } } } } if (! personTypeId) bizvalChangeValue(valueElement); break; } } } function bizvalChangeValue(valueElement) { 'use strict'; var path = valueElement.name.split('['); if (! (path.length == 6 && path[1] == 'MAP]' && path[5] == 'PROVIDER_VALUE]' && path[4] == '<?=BusinessValueTable::COMMON_PERSON_TYPE_ID?>]' )) return; // [ 0 ][ 1 ][ 2 ][ 3 ][4][ 5 ] // mBizVal[MAP][1CC][ZIP][2][PROVIDER_VALUE] var keyElement = valueElement.parentNode.previousSibling.firstChild, value, elements = document.querySelectorAll('input, select, textarea'), // TODO i = 0, length = elements.length; switch (valueElement.type) { case 'checkbox': value = valueElement.checked ? 'true' : ''; break; default: value = valueElement.value; } for (; i < length; ++i) { var de = elements[i], p = de.name.split('['); if (p.length == 6 && p[0] == path[0] && p[1] == path[1] && p[2] == path[2] && p[3] == path[3] && p[4] != path[4] // self exclude && p[5] == 'DELETE]') { de.setAttribute('data-default-key', keyElement.value); de.setAttribute('data-default-value', value); var we = de.parentNode, v = valueElement.type == 'checkbox' ? we.previousSibling.firstChild.nextSibling.checked : we.previousSibling.firstChild.value; if (value) { if (de.checked || ! v) { de.checked = true; bizvalToggleDelete(de); } we.style.display = 'inline'; } else { if (de.checked) { de.checked = false; bizvalToggleDelete(de); } we.style.display = 'none'; } } } } function bizvalToggleRowsVisibility(anchor, className) { 'use strict'; var display; if (anchor.rowsAreVisible) { anchor.rowsAreVisible = false; anchor.innerText = '<?=Loc::getMessage('BIZVAL_PAGE_SHOW_ROWS')?>'; display = 'none'; } else { anchor.rowsAreVisible = true; anchor.innerText = '<?=Loc::getMessage('BIZVAL_PAGE_HIDE_ROWS')?>'; display = 'table-row'; } var nodes = document.querySelectorAll('.'+className), i, l = nodes.length; for (i = 0; i < l; i++) nodes[i].style.display = display; } <? foreach (BusinessValue::getConsumers() as $consumerKey => $consumer) if (is_callable($consumer['GET_JAVASCRIPT'])) echo call_user_func($consumer['GET_JAVASCRIPT']); ?> </script> <? } /** @internal */ public static function getFilter($filter) { $filter = is_array($filter) ? array_intersect_key($filter, array('CODE_KEY'=>1,'CONSUMER_KEY'=>1,'PROVIDER_KEY'=>1,'PROVIDER_VALUE'=>1)) : array(); if (self::$consumerInput['OPTIONS']) { $filter['CONSUMER_KEY'] = ! Input\Manager::getError(self::$consumerInput, $filter['CONSUMER_KEY']) ? Input\Manager::getValue(self::$consumerInput, $filter['CONSUMER_KEY']) : key(self::$consumerInput['OPTIONS']); // REQUIRED } if (is_array(self::$consumerCodeInput[$filter['CONSUMER_KEY']])) { $filter['CODE_KEY'] = ! Input\Manager::getError(self::$consumerCodeInput[$filter['CONSUMER_KEY']], $filter['CODE_KEY']) ? Input\Manager::getValue(self::$consumerCodeInput[$filter['CONSUMER_KEY']], $filter['CODE_KEY']) : null; } // TODO null - personTypeId $filter['PROVIDER_KEY'] = ! Input\Manager::getError(self::$personProviderInput[null], $filter['PROVIDER_KEY']) ? Input\Manager::getValue(self::$personProviderInput[null], $filter['PROVIDER_KEY']) : null; // TODO null - personTypeId $filter['PROVIDER_VALUE'] = $filter['PROVIDER_KEY'] && ! Input\Manager::getError(self::$personProviderValueInput[null][$filter['PROVIDER_KEY']], $filter['PROVIDER_VALUE']) ? Input\Manager::getValue(self::$personProviderValueInput[null][$filter['PROVIDER_KEY']], $filter['PROVIDER_VALUE']) : null; return $filter; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// private static $personTypes; private static $personProviderInput, $personProviderValueInput; private static $groups, $consumerInput, $consumerCodeInput; /** @internal */ public static function initialize() { self::$personTypes = array('' => array('DOMAIN' => '', 'TITLE' => Loc::getMessage('BIZVAL_DOMAIN_COMMON'))) + BusinessValue::getPersonTypes(); list (self::$personProviderInput, self::$personProviderValueInput) = self::getProviderInputs(BusinessValue::getProviders(), self::$personTypes); self::$groups = array('' => array()) + BusinessValue::getGroups(); list (self::$consumerInput, self::$consumerCodeInput) = self::getConsumerInputs(BusinessValue::getConsumers(), self::$groups); } /** @internal */ public static function getProviderInput($personTypeId, array $providerKeys = null) { $providerInput = self::$personProviderInput[$personTypeId]; if ($providerKeys && is_array($providerInput['OPTIONS'])) $providerInput['OPTIONS'] = array_intersect_key($providerInput['OPTIONS'], array_flip($providerKeys)); return $providerInput; } /** @internal */ public static function getValueInput($personTypeId, $providerKey = null) { return $providerKey ? self::$personProviderValueInput[$personTypeId][$providerKey] : self::$personProviderValueInput[$personTypeId]; } /** @internal */ public static function getConsumerInput() { return self::$consumerInput; } /** @internal */ public static function getConsumerCodeInput() { return self::$consumerCodeInput; } private static function getProviderInputs(array $providers, array $personTypes) { $personProviderInput = $personProviderValueInput = array(); $onChange = "bizvalChangeValue(this)"; foreach ($personTypes as $personTypeId => $personType) { $providerOptions = array(); foreach ($providers as $providerKey => $provider) { if (is_array($provider['INPUT'])) { $provider['INPUT']['REQUIRED'] = true; $provider['INPUT']['ONCHANGE'] = $onChange; $providerOptions[$providerKey] = $provider['NAME'] ?: $providerKey; $personProviderValueInput[$personTypeId][$providerKey] = $provider['INPUT']; } elseif (($fields = $provider['FIELDS']) && is_array($fields)) { $fieldOptions = array(); // group fields foreach ($fields as $fieldKey => $field) if (is_array($field) && (! $field['PERSON_TYPE_ID'] || $field['PERSON_TYPE_ID'] == $personTypeId)) $fieldOptions[$field['GROUP']][$fieldKey] = $field['NAME'] ?: $fieldKey; if (count($fieldOptions) == 1) { $fieldOptions = reset($fieldOptions); } elseif (is_array($provider['FIELDS_GROUPS'])) { self::sortRenameGroups($fieldOptions, $provider['FIELDS_GROUPS']); } if (! empty($fieldOptions)) { $providerOptions[$providerKey] = $provider['NAME'] ?: $providerKey; $personProviderValueInput[$personTypeId][$providerKey] = array('TYPE' => 'ENUM', 'OPTIONS' => $fieldOptions, 'ONCHANGE' => $onChange); } } else { $providerOptions[$providerKey] = $provider['NAME'] ?: $providerKey; $personProviderValueInput[$personTypeId][$providerKey] = array('TYPE' => 'STRING', 'SIZE' => 30, 'ONCHANGE' => $onChange); } } $personProviderValueInput[$personTypeId][''] = array('TYPE' => 'STRING', 'SIZE' => 30); // for filter only if ($providerOptions) { $personProviderInput[$personTypeId] = array( 'TYPE' => 'ENUM', 'OPTIONS' => $providerOptions, 'REQUIRED' => true, 'ONCHANGE' => "bizvalChangeProvider(this, '".$personTypeId."')", ); } } return array($personProviderInput, $personProviderValueInput); } private static function getConsumerInputs(array $consumers, array $groups) { $consumerInput = array( 'TYPE' => 'ENUM', 'REQUIRED' => true, //'ONCHANGE' => 'bizvalChangeConsumer(this)', ); $consumerCodeInput = array(); $consumerOptions = array(); foreach ($consumers as $consumerKey => $consumer) { if (is_array($consumer) && ($consumerCodes = $consumer['CODES']) && is_array($consumerCodes)) { $consumerOptions[$consumer['GROUP']][$consumerKey] = $consumer['NAME'] ?: $consumerKey; $codeOptions = array(); foreach ($consumerCodes as $codeKey => $code) if (is_array($code)) $codeOptions[$code['GROUP']][$codeKey] = $code['NAME'] ?: $codeKey; if (count($codeOptions) == 1) $codeOptions = reset($codeOptions); else self::sortRenameGroups($codeOptions, $groups, true); $consumerCodeInput[$consumerKey] = array( 'TYPE' => 'ENUM', 'OPTIONS' => array('' => Loc::getMessage('BIZVAL_PAGE_ALL')) + $codeOptions, ); } } if ($consumerOptions) { self::sortRenameGroups($consumerOptions, $groups, true); $consumerInput['OPTIONS'] = $consumerOptions; } return array($consumerInput, $consumerCodeInput); } private static function sortRenameGroups(array &$groupedItems, array $groups, $flattenEmptyGroup = false) { $sortedItems = array(); if ($flattenEmptyGroup && isset($groupedItems[''])) { $sortedItems = $groupedItems['']; unset($groupedItems['']); } foreach ($groups as $groupKey => $group) { if (is_array($group) && isset($groupedItems[$groupKey])) { $sortedItems[$group['NAME'] ?: $groupKey] = $groupedItems[$groupKey]; unset($groupedItems[$groupKey]); } } $groupedItems = $sortedItems + $groupedItems; } } BusinessValueControl::initialize();