Beispiel #1
0
/**
 * @see df_sc()
 * @param string $resultClass
 * @param string|null|array(string => mixed) $a2 [optional]
 * @param array(string => mixed) $a3 [optional]
 * @return DataObject|object
 */
function df_ic($resultClass, $a2 = null, array $a3 = [])
{
    /** @var string|null $expectedClass */
    /** @var array(string => mixed) $params */
    list($expectedClass, $params) = is_array($a2) ? [null, $a2] : [$a2, $a3];
    return df_ar(df_create($resultClass, $params), $expectedClass);
}
Beispiel #2
0
 /**
  * 2016-08-27
  * @param object $caller
  * @param array(string => mixed) $p
  * @return string
  */
 private static function _sign($caller, array $p)
 {
     /** @var string $type */
     $type = df_trim_text_left(df_caller_f(), 'sign');
     /** @var self $i */
     $i = df_create(df_con($caller, df_cc_class('Signer', $type), df_con($caller, 'Signer')), $p);
     $i->_caller = $caller;
     return $i->sign();
 }
Beispiel #3
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 #4
0
/**
 * 2016-07-04
 * «How to load a currency by its ISO code?» https://mage2.pro/t/1840
 * @param Currency|string|null $currency [optional]
 * @return Currency
 */
function df_currency($currency = null)
{
    /** @var Currency $result */
    if (!$currency) {
        $result = df_currency_base();
    } else {
        if ($currency instanceof Currency) {
            $result = $currency;
        } else {
            /** @var array(string => Currency) $cache */
            static $cache;
            if (!isset($cache[$currency])) {
                $cache[$currency] = df_create(Currency::class)->load($currency);
            }
            $result = $cache[$currency];
        }
    }
    return $result;
}
Beispiel #5
0
 /**
  * 2016-08-27
  * @param Method $method
  * @return array(string, array(string => mixed))
  */
 public static final function p(Method $method)
 {
     /** @var self $i */
     $i = df_create(df_con($method, 'Charge'), [self::$P__METHOD => $method]);
     /**
      * 2016-08-29
      * Метод @uses \Df\Payment\R\ICharge::requestIdKey(),
      * но мы вызываем его нестатично (чтобы он был вызван для нужного класса, а не бля базового),
      * и это успешно работает безо всяких предупреждений интерпретатора:
      * https://3v4l.org/N2VD2
      * http://stackoverflow.com/a/32746909
      * http://stackoverflow.com/a/15756165
      * Некоторые утверждают, что якобы на старых версиях PHP
      * это может выдавать предупреждение уровня E_STRICT:
      * http://stackoverflow.com/a/12874405
      * Однако это неправда, я проверил: https://3v4l.org/1JY8i
      */
     /** @var string $id */
     $id = $i->requestId();
     df_assert_string_not_empty($id);
     /** @var array(string => mixed) $p */
     $p = [$i->requestIdKey() => $id] + $i->params();
     return [$id, $p + [$i->signatureKey() => Signer::signRequest($i, $p)]];
 }
Beispiel #6
0
 /**
  * 2016-01-01
  * Сюда мы попадаем при обработке ядром тега <source_model>.
  * 2015-11-14
  * Цель перекрытия — делаем наши источники данных независимыми друг от друга:
  * ядро создаёт источники данных как объекты-одиночки:
  * @see \Magento\Config\Model\Config\SourceFactory::create()
  * https://github.com/magento/magento2/blob/2.0.0/app/code/Magento/Config/Model/Config/SourceFactory.php#L33
  * а мы вместо этого создаём для каждого НАШЕГО поля отдельный источник данных.
  * @see \Magento\Config\Model\Config\SourceFactory::create()
  * @param Sb $sb
  * @param \Closure $proceed
  * @param string $modelName
  * @return \Magento\Framework\Option\ArrayInterface|mixed
  */
 public function aroundCreate(Sb $sb, \Closure $proceed, $modelName)
 {
     return df_class_my($modelName) ? df_create($modelName) : $proceed($modelName);
 }
Beispiel #7
0
 /**
  * 2016-05-19
  * 2016-05-20
  * Создавать коллекцию надо обязательно через Object Manager,
  * потому что родительский конструктор используе Dependency Injection.
  * @return Collection
  */
 public static function c()
 {
     return df_create(Collection::class);
 }
Beispiel #8
0
 /**
  * 2016-08-14
  * @param string $class [optional]
  * @return EavSetup
  */
 protected final function sEav($class = EavSetup::class)
 {
     return dfc($this, function ($class) {
         return df_create($class, ['setup' => $this->s()]);
     }, [$class]);
 }
Beispiel #9
0
 /**
 * 2016-08-24
 * Несмотря на то, что опция @see \Df\Payment\Settings::askForBillingAddress()
 * стала общей для всех моих платёжных модулей,
 * платёжный адрес у заказа всегда присутствует,
 * просто при askForBillingAddress = false платёжный адрес является вырожденным:
 * он содержит только email покупателя.
 *
 * Только что проверил, как метод работает для анонимных покупателей.
 * Оказывается, если аноничный покупатель при оформлении заказа указал адреса,
 * то эти адреса в данном методе уже будут доступны как посредством
 * @see \Magento\Sales\Model\Order::getAddresses()
 * так и, соответственно, посредством @uses \Magento\Sales\Model\Order::getBillingAddress()
 * и @uses \Magento\Sales\Model\Order::getShippingAddress()
 * Так происходит в связи с особенностью реализации метода
 * @see \Magento\Sales\Model\Order::getAddresses()
 * https://github.com/magento/magento2/blob/2.1.0/app/code/Magento/Sales/Model/Order.php#L1957-L1969
 			if ($this->getData('addresses') == null) {
 				$this->setData('addresses', $this->getAddressesCollection()->getItems());
 			}
 			return $this->getData('addresses');
 * Как видно, метод необязательно получает адреса из базы данных:
 * для анонимных покупателей (или ранее покупавших, но указавшим в этот раз новый адрес),
 * адреса берутся из поля «addresses».
 * А содержимое этого поля устанавливается методом @see \Magento\Sales\Model\Order::addAddress()
 * https://github.com/magento/magento2/blob/2.1.0/app/code/Magento/Sales/Model/Order.php#L1238-L1250
 *
 * @param bool $bs
 * @return OA
 */
 private function addressMixed($bs)
 {
     return dfc($this, function ($bs) {
         /** @var OA[] $aa */
         $aa = df_clean([$this->addressB(), $this->addressS()]);
         $aa = $bs ? $aa : array_reverse($aa);
         /** @var OA $result */
         $result = df_create(OA::class, df_clean(df_first($aa)->getData()) + df_last($aa)->getData());
         /**
          * 2016-08-24
          * Сам класс @see \Magento\Sales\Model\Order\Address никак order не использует.
          * Однако пользователи класса могут ожидать работоспособность метода
          * @see \Magento\Sales\Model\Order\Address::getOrder()
          * В частности, этого ожидает метод @see \Dfe\TwoCheckout\Address::build()
          */
         $result->setOrder($this->o());
         return $result;
     }, func_get_args());
 }
Beispiel #10
0
 /**
  * 2016-07-12
  * @param string $class
  * @param array(string => mixed)|string $params
  * @return self
  */
 public static function ic($class, $params)
 {
     /** @var self $result */
     $result = df_create($class);
     if (isset($params[self::$dfTest])) {
         unset($params[$params[self::$dfTest]]);
         /** @var string|null $case */
         $case = dfa($params, 'case');
         unset($params['case']);
         $params += $result->testData($case);
     }
     $result->setData($params);
     return $result;
 }
Beispiel #11
0
/**
 * 2015-11-29
 * @param string $contents
 * @return Raw
 */
function df_controller_raw($contents)
{
    /** @var Raw $result */
    $result = df_create(Raw::class);
    return $result->setContents($contents);
}
Beispiel #12
0
 /**
  * 2016-07-27
  * Обсерверы по умолчанию являются одиночками: https://github.com/magento/magento2/blob/1.0.0-beta/lib/internal/Magento/Framework/Event/Invoker/InvokerDefault.php#L56-L60
  * Мы используем свою одиночку, а не общую с ядром,
  * потому что наша одиночка хранит значения по-умолчанию,
  * а одиночка ядра загрязняется нашим хаком из метода
  * @used-by \Df\Sales\Plugin\Model\Order\Address\Renderer::aroundFormat()
  * Таким образом, мы используем нашу одиночку для того, чтобы очистить одиночку ядра.
  * @return AddressConfig
  */
 private function addressConfig()
 {
     if (!isset($this->{__METHOD__})) {
         $this->{__METHOD__} = df_create(AddressConfig::class);
     }
     return $this->{__METHOD__};
 }
Beispiel #13
0
 /**
  * 2016-08-09
  * @return Dictionary
  */
 protected function dic()
 {
     return dfc($this, function () {
         return df_create(Dictionary::class);
     });
 }
Beispiel #14
0
 /**
  * 2016-06-04
  * 2016-12-01
  * @see \Dfe\AmazonLogin\Customer
  * @see \Dfe\FacebookLogin\Customer
  * Не объявляем этот метод как final, потому что классы
  * @see \Dfe\FacebookLogin\Controller\Index\Index
  * @see \Dfe\AmazonLogin\Controller\Index\Index
  * уточняют класс его резульата посредством PHPDoc.
  * @return Customer
  */
 protected function c()
 {
     return dfc($this, function () {
         /** @var Customer $result */
         $result = df_create(df_con_heir($this, Customer::class));
         $result->validate();
         return $result;
     });
 }