<?php
/**
 * Базовый класс, 
 * описывающий поведение стандартного атрибута
 ***/    
abstract class attr {

    var $attr_name; // Имя объекта, с которым будет связан атрибут
    var $obj;       // Ссылка на объект
    var $sql_where;    // Внутренняя переменная для ограничения выборки объекта


    /**
     * Возвращаем тип данных для MySQL  
     * @return string тип данных
     */
    function getDBType() {
        return "varchar(255)"; // Тип данных в MySQL для хранения значения атрибута
    }

    /** 
     * Конструтор. Передается имя атрибута и ссылка на объект, для которого он инициируется 
     */
    function __construct( $attr_name, $obj ) {
           $this->attr_name = $attr_name;
           $this->obj = $obj;
    }
    
    /**
     * Вызывается при получении POST запроса с данным формы. Сохраняет данные в объект 
     * @return none
     */
    function lPost() {
        if ( ini_get('magic_quotes_gpc') ) {
            $this->obj->set($this->attr_name,stripslashes($_POST[$this->attr_name]));
        } else {
            $this->obj->set($this->attr_name,$_POST[$this->attr_name]);
        }
    }  
    

    /**
     * Получение текущего значения атрибута 
     * @return mixed текущие значение атрибута
     */
    function getCurVal() {
        return $this->obj->get( $this->attr_name );
    }
    
    
    /**
     * Получение основногом параметров атрибута (обычно шаблон) 
     * @return mixed
     */
    function getAttrTempl() {
        return str_replace("]","}",str_replace("[","{",$this->obj->attrs[$this->attr_name]['templ']));
    }

    /**
     * Получение конкретного параметра атрибута (тип, обязательность, шаблон итд)
     * @param  string $setting какой параметр нужно получить
     * @return mixed
     */
    function getAttrSetting($setting='') {
        return $this->obj->attrs[$this->attr_name][$setting];
    }


    /**
     * Метод вызывается всегда при сохранении объекта. 
     * Последние манипуляции с данными до сохранения в БД
     * @return none
     */
    function presave() {
        if (!is_array($this->getCurVal())) 
            $this->obj->set($this->attr_name, htmlspecialchars(  html_entity_decode( $this->getCurVal() ) ) );
    }  
    

    /**
     * Метод вызывается при валидации объекта. 
     * Проверяется корретность заполнения.
     * Соответвуют ли данные в атрибуте ожидаемым
     * @return bool прошел элемент валидацию или нет
     */
    function validate() {
        return true;
    }
    
    /**
     * Метод для отрисовки HTML элемента управления 
     * @return html код элемента для страницы
     */
    function render_input() {
        if ($this->obj->attrs[$this->attr_name]['mand']) {
          $required = ' required = "required" ';
        } else {
          $required = '';   
        }
        return '<input class="form-control" id="' . $this->attr_name . '" ' . $required . ' type="text" name="' . $this->attr_name . '" value="' .$this->getCurVal() . '">';        
    }

    /**
     * Метод для отрисовки HTML вывода в браузере 
     * @param  boolean $crop использовать сокращённый вывод (для таблиц админки)
     * @return html  преобразованное значение атрибута для вывода на экран
     */
    function render_text( $crop  = false) {
        return $this->getCurVal();
    }
    
    /**
     * Сохранение SQL ограничение при фильтрации объектов. Используется далее фильтрами
     * @param string $sql_where Хвост SQL запроса
     */
    function setSqlWhere( $sql_where ) {
        $this->sql_where =  $sql_where;
    }

    /**
     * Получаем HTML и SQL хвост для фильтрации объектов
     * @param  string $sql_where Хвост SQL запроса
     * @return array            ['html' => 'html код элемента с фильтром', 'sql'=>'SQL хвост запроса']
     */ 
    function getFilter( $sql_where = '' ) {
        return ['html'=> '', 'sql'=>''];
    }
    
      
    /**
     * После сохранения объекта, когда уже точно есть ID
     * @return none
     */
    function postsave() {
    }
    
    
}

?>