Example #1
0
 /**
  * По поводу удаления @see \Df\Config\A::FAKE:
  * 2016-07-30
  * Наша задача: удаление из массива всех целочисленных ключей, кроме @see \Df\Config\A::FAKE
  * Целочисленные ключи — это идентификаторы строк.
  * Нам, в принципе, без разницы их значения, лишь бы они были уникальными.
  * Однако в клиетской части (JavaScript) нам удобно, чтобы они шли по порядку и без дыр.
  * Более того, в алгоритме метода @see \Df\Framework\Form\Element\ArrayT::onFormInitialized()
  * мы уже подразумеваем, что ключи именно такими и являются: идут с нуля и без пропусков.
  *
  * Оказывается, и ключ @see \Df\Config\A::FAKE нам уже не нужен.
  * Мы ведь его добавляли в скрипте https://github.com/mage2pro/core/tree/b1f6809/Framework/view/adminhtml/web/formElement/array/main.js#L131
  * с такой целью:
  * «2015-12-30
  * Сервер так устроен, что если для конкретного поля формы
  * не придут данные с сервер (а при отсутствии элементов они не придут),
  * то сервер не обновляет значение в базе данных для этого поля.
  * Это приводит к тому эффекту, что если удалить все элементы, то сервер не сохранит данные.
  * Чтобы этого избежать, при отсутствии элементов передаём на сервер фейковый.»
  *
  * Поэтому теперь уже его можно удалить.
  *
  * По поводу валидации:
  * 2016-08-02
  * Частную валидацию объектов проводим обязательно до проверки объектов на уникальность,
  * потому что если данные объекты некорректны,
  * то проверка на уникальность может дать некорректные результаты
  * и даже привести к дополнителным сбоям.
  *
  * @override
  * @see \Df\Config\Backend\Serialized::processI()
  * @used-by \Df\Config\Backend\Serialized::processA()
  * @param array(array(string => mixed)) $a
  * @return array(array(string => mixed))
  * @throws \Exception
  */
 protected function processI(array $a)
 {
     /** @var array(array(string => mixed)) $a */
     $a = array_values(dfa_unset($a, A::FAKE));
     /** @var I[] $e */
     $e = iterator_to_array(A::i($this->entityC(), $a));
     /** @uses \Df\Config\ArrayItem::validate() */
     df_each($e, 'validate');
     /** @var int[]|string[] $repeated */
     $repeated = dfa_repeated(dfa_ids($e));
     if ($repeated) {
         df_error('The following values are not uniqie: %s.', df_csv_pretty($repeated));
     }
     $e = df_usort($e, function (I $a, I $b) {
         return $a->sortWeight() - $b->sortWeight();
     });
     /** @uses \Df\Config\ArrayItem::getData() */
     return df_each($e, 'getData');
 }
Example #2
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;
     });
 }