Example #1
0
 /**
  * @used-by df_preg_match()
  * @used-by df_preg_match_int()
  * Возвращает:
  * 1) string, если текст соответствует регулярному выражению
  * 2) string[], если текст соответствует регулярному выражению,
  * и регулярное выражение содержит несколько пар круглых скобок.
  * 3) null, если текст не соответствует регулярному выражению
  * 4) false, если при соответствии произошёл внутренний сбой функции @see preg_match()
  * @throws \Exception
  * @return string|string[]|null|bool
  */
 public function match()
 {
     if (!isset($this->{__METHOD__})) {
         /** @var string|null|bool $result */
         /** @var int|bool $matchResult */
         /** @var string[] $matches */
         // Собачка нужна, чтобы подавить warning.
         $matchResult = @preg_match($this->getPattern(), $this->getSubject(), $matches);
         if (false !== $matchResult) {
             if (1 === $matchResult) {
                 /**
                  * Раньше тут стояло:
                  * $result = dfa($matchResult, 1);
                  * что не совсем правильно,
                  * потому что если регулярное выражение не содержит круглые скобки,
                  * то результирующий массив будет содержать всего один элемент.
                  * ПРИМЕР
                  * регулярное выражение: #[А-Яа-яЁё]#mu
                  * исходный текст: Категория Яндекс.Маркета
                  * результат: Array([0] => К)
                  *
                  * 2015-03-23
                  * Добавил поддержку нескольких пар круглых скобок.
                  */
                 $result = count($matches) < 3 ? df_last($matches) : df_tail($matches);
             } else {
                 if (!$this->needThrowOnNotMatch()) {
                     $result = null;
                 } else {
                     $this->throwNotMatch();
                 }
             }
         } else {
             if ($this->needThrowOnError()) {
                 $this->throwInternalError();
             } else {
                 $result = false;
             }
         }
         $this->{__METHOD__} = df_n_set($result);
     }
     return df_n_get($this->{__METHOD__});
 }
Example #2
0
 /**
  * 2015-09-27
  * Цель метода — получение информации о формировании в данный момент заголовка страницы.
  * @uses \Magento\Framework\View\Page\Title::get()
  * @param Sb $sb
  * @param \Closure $proceed
  * @return string
  */
 public function aroundGet(Sb $sb, \Closure $proceed)
 {
     df_state()->renderingTitle(true);
     try {
         $result = $proceed();
         /**
          * Делаем браузерные заголовки административной части
          * более короткими и понятными: оставляем лишь первую и последнюю части заголовка.
          */
         if (df_is_backend()) {
             /** @var string[] $resultA */
             $resultA = explode(Sb::TITLE_GLUE, $result);
             $result = 3 > count($resultA) ? $result : implode(Sb::TITLE_GLUE, [df_first($resultA), df_last($resultA)]);
         }
     } finally {
         df_state()->renderingTitle(false);
     }
     return $result;
 }
Example #3
0
/**
 * 2016-08-10
 * «groups[all_pay][groups][installment_sales][fields][plans][template][months]» => «months»
 * @param string $nameFull
 * @return string
 */
function df_fe_name_short($nameFull)
{
    return df_last(df_clean(df_explode_multiple(['[', ']'], $nameFull)));
}
Example #4
0
 /** @return bool */
 public static function disabled()
 {
     return df_last(self::$_stack);
 }
Example #5
0
File: O.php Project: mage2pro/core
 /**
  * @param string $key
  * @param \\Zend_Validate_Interface|\Df\Zf\Validate\Type|string|mixed[] $validator
  * @param bool|null $isRequired [optional]
  * @throws \Df\Core\Exception
  * @return $this
  */
 protected function _prop($key, $validator, $isRequired = null)
 {
     /**
     * Полезная проверка!
     * Как-то раз ошибочно описал поле без значения:
     			private static $P__TYPE;
     * И при вызове $this->_prop(self::$P__TYPE, DF_V_STRING_NE)
     * получил диагностическое сообщение: «значение «» недопустимо для свойства «».»
     */
     df_param_string_not_empty($key, 0);
     /**
      * Обратите внимание, что если метод @see _prop() был вызван с двумя параметрами,
      * то и count($arguments) вернёт 2,
      * хотя в методе @see _prop() всегда доступен и 3-х параметр: $isRequired.
      * Другими словами, @see func_get_args() не возвращает параметры по умолчанию,
      * если они не были реально указаны при вызове текущего метода.
      */
     /**
      * Хотя документация к PHP говорит,
      * что @uses func_num_args() быть параметром других функций лишь с версии 5.3 PHP,
      * однако на самом деле @uses func_num_args() быть параметром других функций
      * в любых версиях PHP 5 и даже PHP 4.
      * http://3v4l.org/HKFP7
      * http://php.net/manual/function.func-num-args.php
      */
     if (2 < func_num_args()) {
         /** @var mixed[] $arguments */
         $arguments = func_get_args();
         $isRequired = df_last($arguments);
         /** @var bool $hasRequiredFlag */
         $hasRequiredFlag = is_bool($isRequired) || is_null($isRequired);
         if ($hasRequiredFlag) {
             $validator = array_slice($arguments, 1, -1);
         } else {
             $isRequired = null;
             $validator = df_tail($arguments);
         }
     }
     /** @var \Zend_Validate_Interface[] $additionalValidators */
     $additionalValidators = [];
     /** @var \Zend_Filter_Interface[] $additionalFilters */
     $additionalFilters = [];
     if (!is_array($validator)) {
         $validator = Validator::resolveForProperty($this, $validator, $key, $skipOnNull = false === $isRequired);
         df_assert($validator instanceof \Zend_Validate_Interface);
     } else {
         /** @var array(\Zend_Validate_Interface|Df_Zf_Validate_Type|string) $additionalValidatorsRaw */
         $additionalValidatorsRaw = df_tail($validator);
         $validator = Validator::resolveForProperty($this, df_first($validator), $key, $skipOnNull = false === $isRequired);
         df_assert($validator instanceof \Zend_Validate_Interface);
         foreach ($additionalValidatorsRaw as $additionalValidatorRaw) {
             /** @var \Zend_Validate_Interface|\Zend_Filter_Interface|string $additionalValidatorsRaw */
             /** @var \Zend_Validate_Interface|\Zend_Filter_Interface $additionalValidator */
             $additionalValidator = Validator::resolveForProperty($this, $additionalValidatorRaw, $key);
             if ($additionalValidator instanceof \Zend_Validate_Interface) {
                 $additionalValidators[] = $additionalValidator;
             }
             if ($additionalValidator instanceof \Zend_Filter_Interface) {
                 $additionalFilters[] = $additionalValidator;
             }
         }
     }
     $this->_validators[$key][] = $validator;
     if ($validator instanceof \Zend_Filter_Interface) {
         /** @var \Zend_Filter_Interface $filter */
         $filter = $validator;
         $this->_addFilter($key, $filter);
     }
     foreach ($additionalFilters as $additionalFilter) {
         /** @var \Zend_Filter_Interface $additionalFilter */
         $this->_addFilter($key, $additionalFilter);
     }
     /**
      * Раньше мы проводили валидацию лишь при извлечении значения свойства,
      * в методе @see getData().
      * Однако затем мы сделали улучшение:
      * перенести валидацию на более раннюю стадию — инициализацию свойства @see setData(),
      * и инициализацию валидатора/фильтра @see _prop().
      * Это улучшило диагностику случаев установки объекту некорректных значений свойств,
      * потому что теперь мы возбуждаем исключительную ситуацию
      * сразу при попытке установки некорректного значения.
      * А раньше, когда мы проводили валидацию лишь при извлечении значения свойства,
      * то при диагностике было не вполне понятно,
      * когда конкретно объекту было присвоено некорректное значение свойства.
      */
     /** @var bool $hasValueVorTheKey */
     $hasValueVorTheKey = array_key_exists($key, $this->_data);
     if ($hasValueVorTheKey) {
         Validator::checkProperty($this, $key, $this->_data[$key], $validator);
     }
     foreach ($additionalValidators as $additionalValidator) {
         /** @var \Zend_Validate_Interface $additionalValidator */
         $this->_validators[$key][] = $additionalValidator;
         if ($hasValueVorTheKey) {
             Validator::checkProperty($this, $key, $this->_data[$key], $additionalValidator);
         }
     }
     return $this;
 }
Example #6
0
 /**
 * 2016-08-24
 * Несмотря на то, что опция @see \Df\Payment\Settings::askForBillingAddress()
 * стала общей для всех моих платёжных модулей,
 * платёжный адрес у заказа всегда присутствует,
 * просто при askForBillingAddress = false платёжный адрес является вырожденным:
 * он содержит только email покупателя.
 *
 * Только что проверил, как метод работает для анонимных покупателей.
 * Оказывается, если аноничный покупатель при оформлении заказа указал адреса,
 * то эти адреса в данном методе уже будут доступны как посредством
 * @see \Magento\Sales\Model\Order::getAddresses()
 * так и, соответственно, посредством @uses \Magento\Sales\Model\Order::getBillingAddress()
 * и @uses \Magento\Sales\Model\Order::getShippingAddress()
 * Так происходит в связи с особенностью реализации метода
 * @see \Magento\Sales\Model\Order::getAddresses()
 * https://github.com/magento/magento2/blob/2.1.0/app/code/Magento/Sales/Model/Order.php#L1957-L1969
 			if ($this->getData('addresses') == null) {
 				$this->setData('addresses', $this->getAddressesCollection()->getItems());
 			}
 			return $this->getData('addresses');
 * Как видно, метод необязательно получает адреса из базы данных:
 * для анонимных покупателей (или ранее покупавших, но указавшим в этот раз новый адрес),
 * адреса берутся из поля «addresses».
 * А содержимое этого поля устанавливается методом @see \Magento\Sales\Model\Order::addAddress()
 * https://github.com/magento/magento2/blob/2.1.0/app/code/Magento/Sales/Model/Order.php#L1238-L1250
 *
 * @param bool $bs
 * @return OA
 */
 private function addressMixed($bs)
 {
     return dfc($this, function ($bs) {
         /** @var OA[] $aa */
         $aa = df_clean([$this->addressB(), $this->addressS()]);
         $aa = $bs ? $aa : array_reverse($aa);
         /** @var OA $result */
         $result = df_create(OA::class, df_clean(df_first($aa)->getData()) + df_last($aa)->getData());
         /**
          * 2016-08-24
          * Сам класс @see \Magento\Sales\Model\Order\Address никак order не использует.
          * Однако пользователи класса могут ожидать работоспособность метода
          * @see \Magento\Sales\Model\Order\Address::getOrder()
          * В частности, этого ожидает метод @see \Dfe\TwoCheckout\Address::build()
          */
         $result->setOrder($this->o());
         return $result;
     }, func_get_args());
 }
Example #7
0
 /**
  * 2015-08-13
  * @return BlockInterface
  */
 public function templateFile()
 {
     return df_last($this->_templateFileStack);
 }
Example #8
0
 /**
  * 2015-12-13
  * @used-by df_fe_uid()
  * Метод @uses \Magento\Framework\Data\Form\Element\AbstractElement::_getUiId()
  * возвращает атрибут и его значение уже в виже слитной строки, поэтому парсим её.
  * https://github.com/magento/magento2/blob/c58d2d/lib/internal/Magento/Framework/Data/Form/Element/AbstractElement.php#L331-L338
  * @param AE $element
  * @param string $suffix [optional]
  * @return string
  */
 public static function uidSt(AE $element, $suffix = null)
 {
     return df_trim(df_last(explode('=', $element->_getUiId($suffix))), '"');
 }
Example #9
0
/**
 * 2015-12-29
 * 2016-10-20
 * Нельзя делать параметр $c опциональным, потому что иначе получим сбой:
 * «get_class() called without object from outside a class»
 * https://3v4l.org/k6Hd5
 * @param string|object $c
 * @return string
 */
function df_class_last($c)
{
    return df_last(df_explode_class($c));
}