/** * @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); }
/** * 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(); }
/** * 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-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; }
/** * 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)]]; }
/** * 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); }
/** * 2016-05-19 * 2016-05-20 * Создавать коллекцию надо обязательно через Object Manager, * потому что родительский конструктор используе Dependency Injection. * @return Collection */ public static function c() { return df_create(Collection::class); }
/** * 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]); }
/** * 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()); }
/** * 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; }
/** * 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); }
/** * 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__}; }
/** * 2016-08-09 * @return Dictionary */ protected function dic() { return dfc($this, function () { return df_create(Dictionary::class); }); }
/** * 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; }); }