energine
[ class tree: energine ] [ index: energine ] [ all elements ]

Source for file FieldDescription.class.php

Documentation is available at FieldDescription.class.php

  1. <?php
  2.  
  3. /**
  4.  * Класс FieldDescription.
  5.  *
  6.  * @package energine
  7.  * @subpackage core
  8.  * @author dr.Pavka
  9.  * @copyright Energine 2006
  10.  * @version $Id$
  11.  */
  12.  
  13. //require_once('core/framework/DBWorker.class.php');
  14.  
  15. /**
  16.  * Описание поля данных.
  17.  *
  18.  * @package energine
  19.  * @subpackage core
  20.  * @author dr.Pavka
  21.  */
  22. class FieldDescription extends DBWorker {
  23.     /**
  24.      * Имя поля для которого не указано имя :)
  25.      *
  26.      */
  27.     const EMPTY_FIELD_NAME = 'DUMMY';
  28.  
  29.     /*
  30.     * Визуальные типы полей:
  31.     */
  32.  
  33.     /**
  34.      * Строка
  35.      */
  36.     const FIELD_TYPE_STRING = 'string';
  37.  
  38.     /**
  39.      * Текст
  40.      */
  41.     const FIELD_TYPE_TEXT = 'text';
  42.  
  43.     /**
  44.      * Пароль
  45.      */
  46.     const FIELD_TYPE_PWD = 'password';
  47.  
  48.     /**
  49.      * E-mail
  50.      */
  51.     const FIELD_TYPE_EMAIL = 'email';
  52.  
  53.     /**
  54.      * Телефонный номер
  55.      */
  56.     const FIELD_TYPE_PHONE = 'phone';
  57.  
  58.     /**
  59.      * Целое число
  60.      */
  61.     const FIELD_TYPE_INT = 'integer';
  62.  
  63.     /**
  64.      * Число с плавающей точкой
  65.      */
  66.     const FIELD_TYPE_FLOAT = 'float';
  67.  
  68.     /**
  69.      * Изображение
  70.      */
  71.     const FIELD_TYPE_IMAGE = 'image';
  72.  
  73.     /**
  74.      * Файл
  75.      */
  76.     const FIELD_TYPE_FILE = 'file';
  77.  
  78.     /**
  79.      * Приватный файл
  80.      */
  81.     const FIELD_TYPE_PFILE = 'pfile';
  82.  
  83.     /**
  84.      * Защищенный файл
  85.      */
  86.     const FIELD_TYPE_PRFILE = 'prfile';
  87.  
  88.     /**
  89.      * Булево значение
  90.      */
  91.     const FIELD_TYPE_BOOL = 'boolean';
  92.  
  93.     /**
  94.      * HTML блок
  95.      */
  96.     const FIELD_TYPE_HTML_BLOCK = 'htmlblock';
  97.  
  98.     /**
  99.      * Единичный выбор из нескольких вариантов
  100.      */
  101.     const FIELD_TYPE_SELECT = 'select';
  102.  
  103.     /**
  104.      * Множественный выбор из нескольких вариантов
  105.      */
  106.     const FIELD_TYPE_MULTI = 'multi';
  107.  
  108.     /**
  109.      * Дата и время
  110.      */
  111.     const FIELD_TYPE_DATETIME = 'datetime';
  112.  
  113.     /**
  114.      * Дата
  115.      */
  116.     const FIELD_TYPE_DATE = 'date';
  117.  
  118.     /**
  119.      * Скрытое поле
  120.      */
  121.     const FIELD_TYPE_HIDDEN = 'hidden';
  122.  
  123.     /**
  124.      * Пользовательский тип поля (может содержать любые данные)
  125.      *
  126.      */
  127.     const FIELD_TYPE_CUSTOM = 'custom';
  128.     /**
  129.      * Поле содержит видео данные
  130.      * в формате flv
  131.      * если установлен ffmpeg - конвертируется из одного из поддерживаемых форматов
  132.      */
  133.     const FIELD_TYPE_VIDEO = 'video';
  134.  
  135.     /*
  136.     * Режимы отображения полей:
  137.     */
  138.  
  139.     /**
  140.      * Поле не отображается
  141.      */
  142.     const FIELD_MODE_NONE = 0;
  143.  
  144.     /**
  145.      * Только для чтения
  146.      */
  147.     const FIELD_MODE_READ = 1;
  148.  
  149.     /**
  150.      * Режим редактирования
  151.      */
  152.     const FIELD_MODE_EDIT = 2;
  153.  
  154.     /**
  155.      * Полный контроль
  156.      */
  157.     const FIELD_MODE_FC = 3;
  158.  
  159.     /**
  160.      * @access private
  161.      * @var array набор возможных значений (для полей типа select)
  162.      */
  163.     private $availableValues;
  164.  
  165.     /**
  166.      * @access private
  167.      * @var string имя поля
  168.      */
  169.     private $name;
  170.  
  171.     /**
  172.      * Для полей из БД, включает имя таблицы: tableName[name]
  173.      *
  174.      * @access private
  175.      * @var string системное имя поля
  176.      */
  177.     private $systemName;
  178.  
  179.     /**
  180.      * @access private
  181.      * @var string визуальный тип поля
  182.      */
  183.     private $type;
  184.  
  185.     /**
  186.      * @access private
  187.      * @var string тип поля в БД
  188.      */
  189.     private $systemType;
  190.  
  191.     /**
  192.      * @access private
  193.      * @var int режим отображения поля
  194.      */
  195.     private $mode = self::FIELD_MODE_EDIT;
  196.  
  197.     /**
  198.      * @access private
  199.      * @var int уровень прав на данное поле
  200.      */
  201.     private $rights;
  202.  
  203.     /**
  204.      * @access private
  205.      * @var boolean данные в поле мультиязычные?
  206.      */
  207.     private $isMultilanguage;
  208.  
  209.     /**
  210.      * Хэш вида array(propertyName => propertyValue).
  211.      *
  212.      * @access private
  213.      * @var Object дополнительные свойства поля
  214.      */
  215.     private $additionalProperties;
  216.  
  217.     /**
  218.      * Для полей не имеющих длины устанавливается в true.
  219.      *
  220.      * @access private
  221.      * @var int длина поля
  222.      */
  223.     private $length = true;
  224.  
  225.     /**
  226.      * Конструктор класса.
  227.      *
  228.      * @access public
  229.      * @param string $name имя поля
  230.      * @return void 
  231.      */
  232.     public function __construct($name self::EMPTY_FIELD_NAME{
  233.         parent::__construct();
  234.  
  235.         $this->name = $name;
  236.         $this->systemName = $name;
  237.         $this->isMultilanguage = false;
  238.         $this->additionalProperties = array();
  239.  
  240.         // формируем название поля добавляя префикс 'FIELD_'
  241.         if ($name!=self::EMPTY_FIELD_NAME {
  242.             $this->setProperty('title'$this->translate('FIELD_'.$name));
  243.         }
  244.  
  245.     }
  246.  
  247.     /**
  248.      * Загружает описание поля из массива.
  249.      *
  250.      * @access public
  251.      * @param array $fieldInfo 
  252.      * @return boolean 
  253.      */
  254.     public function loadArray(array $fieldInfo{
  255.         $result true;
  256.         foreach ($fieldInfo as $propName => $propValue{
  257.             switch ($propName{
  258.                 case 'type':
  259.                     $this->setSystemType($propValue);
  260.                     break;
  261.                 case 'length':
  262.                     $this->setLength($propValue);
  263.                     break;
  264.                 case 'isMultilanguage':
  265.                     $this->isMultilanguage = true;
  266.                     break;
  267.                 default:
  268.                     $this->setProperty($propName$propValue);
  269.             }
  270.         }
  271.         return $result;
  272.     }
  273.  
  274.     /**
  275.      * Загружает описание поля из XML-описания.
  276.      *
  277.      * @access public
  278.      * @param SimpleXMLElement $fieldInfo 
  279.      * @return boolean 
  280.      */
  281.     public function loadXML(SimpleXMLElement $fieldInfo{
  282.         $result true;
  283.         foreach ($fieldInfo->attributes(as $attrName => $attrValue{
  284.             $attrName = (string)$attrName;
  285.             $attrValue = (string)$attrValue;
  286.             switch ($attrName{
  287.                 case 'name':
  288.                     $this->name $attrValue;
  289.                     break;
  290.                 case 'type':
  291.                     $this->setSystemType($attrValue);
  292.                     break;
  293.                 case 'length':
  294.                     $this->setLength($attrValue);
  295.                     break;
  296.                 case 'mode':
  297.                     $this->setMode($attrValue);
  298.                     break;
  299.                 default:
  300.                     if(in_array($attrNamearray('title''message''tabName'))){
  301.                         $attrValue $this->translate($attrValue);
  302.                     }
  303.                     $this->setProperty($attrName$attrValue);
  304.             }
  305.         }
  306.         return $result;
  307.     }
  308.  
  309.     /**
  310.      * Возвращает имя поля.
  311.      *
  312.      * @access public
  313.      * @return string 
  314.      */
  315.     public function getName({
  316.         return $this->name;
  317.     }
  318.  
  319.     /**
  320.      * Устанавливает системное имя поля.
  321.      *
  322.      * @access public
  323.      * @param string $systemName 
  324.      * @return void 
  325.      */
  326.     public function setSystemName($systemName{
  327.         $this->systemName $systemName;
  328.     }
  329.  
  330.     /**
  331.      * Возвращает длину поля.
  332.      *
  333.      * @access public
  334.      * @return int | true
  335.      */
  336.     public function getLength({
  337.         return $this->length;
  338.     }
  339.  
  340.     /**
  341.      * Устанавливает длину поля.
  342.      *
  343.      * @access public
  344.      * @param int $length 
  345.      * @return void 
  346.      */
  347.     public function setLength($length{
  348.         $this->length = (int)$length;
  349.     }
  350.  
  351.     /**
  352.      * Возвращает системное имя поля.
  353.      *
  354.      * @access public
  355.      * @return string 
  356.      */
  357.     public function getSystemName({
  358.         return $this->systemName;
  359.     }
  360.  
  361.     /**
  362.      * Устанавливает визуальный тип поля.
  363.      *
  364.      * @access public
  365.      * @param string $type 
  366.      * @return void 
  367.      */
  368.     public function setType($type{
  369.         $this->type = (string)$type;
  370.         switch ($this->type{
  371.             case self::FIELD_TYPE_PWD :
  372.                 $this->setProperty('pattern''/^.+$/');
  373.                 $this->setProperty('message'$this->translate('MSG_FIELD_IS_NOT_NULL'));
  374.                 $this->setProperty('outputFormat''%s');
  375.                 break;
  376.             case self::FIELD_TYPE_HIDDEN :
  377.                 if (is_null($this->getPropertyValue('outputFormat'))) {
  378.                     $this->setProperty('outputFormat''%s');
  379.                 }
  380.                 break;
  381.             case self::FIELD_TYPE_EMAIL:
  382.                 if (($this->getPropertyValue('nullable'=== false|| is_null($this->getPropertyValue('nullable'))) {
  383.                     $regexp '/^(([^()<>@,;:\\\".\[\] ]+)|("[^"\\\\\r]*"))((\.[^()<>@,;:\\\".\[\] ]+)|(\."[^"\\\\\r]*"))*@(([a-z0-9][a-z0-9\-]+)*[a-z0-9]+\.)+[a-z]{2,}$/i';
  384.                 }
  385.                 else {
  386.                     $regexp '/^((([^()<>@,;:\\\".\[\] ]+)|("[^"\\\\\r]*"))((\.[^()<>@,;:\\\".\[\] ]+)|(\."[^"\\\\\r]*"))*@(([a-z0-9][a-z0-9\-]+)*[a-z0-9]+\.)+[a-z]{2,})?$/i';
  387.                 }
  388.                 $this->setProperty('pattern'$regexp);
  389.                 $this->setProperty('message'$this->translate('MSG_BAD_EMAIL_FORMAT'));
  390.                 $this->setProperty('outputFormat''%s');
  391.                 break;
  392.             case  self::FIELD_TYPE_PHONE:
  393.                 if ($this->getPropertyValue('nullable'=== false || is_null($this->getPropertyValue('nullable'))) {
  394.                     $regexp '/^[0-9\(\)\+\-\. ]{5,25}$/';
  395.                 }
  396.                 else {
  397.                     $regexp '/^([0-9\(\)\+\-\. ]{5,25})?$/';
  398.                 }
  399.                 $this->setProperty('pattern'$regexp);
  400.                 $this->setProperty('message'$this->translate('MSG_BAD_PHONE_FORMAT'));
  401.                 $this->setProperty('outputFormat''%s');
  402.                 break;
  403.             case self::FIELD_TYPE_IMAGE:
  404.                 if ($this->getPropertyValue('nullable'=== false{
  405.                     $this->setProperty('pattern''/^.+$/');
  406.                     $this->setProperty('message'$this->translate('MSG_IMG_IS_NOT_NULL'));
  407.                 }
  408.                 $this->length true;
  409.                 $this->setProperty('outputFormat''%s');
  410.                 $this->setProperty('deleteFileTitle'$this->translate('MSG_DELETE_FILE'));
  411.                 break;
  412.             case self::FIELD_TYPE_FILE:
  413.             case self::FIELD_TYPE_PRFILE:
  414.             case self::FIELD_TYPE_PFILE:
  415.             case self::FIELD_TYPE_VIDEO:                
  416.                 if ($this->getPropertyValue('nullable'=== false{
  417.                     $this->setProperty('pattern''/^.+$/');
  418.                     $this->setProperty('message'$this->translate('MSG_FILE_IS_NOT_NULL'));
  419.                 }
  420.                 $this->length true;
  421.                 $this->setProperty('outputFormat''%s');
  422.                 $this->setProperty('deleteFileTitle'$this->translate('MSG_DELETE_FILE'));
  423.                 break;
  424.             case self::FIELD_TYPE_STRING:
  425.                 if ($this->getPropertyValue('nullable'=== false  || is_null($this->getPropertyValue('nullable'))) {
  426.                     $this->setProperty('pattern''/^.+$/');
  427.                     $this->setProperty('message'$this->translate('MSG_FIELD_IS_NOT_NULL'));
  428.                 }
  429.                 $this->setProperty('outputFormat''%s');
  430.                 break;
  431.             case self::FIELD_TYPE_FLOAT:
  432.                 $this->length 10;
  433.                 if (
  434.                     ($this->getPropertyValue('nullable'=== false)
  435.                     ||
  436.                     (is_null($this->getPropertyValue('nullable')))
  437.                 {
  438.                     $regexp '/^[0-9,\.]{1,'.$this->length.'}$/';
  439.                 }
  440.                 else {
  441.                     $regexp '/^[0-9,\.]{0,'.$this->length.'}$/';
  442.                 }
  443.                 $this->setProperty('outputFormat''%f');
  444.                 $this->setProperty('pattern'$regexp);
  445.                 $this->setProperty('message'$this->translate('MSG_BAD_FLOAT_FORMAT'));
  446.                 break;
  447.             case self::FIELD_TYPE_BOOL:
  448.                 $this->length true;
  449.                 $this->setProperty('outputFormat''%s');
  450.                 break;
  451.             case self::FIELD_TYPE_SELECT:
  452.                 $this->length true;
  453.                 break;
  454.             case self::FIELD_TYPE_INT:
  455.                 if (!$this->getPropertyValue('key')) {
  456.                     if ($this->getPropertyValue('nullable'=== false{
  457.                         $regexp '/^\d{1,5}$/';
  458.                         $message $this->translate('MSG_BAD_INT_FORMAT_OR_NULL');
  459.                     }
  460.                     else {
  461.                         $regexp '/^\d{0,5}$/';
  462.                         $message $this->translate('MSG_BAD_INT_FORMAT');
  463.                     }
  464.                     $this->setProperty('pattern'$regexp);
  465.                     $this->setProperty('message'$message);
  466.                     $this->setProperty('outputFormat''%d');
  467.                 }
  468.                 break;
  469.             case self::FIELD_TYPE_TEXT:
  470.             case self::FIELD_TYPE_HTML_BLOCK:
  471.                 if ($this->getPropertyValue('nullable'=== false|| is_null($this->getPropertyValue('nullable'))) {
  472.                     $this->setProperty('pattern''/^.+$/m');
  473.                     $this->setProperty('message'$this->translate('MSG_FIELD_IS_NOT_NULL'));
  474.                 }
  475.                 $this->setProperty('outputFormat''%s');
  476.                 $this->length true;
  477.                 break;
  478.             case self::FIELD_TYPE_DATETIME:
  479.                 if ($this->getPropertyValue('nullable'=== false{
  480.                     $regexp '/^\d{4}\-\d{1,2}\-\d{1,2} \d{1,2}:\d{1,2}:\d{1,2}$/';
  481.                 }
  482.                 else {
  483.                     $regexp '/^(\d{4}\-\d{1,2}\-\d{1,2} \d{1,2}:\d{1,2}:\d{1,2})?$/';
  484.                 }
  485.                 $this->setProperty('pattern'$regexp);
  486.                 $this->setProperty('outputFormat''%Y-%m-%d %H:%M:%S');
  487.                 $this->setProperty('message'$this->translate('MSG_WRONG_DATETIME_FORMAT'));
  488.                 $this->length true;
  489.                 break;
  490.             case self::FIELD_TYPE_DATE:
  491.                 if ($this->getPropertyValue('nullable'=== false{
  492.                     $regexp '/^\d{4}\-\d{1,2}\-\d{1,2}$/';
  493.                 }
  494.                 else {
  495.                     $regexp '/^(\d{4}\-\d{1,2}\-\d{1,2})?$/';
  496.                 }
  497.                 $this->setProperty('pattern'$regexp);
  498.                 $this->setProperty('outputFormat''%Y-%m-%d');
  499.                 $this->setProperty('message'$this->translate('MSG_WRONG_DATE_FORMAT'));
  500.                 $this->length true;
  501.                 break;
  502.             case self::FIELD_TYPE_CUSTOM:
  503.                 if ($this->getPropertyValue('nullable'=== false{
  504.                     $this->setProperty('pattern''/^.+$/');
  505.                     $this->setProperty('message'$this->translate('MSG_FIELD_IS_NOT_NULL'));
  506.                 }
  507.                 break;
  508.             default:
  509.                 break;
  510.         }
  511.     }
  512.  
  513.     /**
  514.      * Возвращает визуальный тип поля.
  515.      *
  516.      * @access public
  517.      * @return string 
  518.      */
  519.     public function getType({
  520.         return $this->type;
  521.     }
  522.  
  523.     /**
  524.      * Устанавливает системный тип поля, одновременно устанавливая на
  525.      * основании его визуальный тип.
  526.      *
  527.      * @access public
  528.      * @param string $systemType 
  529.      * @return void 
  530.      */
  531.     public function setSystemType($systemType{
  532.         $this->systemType $systemType;
  533.         $this->setType($this->convertType($systemType));
  534.     }
  535.  
  536.     /**
  537.      * Возвращает системный тип поля.
  538.      *
  539.      * @access public
  540.      * @return string 
  541.      */
  542.     public function getSystemType({
  543.         return $this->systemType;
  544.     }
  545.  
  546.     /**
  547.      * Устанавливает режим отображения поля.
  548.      *
  549.      * @access public
  550.      * @param int $mode 
  551.      * @return void 
  552.      */
  553.     public function setMode($mode{
  554.         $this->mode $mode;
  555.     }
  556.  
  557.     /**
  558.      * Возвращает режим отображения поля.
  559.      *
  560.      * @access public
  561.      * @return int 
  562.      */
  563.     public function getMode({
  564.         return $this->mode;
  565.     }
  566.  
  567.     /**
  568.      * Устанавливает уровень прав на поле.
  569.      *
  570.      * @access public
  571.      * @param int $rights 
  572.      * @return void 
  573.      */
  574.     public function setRights($rights{
  575.         $this->rights $rights;
  576.     }
  577.  
  578.     /**
  579.      * Возвращает уровень прав на поле.
  580.      *
  581.      * @access public
  582.      * @return int 
  583.      */
  584.     public function getRights({
  585.         return $this->rights;
  586.     }
  587.  
  588.     /**
  589.      * Добавляет свойство поля.
  590.      *
  591.      * @access public
  592.      * @param string $name 
  593.      * @param mixed $value 
  594.      * @return void 
  595.      */
  596.     public function setProperty($name$value{
  597.         if ($name == 'nullable'{
  598.             $value = (bool)$value;
  599.         }
  600.         $this->additionalProperties[$name$value;
  601.     }
  602.  
  603.     /**
  604.      * Удаляет свойство поля.
  605.      *
  606.      * @access public
  607.      * @param string $name 
  608.      * @return void 
  609.      */
  610.     public function removeProperty($name{
  611.         unset($this->additionalProperties[$name]);
  612.     }
  613.  
  614.     /**
  615.      * Возвращает список имен дополнительных свойств поля.
  616.      *
  617.      * @access public
  618.      * @return array 
  619.      */
  620.     public function getPropertyNames({
  621.         return array_keys($this->additionalProperties);
  622.     }
  623.  
  624.     /**
  625.      * Возвращает значение свойста поля.
  626.      *
  627.      * @access public
  628.      * @param string $name 
  629.      * @return mixed 
  630.      */
  631.     public function getPropertyValue($name{
  632.         $value null;
  633.         if (isset($this->additionalProperties[$name])) {
  634.             $value $this->additionalProperties[$name];
  635.         }
  636.         return $value;
  637.     }
  638.  
  639.     /**
  640.      * Конвертирует тип поля из системного типа в визуальный.
  641.      *
  642.      * @access protected
  643.      * @param string $systemType 
  644.      * @return string 
  645.      */
  646.     protected function convertType($systemType{
  647.         switch ($systemType{
  648.             case DBA::COLTYPE_STRING:
  649.                 if (strpos($this->name'_password')) {
  650.                     $result self::FIELD_TYPE_PWD;
  651.                 }
  652.                 elseif (strpos($this->name'_email')) {
  653.                     $result self::FIELD_TYPE_EMAIL;
  654.                 }
  655.                 elseif (strpos($this->name'_phone')) {
  656.                     $result self::FIELD_TYPE_PHONE;
  657.                 }
  658.                 elseif (strpos($this->name'_img')) {
  659.                     $result self::FIELD_TYPE_IMAGE;
  660.                 }
  661.                 elseif (strpos($this->name'_file')) {
  662.                     $result self::FIELD_TYPE_FILE;
  663.                 }
  664.                 elseif (strpos($this->name'_pfile')) {
  665.                     $result self::FIELD_TYPE_PFILE;
  666.                 }
  667.                 elseif (strpos($this->name'_prfile')) {
  668.                     $result self::FIELD_TYPE_PRFILE;
  669.                 }
  670.                 elseif (strpos($this->name'_video')) {
  671.                     $result self::FIELD_TYPE_VIDEO;
  672.                 }
  673.                 else {
  674.                     $result self::FIELD_TYPE_STRING;
  675.                 }
  676.                 break;
  677.             case DBA::COLTYPE_FLOAT:
  678.                 $result self::FIELD_TYPE_FLOAT;
  679.                 break;
  680.             case DBA::COLTYPE_INTEGER:
  681.                 if ($this->length == 1{
  682.                     $result self::FIELD_TYPE_BOOL;
  683.                 }
  684.                 // обрабатываем внешний ключ
  685.                 elseif (is_array($this->getPropertyValue('key'))) {
  686.                     $result self::FIELD_TYPE_SELECT;
  687.                 }
  688.                 else {
  689.                     $result self::FIELD_TYPE_INT;
  690.                 }
  691.                 break;
  692.             case DBA::COLTYPE_TEXT:
  693.                 if (strpos($this->name'_rtf')) {
  694.                     $result self::FIELD_TYPE_HTML_BLOCK;
  695.                 }
  696.                 else {
  697.                     $result self::FIELD_TYPE_TEXT;
  698.                 }
  699.                 break;
  700.             case DBA::COLTYPE_DATETIME:
  701.                 $result self::FIELD_TYPE_DATETIME;
  702.                 break;
  703.             case DBA::COLTYPE_DATE:
  704.                 $result self::FIELD_TYPE_DATE;
  705.                 break;
  706.             default:
  707.                 $result $systemType;
  708.         }
  709.         return $result;
  710.     }
  711.  
  712.     /**
  713.      * Пересечение мета-данных конфигурации и мета-данных, полученных из БД.
  714.      *
  715.      * @access public
  716.      * @param FieldDescription основное описание
  717.      * @param FieldDescription дополнительное описание
  718.      *
  719.      * @return FieldDescription 
  720.      * @static
  721.      */
  722.     public static function intersect(FieldDescription $configFieldDescriptionFieldDescription $dbFieldDescription{
  723.         $type $configFieldDescription->getType();
  724.         $mode $configFieldDescription->getMode();
  725.         if (!is_null($type)) {
  726.             $dbFieldDescription->setProperty('origType'$dbFieldDescription->getType());
  727.             //меняем тип
  728.             $dbFieldDescription->setType($type);
  729.         }
  730.         if (!is_null($mode)) {
  731.             $dbFieldDescription->setMode($mode);
  732.         }
  733.         $dbFieldDescription->isMultilanguage = $configFieldDescription->isMultilanguage || $dbFieldDescription->isMultilanguage();
  734.         //$properties = $secondaryFieldDescription->getPropertyNames();
  735.         $properties array_merge($configFieldDescription->getPropertyNames($dbFieldDescription->getPropertyNames());
  736.         foreach ($properties as $propertyName{
  737.             $propertyValue $configFieldDescription->getPropertyValue($propertyName);
  738.  
  739.             if (!is_null($propertyValue&& !($propertyName == 'title' && $propertyValue == 'FIELD_'.self::EMPTY_FIELD_NAME)) {
  740.                 if ($propertyName == 'message'{
  741.                     $propertyValue $configFieldDescription->translate($propertyValue);
  742.                 }
  743.  
  744.                 $dbFieldDescription->setProperty($propertyName$propertyValue);
  745.             }
  746.         }
  747.  
  748.         return $dbFieldDescription;
  749.     }
  750.  
  751.     /**
  752.      * Проверяет корректность переданных данных.
  753.      *
  754.      * @access public
  755.      * @param mixed $data 
  756.      * @return boolean 
  757.      */
  758.     public function validate($data{
  759.         if (is_int($this->length&& strlen($data$this->length{
  760.             return false;
  761.         }
  762.         if ($this->getPropertyValue('pattern'&& !preg_match($this->getPropertyValue('pattern')$data)) {
  763.             return false;
  764.         }
  765.         return true;
  766.     }
  767.  
  768.     /**
  769.      * Возвращает флаг мультиязычности данных.
  770.      *
  771.      * @access public
  772.      * @return boolean 
  773.      */
  774.     public function isMultilanguage({
  775.         return $this->isMultilanguage;
  776.     }
  777.  
  778.     /**
  779.      * Загружает набор возможных значений поля.
  780.      *
  781.      * @access public
  782.      * @param mixed $values набор значений
  783.      * @param string $keyName имя поля-ключа
  784.      * @param string $valueName имя поля основного значения
  785.      * @return void 
  786.      * @see QAL::select()
  787.      */
  788.     public function loadAvailableValues($values$keyName$valueName{
  789.         $result array();
  790.         if (is_array($values)) {
  791.             foreach ($values as $row{
  792.                 $key $row[$keyName];
  793.                 $value $row[$valueName];
  794.  
  795.                 unset($row[$keyName]);
  796.                 unset($row[$valueName]);
  797.  
  798.                 $result[$keyarray(
  799.                 'value' => $value,
  800.                 'attributes' => (empty($rowfalse $row)
  801.                 );
  802.             }
  803.         }
  804.         $this->availableValues $result;
  805.     }
  806.  
  807.     /**
  808.      * Возвращает набор возможных значений поля.
  809.      *
  810.      * @access public
  811.      * @return array 
  812.      */
  813.     public function getAvailableValues({
  814.         return $this->availableValues;
  815.     }
  816.  
  817.     /**
  818.      * Определяет значение режима отображения элемента
  819.      *
  820.      * @return int 
  821.      * @access public
  822.      * @static
  823.      */
  824.  
  825.     public static function computeRights($methodRights$RORights null$FCRights null{
  826.         //Если уровень прав не указан, берем права документа
  827.         $RORights is_null($RORights)?$methodRights:$RORights;
  828.         $FCRights is_null($FCRights)?$methodRights:$FCRights;
  829.  
  830.  
  831.         //Если права на чтение на контрол меньше чем права на метод, то контрол - невидим
  832.         if($methodRights<$RORights{
  833.             $result FieldDescription::FIELD_MODE_NONE;
  834.         }
  835.         //Если права на чтение на контрол больше или равны правам на метод, и права на запись меньше  - просто выводится текст контрола
  836.         elseif($methodRights >= $RORights&&$methodRights<$FCRights)
  837.         {
  838.             $result FieldDescription::FIELD_MODE_READ;
  839.         }
  840.         elseif($methodRights>=$FCRights)
  841.         {
  842.             $result FieldDescription::FIELD_MODE_EDIT;
  843.         }
  844.  
  845.         Return $result;
  846.     }
  847.  
  848. }
В создании документации нам помог: phpDocumentor