Создание модуля для 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

На данном этапе Magento уже знает о нашем модуле. Включить или выключить его можно при помощи изменения параметра конфигурационного файла.
Управлять модулем также можно через админку: System -> Configuration -> Advanced.
Значение local для узла говорит о том, что наш модуль относится к custom модулям и размещается в папке /app/code/local

Создание XML конфигурации для модуля

Создаем новый xml файл: /app/code/local/Snowcore/Blog/etc/config.xml

В данном файле определяются основные настройки модуля.
Секция отвечает за настройки меню и доступов к разным ресурсам в админ части приложения.
Часть хранит информацию об используемых моделях и ресурсах, хелперах и блоках.

Создание Helper

Хелпер содержит всего пару строчек кода /app/code/local/Snowcore/Blog/Helper/Data.php

Этот хелпер нужен для того, чтобы работала система переводов.
На данном этапе у нас должен появиться новый пункт в главном меню админки:

Magento admin menu

Сразу создадим хелпер для статей:
/app/code/local/Snowcore/Blog/Helper/Article.php

Создание моделей

Magento использует “тонкие” модели. Есть два типа моделей:

  • Обычная модель: отвечает за бизнес-логику
  • Ресурс-модель, которая работает с базой

Для начала нам понадобятся модели для статей.

Создаем обычную модель:
/app/code/local/Snowcore/Blog/Model/Article.php

В ней мы указываем ресурс-модель, с которой будет работать данная модель.

Создаем ресурс-модель:
/app/code/local/Snowcore/Blog/Model/Mysql4/Article.php

Второй параметр метода _init это первичный ключ таблицы articles.

Создаем коллекцию для статей:
/app/code/local/Snowcore/Blog/Model/Mysql4/Article/Collection.php
С коллекциями работает grid, который показывает список сущностей (статей).

SQL установщик для модуля

Установка модуля (создание таблиц в базе) происходит автоматически.
Здесь главное правильно указать версию для модуля, она должна совпадать с версией, которая назначена в XML конфигурации.
/app/code/local/Snowcore/Blog/sql/blog_setup/mysql4-install-0.1.0.php

Установка модуля (создание необходимых таблиц) происходит автоматически – при обращении к любой странице. Если возникают проблемы с установкой модуля (таблицы не создались) – посмотрите в базе таблицу core_resource, там должна быть запись со значением code = blog_setup. Удалите запись, модуль переустановится.

Создание Layout модуля

Создаем новый XML:
/app/design/adminhtml/default/default/layout/blog.xml

Создание блоков

Блоки отвечают за отображение модуля. В рамках первой статьи создаем блоки для админки.
Изначально нам понадобится блок для отображения списка существующих записей – grid.

Создаем контейнер для grid:
/app/code/local/Snowcore/Blog/Block/Adminhtml/Article.php

Далее создаем сам Grid:
/app/code/local/Snowcore/Blog/Block/Adminhtml/Article/Grid.php

Кратко о гриде:

  • В конструкторе мы задаем параметры сортировки
  • В методе _prepareCollection указывается, с какой коллекцией будет работать grid
  • Метод _prepareColumns позволяет определить, какие колонки будут отображаться в таблице сущностей
  • Метод getRowUrl определяет формат ссылки для перехода на форму редактирования (при клике на определенную строку)

Cоздание контроллера

В рамках этой статьи у контроллера будет только index action (отображение таблицы со статьями)
/app/code/local/Snowcore/Blog/controllers/Adminhtml/ArticleController.php

Наш контроллер пока содержит index действие, в котором происходит инициализация layout и breadcrumbs. На данном этапе на странице Manage Articles отображается содержимое таблицы статей. Таблица пока пустая, но для проверки работоспособности грида, можете добавить вручную пару записей в базу.
Mage_Adminhtml_Block_Widget_Grid предоставляет возможность использования фильтра и сортировки списка по заданным полям.

В итоге мы получили рабочую таблицу с возможностью фильтрации и сортировки данных. В следующей статье мы сделаем возможность управления записями таблицы.

See you soon 😉

  • Очень полезная статья для новичков в Магенто.

    ЗЫ Я два раза устанавливал магенто и все четно, не могу зайти в админку (((

  • @Максим: а ты Magento на локальной машине устанавливал? Какое имя хоста для сайта задал?

  • Если маженто устанавливается на локалхост, то нужно заходить на не не так: http://localhost, а вот так: http://127.0.0.1

  • Или просто создайте virtualhost с точкой в имени

  • Pingback: progg.ru()

  • Ребят, в случае проблем с админкой вовсе не надо мудрить с виртуал-хостами. Есть очень простое решение:

    Заходите в файл Magento_dir/app/code/core/Mage/Core/Model/Session/Abstract/Varien.php

    Ищете там блок кода :

    // set session cookie params
    session_set_cookie_params(
    $this->getCookie()->getLifetime(),
    $this->getCookie()->getPath(),
    $this->getCookie()->getDomain(),
    $this->getCookie()->isSecure(),
    $this->getCookie()->getHttponly()
    );

    и меняете его на вот такой:

    // set session cookie params
    session_set_cookie_params(
    $this->getCookie()->getLifetime(),
    $this->getCookie()->getPath()
    // $this->getCookie()->getDomain(),
    // $this->getCookie()->isSecure(),
    // $this->getCookie()->getHttponly()
    );

  • @Ilja Kotlov:
    по вашему, править код core модулей легче чем просто переименовать локальный хост? 😀

  • @Snowcore:

    да, по-моему легче, тем более, что это никак не влияет на безопасность системы и её работу в общем. Хотя, это вкусовщина, но я делаю именно так.=)

  • m4e

    @all
    Тем, кому больше понравился вариант Ilja Kotlov: если хотите писать для маженты: никогда не изменяйте core-файлы!

    Скопируйте файл, о котором говорится, в /app/code/local/…(дальше такой же путь как и в core)…/Varien.php
    и изменяйте его как душе угодно – маженто подтянет его вместо своего родного.

    @Snowcore:
    Статья ради кармы на хабре и плюсиков на аскдев? 😉 Получилось сродни первому уроку вождения – ни зачем, ни почему, просто “нужно делать именно так!”

  • @m4e: Миша, ты имеешь что-то против размещения МОЕЙ статьи МНОЙ на разных ресурсах? Или может, это уже запрещено?

    И при чем здесь первый урок вождения? Что ты этим хотел сказать???

  • Ilja Kotlov

    @m4e

    Согласен, была моя промашка, действительно так удобнее и правильнее.

    @Snowcore

    Дружище, расслабься, никто не посягает на твои права, просто человек немного некорректо выразился. Видимо, у него была мысль, что цель размещения статьи — получение как можно большего количества плюсов, а не на благо начинающим. Как человек, который уже достаточное время занимается разработкой на Магенто, могу сказать, что в своё время мне очень не хватало такой понятной статьи об основах создания модулей.

    На мой взгляд, упоминание первого урока вождения здесь вовсе неуместно.

  • Дамс, ради получения кармы и плюсов я бы использовал несколько иные способы…

    @Ilja Kotlov

    Спасибо за поддержку, сначала мне самому не хватало такого рода статей.

  • Спасибо за статью, интересно было ознакомится с движком.

  • Спасибо за полезную информацию. А как правильно на страницу редактирования article добавить wysiwyg-редактор? Нигде ни на аглицком, ни, тем более, на русском не нашел 🙁

  • kaiser Zaido

    Привет, посмотри плз вопрос про magento

    http://www.magentocommerce.com/boards/viewthread/77299/

    Спасибо.

  • Денис

    Привет

    попробовал сделать на Magento 1.4.0.1

    В админке в строке, где должны быть вкладки, ошибка:
    Fatal error: Class ‘Snowcore_Blog_Helper_Data’ not found in Z:homemagento1.ruwwwappMage.php on line 523

    (работает на денвере)

    автозагрузка не работает – файл Data.php размещен там же /app/code/local/Snowcore/Blog/Helper/Data.php

    проверял все методы Autoload
    все пути, все структуры директорий, заменял даже в названиях классов символ _ на символ _ (на случай, если при copypast другой символ появился, также как и обратные кавычки в /app/code/local/Snowcore/Blog/etc/config.xml

    помогите плиз

  • Денис

    сейчас попробовал сделать на сервере хостинга – все тоже самое просто скопировал директорию /app/code/local/Snowcore/Blog/ и файл config.xml по ftp, отключил cache – все заработало…

    проблема значит в денвере, с путями в винде

    не так подключаются файлы, но остальное же все работает!

    почему?

  • Очень четкая статья, тут описаны нюансы в двух словах, с которыми лично мне пришлось продолбаться на буржуйских форумах и блогах. А тут все в одной статье, компактно и точно 🙂
    Респект и уважуха! 😉

  • У меня другая проблема.

    Сделал, все как в статье.

    Создался пункт меню:
    со ссылкой сюда:
    /index.php/blog/adminhtml_article/

    переходя по которой происходит 404-я ошибка

  • lena

    Делала все как указано. Кеш отключен. Но новый пункт меню не появляется.

  • AnheL

    Спасибо за статью, а продолжение вообще будет? =)

  • alex

    я тоже делал все как указано. Но новый пункт меню не появляется.

  • Artem

    +100 Все инструкции выполнил. Нового пункта в меню не появляется. Пожалуйста, помогите советом, в чем может быть проблема.

  • Sam

    А когда будет-то вторая часть статьи?

  • Lady_A

    Очень ждем продолжения статьи. Часть 2! Когда будет?

  • Oxidane

    Спасибо за статью, то что нужно. А если пункт меню не появляется ищите проблемы в синтаксисе. При копи-пасте вставляются не те кавычки.
    Вместо ‘ и ’ -> ‘ и ‘
    Вместо “ и ” -> ” и “

  • Oxidane

    Ой, в общем русскоязычные кавычки надо заменить на англоязычные. =)

  • Здравствуйте. Делал свой модуль по примеру в этой статье. Возник вопрос по поводу “Установка модуля (создание таблиц в базе) происходит автоматически.” Почему это должно произойти и где это описано? У меня таблица не создалась.

  • temp

    Заметил проблему – при копировании кода в некоторые IDE возникает проблема с кавычками, одинарными и двойными – они не распознаются. Особенно это заметно при создании SQL-установщика – и тем самым первым делом устанавливается битая таблица. Чтобы ее удалить надо переставить модуль(после исправления всех кавычек), как и сказанно в конце пункта про SQL установщик.

  • В /app/code/local/Snowcore/Blog/etc/config.xml
    Если вы копировали всё от сюда то там неправильные кавычки. “” – вот эти подайдут!

  • Helly

    Добрый день. Подскажите как можно выявить ошибку, если при создании модуля на странице adminhtml_article grid не строится. Отображается только content-header с заголовком “Articles Manager” и кнопкой “Add Article”?

  • At

    Остановился на ошибке при попытке прорисовать таблицу.
    Fatal error: Call to a member function setSaveParametersInSession() on a non-object in /home/atb/mg/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Container.php on line 66
    Что крутить?
    Благодарю