Пример #1
1
 /**
  * @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);
 }
Пример #2
0
 /**
  * 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);
     }
 }
Пример #3
0
 /** @return string[] */
 private function familyA()
 {
     if (!isset($this->{__METHOD__})) {
         $this->{__METHOD__} = explode(':', df_request('family'));
     }
     return $this->{__METHOD__};
 }
Пример #4
0
/**
 * 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);
}
Пример #5
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));
     });
 }
Пример #6
0
 /**
  * 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];
 }
Пример #7
0
 /**
  * Этот метод возвращает объект-одиночку,
  * потому что параметры запроса у нас неизменны в течение всей жизни запроса.
  * @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))));
 }