Фільтри значно покращують зручність керування списком записів в панелі адміністратора.
В цілому ми додамо три фільтра:
Також я покажу, як легко можна створити свої власні фільтри за допомогою класу 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.