Exemple #1
0
 /**
  * @param string $locale
  * @return \Zend_Validate_Interface
  */
 protected function getZendValidator($locale)
 {
     df_param_string_not_empty($locale, 0);
     if (!isset($this->{__METHOD__}[$locale])) {
         /** @var string $class */
         $class = $this->getZendValidatorClass();
         /** @var \Zend_Validate_Interface $result */
         $result = new $class($locale);
         df_assert($result instanceof \Zend_Validate_Interface);
         $this->{__METHOD__}[$locale] = $result;
     }
     return $this->{__METHOD__}[$locale];
 }
Exemple #2
0
/**
 * @param string $datetime
 * @param bool $throw [optional]
 * @return ZD|null
 * @throws Exception
 */
function df_date_from_db($datetime, $throw = true)
{
    df_param_string_not_empty($datetime, 0);
    /** @var ZD|null $result */
    $result = null;
    if ($datetime) {
        try {
            $result = new ZD($datetime, ZD::ISO_8601);
        } catch (Exception $e) {
            if ($throw) {
                df_error($e);
            }
        }
    }
    return $result;
}
Exemple #3
0
 /** @return string */
 private function openTagWithAttributesAsText()
 {
     return df_cc_s($this->tag(), $this->shouldAttributesBeMultiline() ? "\n" : null, call_user_func($this->shouldAttributesBeMultiline() ? 'df_tab_multiline' : 'df_nop', implode($this->shouldAttributesBeMultiline() ? "\n" : ' ', df_clean(df_map_k(function ($name, $value) {
         df_param_string_not_empty($name, 0);
         /**
          * 2015-04-16
          * Передавать в качестве $value массив имеет смысл, например, для атрибута «class».
          *
          * 2016-11-29
          * Не использую @see df_e(), чтобы сохранить двойные кавычки (data-mage-init)
          * и в то же время сконвертировать одинарные
          * (потому что значения атрибутов мы ниже обрамляем именно одинарными).
          */
         $value = htmlspecialchars(str_replace("'", ''', !is_array($value) ? $value : df_cc_s($value)), ENT_NOQUOTES, 'UTF-8', false);
         return '' === $value ? '' : "{$name}='{$value}'";
     }, $this->attributes())))));
 }
Exemple #4
0
/**
 * 2015-12-07
 * @param array(string => mixed) $array
 * @param string|string[] $path
 * @param mixed $value
 * @return void
 */
function dfa_deep_set(array &$array, $path, $value)
{
    if (is_array($path)) {
        $pathParts = $path;
    } else {
        df_param_string_not_empty($path, 1);
        /**
         * 2015-02-06
         * Обратите внимание, что если разделитель отсутствует в строке,
         * то @uses explode() вернёт не строку, а массив со одим элементом — строкой.
         * Это вполне укладывается в наш универсальный алгоритм.
         */
        /** @var string[] $pathParts */
        $pathParts = df_explode_xpath($path);
    }
    /** @var array(string => mixed) $a */
    $a =& $array;
    while ($pathParts) {
        /** @var string $key */
        $key = array_shift($pathParts);
        if (!isset($a[$key])) {
            $a[$key] = [];
        }
        $a =& $a[$key];
        if (!is_array($a)) {
            $a = [];
        }
    }
    $a = $value;
}
Exemple #5
0
/**      
 * 2016-05-20
 * Возвращает 2-буквенный код страны по стандарту ISO 3166-1 alpha-2
 * по названию страны для заданной локали (или системной локали по умолчанию)
 * https://ru.wikipedia.org/wiki/ISO_3166-1
 * @param string $name
 * @param string|null $locale [optional]
 * @return string|null
 */
function df_country_ntc($name, $locale = null)
{
    df_param_string_not_empty($name, 0);
    return dfa(df_countries_ntc($locale), mb_strtoupper(df_trim($name)));
}
Exemple #6
0
 /**
  * @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;
 }
Exemple #7
0
 /**
  * @param string|string[] $path
  * @return X[]
  */
 public function xpathA($path)
 {
     if (1 < func_num_args()) {
         $path = df_cc_path(func_get_args());
     } else {
         if (is_array($path)) {
             $path = df_cc_path($path);
         }
     }
     df_param_string_not_empty($path, 0);
     /** @var X[] $result */
     $result = parent::xpath($path);
     df_result_array($result);
     return $result;
 }
Exemple #8
0
/**
 * @param string|X $x
 * @param bool $throw [optional]
 * @return X|null
 * @throws E
 */
function df_xml_parse($x, $throw = true)
{
    /** @var X $result */
    if ($x instanceof X) {
        $result = $x;
    } else {
        df_param_string_not_empty($x, 0);
        $result = null;
        try {
            $result = new X($x);
        } catch (\Exception $e) {
            if ($throw) {
                df_error("При синтаксическом разборе документа XML произошёл сбой:\n" . "«%s»\n" . "********************\n" . "%s\n" . "********************\n", df_ets($e), df_trim($x));
            }
        }
    }
    return $result;
}
Exemple #9
0
 /**
  * @param string $childName
  * @return bool
  */
 public function isChildComplex($childName)
 {
     df_param_string_not_empty($childName, 0);
     if (!isset($this->{__METHOD__}[$childName])) {
         /** @var X|null $child */
         $child = $this->child($childName, $isRequired = false);
         $this->{__METHOD__}[$childName] = $child && !df_check_leaf($child);
     }
     return $this->{__METHOD__}[$childName];
 }
Exemple #10
0
 /**
  * @used-by s()
  * @used-by Df_Dataflow_Model_Registry_Collection::getValidator()
  * @used-by Df_Core_Validator::byName()
  * @param string $className
  * @return ClassT
  */
 public static function i($className)
 {
     df_param_string_not_empty($className, 0);
     return new self([self::$PARAM__CLASS => $className]);
 }
Exemple #11
0
/**
 * 2016-08-03
 * @param string $name
 * @param string|\Exception $message [optional]
 * @return void
 * @throws DFE
 */
function df_assert_class_exists($name, $message = null)
{
    df_param_string_not_empty($name, 0);
    if (df_enable_assertions()) {
        if (!df_class_exists($name)) {
            df_error($message ?: "The required class «{$name}» does not exist.");
        }
    }
}
Exemple #12
0
 /**
  * @param string $path
  * @return void
  */
 public function delete($path)
 {
     df_param_string_not_empty($path, 0);
     \Magento\Framework\Filesystem\Io\File::rmdirRecursive($path);
 }
Exemple #13
0
/**
 * @param string $filePath
 * @param string $contents
 * @return void
 * @throws Exception
 */
function df_file_put_contents($filePath, $contents)
{
    df_param_string_not_empty($filePath, 0);
    df_path()->createAndMakeWritable($filePath);
    /** @var int|bool $r */
    $r = file_put_contents($filePath, $contents);
    df_assert(false !== $r);
}