/** * 2016-06-30 * @override * @see \Df\Framework\IValidator::check() * @used-by \Df\Framework\Plugin\Data\Form\Element\AbstractElement::afterGetComment() * @used-by check() * @param AE $e * @return true|Phrase|Phrase[] */ public function check(AE $e) { return dfa_flatten(array_map(function (R $r) use($e) { /** @var true|Phrase|Phrase[] $messages */ $messages = $r->check($e); return true === $messages ? [] : df_array($messages); }, $this->_children)) ?: true; }
/** * 2016-11-20 * У класса @see \Magento\Framework\Data\Form\Element\AbstractElement * метод getComment() — магический. * К магическим методам плагины не применяются. * Поэтому для задействования плагина необходимо унаследоваться от класса ядра * и явно объявить в своём классе метод getComment(). * Примеры: * @see \Df\Framework\Form\Element\Checkbox::getComment() * @see \Df\Framework\Form\Element\Text::getComment() * @used-by \Magento\Config\Block\System\Config\Form\Field::_renderValue() * https://github.com/magento/magento2/blob/2.1.0/app/code/Magento/Config/Block/System/Config/Form/Field.php#L82-L84 * @param Sb $sb * @param string $result * @return string */ public function afterGetComment(Sb $sb, $result) { /** @var string|null $vc */ $vc = df_fe_fc($sb, 'dfValidator'); if ($vc) { /** @var \Df\Framework\IValidator $v */ $v = df_o($vc); /** @var Phrase|Phrase[]|true $messages */ $messages = $v->check($sb); if (true !== $messages) { $result .= df_tag_list(df_array($messages), false, 'df-enabler-warnings'); } } return $result; }
/** * 2015-11-28 * @param AE|E $e * @param string $class [optional] * @param string|string[] $css [optional] * @param array(string => string) $params [optional] * @param string|null $path [optional] * @return void */ function df_fe_init(AE $e, $class = '', $css = [], $params = [], $path = null) { $class = $class ?: get_class($e); /** @var string $moduleName */ $moduleName = df_module_name($class); // 2015-12-29 // Мы различаем ситуации, когда $path равно null и пустой строке. // *) null означает, что имя ресурса должно определяться по имени класса. // *) пустая строка означает, что ресурс не имеет префикса, т.е. его имя просто «main». if (is_null($path)) { /** @var string[] $classA */ $classA = df_explode_class_lc($class); $classLast = array_pop($classA); switch ($classLast) { // Если имя класса заканчивается на FormElement, // то это окончание в пути к ресурсу отбрасываем. case 'formElement': // $path будет равно null break; // Если имя класса заканчивается на Element, // то в качестве пути к ресурсу используем предыдущую часть класса. // Пример: «Dfe\SalesSequence\Config\Matrix\Element» => «matrix» // Если имя класса заканчивается на Element, // то в качестве пути к ресурсу используем предыдущую часть класса. // Пример: «Dfe\SalesSequence\Config\Matrix\Element» => «matrix» case 'element': $path = array_pop($classA); break; default: $path = $classLast; } } // 2015-12-29 // Используем df_ccc, чтобы отбросить $path, равный пустой строке. // Если имя класса заканчивается на FormElement, то это окончание в пути к ресурсу отбрасываем. $path = df_ccc('/', 'formElement', $path, 'main'); /** * 2015-12-29 * На практике заметил, что основной файл CSS используется почти всегда, * и его имя имеет формат: Df_Framework::formElement/color/main.css. * Добавляем его обязательно в конец массива, * чтобы правила основного файла CSS элемента * имели приоритет над правилами библиотечных файлов CSS, * которые элемент мог включать в массив $css. * Обратите внимание, что мы даже не проверяем, * присутствует ли уже $mainCss в массиве $css, * потому что @uses df_link_inline делает это сама. */ $css = df_array($css); /** * 2015-12-30 * Раньше я думал, что основной файл CSS используется всегда, однако нашлось исключение: * @see \Dfe\CurrencyFormat\FormElement обходится в настоящее время без CSS. */ if (df_asset_exists($path, $moduleName, 'less')) { $css[] = df_asset_name($path, $moduleName, 'css'); } /** * 2016-03-08 * Отныне getBeforeElementHtml() будет гарантированно вызываться благодаря * @used-by \Df\Framework\Plugin\Data\Form\Element\AbstractElement::afterGetElementHtml() */ $e['before_element_html'] .= df_cc_n(!df_asset_exists($path, $moduleName, 'js') ? null : df_x_magento_init($moduleName, $path, ['id' => $e->getHtmlId()] + df_clean($params)), df_link_inline($css)); }
/** * 2015-02-11 * Эта функция аналогична @see array_map(), но обладает 3-мя дополнительными возможностями: * 1) её можно применять не только к массивам, но и к @see \Traversable. * 2) она позволяет удобным способом передавать в $callback дополнительные параметры * 3) позволяет передавать в $callback ключи массива * до и после основного параметра (элемента массива). * 4) позволяет в результате использовать нестандартные ключи * Обратите внимание, что df_map('Df_Cms_Model_ContentsMenu_Applicator::i', $this->getCmsRootNodes()) * эквивалентно $this->getCmsRootNodes()->walk('Df_Cms_Model_ContentsMenu_Applicator::i') * @param callable|array(int|string => mixed)|array[]\Traversable $a1 * @param callable|array(int|string => mixed)|array[]|\Traversable $a2 * @param mixed|mixed[] $pAppend [optional] * @param mixed|mixed[] $pPrepend [optional] * @param int $keyPosition [optional] * @param bool $returnKey [optional] * @return array(int|string => mixed) */ function df_map($a1, $a2, $pAppend = [], $pPrepend = [], $keyPosition = 0, $returnKey = false) { /** @var callable $callback */ /** @var array(int|string => mixed)|\Traversable $array */ list($callback, $array) = is_callable($a1) ? [$a1, $a2] : [$a2, $a1]; df_assert_callable($callback); df_assert_traversable($array); $array = df_ita($array); /** @var array(int|string => mixed) $result */ if (!$pAppend && !$pPrepend && 0 === $keyPosition && !$returnKey) { $result = array_map($callback, $array); } else { $pAppend = df_array($pAppend); $pPrepend = df_array($pPrepend); $result = []; foreach ($array as $key => $item) { /** @var int|string $key */ /** @var mixed $item */ /** @var mixed[] $primaryArgument */ switch ($keyPosition) { case DF_BEFORE: $primaryArgument = [$key, $item]; break; case DF_AFTER: $primaryArgument = [$item, $key]; break; default: $primaryArgument = [$item]; } /** @var mixed[] $arguments */ $arguments = array_merge($pPrepend, $primaryArgument, $pAppend); /** @var mixed $item */ $item = call_user_func_array($callback, $arguments); if (!$returnKey) { $result[$key] = $item; } else { // 2016-10-25 // Позволяет возвращать нестандартные ключи. $result[$item[0]] = $item[1]; } } } return $result; }
/** * @param string|null $type [optional] * @param int|bool|null $lifetime [optional] * @param string|string[]|null $tags [optional] * @return \Df\Core\Cache */ public static function i($type = null, $lifetime = self::LIFETIME_STANDARD, $tags = null) { /** @var bool $infinite */ $infinite = true === $lifetime; if ($infinite) { $lifetime = self::LIFETIME_INFINITE; } $tags = $tags ? df_array($tags) : ($type ? [$type] : []); return new self([self::$P__LIFETIME => $lifetime, self::$P__TAGS => $tags, self::$P__TYPE => $type]); }
/** * @param string $propertyName * @param string $cacheKey * @return void */ private function cacheSaveProperty($propertyName, $cacheKey) { $cacheKey = $cacheKey . $propertyName; /** @var mixed $propertyValue */ $propertyValue = $this->{$propertyName}; /** @var string|bool $propertyValueSerialized */ $propertyValueSerialized = isset($this->_cachedPropertiesSimpleMap[$propertyName]) ? df_serialize_simple($propertyValue) : df_serialize($propertyValue); if ($propertyValueSerialized) { df_cache_save($data = $propertyValueSerialized, $id = $cacheKey, $tags = df_array($this->cacheTags()), $lifeTime = $this->cacheLifetime()); } }