/** * 2016-08-03 * Начиная с Magento 2.1.0 backend model создаётся только если данные присутствуют в базе данных * для конкретной области действия настроек (scope и scopeId). * https://github.com/magento/magento2/blob/2.1.0/app/code/Magento/Config/Block/System/Config/Form.php#L309-L327 * Если данные отсутстствуют в БД для конкретной области действия настроек, * то backend model вообще не создаётся, * однако данные всё равно извлекаются из БД из общей области действия настроек: * https://github.com/magento/magento2/blob/2.1.0/app/code/Magento/Config/Block/System/Config/Form.php#L323-L327 * Видимо, такое поведение дефектно: данные могут попасть в форму * в обход обработки и валидации их в backend model. * * Ранее (до версии 2.1.0) backend model создавалась в любом случае: * такое поведение я считаю более верным: * https://github.com/magento/magento2/blob/2.0.8/app/code/Magento/Config/Block/System/Config/Form.php#L330-L342 * * В плагин мы попадаем отсюда: @see \Magento\Config\Block\System\Config\Form::_initElement() * https://github.com/magento/magento2/blob/2.1.0/app/code/Magento/Config/Block/System/Config/Form.php#L347-L367 * * @see \Magento\Framework\Data\Form\Element\Fieldset::addField() * @param Sb|El $sb * @param string $elementId * @param string $type * @param array(string => mixed) $config * @param bool $after [optional] * @param bool $isAdvanced [optional] * @return array(string|bool|array(string => mixed)) */ public function beforeAddField(Sb $sb, $elementId, $type, array $config, $after = false, $isAdvanced = false) { /** @var array(string => mixed)|null $fc */ $fc = dfa($config, 'field_config'); /** * 2016-09-27 * Модуль Unirgy Dropship ошибочно пихает в $fc объект класса stdClass вместо массива: * https://code.dmitry-fedyuk.com/m2e/stripe/issues/5 */ if ($fc && is_array($fc)) { /** @var string|null $path */ $path = df_cc_path(dfa($fc, 'path'), dfa($fc, 'id')); /** @var string|null $backendC */ $backendC = dfa($fc, 'backend_model'); /** * 2016-08-03 * Конкретное значение тега «type» из system.xml можно получить вызовом dfa($fc, 'type') * Однако нам это не нужно: достаточно использовать аргумент $type: * @see \Magento\Config\Model\Config\Structure\Element\Field::getType() */ /** @var mixed|null $value */ $value = dfa($config, 'value'); if ($path && $backendC && !B::isProcessed($path) && is_a($type, El::class, true) && !is_null($value)) { /** * 2016-08-03 * По аналогии с @see \Magento\Config\Block\System\Config\Form::_initElement() * https://github.com/magento/magento2/blob/2.1.0/app/code/Magento/Config/Block/System/Config/Form.php#L314-L320 */ /** @var B $b */ $b = df_create($backendC); $b->setPath($path); $b->setValue($value); /** * 2016-08-03 * По аналогии с @see \Magento\Config\Block\System\Config\Form::getWebsiteCode() */ $b->setWebsite(df_request('website', '')); /** * 2016-08-03 * По аналогии с @see \Magento\Config\Block\System\Config\Form::getStoreCode() */ $b->setStore(df_request('store', '')); $b->afterLoad(); $config['value'] = $b->getValue(); } } return [$elementId, $type, $config, $after, $isAdvanced]; }
/** * 2016-11-17 * В качестве $moduleName можно передавать: * 1) Имя модуля. «A_B» * 2) Имя класса. «A\B\C» * 3) Объект класса. * * @param string|object $moduleName * @param string $localPath [optional] * @return string */ function df_test_file($moduleName, $localPath = '') { return df_cc_path(df_module_dir($moduleName), 'T/data', $localPath); }
/** @return bool */ private function getReportFilePath() { return df_cc_path(BP, 'var', 'log', $this->getReportFileName()); }
/** * 2015-12-08 * @param string[] $relativeParts * @return string */ public function absolute(array $relativeParts) { return $this->baseAbsolute() . df_cc_path($relativeParts); }
/** * 2016-03-14 * @param O $order * @return string */ function df_order_shipping_title(O $order) { /** * 2016-07-02 * Метод @uses \Magento\Sales\Model\Order::getShippingMethod() * некорректно работает с параметром $asObject = true при отсутствии у заказа способа доставки * (такое может быть, в частности, когда заказ содержит только виртуальные товары): * list($carrierCode, $method) = explode('_', $shippingMethod, 2); * Здесь $shippingMethod равно null, что приводит к сбою * Notice: Undefined offset: 1 in app/code/Magento/Sales/Model/Order.php on line 1203 * https://github.com/magento/magento2/blob/2.1.0/app/code/Magento/Sales/Model/Order.php#L1191-L1206 * Поэтому сначала смотрим, имеется ли у заказа способ доставки, * вызывая @uses \Magento\Sales\Model\Order::getShippingMethod() с параметром $asObject = false: */ /** @var string $result */ $result = ''; if ($order->getShippingMethod()) { /** @var string $code */ $code = $order->getShippingMethod($asObject = true)['method']; if ($code) { $result = df_cfg(df_cc_path('carriers', $code, 'title')); } } return $result; }
/** * 2015-12-08 * @return string */ private function pathRelativeBase() { if (!isset($this->{__METHOD__})) { $this->{__METHOD__} = df_cc_path('sprite', df_fs_name(implode('_', [$this->fs()->nameResolution(), $this->fs()->nameColorsSizeMargin()]))); } return $this->{__METHOD__}; }
/** * @param string|string[] $path * @return X[] */ public function xpathA($path) { if (1 < func_num_args()) { $path = df_cc_path(func_get_args()); } else { if (is_array($path)) { $path = df_cc_path($path); } } df_param_string_not_empty($path, 0); /** @var X[] $result */ $result = parent::xpath($path); df_result_array($result); return $result; }
/** * @param string $nameTemplate * @param string $message * @param string $subfolder [optional] * @param string $datePartsSeparator [optional] * @return void */ function df_report($nameTemplate, $message, $subfolder = '', $datePartsSeparator = '-') { df_file_put_contents(df_file_name(df_cc_path(BP . '/var/log', $subfolder), $nameTemplate, $datePartsSeparator), $message); }
/** * 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 $path * @return string */ private function route($path) { return df_cc_path(df_route($this), $path); }
/** * 2016-05-31 * @param string[] ...$args * @return string */ function df_cc_path_t(...$args) { return df_append(df_cc_path(dfa_flatten($args)), '/'); }
/** * 2016-07-19 * 2015-09-02 * Метод @uses \Magento\Framework\Module\Dir\Reader::getModuleDir() * и, соответственно, @uses df_module_dir_etc() * в качестве разделителя путей использует не DIRECTORY_SEPARATOR, а /, * поэтому и мы поступаем так же. * * 2016-11-17 * В качестве $moduleName можно передавать: * 1) Имя модуля. «A_B» * 2) Имя класса. «A\B\C» * 3) Объект класса. * * @param string|object $moduleName * @param string $localPath [optional] * @return string * @throws \InvalidArgumentException */ function df_module_path_etc($moduleName, $localPath = '') { return df_cc_path(df_module_dir_etc($moduleName), $localPath); }