Пример #1
0
 /**
  * 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]);
 }
Пример #2
0
/**
 * 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);
}
Пример #3
0
 /**
  * 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));
     });
 }
Пример #4
0
 /**
  * 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);
     }
 }
Пример #5
0
/**
 * 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]);
}
Пример #6
0
 /**
  * @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;
 }
Пример #7
0
 /**
  * 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__};
 }
Пример #8
0
/**
 * @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;
}