Создание модуля для Magento – часть 1
Популярность Magento постоянно растет. Появляется множество новых интеренет-магазинов, написанных на этом замечательном движке.
К сожалению, информации для разработчиков маловато, поэтому, будем исправлять ситуацию 🙂
В мои планы входит написание нескольких статей о том, как создать модуль для Magento, на примере модуля блога.
Изначально ограничимся минимальным функционалом: напишем административную часть модуля, при помощи которой можно будет управлять статьями блога в админке.
Модуль создается в отдельном namespace. Обычно, namespace – это название компании разработчика модуля.
В данной статье я буду создавать модуль блога для Magento в своем неймспейсе Snowcore.
Название модуля не должно содержать символов подчеркивания. Все custom модули создаются в директории /app/code/local
Мой модуль будет называться Snowcore_Blog
Перейдем непосредственно к делу. Что же нужно для написания модуля для Magento?
Отключение кеша Magento
Первым делом отключаем cache в Magento, иначе не сможем увидеть своих изменений 🙂 Отключить кеширование можно в админке: System – Cache Management – в первой вкладке Cache Control изменяем параметр All Cache на Disable, жмем Save cache settings
Создание структуры директорий
В папке модуля создаем следующую структуру:
/app/code/local/Snowcore/Blog/
Block
controllers
etc
Helper
Model
sql
Добавляем директорию для шаблонов:
/app/design/frontend/default/default/template/blog
(здесь первый default – это интерфейс, второй default – тема)
Подключение модуля
Для подключения модуля нужно создать XML файл конфигурации:
/app/etc/modules/Snowcore_Blog.xml
1 2 3 4 5 6 7 8 9 |
<?xml version="1.0"?> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>config</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>modules</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>Snowcore_Blog</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>active</span><span style='color:#7f0055; '>></span>true<span style='color:#7f0055; '></</span><span style='color:#7f0055; '>active</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>codePool</span><span style='color:#7f0055; '>></span>local<span style='color:#7f0055; '></</span><span style='color:#7f0055; '>codePool</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '></</span><span style='color:#7f0055; '>Snowcore_Blog</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '></</span><span style='color:#7f0055; '>modules</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '></</span><span style='color:#7f0055; '>config</span><span style='color:#7f0055; '>></span> |
На данном этапе Magento уже знает о нашем модуле. Включить или выключить его можно при помощи изменения параметра
Управлять модулем также можно через админку: System -> Configuration -> Advanced.
Значение local для узла
Создание XML конфигурации для модуля
Создаем новый xml файл: /app/code/local/Snowcore/Blog/etc/config.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
<span style='color:#7f0055; '><</span><span style='color:#7f0055; '>config</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>modules</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>Snowcore_Blog</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>version</span><span style='color:#7f0055; '>></span>0.1.0<span style='color:#7f0055; '></</span><span style='color:#7f0055; '>version</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '></</span><span style='color:#7f0055; '>Snowcore_Blog</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '></</span><span style='color:#7f0055; '>modules</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>frontend</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>routers</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>blog</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>use</span><span style='color:#7f0055; '>></span>standard<span style='color:#7f0055; '></</span><span style='color:#7f0055; '>use</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>args</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>module</span><span style='color:#7f0055; '>></span>Snowcore_Blog<span style='color:#7f0055; '></</span><span style='color:#7f0055; '>module</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>frontName</span><span style='color:#7f0055; '>></span>blog<span style='color:#7f0055; '></</span><span style='color:#7f0055; '>frontName</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '></</span><span style='color:#7f0055; '>args</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '></</span><span style='color:#7f0055; '>blog</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '></</span><span style='color:#7f0055; '>routers</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '></</span><span style='color:#7f0055; '>frontend</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>admin</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>routers</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>blog</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>use</span><span style='color:#7f0055; '>></span>admin<span style='color:#7f0055; '></</span><span style='color:#7f0055; '>use</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>args</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>module</span><span style='color:#7f0055; '>></span>Snowcore_Blog<span style='color:#7f0055; '></</span><span style='color:#7f0055; '>module</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>frontName</span><span style='color:#7f0055; '>></span>blog<span style='color:#7f0055; '></</span><span style='color:#7f0055; '>frontName</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '></</span><span style='color:#7f0055; '>args</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '></</span><span style='color:#7f0055; '>blog</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '></</span><span style='color:#7f0055; '>routers</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '></</span><span style='color:#7f0055; '>admin</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>adminhtml</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; font-weight:bold; '>menu</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>blog</span> module=<span style='color:#2a00ff; '>"blog"</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; font-weight:bold; '>title</span><span style='color:#7f0055; '>></span>Blog<span style='color:#7f0055; '></</span><span style='color:#7f0055; font-weight:bold; '>title</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>sort_order</span><span style='color:#7f0055; '>></span>77<span style='color:#7f0055; '></</span><span style='color:#7f0055; '>sort_order</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>children</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>article</span> module=<span style='color:#2a00ff; '>"blog"</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; font-weight:bold; '>title</span><span style='color:#7f0055; '>></span>Manage Articles<span style='color:#7f0055; '></</span><span style='color:#7f0055; font-weight:bold; '>title</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>sort_order</span><span style='color:#7f0055; '>></span>0<span style='color:#7f0055; '></</span><span style='color:#7f0055; '>sort_order</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>action</span><span style='color:#7f0055; '>></span>blog/adminhtml_article<span style='color:#7f0055; '></</span><span style='color:#7f0055; '>action</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '></</span><span style='color:#7f0055; '>article</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '></</span><span style='color:#7f0055; '>children</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '></</span><span style='color:#7f0055; '>blog</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '></</span><span style='color:#7f0055; font-weight:bold; '>menu</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>acl</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>resources</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>all</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; font-weight:bold; '>title</span><span style='color:#7f0055; '>></span>Allow Everything<span style='color:#7f0055; '></</span><span style='color:#7f0055; font-weight:bold; '>title</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '></</span><span style='color:#7f0055; '>all</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>admin</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>children</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>blog</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; font-weight:bold; '>title</span><span style='color:#7f0055; '>></span>Blog Module<span style='color:#7f0055; '></</span><span style='color:#7f0055; font-weight:bold; '>title</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>sort_order</span><span style='color:#7f0055; '>></span>200<span style='color:#7f0055; '></</span><span style='color:#7f0055; '>sort_order</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '></</span><span style='color:#7f0055; '>blog</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '></</span><span style='color:#7f0055; '>children</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '></</span><span style='color:#7f0055; '>admin</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '></</span><span style='color:#7f0055; '>resources</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '></</span><span style='color:#7f0055; '>acl</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>layout</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>updates</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>blog</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>file</span><span style='color:#7f0055; '>></span>blog.xml<span style='color:#7f0055; '></</span><span style='color:#7f0055; '>file</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '></</span><span style='color:#7f0055; '>blog</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '></</span><span style='color:#7f0055; '>updates</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '></</span><span style='color:#7f0055; '>layout</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '></</span><span style='color:#7f0055; '>adminhtml</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>global</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>models</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>blog</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>class</span><span style='color:#7f0055; '>></span>Snowcore_Blog_Model<span style='color:#7f0055; '></</span><span style='color:#7f0055; '>class</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>resourceModel</span><span style='color:#7f0055; '>></span>blog_mysql4<span style='color:#7f0055; '></</span><span style='color:#7f0055; '>resourceModel</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '></</span><span style='color:#7f0055; '>blog</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>blog_mysql4</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>class</span><span style='color:#7f0055; '>></span>Snowcore_Blog_Model_Mysql4<span style='color:#7f0055; '></</span><span style='color:#7f0055; '>class</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>entities</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>article</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; font-weight:bold; '>table</span><span style='color:#7f0055; '>></span>blog_articles<span style='color:#7f0055; '></</span><span style='color:#7f0055; font-weight:bold; '>table</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '></</span><span style='color:#7f0055; '>article</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '></</span><span style='color:#7f0055; '>entities</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '></</span><span style='color:#7f0055; '>blog_mysql4</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '></</span><span style='color:#7f0055; '>models</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>resources</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>blog_setup</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>setup</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>module</span><span style='color:#7f0055; '>></span>Snowcore_Blog<span style='color:#7f0055; '></</span><span style='color:#7f0055; '>module</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '></</span><span style='color:#7f0055; '>setup</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>connection</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>use</span><span style='color:#7f0055; '>></span>core_setup<span style='color:#7f0055; '></</span><span style='color:#7f0055; '>use</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '></</span><span style='color:#7f0055; '>connection</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '></</span><span style='color:#7f0055; '>blog_setup</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>blog_write</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>connection</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>use</span><span style='color:#7f0055; '>></span>core_write<span style='color:#7f0055; '></</span><span style='color:#7f0055; '>use</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '></</span><span style='color:#7f0055; '>connection</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '></</span><span style='color:#7f0055; '>blog_write</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>blog_read</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>connection</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>use</span><span style='color:#7f0055; '>></span>core_read<span style='color:#7f0055; '></</span><span style='color:#7f0055; '>use</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '></</span><span style='color:#7f0055; '>connection</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '></</span><span style='color:#7f0055; '>blog_read</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '></</span><span style='color:#7f0055; '>resources</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>blocks</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>blog</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>class</span><span style='color:#7f0055; '>></span>Snowcore_Blog_Block<span style='color:#7f0055; '></</span><span style='color:#7f0055; '>class</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '></</span><span style='color:#7f0055; '>blog</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '></</span><span style='color:#7f0055; '>blocks</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>helpers</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>blog</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>class</span><span style='color:#7f0055; '>></span>Snowcore_Blog_Helper<span style='color:#7f0055; '></</span><span style='color:#7f0055; '>class</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '></</span><span style='color:#7f0055; '>blog</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '></</span><span style='color:#7f0055; '>helpers</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '></</span><span style='color:#7f0055; '>global</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '></</span><span style='color:#7f0055; '>config</span><span style='color:#7f0055; '>></span> |
В данном файле определяются основные настройки модуля.
Секция
Часть
Создание Helper
Хелпер содержит всего пару строчек кода /app/code/local/Snowcore/Blog/Helper/Data.php
1 2 3 4 5 6 |
<span style='color:#7f0055; background:#ffffe8; '><?php</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>class</span><span style='color:#000000; background:#ffffe8; '> Snowcore_Blog_Helper_Data </span><span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>extends</span><span style='color:#000000; background:#ffffe8; '> Mage_Core_Helper_Abstract</span> <span style='color:#000000; background:#ffffe8; '>{</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>}</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#7f0055; background:#ffffe8; '></span> |
Этот хелпер нужен для того, чтобы работала система переводов.
На данном этапе у нас должен появиться новый пункт в главном меню админки:

Сразу создадим хелпер для статей:
/app/code/local/Snowcore/Blog/Helper/Article.php
1 2 3 4 5 6 |
<span style='color:#7f0055; background:#ffffe8; '><?php</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>class</span><span style='color:#000000; background:#ffffe8; '> Snowcore_Blog_Helper_Article </span><span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>extends</span><span style='color:#000000; background:#ffffe8; '> Mage_Core_Helper_Abstract</span> <span style='color:#000000; background:#ffffe8; '>{</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>}</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#7f0055; background:#ffffe8; '></span> |
Создание моделей
Magento использует “тонкие” модели. Есть два типа моделей:
- Обычная модель: отвечает за бизнес-логику
- Ресурс-модель, которая работает с базой
Для начала нам понадобятся модели для статей.
Создаем обычную модель:
/app/code/local/Snowcore/Blog/Model/Article.php
1 2 3 4 5 6 7 8 9 10 |
<span style='color:#7f0055; background:#ffffe8; '><?php</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>class</span><span style='color:#000000; background:#ffffe8; '> Snowcore_Blog_Model_Article </span><span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>extends</span><span style='color:#000000; background:#ffffe8; '> Mage_Core_Model_Abstract</span> <span style='color:#000000; background:#ffffe8; '>{</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>    </span><span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>public</span><span style='color:#000000; background:#ffffe8; '> </span><span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>function</span><span style='color:#000000; background:#ffffe8; '> _construct</span><span style='color:#000000; background:#ffffe8; '>(</span><span style='color:#000000; background:#ffffe8; '>)</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>    </span><span style='color:#000000; background:#ffffe8; '>{</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>        parent</span><span style='color:#000000; background:#ffffe8; '>::</span><span style='color:#000000; background:#ffffe8; '>_construct</span><span style='color:#000000; background:#ffffe8; '>(</span><span style='color:#000000; background:#ffffe8; '>)</span><span style='color:#000000; background:#ffffe8; '>;</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>        </span><span style='color:#000000; background:#ffffe8; '>$</span><span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>this</span><span style='color:#000000; background:#ffffe8; '>-</span><span style='color:#000000; background:#ffffe8; '>></span><span style='color:#000000; background:#ffffe8; '>_init</span><span style='color:#000000; background:#ffffe8; '>(</span><span style='color:#2a00ff; background:#ffffe8; '>'blog/article'</span><span style='color:#000000; background:#ffffe8; '>)</span><span style='color:#000000; background:#ffffe8; '>;</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>    </span><span style='color:#000000; background:#ffffe8; '>}</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>}</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#7f0055; background:#ffffe8; '></span> |
В ней мы указываем ресурс-модель, с которой будет работать данная модель.
Создаем ресурс-модель:
/app/code/local/Snowcore/Blog/Model/Mysql4/Article.php
1 2 3 4 5 6 7 8 9 |
<span style='color:#7f0055; background:#ffffe8; '><?php</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>class</span><span style='color:#000000; background:#ffffe8; '> Snowcore_Blog_Model_Mysql4_Article </span><span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>extends</span><span style='color:#000000; background:#ffffe8; '> Mage_Core_Model_Mysql4_Abstract</span> <span style='color:#000000; background:#ffffe8; '>{</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>    </span><span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>public</span><span style='color:#000000; background:#ffffe8; '> </span><span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>function</span><span style='color:#000000; background:#ffffe8; '> _construct</span><span style='color:#000000; background:#ffffe8; '>(</span><span style='color:#000000; background:#ffffe8; '>)</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>    </span><span style='color:#000000; background:#ffffe8; '>{</span><span style='color:#000000; background:#ffffe8; '> </span> <span style='color:#000000; background:#ffffe8; '>        </span><span style='color:#000000; background:#ffffe8; '>$</span><span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>this</span><span style='color:#000000; background:#ffffe8; '>-</span><span style='color:#000000; background:#ffffe8; '>></span><span style='color:#000000; background:#ffffe8; '>_init</span><span style='color:#000000; background:#ffffe8; '>(</span><span style='color:#2a00ff; background:#ffffe8; '>'blog/article'</span><span style='color:#000000; background:#ffffe8; '>,</span><span style='color:#000000; background:#ffffe8; '> </span><span style='color:#2a00ff; background:#ffffe8; '>'article_id'</span><span style='color:#000000; background:#ffffe8; '>)</span><span style='color:#000000; background:#ffffe8; '>;</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>    </span><span style='color:#000000; background:#ffffe8; '>}</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>}</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#7f0055; background:#ffffe8; '></span> |
Второй параметр метода _init это первичный ключ таблицы articles.
Создаем коллекцию для статей:
/app/code/local/Snowcore/Blog/Model/Mysql4/Article/Collection.php
С коллекциями работает grid, который показывает список сущностей (статей).
1 2 3 4 5 6 7 8 9 10 |
<span style='color:#7f0055; background:#ffffe8; '><?php</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>class</span><span style='color:#000000; background:#ffffe8; '> Snowcore_Blog_Model_Mysql4_Article_Collection </span><span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>extends</span><span style='color:#000000; background:#ffffe8; '> Mage_Core_Model_Mysql4_Collection_Abstract</span> <span style='color:#000000; background:#ffffe8; '>{</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>    </span><span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>public</span><span style='color:#000000; background:#ffffe8; '> </span><span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>function</span><span style='color:#000000; background:#ffffe8; '> _construct</span><span style='color:#000000; background:#ffffe8; '>(</span><span style='color:#000000; background:#ffffe8; '>)</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>    </span><span style='color:#000000; background:#ffffe8; '>{</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>        parent</span><span style='color:#000000; background:#ffffe8; '>::</span><span style='color:#000000; background:#ffffe8; '>_construct</span><span style='color:#000000; background:#ffffe8; '>(</span><span style='color:#000000; background:#ffffe8; '>)</span><span style='color:#000000; background:#ffffe8; '>;</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>        </span><span style='color:#000000; background:#ffffe8; '>$</span><span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>this</span><span style='color:#000000; background:#ffffe8; '>-</span><span style='color:#000000; background:#ffffe8; '>></span><span style='color:#000000; background:#ffffe8; '>_init</span><span style='color:#000000; background:#ffffe8; '>(</span><span style='color:#2a00ff; background:#ffffe8; '>'blog/article'</span><span style='color:#000000; background:#ffffe8; '>)</span><span style='color:#000000; background:#ffffe8; '>;</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>    </span><span style='color:#000000; background:#ffffe8; '>}</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>}</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#7f0055; background:#ffffe8; '></span> |
SQL установщик для модуля
Установка модуля (создание таблиц в базе) происходит автоматически.
Здесь главное правильно указать версию для модуля, она должна совпадать с версией, которая назначена в XML конфигурации.
/app/code/local/Snowcore/Blog/sql/blog_setup/mysql4-install-0.1.0.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<span style='color:#7f0055; background:#ffffe8; '><?php</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>$installer</span><span style='color:#000000; background:#ffffe8; '> </span><span style='color:#000000; background:#ffffe8; '>=</span><span style='color:#000000; background:#ffffe8; '> </span><span style='color:#000000; background:#ffffe8; '>$</span><span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>this</span><span style='color:#000000; background:#ffffe8; '>;</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>$installer</span><span style='color:#000000; background:#ffffe8; '>-</span><span style='color:#000000; background:#ffffe8; '>></span><span style='color:#000000; background:#ffffe8; '>startSetup</span><span style='color:#000000; background:#ffffe8; '>(</span><span style='color:#000000; background:#ffffe8; '>)</span><span style='color:#000000; background:#ffffe8; '>;</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>$installer</span><span style='color:#000000; background:#ffffe8; '>-</span><span style='color:#000000; background:#ffffe8; '>></span><span style='color:#000000; background:#ffffe8; '>run</span><span style='color:#000000; background:#ffffe8; '>(</span><span style='color:#2a00ff; background:#ffffe8; '>"</span> <span style='color:#2a00ff; background:#ffffe8; '></span> <span style='color:#2a00ff; background:#ffffe8; '>-- DROP TABLE IF EXISTS </span><span style='color:#2a00ff; background:#ffffe8; '>{</span><span style='color:#2a00ff; background:#ffffe8; '>$</span><span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>this</span><span style='color:#2a00ff; background:#ffffe8; '>-</span><span style='color:#2a00ff; background:#ffffe8; '>></span><span style='color:#2a00ff; background:#ffffe8; '>getTable</span><span style='color:#2a00ff; background:#ffffe8; '>(</span><span style='color:#2a00ff; background:#ffffe8; '>'blog_articles'</span><span style='color:#2a00ff; background:#ffffe8; '>)</span><span style='color:#2a00ff; background:#ffffe8; '>}</span><span style='color:#2a00ff; background:#ffffe8; '>;</span> <span style='color:#2a00ff; background:#ffffe8; '>CREATE TABLE </span><span style='color:#2a00ff; background:#ffffe8; '>{</span><span style='color:#2a00ff; background:#ffffe8; '>$</span><span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>this</span><span style='color:#2a00ff; background:#ffffe8; '>-</span><span style='color:#2a00ff; background:#ffffe8; '>></span><span style='color:#2a00ff; background:#ffffe8; '>getTable</span><span style='color:#2a00ff; background:#ffffe8; '>(</span><span style='color:#2a00ff; background:#ffffe8; '>'blog_articles'</span><span style='color:#2a00ff; background:#ffffe8; '>)</span><span style='color:#2a00ff; background:#ffffe8; '>}</span><span style='color:#2a00ff; background:#ffffe8; '> (</span> <span style='color:#2a00ff; background:#ffffe8; '>  `article_id` int(10) unsigned NOT NULL AUTO_INCREMENT,</span> <span style='color:#2a00ff; background:#ffffe8; '>  `title` varchar(150) NOT NULL,</span> <span style='color:#2a00ff; background:#ffffe8; '>  `slug` varchar(150) NOT NULL,</span> <span style='color:#2a00ff; background:#ffffe8; '>  `content` text,</span> <span style='color:#2a00ff; background:#ffffe8; '>  `meta_keywords` varchar(255) NOT NULL DEFAULT '',</span> <span style='color:#2a00ff; background:#ffffe8; '>  `meta_description` varchar(160) NOT NULL DEFAULT '',</span> <span style='color:#2a00ff; background:#ffffe8; '>  `created_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,</span> <span style='color:#2a00ff; background:#ffffe8; '>  PRIMARY KEY (`article_id`)</span> <span style='color:#2a00ff; background:#ffffe8; '>) ENGINE=InnoDB DEFAULT CHARSET=utf8</span> <span style='color:#2a00ff; background:#ffffe8; '>    "</span><span style='color:#000000; background:#ffffe8; '>)</span><span style='color:#000000; background:#ffffe8; '>;</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>$installer</span><span style='color:#000000; background:#ffffe8; '>-</span><span style='color:#000000; background:#ffffe8; '>></span><span style='color:#000000; background:#ffffe8; '>endSetup</span><span style='color:#000000; background:#ffffe8; '>(</span><span style='color:#000000; background:#ffffe8; '>)</span><span style='color:#000000; background:#ffffe8; '>;</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#7f0055; background:#ffffe8; '></span> |
Установка модуля (создание необходимых таблиц) происходит автоматически – при обращении к любой странице. Если возникают проблемы с установкой модуля (таблицы не создались) – посмотрите в базе таблицу core_resource, там должна быть запись со значением code = blog_setup. Удалите запись, модуль переустановится.
Создание Layout модуля
Создаем новый XML:
/app/design/adminhtml/default/default/layout/blog.xml
1 2 3 4 5 6 7 8 |
<?xml version="1.0"?> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>layout</span> version=<span style='color:#2a00ff; '>"0.1.0"</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>blog_adminhtml_article_index</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>reference</span> name=<span style='color:#2a00ff; '>"content"</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '><</span><span style='color:#7f0055; '>block</span> type=<span style='color:#2a00ff; '>"blog/adminhtml_article"</span> name=<span style='color:#2a00ff; '>"article"</span> <span style='color:#7f0055; '>/></span> <span style='color:#7f0055; '></</span><span style='color:#7f0055; '>reference</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '></</span><span style='color:#7f0055; '>blog_adminhtml_article_index</span><span style='color:#7f0055; '>></span> <span style='color:#7f0055; '></</span><span style='color:#7f0055; '>layout</span><span style='color:#7f0055; '>></span> |
Создание блоков
Блоки отвечают за отображение модуля. В рамках первой статьи создаем блоки для админки.
Изначально нам понадобится блок для отображения списка существующих записей – grid.
Создаем контейнер для grid:
/app/code/local/Snowcore/Blog/Block/Adminhtml/Article.php
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<span style='color:#7f0055; background:#ffffe8; '><?php</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>class</span><span style='color:#000000; background:#ffffe8; '> Snowcore_Blog_Block_Adminhtml_Article </span><span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>extends</span><span style='color:#000000; background:#ffffe8; '> Mage_Adminhtml_Block_Widget_Grid_Container</span> <span style='color:#000000; background:#ffffe8; '>{</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>    </span><span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>public</span><span style='color:#000000; background:#ffffe8; '> </span><span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>function</span><span style='color:#000000; background:#ffffe8; '> </span><span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>__construct</span><span style='color:#000000; background:#ffffe8; '>(</span><span style='color:#000000; background:#ffffe8; '>)</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>    </span><span style='color:#000000; background:#ffffe8; '>{</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>        </span><span style='color:#000000; background:#ffffe8; '>$</span><span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>this</span><span style='color:#000000; background:#ffffe8; '>-></span><span style='color:#000000; background:#ffffe8; '>_controller</span><span style='color:#000000; background:#ffffe8; '> </span><span style='color:#000000; background:#ffffe8; '>=</span><span style='color:#000000; background:#ffffe8; '> </span><span style='color:#2a00ff; background:#ffffe8; '>'adminhtml_article'</span><span style='color:#000000; background:#ffffe8; '>;</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>        </span><span style='color:#000000; background:#ffffe8; '>$</span><span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>this</span><span style='color:#000000; background:#ffffe8; '>-></span><span style='color:#000000; background:#ffffe8; '>_blockGroup</span><span style='color:#000000; background:#ffffe8; '> </span><span style='color:#000000; background:#ffffe8; '>=</span><span style='color:#000000; background:#ffffe8; '> </span><span style='color:#2a00ff; background:#ffffe8; '>'blog'</span><span style='color:#000000; background:#ffffe8; '>;</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>        </span><span style='color:#000000; background:#ffffe8; '>$</span><span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>this</span><span style='color:#000000; background:#ffffe8; '>-></span><span style='color:#000000; background:#ffffe8; '>_headerText</span><span style='color:#000000; background:#ffffe8; '> </span><span style='color:#000000; background:#ffffe8; '>=</span><span style='color:#000000; background:#ffffe8; '> Mage</span><span style='color:#000000; background:#ffffe8; '>::</span><span style='color:#000000; background:#ffffe8; '>helper</span><span style='color:#000000; background:#ffffe8; '>(</span><span style='color:#2a00ff; background:#ffffe8; '>'blog/article'</span><span style='color:#000000; background:#ffffe8; '>)</span><span style='color:#000000; background:#ffffe8; '>-</span><span style='color:#000000; background:#ffffe8; '>></span><span style='color:#000000; background:#ffffe8; '>__</span><span style='color:#000000; background:#ffffe8; '>(</span><span style='color:#2a00ff; background:#ffffe8; '>'Articles Manager'</span><span style='color:#000000; background:#ffffe8; '>)</span><span style='color:#000000; background:#ffffe8; '>;</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>        </span><span style='color:#000000; background:#ffffe8; '>$</span><span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>this</span><span style='color:#000000; background:#ffffe8; '>-></span><span style='color:#000000; background:#ffffe8; '>_addButtonLabel</span><span style='color:#000000; background:#ffffe8; '> </span><span style='color:#000000; background:#ffffe8; '>=</span><span style='color:#000000; background:#ffffe8; '> Mage</span><span style='color:#000000; background:#ffffe8; '>::</span><span style='color:#000000; background:#ffffe8; '>helper</span><span style='color:#000000; background:#ffffe8; '>(</span><span style='color:#2a00ff; background:#ffffe8; '>'blog/article'</span><span style='color:#000000; background:#ffffe8; '>)</span><span style='color:#000000; background:#ffffe8; '>-</span><span style='color:#000000; background:#ffffe8; '>></span><span style='color:#000000; background:#ffffe8; '>__</span><span style='color:#000000; background:#ffffe8; '>(</span><span style='color:#2a00ff; background:#ffffe8; '>'Add Article'</span><span style='color:#000000; background:#ffffe8; '>)</span><span style='color:#000000; background:#ffffe8; '>;</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>        parent</span><span style='color:#000000; background:#ffffe8; '>::</span><span style='color:#000000; background:#ffffe8; '>__construct</span><span style='color:#000000; background:#ffffe8; '>(</span><span style='color:#000000; background:#ffffe8; '>)</span><span style='color:#000000; background:#ffffe8; '>;</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>    </span><span style='color:#000000; background:#ffffe8; '>}</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>}</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#7f0055; background:#ffffe8; '></span> |
Далее создаем сам Grid:
/app/code/local/Snowcore/Blog/Block/Adminhtml/Article/Grid.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
<span style='color:#7f0055; background:#ffffe8; '><?php</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>class</span><span style='color:#000000; background:#ffffe8; '> Snowcore_Blog_Block_Adminhtml_Article_Grid </span><span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>extends</span><span style='color:#000000; background:#ffffe8; '> Mage_Adminhtml_Block_Widget_Grid</span> <span style='color:#000000; background:#ffffe8; '>{</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>    </span><span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>public</span><span style='color:#000000; background:#ffffe8; '> </span><span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>function</span><span style='color:#000000; background:#ffffe8; '> </span><span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>__construct</span><span style='color:#000000; background:#ffffe8; '>(</span><span style='color:#000000; background:#ffffe8; '>)</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>    </span><span style='color:#000000; background:#ffffe8; '>{</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>        parent</span><span style='color:#000000; background:#ffffe8; '>::</span><span style='color:#000000; background:#ffffe8; '>__construct</span><span style='color:#000000; background:#ffffe8; '>(</span><span style='color:#000000; background:#ffffe8; '>)</span><span style='color:#000000; background:#ffffe8; '>;</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>        </span><span style='color:#000000; background:#ffffe8; '>$</span><span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>this</span><span style='color:#000000; background:#ffffe8; '>-</span><span style='color:#000000; background:#ffffe8; '>></span><span style='color:#000000; background:#ffffe8; '>setId</span><span style='color:#000000; background:#ffffe8; '>(</span><span style='color:#2a00ff; background:#ffffe8; '>'blogArticleGrid'</span><span style='color:#000000; background:#ffffe8; '>)</span><span style='color:#000000; background:#ffffe8; '>;</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>        </span><span style='color:#000000; background:#ffffe8; '>$</span><span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>this</span><span style='color:#000000; background:#ffffe8; '>-</span><span style='color:#000000; background:#ffffe8; '>></span><span style='color:#000000; background:#ffffe8; '>setDefaultSort</span><span style='color:#000000; background:#ffffe8; '>(</span><span style='color:#2a00ff; background:#ffffe8; '>'article_id'</span><span style='color:#000000; background:#ffffe8; '>)</span><span style='color:#000000; background:#ffffe8; '>;</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>        </span><span style='color:#000000; background:#ffffe8; '>$</span><span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>this</span><span style='color:#000000; background:#ffffe8; '>-</span><span style='color:#000000; background:#ffffe8; '>></span><span style='color:#000000; background:#ffffe8; '>setDefaultDir</span><span style='color:#000000; background:#ffffe8; '>(</span><span style='color:#2a00ff; background:#ffffe8; '>'ASC'</span><span style='color:#000000; background:#ffffe8; '>)</span><span style='color:#000000; background:#ffffe8; '>;</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>        </span><span style='color:#000000; background:#ffffe8; '>$</span><span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>this</span><span style='color:#000000; background:#ffffe8; '>-</span><span style='color:#000000; background:#ffffe8; '>></span><span style='color:#000000; background:#ffffe8; '>setSaveParametersInSession</span><span style='color:#000000; background:#ffffe8; '>(</span><span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>true</span><span style='color:#000000; background:#ffffe8; '>)</span><span style='color:#000000; background:#ffffe8; '>;</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>    </span><span style='color:#000000; background:#ffffe8; '>}</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>    </span><span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>protected</span><span style='color:#000000; background:#ffffe8; '> </span><span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>function</span><span style='color:#000000; background:#ffffe8; '> _prepareCollection</span><span style='color:#000000; background:#ffffe8; '>(</span><span style='color:#000000; background:#ffffe8; '>)</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>    </span><span style='color:#000000; background:#ffffe8; '>{</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>        </span><span style='color:#000000; background:#ffffe8; '>$collection</span><span style='color:#000000; background:#ffffe8; '> </span><span style='color:#000000; background:#ffffe8; '>=</span><span style='color:#000000; background:#ffffe8; '> Mage</span><span style='color:#000000; background:#ffffe8; '>::</span><span style='color:#000000; background:#ffffe8; '>getModel</span><span style='color:#000000; background:#ffffe8; '>(</span><span style='color:#2a00ff; background:#ffffe8; '>'blog/article'</span><span style='color:#000000; background:#ffffe8; '>)</span><span style='color:#000000; background:#ffffe8; '>-</span><span style='color:#000000; background:#ffffe8; '>></span><span style='color:#000000; background:#ffffe8; '>getCollection</span><span style='color:#000000; background:#ffffe8; '>(</span><span style='color:#000000; background:#ffffe8; '>)</span><span style='color:#000000; background:#ffffe8; '>;</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>        </span><span style='color:#000000; background:#ffffe8; '>$</span><span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>this</span><span style='color:#000000; background:#ffffe8; '>-</span><span style='color:#000000; background:#ffffe8; '>></span><span style='color:#000000; background:#ffffe8; '>setCollection</span><span style='color:#000000; background:#ffffe8; '>(</span><span style='color:#000000; background:#ffffe8; '>$collection</span><span style='color:#000000; background:#ffffe8; '>)</span><span style='color:#000000; background:#ffffe8; '>;</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>        </span><span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>return</span><span style='color:#000000; background:#ffffe8; '> parent</span><span style='color:#000000; background:#ffffe8; '>::</span><span style='color:#000000; background:#ffffe8; '>_prepareCollection</span><span style='color:#000000; background:#ffffe8; '>(</span><span style='color:#000000; background:#ffffe8; '>)</span><span style='color:#000000; background:#ffffe8; '>;</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>    </span><span style='color:#000000; background:#ffffe8; '>}</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>    </span><span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>protected</span><span style='color:#000000; background:#ffffe8; '> </span><span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>function</span><span style='color:#000000; background:#ffffe8; '> _prepareColumns</span><span style='color:#000000; background:#ffffe8; '>(</span><span style='color:#000000; background:#ffffe8; '>)</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>    </span><span style='color:#000000; background:#ffffe8; '>{</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>        </span><span style='color:#000000; background:#ffffe8; '>$</span><span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>this</span><span style='color:#000000; background:#ffffe8; '>-</span><span style='color:#000000; background:#ffffe8; '>></span><span style='color:#000000; background:#ffffe8; '>addColumn</span><span style='color:#000000; background:#ffffe8; '>(</span><span style='color:#2a00ff; background:#ffffe8; '>'article_id'</span><span style='color:#000000; background:#ffffe8; '>,</span><span style='color:#000000; background:#ffffe8; '> </span><span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>array</span><span style='color:#000000; background:#ffffe8; '>(</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>          </span><span style='color:#2a00ff; background:#ffffe8; '>'header'</span><span style='color:#000000; background:#ffffe8; '> </span><span style='color:#000000; background:#ffffe8; '>=</span><span style='color:#000000; background:#ffffe8; '>></span><span style='color:#000000; background:#ffffe8; '> Mage</span><span style='color:#000000; background:#ffffe8; '>::</span><span style='color:#000000; background:#ffffe8; '>helper</span><span style='color:#000000; background:#ffffe8; '>(</span><span style='color:#2a00ff; background:#ffffe8; '>'blog/article'</span><span style='color:#000000; background:#ffffe8; '>)</span><span style='color:#000000; background:#ffffe8; '>-</span><span style='color:#000000; background:#ffffe8; '>></span><span style='color:#000000; background:#ffffe8; '>__</span><span style='color:#000000; background:#ffffe8; '>(</span><span style='color:#2a00ff; background:#ffffe8; '>'ID'</span><span style='color:#000000; background:#ffffe8; '>)</span><span style='color:#000000; background:#ffffe8; '>,</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>          </span><span style='color:#2a00ff; background:#ffffe8; '>'align'</span><span style='color:#000000; background:#ffffe8; '> </span><span style='color:#000000; background:#ffffe8; '>=</span><span style='color:#000000; background:#ffffe8; '>></span><span style='color:#2a00ff; background:#ffffe8; '>'right'</span><span style='color:#000000; background:#ffffe8; '>,</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>          </span><span style='color:#2a00ff; background:#ffffe8; '>'width'</span><span style='color:#000000; background:#ffffe8; '> </span><span style='color:#000000; background:#ffffe8; '>=</span><span style='color:#000000; background:#ffffe8; '>></span><span style='color:#000000; background:#ffffe8; '> </span><span style='color:#2a00ff; background:#ffffe8; '>'50px'</span><span style='color:#000000; background:#ffffe8; '>,</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>          </span><span style='color:#2a00ff; background:#ffffe8; '>'index'</span><span style='color:#000000; background:#ffffe8; '> </span><span style='color:#000000; background:#ffffe8; '>=</span><span style='color:#000000; background:#ffffe8; '>></span><span style='color:#000000; background:#ffffe8; '> </span><span style='color:#2a00ff; background:#ffffe8; '>'article_id'</span><span style='color:#000000; background:#ffffe8; '>,</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>        </span><span style='color:#000000; background:#ffffe8; '>)</span><span style='color:#000000; background:#ffffe8; '>)</span><span style='color:#000000; background:#ffffe8; '>;</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>        </span><span style='color:#000000; background:#ffffe8; '>$</span><span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>this</span><span style='color:#000000; background:#ffffe8; '>-</span><span style='color:#000000; background:#ffffe8; '>></span><span style='color:#000000; background:#ffffe8; '>addColumn</span><span style='color:#000000; background:#ffffe8; '>(</span><span style='color:#2a00ff; background:#ffffe8; '>'title'</span><span style='color:#000000; background:#ffffe8; '>,</span><span style='color:#000000; background:#ffffe8; '> </span><span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>array</span><span style='color:#000000; background:#ffffe8; '>(</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>          </span><span style='color:#2a00ff; background:#ffffe8; '>'header'</span><span style='color:#000000; background:#ffffe8; '> </span><span style='color:#000000; background:#ffffe8; '>=</span><span style='color:#000000; background:#ffffe8; '>></span><span style='color:#000000; background:#ffffe8; '> Mage</span><span style='color:#000000; background:#ffffe8; '>::</span><span style='color:#000000; background:#ffffe8; '>helper</span><span style='color:#000000; background:#ffffe8; '>(</span><span style='color:#2a00ff; background:#ffffe8; '>'blog/article'</span><span style='color:#000000; background:#ffffe8; '>)</span><span style='color:#000000; background:#ffffe8; '>-</span><span style='color:#000000; background:#ffffe8; '>></span><span style='color:#000000; background:#ffffe8; '>__</span><span style='color:#000000; background:#ffffe8; '>(</span><span style='color:#2a00ff; background:#ffffe8; '>'Title'</span><span style='color:#000000; background:#ffffe8; '>)</span><span style='color:#000000; background:#ffffe8; '>,</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>          </span><span style='color:#2a00ff; background:#ffffe8; '>'align'</span><span style='color:#000000; background:#ffffe8; '> </span><span style='color:#000000; background:#ffffe8; '>=</span><span style='color:#000000; background:#ffffe8; '>></span><span style='color:#000000; background:#ffffe8; '> </span><span style='color:#2a00ff; background:#ffffe8; '>'left'</span><span style='color:#000000; background:#ffffe8; '>,</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>          </span><span style='color:#2a00ff; background:#ffffe8; '>'index'</span><span style='color:#000000; background:#ffffe8; '> </span><span style='color:#000000; background:#ffffe8; '>=</span><span style='color:#000000; background:#ffffe8; '>></span><span style='color:#000000; background:#ffffe8; '> </span><span style='color:#2a00ff; background:#ffffe8; '>'title'</span><span style='color:#000000; background:#ffffe8; '>,</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>        </span><span style='color:#000000; background:#ffffe8; '>)</span><span style='color:#000000; background:#ffffe8; '>)</span><span style='color:#000000; background:#ffffe8; '>;</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>        </span><span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>return</span><span style='color:#000000; background:#ffffe8; '> parent</span><span style='color:#000000; background:#ffffe8; '>::</span><span style='color:#000000; background:#ffffe8; '>_prepareColumns</span><span style='color:#000000; background:#ffffe8; '>(</span><span style='color:#000000; background:#ffffe8; '>)</span><span style='color:#000000; background:#ffffe8; '>;</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>    </span><span style='color:#000000; background:#ffffe8; '>}</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>    </span><span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>public</span><span style='color:#000000; background:#ffffe8; '> </span><span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>function</span><span style='color:#000000; background:#ffffe8; '> getRowUrl</span><span style='color:#000000; background:#ffffe8; '>(</span><span style='color:#000000; background:#ffffe8; '>$row</span><span style='color:#000000; background:#ffffe8; '>)</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>    </span><span style='color:#000000; background:#ffffe8; '>{</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>        </span><span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>return</span><span style='color:#000000; background:#ffffe8; '> </span><span style='color:#000000; background:#ffffe8; '>$</span><span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>this</span><span style='color:#000000; background:#ffffe8; '>-</span><span style='color:#000000; background:#ffffe8; '>></span><span style='color:#000000; background:#ffffe8; '>getUrl</span><span style='color:#000000; background:#ffffe8; '>(</span><span style='color:#2a00ff; background:#ffffe8; '>'*/*/edit'</span><span style='color:#000000; background:#ffffe8; '>,</span><span style='color:#000000; background:#ffffe8; '> </span><span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>array</span><span style='color:#000000; background:#ffffe8; '>(</span><span style='color:#2a00ff; background:#ffffe8; '>'id'</span><span style='color:#000000; background:#ffffe8; '> </span><span style='color:#000000; background:#ffffe8; '>=</span><span style='color:#000000; background:#ffffe8; '>></span><span style='color:#000000; background:#ffffe8; '> </span><span style='color:#000000; background:#ffffe8; '>$row</span><span style='color:#000000; background:#ffffe8; '>-</span><span style='color:#000000; background:#ffffe8; '>></span><span style='color:#000000; background:#ffffe8; '>getId</span><span style='color:#000000; background:#ffffe8; '>(</span><span style='color:#000000; background:#ffffe8; '>)</span><span style='color:#000000; background:#ffffe8; '>)</span><span style='color:#000000; background:#ffffe8; '>)</span><span style='color:#000000; background:#ffffe8; '>;</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>    </span><span style='color:#000000; background:#ffffe8; '>}</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>}</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#7f0055; background:#ffffe8; '></span> |
Кратко о гриде:
- В конструкторе мы задаем параметры сортировки
- В методе _prepareCollection указывается, с какой коллекцией будет работать grid
- Метод _prepareColumns позволяет определить, какие колонки будут отображаться в таблице сущностей
- Метод getRowUrl определяет формат ссылки для перехода на форму редактирования (при клике на определенную строку)
Cоздание контроллера
В рамках этой статьи у контроллера будет только index action (отображение таблицы со статьями)
/app/code/local/Snowcore/Blog/controllers/Adminhtml/ArticleController.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<span style='color:#7f0055; background:#ffffe8; '><?php</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>class</span><span style='color:#000000; background:#ffffe8; '> Snowcore_Blog_Adminhtml_ArticleController </span><span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>extends</span><span style='color:#000000; background:#ffffe8; '> Mage_Adminhtml_Controller_action</span> <span style='color:#000000; background:#ffffe8; '>{</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>    </span><span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>protected</span><span style='color:#000000; background:#ffffe8; '> </span><span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>function</span><span style='color:#000000; background:#ffffe8; '> _initAction</span><span style='color:#000000; background:#ffffe8; '>(</span><span style='color:#000000; background:#ffffe8; '>)</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>    </span><span style='color:#000000; background:#ffffe8; '>{</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>        </span><span style='color:#000000; background:#ffffe8; '>$</span><span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>this</span><span style='color:#000000; background:#ffffe8; '>-</span><span style='color:#000000; background:#ffffe8; '>></span><span style='color:#000000; background:#ffffe8; '>loadLayout</span><span style='color:#000000; background:#ffffe8; '>(</span><span style='color:#000000; background:#ffffe8; '>)</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>            </span><span style='color:#000000; background:#ffffe8; '>-</span><span style='color:#000000; background:#ffffe8; '>></span><span style='color:#000000; background:#ffffe8; '>_setActiveMenu</span><span style='color:#000000; background:#ffffe8; '>(</span><span style='color:#2a00ff; background:#ffffe8; '>'blog/article'</span><span style='color:#000000; background:#ffffe8; '>)</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>            </span><span style='color:#000000; background:#ffffe8; '>-</span><span style='color:#000000; background:#ffffe8; '>></span><span style='color:#000000; background:#ffffe8; '>_addBreadcrumb</span><span style='color:#000000; background:#ffffe8; '>(</span><span style='color:#000000; background:#ffffe8; '>Mage</span><span style='color:#000000; background:#ffffe8; '>::</span><span style='color:#000000; background:#ffffe8; '>helper</span><span style='color:#000000; background:#ffffe8; '>(</span><span style='color:#2a00ff; background:#ffffe8; '>'adminhtml'</span><span style='color:#000000; background:#ffffe8; '>)</span><span style='color:#000000; background:#ffffe8; '>-</span><span style='color:#000000; background:#ffffe8; '>></span><span style='color:#000000; background:#ffffe8; '>__</span><span style='color:#000000; background:#ffffe8; '>(</span><span style='color:#2a00ff; background:#ffffe8; '>'Articles Manager'</span><span style='color:#000000; background:#ffffe8; '>)</span><span style='color:#000000; background:#ffffe8; '>,</span><span style='color:#000000; background:#ffffe8; '> Mage</span><span style='color:#000000; background:#ffffe8; '>::</span><span style='color:#000000; background:#ffffe8; '>helper</span><span style='color:#000000; background:#ffffe8; '>(</span><span style='color:#2a00ff; background:#ffffe8; '>'adminhtml'</span><span style='color:#000000; background:#ffffe8; '>)</span><span style='color:#000000; background:#ffffe8; '>-</span><span style='color:#000000; background:#ffffe8; '>></span><span style='color:#000000; background:#ffffe8; '>__</span><span style='color:#000000; background:#ffffe8; '>(</span><span style='color:#2a00ff; background:#ffffe8; '>'Articles Manager'</span><span style='color:#000000; background:#ffffe8; '>)</span><span style='color:#000000; background:#ffffe8; '>)</span><span style='color:#000000; background:#ffffe8; '>;</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>        </span><span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>return</span><span style='color:#000000; background:#ffffe8; '> </span><span style='color:#000000; background:#ffffe8; '>$</span><span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>this</span><span style='color:#000000; background:#ffffe8; '>;</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>    </span><span style='color:#000000; background:#ffffe8; '>}</span><span style='color:#000000; background:#ffffe8; '> </span> <span style='color:#000000; background:#ffffe8; '>   </span> <span style='color:#000000; background:#ffffe8; '>    </span><span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>public</span><span style='color:#000000; background:#ffffe8; '> </span><span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>function</span><span style='color:#000000; background:#ffffe8; '> indexAction</span><span style='color:#000000; background:#ffffe8; '>(</span><span style='color:#000000; background:#ffffe8; '>)</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>    </span><span style='color:#000000; background:#ffffe8; '>{</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>        </span><span style='color:#000000; background:#ffffe8; '>$</span><span style='color:#7f0055; background:#ffffe8; font-weight:bold; '>this</span><span style='color:#000000; background:#ffffe8; '>-</span><span style='color:#000000; background:#ffffe8; '>></span><span style='color:#000000; background:#ffffe8; '>_initAction</span><span style='color:#000000; background:#ffffe8; '>(</span><span style='color:#000000; background:#ffffe8; '>)</span><span style='color:#000000; background:#ffffe8; '> </span> <span style='color:#000000; background:#ffffe8; '>            </span><span style='color:#000000; background:#ffffe8; '>-</span><span style='color:#000000; background:#ffffe8; '>></span><span style='color:#000000; background:#ffffe8; '>renderLayout</span><span style='color:#000000; background:#ffffe8; '>(</span><span style='color:#000000; background:#ffffe8; '>)</span><span style='color:#000000; background:#ffffe8; '>;</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>    </span><span style='color:#000000; background:#ffffe8; '>}</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#000000; background:#ffffe8; '>}</span><span style='color:#000000; background:#ffffe8; '></span> <span style='color:#7f0055; background:#ffffe8; '></span> |
Наш контроллер пока содержит index действие, в котором происходит инициализация layout и breadcrumbs. На данном этапе на странице Manage Articles отображается содержимое таблицы статей. Таблица пока пустая, но для проверки работоспособности грида, можете добавить вручную пару записей в базу.
Mage_Adminhtml_Block_Widget_Grid предоставляет возможность использования фильтра и сортировки списка по заданным полям.
В итоге мы получили рабочую таблицу с возможностью фильтрации и сортировки данных. В следующей статье мы сделаем возможность управления записями таблицы.
See you soon 😉
Pingback: progg.ru()