Example #1
0
 /**
  * 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;
     });
 }
Example #2
0
/**
 * 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;
}
Example #3
0
/**
 * 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));
}