ModelFilter - фильтр записей

Зависимости

  • нет зависимостей

Компонент добавляет на сайт модель ModelFilter, которая позволяет реализовать лёгкий и быстрый фильтр элементов таблицы.

Пример использования

Допустим у нас есть модель TestModel, с различными полями. Мы добавляем в неё публичную переменную $filter и инициализируем её в конструкторе:

        class TestModel extends Model
        {
            public $filter;
       
            public function __construct($id = NULL)
            {
                global $g_databases;
                parent::__construct($g_databases->db, 'model_test', 'id', $id, false);
       
                $this->filter = new ModelFilter($g_databases->db, $this->table);
            }
       
            public function CreateTable()
            {
                static $arrCreates = array();
       
                if (!isset($arrCreates[$this->table]))
                {
                    $this->db->query("CREATE TABLE IF NOT EXISTS ?# 
                                     ( 
                                       `id` int(11) NOT NULL AUTO_INCREMENT, 
       
                                       `text1` varchar(256) CHARACTER SET utf8 NOT NULL, 
                                       `text2` varchar(256) CHARACTER SET utf8 NOT NULL, 
       
                                       `int` int(11), 
                                       `flt` float, 
       
                                       PRIMARY KEY (`id`) 
                                     ) ENGINE=MyISAM DEFAULT CHARSET=latin1",
                                     $this->table);
                }
            }
            // ...
        }
    

Теперь через эту переменную $filter можно осуществлять поиск нужных элементов:

        $testModel = new TestModel();

        $filter = array();
        $filter["int"] = array('min' => 3007); // все элементы у которых 'int' больше-равно 3007
       
        $ids = $testModel->filter->Filter($filter, 2, 3, "text1"); // вернуть 3 элемента начиная с 2. Упорядочить записи по полю text1
        $ids = $testModel->filter->FilterTotal($filter); // общее количество элементов
    

Другие примеры задания фильтра:

        $filter = array();
        // все элементы у которых 'int' равно 3002 или 3005 или 3007 или 3008
        $filter["int"] = array(3002, 3005, 3007, 3008); 

        $filter = array();
        // все элементы у которых либо text1 либо text2 равны ABC
        $filter["text1,text2"] = "ABC"; 

        $filter = array();
        // все элементы у которых text1 равно ABC, а text2 равно DEF
        $filter["text1"] = "ABC"; 
        $filter["text2"] = "DEF";

        $filter = array();
        // все элементы у которых либо text1 либо text2 содержат подстроку "а20" либо подстроку "text"
        $filter["text1,text2"] = array("а20", "%text%");
    

Примеры сортировки:

        // Вернуть и упорядочить записи по полю text1
        $ids = $testModel->filter->Filter($filter, 0, 99, "text1"); 

        // Вернуть и упорядочить записи по полю text1 и полю text2
        $ids = $testModel->filter->Filter($filter, 0, 99, array("text1", "text2")); 

        // Вернуть и упорядочить записи по полю text1 и полю text2, но упорядочить все в обратном порядке
        $ids = $testModel->filter->Filter($filter, 0, 99, array("text1", "text2"), true); 

        // Вернуть и упорядочить записи по полю text1 в обратном порядке и полю text2 в прямом порядке.
        $ids = $testModel->filter->Filter($filter, 0, 99, array("text1", "text2"), "text1"); 

        // Вернуть и упорядочить записи по полю text1 в обратном порядке и полю text2 в в обратном порядке (эквивалент примера номер 3)
        $ids = $testModel->filter->Filter($filter, 0, 99, array("text1", "text2"), array("text1", "text2")); 
    

Если нужно вернусть все элементы, то массив $filter просто должен быть пуст.