Частина 16 - додаємо фільтри і вчимося створювати свої

Частина 16 - додаємо фільтри і вчимося створювати свої

Фільтри значно покращують зручність керування списком записів в панелі адміністратора.

В цілому ми додамо три фільтра:

Також я покажу, як легко можна створити свої власні фільтри за допомогою класу JHtml.







Змінюємо модель списку повідомлень

Отже, відкриваємо файл admin / models / helloworlds.php і починаємо вносити зміни.

Вибірка даних для формування списку у нас відбувається в методі getListQuery (). Давайте подивимося, як він змінився:

Спочатку за допомогою методу escape () ми екрануючи спеціальні символи типу "%", які можуть міститися в пошуковому запиті. Потім ми обрамляемо запит в лапки, але не екрануючи його повторно, передаючи другим аргументом false в метод quote ().

Значення фільтрів ми отримуємо зі стану моделі. Тому необхідно додати отримання цих значень в метод populateState ():

Тут ми отримуємо і встановлюємо значення наших фільтрів. При цьому ми використовуємо метод getUserStateFromRequest (). який доступний нам з батьківського класу JModelList. Цей метод отримує значення змінної стану користувача (сесії) і заново встановлює це значення в разі його зміни. Для того, щоб значення в стані користувача були унікальні між різними компонентами, ми використовуємо властивість $ this-> context з батьківського класу JModel. яке встановлюється в його конструкторі.

У підсумку ми отримуємо ефект запам'ятовування значення фільтрів. Найімовірніше ви звертали на це увагу при роботі з Joomla - фільтри зберігаються при переході між компонентами до тих пір, поки ви не вийдете з панелі адміністратора. Тільки тоді відбувається обнуління стану користувача і відповідно фільтрів.

Нам також необхідно додати метод getStoreId ():

Цей метод використовується для кешування даних. У ньому ми враховуємо поточний стан фільтрів, яке необхідно для створення унікального store id. Воно повсюдно використовується в батьківському класі JModelList. де є ключем у властивості-масиві $ cache.

змінюємо хелпер

Змінюємо уявлення списку повідомлень

Так як у нас тепер є фільтр стану повідомлення, ми можемо змінити логіку видалення повідомлень. Первинно ми будемо розміщувати їх в корзину, а видаляти можна буде тільки ті повідомлення, які вже були поміщені в кошик. Для цього трохи змінимо метод addToolBar ():

Тепер, коли значення фільтра стану дорівнюватиме -2 (в кошику) у нас буде з'являтися кнопка «Очистити кошик». В іншому випадку замість неї буде відображатися кнопка «В кошик».

Змінюємо шаблони списку повідомлень

Спочатку змінимо основний шаблон admin / views / helloworlds / tmpl / default.php і додамо в нього фільтри:







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

Поточні значення фільтрів ми беремо зі стану моделі. Також хотілося б відзначити, що будь-яка зміна фільтрів призводить до відправки форми за допомогою this.form.submit ().

А в суб-шаблоні admin / views / helloworlds / tmpl / default_foot.php миувелічіваем значення colspan:

У підсумку виходить ось така картинка:

Змінюємо контролер повідомлення

Відкриваємо файл admin / controller / helloworld.php і вносимо одне невелика зміна в метод allowAdd () - міняємо рядок

Тут ми просто додали значення за замовчуванням, яке береться з фільтра.

Змінюємо файл форми

У файлі форми необхідно додати два значення стану:

Відкрийте файл admin / models / forms / helloworld.xml і додайте для поля state ці два значення:

Додаємо мовні константи

Відкрийте файл admin / language / en-GB / en-GB.com_helloworld.ini і додайте:

COM_HELLOWORLD_FILTER_SEARCH_DESC = "You can search by any text in greeting."
COM_HELLOWORLD_N_ITEMS_ARCHIVED_1 = "One message archived"
COM_HELLOWORLD_N_ITEMS_ARCHIVED = ". Messages archived"
COM_HELLOWORLD_N_ITEMS_TRASHED_1 = "One message trashed"
COM_HELLOWORLD_N_ITEMS_TRASHED = ". Messages trashed"

Відкрийте файл admin / language / ru-RU / ru-RU.com_helloworld.ini і додайте:

COM_HELLOWORLD_FILTER_SEARCH_DESC = "Ви можете шукати по будь-якого тексту в привітанні."
COM_HELLOWORLD_N_ITEMS_ARCHIVED_1 = "1 повідомлення вміщено в Архів"
COM_HELLOWORLD_N_ITEMS_ARCHIVED_2 = ". Повідомлення вміщено в Архів"
COM_HELLOWORLD_N_ITEMS_ARCHIVED_MORE = ". Повідомлень поміщено в Архів"
COM_HELLOWORLD_N_ITEMS_TRASHED_1 = "1 повідомлення вміщено до Кошику"
COM_HELLOWORLD_N_ITEMS_TRASHED_2 = ". Повідомлення вміщено до Кошику"
COM_HELLOWORLD_N_ITEMS_TRASHED_MORE = ". Повідомлень поміщено до Кошику"

Збираємо пакет установки компонента

Не забудьте поміняти номер версії в файлі helloworld.xml:

Вміст директорії з кодом:

Запакуйте директорію в архівний файл (zip, tar, tar.gz, bz2) або скачайте його безпосередньо c GitHub. Далі встановіть його, використовуючи менеджер розширень Joomla. Тепер в списку записів з'явилися фільтри.

Код для цієї частини

Створюємо свої власні фільтри за допомогою класу JHtml

Створювати свої власні фільтри з JHtml досить просто. Давайте уявимо, що в Joomla не доступний вбудований фільтр стану, тому нам необхідно створити свій.

Перше, що потрібно зробити, це вказати класу JHtml. де шукати файли, в яких визначені наші функції для роботи з фільтрами. Робиться це за допомогою методу addIncludePath (). Припустимо, що ми будемо зберігати ці файли в папці / admin / helpers / html. тоді в точці входу /admin/helloworld.php ми додаємо:

Далі створюємо в цій папці файл filters.php наступного змісту:

Тепер ми можемо замінити рядок

Все працює так само, як ніби ми використовували вбудований в Joomla фільтр стану.

Але як JHtml визначає, що потрібно викликати саме метод stateOptions () класу HelloWorldHtmlFilters з файлу filters.php. Я думаю, що ви вже здогадалися, що відповідь криється в ключі 'helloworldhtml.filters.stateOptions'. який JHtml розбирає на наступні складові:

  • перший сегмент - префікс класу, а якщо не вказано, то JHtml;
  • другий сегмент - ім'я файлу
  • третій сегмент - метод класу

При цьому для отримання імені класу JHtml об'єднує перший і другий сегмент. Таким чином, знаючи цей ключ, Ви можете легко знайти наявні в Joomla класи, які працюють не тільки з фільтрами, але з різними елементами типу 'date', 'sliders' і т.п. Наприклад, використовуваний нами в фільтрах ключ 'select.options' призведе до файлу libraries / joomla / html / html / select.php в якому Ви знайдете клас JHtmlSelect і метод options ().

Але, ми можемо піти ще далі і створити цілий select-фільтр, а не просто масив опцій:

Тепер ми можемо замінити рядок

на ще більш простий варіант

Втім, JHtml не більше ніж красива обгортка для виклику статичних методів. Ніхто не забороняє в точці входу зареєструвати хелпер в автозавантажувач:

І далі виводити фільтр ось так:

Не знаю, який варіант віддасте перевагу ви, але особисто мені більше до душі використання JHtml.