Source for file FieldDescription.class.php
Documentation is available at FieldDescription.class.php
* Класс FieldDescription.
* @copyright Energine 2006
//require_once('core/framework/DBWorker.class.php');
* Имя поля для которого не указано имя :)
* Число с плавающей точкой
* Единичный выбор из нескольких вариантов
* Множественный выбор из нескольких вариантов
* Пользовательский тип поля (может содержать любые данные)
* Поле содержит видео данные
* если установлен ffmpeg - конвертируется из одного из поддерживаемых форматов
* Режимы отображения полей:
* @var array набор возможных значений (для полей типа select)
* Для полей из БД, включает имя таблицы: tableName[name]
* @var string системное имя поля
* @var string визуальный тип поля
* @var string тип поля в БД
* @var int режим отображения поля
private $mode = self::FIELD_MODE_EDIT;
* @var int уровень прав на данное поле
* @var boolean данные в поле мультиязычные?
* Хэш вида array(propertyName => propertyValue).
* @var Object дополнительные свойства поля
* Для полей не имеющих длины устанавливается в true.
* @param string $name имя поля
public function __construct($name = self::EMPTY_FIELD_NAME) {
// формируем название поля добавляя префикс 'FIELD_'
if ($name!= self::EMPTY_FIELD_NAME ) {
* Загружает описание поля из массива.
* @param array $fieldInfo
public function loadArray(array $fieldInfo) {
foreach ($fieldInfo as $propName => $propValue) {
* Загружает описание поля из XML-описания.
* @param SimpleXMLElement $fieldInfo
public function loadXML(SimpleXMLElement $fieldInfo) {
foreach ($fieldInfo->attributes() as $attrName => $attrValue) {
$attrName = (string) $attrName;
$attrValue = (string) $attrValue;
$this->name = $attrValue;
if(in_array($attrName, array('title', 'message', 'tabName'))){
* Устанавливает системное имя поля.
* @param string $systemName
* Устанавливает длину поля.
* Возвращает системное имя поля.
* Устанавливает визуальный тип поля.
$this->type = (string) $type;
case self::FIELD_TYPE_PWD :
case self::FIELD_TYPE_HIDDEN :
case self::FIELD_TYPE_EMAIL:
$regexp = '/^(([^()<>@,;:\\\".\[\] ]+)|("[^"\\\\\r]*"))((\.[^()<>@,;:\\\".\[\] ]+)|(\."[^"\\\\\r]*"))*@(([a-z0-9][a-z0-9\-]+)*[a-z0-9]+\.)+[a-z]{2,}$/i';
$regexp = '/^((([^()<>@,;:\\\".\[\] ]+)|("[^"\\\\\r]*"))((\.[^()<>@,;:\\\".\[\] ]+)|(\."[^"\\\\\r]*"))*@(([a-z0-9][a-z0-9\-]+)*[a-z0-9]+\.)+[a-z]{2,})?$/i';
case self::FIELD_TYPE_PHONE:
$regexp = '/^[0-9\(\)\+\-\. ]{5,25}$/';
$regexp = '/^([0-9\(\)\+\-\. ]{5,25})?$/';
case self::FIELD_TYPE_IMAGE:
case self::FIELD_TYPE_FILE:
case self::FIELD_TYPE_PRFILE:
case self::FIELD_TYPE_PFILE:
case self::FIELD_TYPE_VIDEO:
case self::FIELD_TYPE_STRING:
case self::FIELD_TYPE_FLOAT:
$regexp = '/^[0-9,\.]{1,'. $this->length. '}$/';
$regexp = '/^[0-9,\.]{0,'. $this->length. '}$/';
case self::FIELD_TYPE_BOOL:
case self::FIELD_TYPE_SELECT:
case self::FIELD_TYPE_INT:
$message = $this->translate('MSG_BAD_INT_FORMAT_OR_NULL');
$message = $this->translate('MSG_BAD_INT_FORMAT');
case self::FIELD_TYPE_TEXT:
case self::FIELD_TYPE_HTML_BLOCK:
case self::FIELD_TYPE_DATETIME:
$regexp = '/^\d{4}\-\d{1,2}\-\d{1,2} \d{1,2}:\d{1,2}:\d{1,2}$/';
$regexp = '/^(\d{4}\-\d{1,2}\-\d{1,2} \d{1,2}:\d{1,2}:\d{1,2})?$/';
$this->setProperty('outputFormat', '%Y-%m-%d %H:%M:%S');
case self::FIELD_TYPE_DATE:
$regexp = '/^\d{4}\-\d{1,2}\-\d{1,2}$/';
$regexp = '/^(\d{4}\-\d{1,2}\-\d{1,2})?$/';
case self::FIELD_TYPE_CUSTOM:
* Возвращает визуальный тип поля.
* Устанавливает системный тип поля, одновременно устанавливая на
* основании его визуальный тип.
* @param string $systemType
* Возвращает системный тип поля.
* Устанавливает режим отображения поля.
* Возвращает режим отображения поля.
* Устанавливает уровень прав на поле.
* Возвращает уровень прав на поле.
* Добавляет свойство поля.
if ($name == 'nullable') {
* Возвращает список имен дополнительных свойств поля.
* Возвращает значение свойста поля.
* Конвертирует тип поля из системного типа в визуальный.
* @param string $systemType
case DBA::COLTYPE_STRING:
$result = self::FIELD_TYPE_PWD;
$result = self::FIELD_TYPE_EMAIL;
$result = self::FIELD_TYPE_PHONE;
$result = self::FIELD_TYPE_IMAGE;
$result = self::FIELD_TYPE_FILE;
$result = self::FIELD_TYPE_PFILE;
$result = self::FIELD_TYPE_PRFILE;
$result = self::FIELD_TYPE_VIDEO;
$result = self::FIELD_TYPE_STRING;
$result = self::FIELD_TYPE_FLOAT;
case DBA::COLTYPE_INTEGER:
$result = self::FIELD_TYPE_BOOL;
// обрабатываем внешний ключ
$result = self::FIELD_TYPE_SELECT;
$result = self::FIELD_TYPE_INT;
$result = self::FIELD_TYPE_HTML_BLOCK;
$result = self::FIELD_TYPE_TEXT;
case DBA::COLTYPE_DATETIME:
$result = self::FIELD_TYPE_DATETIME;
$result = self::FIELD_TYPE_DATE;
* Пересечение мета-данных конфигурации и мета-данных, полученных из БД.
* @param FieldDescription основное описание
* @param FieldDescription дополнительное описание
* @return FieldDescription
public static function intersect(FieldDescription $configFieldDescription, FieldDescription $dbFieldDescription) {
$type = $configFieldDescription->getType();
$mode = $configFieldDescription->getMode();
$dbFieldDescription->setType($type);
$dbFieldDescription->setMode($mode);
//$properties = $secondaryFieldDescription->getPropertyNames();
foreach ($properties as $propertyName) {
if (!is_null($propertyValue) && !($propertyName == 'title' && $propertyValue == 'FIELD_'. self::EMPTY_FIELD_NAME)) {
if ($propertyName == 'message') {
$propertyValue = $configFieldDescription->translate($propertyValue);
$dbFieldDescription->setProperty($propertyName, $propertyValue);
return $dbFieldDescription;
* Проверяет корректность переданных данных.
* Возвращает флаг мультиязычности данных.
* Загружает набор возможных значений поля.
* @param mixed $values набор значений
* @param string $keyName имя поля-ключа
* @param string $valueName имя поля основного значения
foreach ($values as $row) {
$value = $row[$valueName];
'attributes' => (empty($row) ? false : $row)
* Возвращает набор возможных значений поля.
* Определяет значение режима отображения элемента
public static function computeRights($methodRights, $RORights = null, $FCRights = null) {
//Если уровень прав не указан, берем права документа
$RORights = is_null($RORights)? $methodRights: $RORights;
$FCRights = is_null($FCRights)? $methodRights: $FCRights;
//Если права на чтение на контрол меньше чем права на метод, то контрол - невидим
if($methodRights< $RORights) {
//Если права на чтение на контрол больше или равны правам на метод, и права на запись меньше - просто выводится текст контрола
elseif($methodRights >= $RORights&& $methodRights< $FCRights)
elseif($methodRights>= $FCRights)
|