Головна » Блоги » InstantCMS - переваги та недоліки системи » Розширюємо можливості фільтрів для дат в наборах для InstantCMS 2

Розширюємо можливості фільтрів для дат в наборах для InstantCMS 2

+1
Голосів: 1
Опубліковано: 2018 / 04 / 16
Переглядів: 218
Редагувалося: 6 раз — останній 11 травня 2018
Вітаю!
Однією з "фішок" другої гілки системи, безперчно, є набори в типах контенту. Спробуємо іх трішечки розширити.

Коротеньке пояснення для тих, хто поки не в курсі справи: набори дозволяють вивести список записів любого типу контенту за певними правилами. Для прикладу, можна впорядкувати записи за алфавітом, рейтингом, переглядами; можна відфільтрувати певним чином потрібні записи. При цьому є можливість використовувати для створення наборів більшість полів, що використані в даному типі контенту.
Дуже часто доводиться створювати набори, де використувається поле типу "дата". І от тут є певна можливість для покращення. Справа в тому, що доступні опції для роботи з датами в минулому. А от для майбутніх дат фільтрів в системі не існує.
Запропонований нижче хак, дозволить виводити записи за додатковими правилами "сьогодні", "не раніше ніж" та "не пізніше ніж". Наприклад, для організації на сайті чогось подібного до афіші, саме те.
Отже, як зробити? Наведений нижче код, актуальний для версії системи 2.9.0

Відкиваємо файл system/core/model.php, після коду (приблизно рядок 708):
Код PHP:
  1.  
  2. public function filterDateOlder($field, $value, $interval='DAY'){
  3. if (strpos($field, '.') === false){ $field = 'i.' . $field; }
  4. $value = $this->db->escape($value);
  5. $interval = $this->db->escape($interval);
  6. $this->filter("$field < DATE_SUB(NOW(), INTERVAL {$value} {$interval})");
  7. return $this;
  8. }
  9.  
додамо потрібні функції:
Код PHP:
  1.  
  2. public function filterDateCurrent($field){
  3. if (strpos($field, '.') === false){ $field = 'i.' . $field; }
  4. $this->filter("$field = DATE(NOW())");
  5. return $this;
  6. }
  7. public function filterDateEarlier($field, $value, $interval='DAY'){
  8. if (strpos($field, '.') === false){ $field = 'i.' . $field; }
  9. $value = $this->db->escape($value);
  10. $interval = $this->db->escape($interval);
  11. $this->filter("DATE_SUB(($field), INTERVAL {$value} {$interval}) >= DATE(NOW())");
  12. return $this;
  13. }
  14. public function filterDateLater($field, $value, $interval='DAY'){
  15. if (strpos($field, '.') === false){ $field = 'i.' . $field; }
  16. $value = $this->db->escape($value);
  17. $interval = $this->db->escape($interval);
  18. $this->filter("DATE_SUB(($field), INTERVAL {$value} {$interval}) < DATE(NOW())");
  19. return $this;
  20. }
В тому ж файлі, після:
Код PHP:
  1.  
  2. case 'do': $this->filterDateOlder($filter['field'], $filter['value']); break;
  3.  
вставимо:
Код PHP:
  1.  
  2. case 'dc': $this-> filterDateCurrent($filter['field'], $filter['value']); break;
  3. case 'de': $this-> filterDateEarlier($filter['field'], $filter['value']); break;
  4. case 'dl': $this-> filterDateLater($filter['field'], $filter['value']); break;
  5.  
Далі знайдемо файл system/controllers/admin/forms/form_ctypes_dataset.php, в якому після:
Код PHP:
  1.  
  2. 'do' => LANG_FILTER_DATE_OLDER,
  3.  
вставимо:
Код PHP:
  1.  
  2. 'de' => LANG_FILTER_DATE_EARLIER,
  3. 'dl' => LANG_FILTER_DATE_LATER,
  4. 'dc' => LANG_FILTER_DATE_CURRENT,
  5.  
Залишилося призначити текстові константи. Для цього відкриємо файл system/languages/встановлений-мовний-пакет/language.php, де в любому місці вкажемо:
Код PHP:
  1.  
  2. define('LANG_FILTER_DATE_EARLIER', 'не раніше, днів');
  3. define('LANG_FILTER_DATE_LATER', 'не пізніше, днів');
  4. define('LANG_FILTER_DATE_CURRENT', 'актуальна дата');
  5.  
Не забувайте помічати зміни в файлах, щоб потім було простіше їх знайти.

В принципі, готово! Тепер ми маємо додаткові можливості для фільтраціїї, з чим нас і вітаю!
Миру вам!

Читайте також:

Коментарі (0)

Немає коментарів. Ваш буде першим!