Beispiel #1
0
 /**
  * 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];
 }
Beispiel #2
0
/**
 * 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);
}
Beispiel #3
0
 /** @return bool */
 private function getReportFilePath()
 {
     return df_cc_path(BP, 'var', 'log', $this->getReportFileName());
 }
Beispiel #4
0
 /**
  * 2015-12-08
  * @param string[] $relativeParts
  * @return string
  */
 public function absolute(array $relativeParts)
 {
     return $this->baseAbsolute() . df_cc_path($relativeParts);
 }
Beispiel #5
0
/**
 * 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;
}
Beispiel #6
0
 /**
  * 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__};
 }
Beispiel #7
0
 /**
  * @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;
 }
Beispiel #8
0
/**
 * @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);
}
Beispiel #9
0
/**
 * 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])];
}
Beispiel #10
0
 /**
  * 2016-08-27
  * @param string $path
  * @return string
  */
 private function route($path)
 {
     return df_cc_path(df_route($this), $path);
 }
Beispiel #11
0
/**
 * 2016-05-31
 * @param string[] ...$args
 * @return string
 */
function df_cc_path_t(...$args)
{
    return df_append(df_cc_path(dfa_flatten($args)), '/');
}
Beispiel #12
0
/**
 * 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);
}