/** * 2015-12-07 * 2016-01-01 * Сегодня заметил, что Magento 2, в отличие от Magento 1.x, * допускает иерархическую вложенность групп настроек большую, чем 3, например: * https://github.com/magento/magento2/blob/2.0.0/app/code/Magento/Cron/etc/adminhtml/system.xml#L14 * В Magento 1.x вложенность всегда такова: section / group / field. * В Magento 2 вложенность может быть такой: section / group / group / field. * @return array(string => mixed) */ protected function value() { return dfc($this, function () { /** @var string[] $pathA */ $pathA = array_slice(df_explode_xpath($this->getPath()), 1); /** @var string $fieldName */ $fieldName = array_pop($pathA); /** @var string $path */ $path = 'groups/' . implode('/groups/', $pathA) . '/fields/' . $fieldName; /** @var array(string => mixed) $result */ /** * 2016-09-02 * При сохранении настроек вне области действия по умолчанию * в результат попадает ключ «inherit». Удаляем его. * https://code.dmitry-fedyuk.com/m2e/allpay/issues/24 */ $result = dfa_unset(dfa_deep($this->_data, $path), 'inherit'); df_result_array($result); return $result; }); }
/** * 2015-12-07 * @param array(string => mixed) $array * @param string|string[] $path * @param mixed $value * @return void */ function dfa_deep_set(array &$array, $path, $value) { if (is_array($path)) { $pathParts = $path; } else { df_param_string_not_empty($path, 1); /** * 2015-02-06 * Обратите внимание, что если разделитель отсутствует в строке, * то @uses explode() вернёт не строку, а массив со одим элементом — строкой. * Это вполне укладывается в наш универсальный алгоритм. */ /** @var string[] $pathParts */ $pathParts = df_explode_xpath($path); } /** @var array(string => mixed) $a */ $a =& $array; while ($pathParts) { /** @var string $key */ $key = array_shift($pathParts); if (!isset($a[$key])) { $a[$key] = []; } $a =& $a[$key]; if (!is_array($a)) { $a = []; } } $a = $value; }
/** * 2016-09-03 * Другой возможный алгоритм: df_explode_multiple(['/', DS], $path) * @param string $path * @return string[] */ function df_explode_path($path) { return df_explode_xpath(df_path_n($path)); }