/** * @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]; }
/** * @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; }
/** @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()))))); }
/** * 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; }
/** * 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))); }
/** * @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; }
/** * @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; }
/** * @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; }
/** * @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]; }
/** * @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]); }
/** * 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."); } } }
/** * @param string $path * @return void */ public function delete($path) { df_param_string_not_empty($path, 0); \Magento\Framework\Filesystem\Io\File::rmdirRecursive($path); }
/** * @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); }