/** * @override * @see _P::execute() * @return \Magento\Framework\Controller\Result\Redirect */ public function execute() { // 2016-06-05 // @see urldecode() здесь вызывать уже не надо, проверял. /** @var string $redirectUrl */ $redirectUrl = df_request($this->redirectUrlKey()) ?: df_url(); /** * 2016-12-02 * Если адрес для перенаправления покупателя передётся в адресе возврата, * то адрес для перенаправления там закодирован посредством @see base64_encode() * @see \Dfe\BlackbaudNetCommunity\Url::get() */ if (!df_starts_with($redirectUrl, 'http')) { $redirectUrl = base64_decode($redirectUrl); } try { /** @var Session|DfSession $s */ $s = df_customer_session(); if (!$this->mc()) { /** * 2016-12-01 * Учётная запись покупателя отсутствует в Magento, * и в то же время информации провайдера SSO недостаточно * для автоматической регистрации покупателя в Magento * (случай Blackbaud NetCommunity). * Перенаправляем покупателя на стандартную страницу регистрации Magento, * где часть полей будет уже заполнена данными от провайдера SSO, * а пароль будет либо скрытым, либо необязательным полем. * После регистрации свежесозданная учётная запись будет привязана * к учётной записи покупателя в провайдере SSO. */ $redirectUrl = df_customer_url()->getRegisterUrl(); } else { /** * 2015-10-08 * По аналогии с @see \Magento\Customer\Controller\Account\LoginPost::execute() * https://github.com/magento/magento2/blob/1.0.0-beta4/app/code/Magento/Customer/Controller/Account/LoginPost.php#L84-L85 */ $s->setCustomerDataAsLoggedIn($this->mc()->getDataModel()); $s->regenerateId(); /** * По аналогии с @see \Magento\Customer\Model\Account\Redirect::updateLastCustomerId() * Напрямую тот метод вызвать не можем, потому что он protected, * а использовать весь класс @see \Magento\Customer\Model\Account\Redirect пробовал, * но оказалось неудобно из-за слишком сложной процедуры перенаправлений. */ if ($s->getLastCustomerId() != $s->getId()) { $s->unsBeforeAuthUrl()->setLastCustomerId($s->getId()); } } } catch (\Exception $e) { df_message_error($e); } $this->postProcess(); return $this->resultRedirectFactory->create()->setUrl($redirectUrl); }
/** * 2016-04-10 * It is implemented by analogy with @see \Magento\Backend\Model\Auth::login() * https://github.com/magento/magento2/blob/052e789/app/code/Magento/Backend/Model/Auth.php#L137-L182 * * @param string $email * @return void * @throws \Magento\Framework\Exception\AuthenticationException */ public function loginByEmail($email) { $this->_initCredentialStorage(); /** @var \Magento\Backend\Model\Auth\Credential\StorageInterface|\Magento\User\Model\User $user */ $user = $this->getCredentialStorage(); $user->{\Df\User\Plugin\Model\User::LOGIN_BY_EMAIL} = true; $user->login($email, null); if ($user->getId()) { /** @var \Magento\Backend\Model\Auth\StorageInterface|\Magento\Backend\Model\Auth\Session $authSession */ $authSession = $this->getAuthStorage(); $authSession->setUser($user); $authSession->processLogin(); //$cookieManager->setSensitiveCookie($session->getName(), session_id()); $_COOKIE[$authSession->getName()] = session_id(); /** @var SessionManagerInterface|\Magento\Backend\Model\Session $session */ $session = df_o(SessionManagerInterface::class); $session->setData(\Magento\Framework\Data\Form\FormKey::FORM_KEY, df_request('form_key')); df_dispatch('backend_auth_user_login_success', ['user' => $user]); /** * 2016-04-10 * Обязательно, иначе авторизация работать не будет. * https://mage2.pro/t/1199 */ /** @var SecurityPlugin $securityPlugin */ $securityPlugin = df_o(SecurityPlugin::class); $securityPlugin->afterLogin($this); } }
/** @return string[] */ private function familyA() { if (!isset($this->{__METHOD__})) { $this->{__METHOD__} = explode(':', df_request('family')); } return $this->{__METHOD__}; }
/** * 2015-02-04 * Обратите внимание, что вряд ли мы вправе кэшировать результат при парметре $store = null, * ведь текущий магазин может меняться. * @param int|string|null|bool|StoreInterface $store [optional] * @return StoreInterface|Store * @throws \Magento\Framework\Exception\NoSuchEntityException|Exception * https://github.com/magento/magento2/issues/2222 */ function df_store($store = null) { /** @var StoreInterface $result */ $result = $store; if (is_null($result)) { /** * 2015-11-04 * По аналогии с @see \Magento\Store\Model\StoreResolver::getCurrentStoreId() * https://github.com/magento/magento2/blob/f578e54e093c31378ca981cfe336f7e651194585/app/code/Magento/Store/Model/StoreResolver.php#L82 */ /** @var string|null $storeCode */ $storeCode = df_request(\Magento\Store\Model\StoreResolver::PARAM_NAME); if (is_null($storeCode)) { $storeCode = df_store_cookie_m()->getStoreCodeFromCookie(); } if (is_null($storeCode)) { $storeCode = df_request('store-view'); } /** * 2015-08-10 * Доработал алгоритм. * Сначала мы смотрим, не находимся ли мы в административной части, * и нельзя ли при этом узнать текущий магазин из веб-адреса. * По аналогии с @see Mage_Adminhtml_Block_Catalog_Product_Grid::_getStore() * * 2015-09-20 * При единственном магазине * вызываемый ниже метод метод @uses \Df\Core\State::getStoreProcessed() * возвратит витрину default, однако при нахождении в административной части * нам нужно вернуть витрину «admin». * Например, это нужно, чтобы правильно работала функция @used-by df_is_backend() * Переменная $coreCurrentStore в данной точке содержит витрину «admin». * * 2015-11-04 * При нахождении в административном интерфейсе * и при отсутствии в веб-адресе идентификатора магазина * этот метод вернёт витрину по-умолчанию, а не витрину «admin». * * Не знаю, правильно ли это, то так делает этот метод в Российской сборке для Magento 1.x, * поэтому решил пока не менять поведение. * * В Magento 2 же стандартный метод \Magento\Store\Model\StoreManager::getStore() * при вызове без параметров возвращает именно витрину по умолчанию, а не витрину «admin»: * https://github.com/magento/magento2/issues/2254 * «The call for \Magento\Store\Model\StoreManager::getStore() without parameters * inside the backend returns the default frontend store, not the «admin» store, * which is inconsistent with Magento 1.x behaviour and I think it will lead to developer mistakes.» */ if (is_null($storeCode) && df_is_backend()) { $storeCode = df_request('store', 'admin'); } if (!is_null($storeCode)) { $result = df_store_m()->getStore($storeCode); } } return is_object($result) ? $result : df_store_m()->getStore($result); }
/** * 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-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]; }
/** * Этот метод возвращает объект-одиночку, * потому что параметры запроса у нас неизменны в течение всей жизни запроса. * @return Params */ public static function fromRequest() { /** @var array(string => string|int) $params */ $params = [self::$P__WIDTH => 400, self::$P__HEIGHT => 50, self::$P__FONT_SIZE => 14, self::$P__FONT_COLOR => '0|0|0|0', self::$P__BG_COLOR => '255|255|255|127', self::$P__MARGIN_LEFT => 0]; static $r; return $r ? $r : ($r = new self(dfa_select(df_request() + $params, array_keys($params)))); }