/** * 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)); }
/** * 2016-11-22 * @param string|object $module * @param string $template [optional] * @param array $vars [optional] * Параметры $vars будут доступны в шаблоне в качестве переменных: * @see \Magento\Framework\View\TemplateEngine\Php::render() extract($dictionary, EXTR_SKIP); * https://github.com/magento/magento2/blob/2.1.2/lib/internal/Magento/Framework/View/TemplateEngine/Php.php#L58 * @return string */ function df_phtml($module, $template, array $vars = []) { return df_block(null, [], df_module_name($module) . '::' . $template, $vars)->toHtml(); }
/** * 2016-07-19 * @used-by Df_Localization_Model_Dictionary::e() * @param string $localPath [optional] * @return string */ protected function modulePathEtc($localPath = '') { return df_module_path_etc(df_module_name($this), $localPath); }
/** * 2016-11-21 * Цель плагина — устранение дефекта метода * @see \Magento\Framework\View\Element\AbstractBlock::extractModuleName(), * который работает некорректно (возвращает пустую строку), * если класс модуля не имеет префикса «Block»: * https://github.com/magento/magento2/blob/2.1.2/lib/internal/Magento/Framework/View/Element/AbstractBlock.php#L846-L860 * @see \Magento\Framework\View\Element\AbstractBlock::getModuleName() * * @param Sb $sb * @param string $r * @return string */ public function afterGetModuleName(Sb $sb, $r) { return $r ?: ($sb['module_name'] = df_module_name($sb)); }
/** * 2016-11-28 * Такой синтаксис, в отличие от @see df_x_magento_init(), * позволяет нам иметь в JavaScript объект-элемент DOM вторым параметром: * https://github.com/magento/magento2/blob/2.1.2/lib/web/mage/apply/main.js#L69-L70 * Пример: https://github.com/magento/magento2/blob/2.1.2/app/code/Magento/Checkout/view/frontend/templates/cart/minicart.phtml#L30-L38 * @see json_encode всегда использует двойные кавычки, * а @see \Df\Core\Format\Html\Tag::openTagWithAttributesAsText() * всегда обрамляет значение в одинарные кавычки, * поэтому df_x_magento_init_att() всегда совместима с @see df_tag() * @param string|object $module * @param string $script * @param array(string => mixed) $params * @return array(string => string) */ function df_x_magento_init_att($module, $script, array $params = []) { return ['data-mage-init' => df_json_encode([df_cc_path(df_module_name($module), $script) => $params])]; }
/** * 2016-08-27 * @param string|object $module * @param string|null $scope [optional] * @return string */ function df_route($module, $scope = 'frontend') { return dfcf(function ($m, $s) { return df_route_config()->getRouteFrontName($m, $s); }, [df_module_name($module), $scope]); }
/** * 2015-08-14 * https://mage2.pro/t/57 * https://mage2.ru/t/92 * * 2015-09-02 * Метод @uses \Magento\Framework\Module\Dir\Reader::getModuleDir() * в качестве разделителя путей использует не DIRECTORY_SEPARATOR, а / * * 2016-11-17 * В качестве $moduleName можно передавать: * 1) Имя модуля. «A_B» * 2) Имя класса. «A\B\C» * 3) Объект класса. * * Результат намеренно не кэшируем, * потому что @uses \Magento\Framework\Module\Dir\Reader::getModuleDir() его отлично сам кэширует. * * @used-by \Df\Core\O::modulePath() * @used-by df_test_file() * @param string|object $moduleName * @param string $type [optional] * @return string * @throws \InvalidArgumentException */ function df_module_dir($moduleName, $type = '') { /** @var ModuleDirReader $reader */ $reader = df_o(ModuleDirReader::class); return $reader->getModuleDir($type, df_module_name($moduleName)); }
/** * 2016-02-16 * «Dfe\CheckoutCom\Method» => «dfe_checkout_com» * 2016-10-20 * Нельзя делать параметр $c опциональным, потому что иначе получим сбой: * «get_class() called without object from outside a class» * https://3v4l.org/k6Hd5 * @param string|object $c * @param string $del [optional] * @return string */ function df_module_name_lc($c, $del = '_') { return implode($del, df_explode_class_lc_camel(df_module_name($c, '\\'))); }