/** * 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)); }); }
/** * @override * @see \Df\Payment\Method::getConfigPaymentAction() * @return string * * 2016-08-27 * Сюда мы попадаем только из метода @used-by \Magento\Sales\Model\Order\Payment::place() * причём там наш метод вызывается сразу из двух мест и по-разному. * Умышленно возвращаем null. * @used-by \Magento\Sales\Model\Order\Payment::place() * https://github.com/magento/magento2/blob/ffea3cd/app/code/Magento/Sales/Model/Order/Payment.php#L334-L355 */ public final function getConfigPaymentAction() { /** @var string $id */ /** @var array(string => mixed) $p */ list($id, $p) = Charge::p($this); /** @var string $url */ $url = $this->url($this->redirectUrl()); /** * 2016-07-01 * К сожалению, если передавать в качестве результата ассоциативный массив, * то его ключи почему-то теряются. Поэтому запаковываем массив в JSON. */ $this->iiaSet(PlaceOrder::DATA, df_json_encode(['params' => $p, 'uri' => $url])); // 2016-05-06 // Письмо-оповещение о заказе здесь ещё не должно отправляться. // «How is a confirmation email sent on an order placement?» https://mage2.pro/t/1542 $this->o()->setCanSendNewEmailFlag(false); // 2016-07-10 // Сохраняем информацию о транзакции. $this->saveRequest($id, $url, $p); return null; }
/** * 2015-12-08 * @override * @see \Df\GoogleFont\Fonts\Png::draw() * @used-by \Df\GoogleFont\Fonts\Png::image() * @param resource $image * @return void */ protected function draw($image) { /** @var int $x */ $x = 0; /** @var int $y */ $y = 0; $this->_datumPoints = []; /** @var int|bool|resource $r */ $r = imagefill($image, 0, 0, $this->colorAllocateAlpha($image, $this->bgColor())); df_assert($r); // http://stackoverflow.com/a/1397584/254475 imagealphablending($image, true); foreach ($this->previews() as $preview) { /** @var Preview $preview */ try { /** @var resource $previewImage */ $previewImage = imagecreatefromstring($preview->contents()); df_assert($previewImage); try { $r = imagecopy($image, $previewImage, $x, $y, 0, 0, $preview->width(), $preview->height()); df_assert($r); $this->_datumPoints[$preview->getId()] = [$x, $y]; } finally { imagedestroy($previewImage); } } catch (\Exception $e) { df_log($e->getMessage()); } $x += $this->previewWidth(); if ($x >= $this->width()) { $x = 0; $y += $this->previewHeight() + $this->marginY(); } } df_media_write($this->pathToDatumPoints(), df_json_encode($this->_datumPoints)); }
/** * 2016-08-22 * @see dfp_add_info() * 2016-08-23 * Если значением ключа в $info будет null, то предыдущий ключ удалится: @see dfo() * @param DataObject|C $c * @param array(string => mixed) $info * @return void */ function df_customer_info_add(DataObject $c, array $info) { $c[Schema::F__DF] = df_json_encode(df_extend(df_customer_info_get($c), $info)); }
/** * 2016-08-24 * @override * @see \Df\Framework\Controller\Result\Text::prepare() * @used-by \Df\Framework\Controller\Result\Text::i() * @param string|mixed[] $body * @return string */ protected function prepare($body) { return is_array($body) ? df_json_encode($body) : $body; }
/** * 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])]; }