/** * 2016-08-14 * @param string $fieldName * @return void */ protected function addFieldToSalesItems($fieldName) { /** @var array(string => string) $params */ $params = ['type' => 'text']; $this->sQuote()->addAttribute('quote_item', $fieldName, $params); /** @uses \Magento\Sales\Setup\SalesSetup::addAttribute() */ df_map([$this->sSales(), 'addAttribute'], ['creditmemo_item', 'invoice_item', 'order_item'], [$fieldName, $params]); }
/** * 2016-01-14 * @param callable $f * @param mixed[]|mixed[][] $a * @param mixed|mixed[] $pAppend [optional] * @param mixed|mixed[] $pPrepend [optional] * @param int $keyPosition [optional] * @return mixed|mixed[] */ function df_call_a(callable $f, array $a, $pAppend = [], $pPrepend = [], $keyPosition = 0) { /** * 2016-11-13 * Нельзя здесь использовать @see df_args() */ if (1 === count($a)) { $a = $a[0]; } return !is_array($a) ? call_user_func_array($f, array_merge($pPrepend, [$a], $pAppend)) : df_map($f, $a, $pAppend, $pPrepend, $keyPosition); }
/** * 2015-12-09 * На странице может быть сразу несколько данных элементов управления. * Возникает проблема: как синхронизировать их одновременные обращения к серверу за данными? * Проблемой это является, потому что генерация образцов шрифтов — * длительная (порой минуты) задача со множеством файловых операций. * Параллельный запуск сразу двух таких генераций * (а они будут выполняться разными процессами PHP) * почти наверняка приведёт к файловым конфликтам и ошибкам, * да и вообще смысла в этом никакого нет: * зачем параллельно делать одно и то же с одними и теми же объектами? * Эта проблема была решена в серверной части применением функции @uses df_sync * @override * @see \Magento\Framework\App\Action\Action::execute() * @return Json */ public function execute() { df_response_cache_max(); $this->_actionFlag->set('', self::FLAG_NO_POST_DISPATCH, true); return df_sync($this, function () { return Json::i(Cache::i(null, 30 * 86400)->p(function () { return df_json_encode(['sprite' => $this->sprite()->url(), 'fonts' => array_filter(df_map(function (Font $font) { return array_filter(array_map(function (Variant $variant) { return $this->sprite()->datumPoint($variant->preview()); }, $font->variants())); }, _Fonts::s()))]); }, __METHOD__, df_request(), null)); }); }
/** * 2016-07-28 * @override * @see ObserverInterface::execute() * @used-by \Magento\Framework\Event\Invoker\InvokerDefault::_callObserverMethod() * @param O $o * @return void */ public function execute(O $o) { /** @var Provider $provider */ $provider = $o[Plugin::PROVIDER]; /** @var ISearchResult|ApiSearchResult|UiSearchResult|OrderGC|InvoiceGC|CreditmemoGC $result */ $result = $o[Plugin::RESULT]; if (in_array($provider->getName(), ['sales_order_grid_data_source'])) { /** * 2016-07-28 * https://github.com/magento/magento2/blob/2.1.0/lib/internal/Magento/Framework/View/Element/UiComponent/DataProvider/SearchResult.php#L37-L40 * @see \Magento\Framework\View\Element\UiComponent\DataProvider\SearchResult::$document * * Структура документа описана здесь: https://mage2.pro/t/1908 */ /** @var string $cacheKey */ $cacheKey = __METHOD__; /** @var string $prop */ $prop = 'payment_method'; df_map(function (Document $item) use($cacheKey, $prop) { /** @var string|null $methodCode */ $methodCode = $item[$prop]; if ($methodCode && df_starts_with($methodCode, 'dfe_')) { /** @var int $id */ $id = $item['entity_id']; /** * 2016-07-29 * Эта операция очень ресурсоёмка: * для каждой строки таблицы заказов она делает кучу запросов к базе данных. * Поэтому кэшируем результаты в постоянном кэше. */ $item[$prop] = df_cache_get_simple([$cacheKey, $id], function () use($id) { /** @var Method $method */ $method = df_order($id)->getPayment()->getMethodInstance(); return $method->titleDetailed(); }); } }, $result); } }
/** * 2016-09-07 * @param string[] $a * @param int $length * @return string[] * @uses mb_substr() */ function dfa_chop(array $a, $length) { return df_map('mb_substr', $a, [0, $length]); }
/** * @param string|string[] $text * @param string $charlist [optional] * @return string|string[] */ public function trim($text, $charlist = null) { /** @var string|string $result */ if (is_array($text)) { $result = df_map([$this, __FUNCTION__], $text, $charlist); } else { if (!is_null($charlist)) { /** @var string[] $addionalSymbolsToTrim */ $addionalSymbolsToTrim = ["\n", "\r", ' ']; foreach ($addionalSymbolsToTrim as $addionalSymbolToTrim) { /** @var string $addionalSymbolToTrim */ if (!df_contains($charlist, $addionalSymbolToTrim)) { $charlist .= $addionalSymbolToTrim; } } } /** * Обратите внимание, что класс Zend_Filter_StringTrim может работать некорректно * для строк, заканчивающихся заглавной кириллической буквой «Р». * http://framework.zend.com/issues/browse/ZF-11223 * Однако решение, которое предложено по ссылке выше * (http://framework.zend.com/issues/browse/ZF-11223) * может приводить к падению интерпретатора PHP * для строк, начинающихся с заглавной кириллической буквы «Р». * Такое у меня происходило в методе @see Df_Autotrading_Model_Request_Locations::parseLocation() * Кто виноват: решение или исходный класс @see Zend_Filter_StringTrim — не знаю * (скорее, решение). * Поэтому мой класс @see \Df\Zf\Filter\StringTrim дополняет решение по ссылке выше * программным кодом из Zend Framework 2.0. */ /** @var \Df\Zf\Filter\StringTrim $filter */ $filter = new \Df\Zf\Filter\StringTrim($charlist); $result = $filter->filter($text); /** * @see Zend_Filter_StringTrim::filter() теоретически может вернуть null, * потому что этот метод зачастую перепоручает вычисление результата функции @uses preg_replace() * @url http://php.net/manual/function.preg-replace.php */ $result = df_nts($result); // Как ни странно, Zend_Filter_StringTrim иногда выдаёт результат « ». if (' ' === $result) { $result = ''; } } return $result; }
/** * 2015-12-08 * @return Preview[] */ private function previews() { if (!isset($this->{__METHOD__})) { $this->{__METHOD__} = call_user_func_array('array_merge', df_map(function (Font $font) { return array_map(function (Variant $variant) { return $variant->preview(); }, array_values($font->variantsAvailable())); }, $this->fonts())); } return $this->{__METHOD__}; }
/** * @param mixed|mixed[] $v * @param bool $allowNull [optional] * @return int|int[] * @throws DFE */ function df_int($v, $allowNull = true) { /** @var int|int[] $result */ if (is_array($v)) { $result = df_map(__FUNCTION__, $v, $allowNull); } else { if (is_int($v)) { $result = $v; } else { if (is_bool($v)) { $result = $v ? 1 : 0; } else { if ($allowNull && (is_null($v) || '' === $v)) { $result = 0; } else { if (!\Df\Zf\Validate\StringT\IntT::s()->isValid($v)) { /** * Обратите внимание, что мы намеренно используем @uses df_error(), * а не @see df_error(). * Например, модуль доставки «Деловые Линии» * не оповещает разработчика только об исключительных ситуациях * класса @see Exception, * которые порождаются функцией @see df_error(). * О сбоях преобразования типов надо оповещать разработчика. */ df_error(\Df\Zf\Validate\StringT\IntT::s()->getMessage()); } else { $result = (int) $v; } } } } } return $result; }