Создаем админку для нашего модуля
В админке мы создадим отдельный блок. В этом блоке мы будем выводить стандартный список записей (Grid), форму работы с данными. Среди полей формы будет поле для выбора картинки и HTML редактор для форматированного вывода контента.
Для этого, нам нужно создать:
- класс контроллера модуля в админке (будет работать с данными реализовывать CRUD)
- класс блока для вывода grid-a
- класс хелпера - (у нас хелпер будет реализовывать функционал вывода полного пути картинки и url картинки)
- в файле конфигурации, нам нужно указать информацию о блоке и создать кнопку меню для перехода на наш блок
- Класс grid-a
- Класс блока для вывода формы
- Класс виджета формы
Создаем класс контроллера нашего модуля в админке
Контроллер будет заниматься выводом таблицы со списком записей и организовывать удаление, добавление (в том числе массовое удаление) и редактирование данных. Также, контроллер будет сохранять картинки, которые будет передаваться формой.
Создаем каталог:
app/code/local/My/Articles/controllers/Adminhtml
Создаем файл контроллера:
app/code/local/My/Articles/controllers/Adminhtml/ArticlesController.php
Добавляем код:
<?php
/**
* Class My_Articles_Adminhtml_ArticlesController
* Класс контроллера
* 1 выводит список записей
* 2 выводит форму для редактирования данных
* 3 обрабатывает данные из формы + сохраняет картинку
* 4 реализует массовое удаление данных
*/
class My_Articles_Adminhtml_ArticlesController extends Mage_Adminhtml_Controller_Action
{
/**
* Вывод таблицы со списком данных
*/
public function indexAction()
{
/**
* Загружаем Layout
*/
$this->loadLayout();
/**
* Активируем меню
*/
$this->_setActiveMenu('myarticles');
/**
* Получаем класс блока
*/
$contentBlock = $this->getLayout()->createBlock('my_articles_block/adminhtml_articles');
/**
* Инициализируем контент
*/
$this->_addContent($contentBlock);
/**
* Выводим данные
*/
$this->renderLayout();
}
/**
* Вывод формы для добавления данных
* В данном случае перебрасывается на экшин редактирования
*/
public function newAction()
{
$this->_forward('edit');
}
/**
* Редактирование данных
*/
public function editAction()
{
/**
* Получаем id данных модели если нет - 0 (0 - это новая запись)
*/
$id = (int) $this->getRequest()->getParam('id');
/**
* Получаем модель
*/
$model = Mage::getModel('myarticles/articles')->load($id);
/**
* Регистрируем модель в глобальном секторе
*/
Mage::register('current_article', $model);
/**
* Активируем меню
*/
$this->loadLayout()->_setActiveMenu('myarticles');
/**
* Загружаем блок
*/
$layout = $this->getLayout()->createBlock('my_articles_block/adminhtml_articles_edit');
/**
* Создаем контент
*/
$this->_addContent($layout);
/**
* Выводим данные
*/
$this->renderLayout();
}
/**
* Сохранение данных из формы
*/
public function saveAction()
{
/**
* Получаем данные формы из POST
*/
if ($data = $this->getRequest()->getPost()) {
try {
/**
* Загружаем хелпер
*/
$helper = Mage::helper('myarticles');
/**
* Загружаем модель
*/
$model = Mage::getModel('myarticles/articles');
/**
* Передаем модели данные из POST
*/
$model->setData($data)->setId($this->getRequest()->getParam('id'));
/**
* Если не указали дату - передаем текущую
*/
if (!$model->getCreated()){
$model->setCreated(now());
}
/**
* Сохраняем данные в модели
*/
$model->save();
/**
* Получаем Id модели (если мы создаем новую запись - id мы узнаем после сохранения)
*/
$id = $model->getId();
/**
* Смотрим, предала ли форма картинку
* Из хелпера получаем путь для картинки и сохраняем ее
* Если ошибка - удаляем картинку
* Если все ок - записываем в модель имя картинки
*/
if (isset($_FILES['image']['name']) && $_FILES['image']['name'] != '') {
$uploader = new Varien_File_Uploader('image');
$uploader->setAllowedExtensions(array('jpg', 'jpeg'));
$uploader->setAllowRenameFiles(false);
$uploader->setFilesDispersion(false);
$uploader->save($helper->getImagePath(), $id . '.jpg'); // Upload the image
$model->setImage($id . '.jpg');
$model->save();
} else {
if (isset($data['image']['delete']) && $data['image']['delete'] == 1) {
@unlink($helper->getImagePath($id));
}
}
/**
* Результат сохранения записываем в сессию и выводим сообщение
*/
Mage::getSingleton('adminhtml/session')->addSuccess($this->__('Article was saved successfully'));
Mage::getSingleton('adminhtml/session')->setFormData(false);
$this->_redirect('*/*/');
} catch (Exception $e) {
Mage::getSingleton('adminhtml/session')->addError($e->getMessage());
Mage::getSingleton('adminhtml/session')->setFormData($data);
$this->_redirect('*/*/edit', array(
'id' => $this->getRequest()->getParam('id')
));
}
return;
}
Mage::getSingleton('adminhtml/session')->addError($this->__('Unable to find item to save'));
/**
* Перебрасываем на страницу со списком
*/
$this->_redirect('*/*/');
}
/**
* Удаление одной картинки
*/
public function deleteAction()
{
/**
* Получаем id записи
*/
if ($id = $this->getRequest()->getParam('id')) {
try {
/**
* Удаляем запись
*/
Mage::getModel('myarticles/articles')->setId($id)->delete();
Mage::getSingleton('adminhtml/session')->addSuccess($this->__('Article was deleted successfully'));
} catch (Exception $e) {
Mage::getSingleton('adminhtml/session')->addError($e->getMessage());
$this->_redirect('*/*/edit', array('id' => $id));
}
}
$this->_redirect('*/*/');
}
/**
* Массовое удаление записей
*/
public function massDeleteAction()
{
/**
* Получаем список id записей
*/
$articles = $this->getRequest()->getParam('article', null);
/**
* Если записи есть - обходим и по одной удаляем
* После удаления - переходим в список записей и выводим в сообщении результат
*/
if (is_array($articles) && sizeof($articles) > 0) {
try {
foreach ($articles as $id) {
Mage::getModel('myarticles/articles')->setId($id)->delete();
}
$this->_getSession()->addSuccess($this->__('Total of %d articles have been deleted', sizeof($articles)));
} catch (Exception $e) {
$this->_getSession()->addError($e->getMessage());
}
} else {
$this->_getSession()->addError($this->__('Please select article'));
}
$this->_redirect('*/*');
}
}
Создаем класс-хелпер
Нам понадобится хелпер для разных часто повторяющихся служебных случаев например, когда мы будем выводить наши данные на frontend-е - нам нужно будет определять наличие файлов картинок и наш хелпер нам поможет вернув полный путь к файлу по id записи. Также, наш хелпер поможет вернуть url картинки в общем, мы можем реализовать разные полезности в нем.
Создаем каталог:
app/code/local/My/Articles/Helper
Создаем файл:
app/code/local/My/Articles/Helper/Data.php
Добавляем код:
<?php
/**
* Class My_Articles_Helper_Data
* Класс хелпер
* Реализует вывод полного пути по id
* и вывод url по id записи
*/
class My_Articles_Helper_Data extends Mage_Core_Helper_Abstract
{
/**
* Функция реализует вывод полного пути к файлу картинки по id записи
* Передаем id записи
* @param int $id
* @return string
*/
public function getImagePath($id = 0)
{
$path = Mage::getBaseDir('media') . '/my_articles';
if ($id) {
return "{$path}/{$id}.jpg";
} else {
return $path;
}
}
/**
* Функция реализует вывод url к файлу картинки по id записи
* Передаем id записи
* @param int $id
* @return string
*/
public function getImageUrl($id = 0)
{
$url = Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_MEDIA) . 'my_articles/';
if ($id) {
return $url . $id . '.jpg';
} else {
return $url;
}
}
}
Создаем класс блока в админке
Классы блоков используются Magento для вывода данных на странице. Так, мы передаем логику, которая необходима для вывода, классам блокам, а контроллерам передаем функционал обработки данных полученными из формы и сохранением их в базу.
Создаем каталоги:
app/code/local/My/Articles/Block app/code/local/My/Articles/Block/Adminhtml
Создаем файл:
app/code/local/My/Articles/Block/Adminhtml/Articles.php
Добавляем код:
<?php
class My_Articles_Block_Adminhtml_Articles extends Mage_Adminhtml_Block_Widget_Grid_Container
{
protected function _construct()
{
parent::_construct();
$helper = Mage::helper('myarticles');
$this->_blockGroup = 'my_articles_block';
$this->_controller = 'adminhtml_articles';
$this->_headerText = $helper->__('Article Management');
$this->_addButtonLabel = $helper->__('Add Article');
}
}
Добавляем параметры в файл конфигурации
В этом файле мы укажем Magento на наш модуль, добавим кнопку в меню и укажем информацию о нашем блоке.
app/code/local/My/Articles/etc/config.xml
Нам нужно добавить блоки (см. комментарии):
- Код для блока
- Код для админки
- Код для меню админки
<?xml version="1.0" ?>
<config>
<modules>
<My_Articles>
<version>1.0.0</version>
</My_Articles>
</modules>
<!-- Код для контроллера -->
<frontend>
<routers>
<marticles>
<use>standard</use>
<args>
<module>My_Articles</module>
<frontName>articles</frontName>
</args>
</marticles>
</routers>
</frontend>
<global>
<!-- Код для моделей -->
<models>
<myarticles>
<class>My_Articles_Model</class>
<resourceModel>myarticles_recource</resourceModel>
</myarticles>
<!-- Код для ресурсов модели -->
<myarticles_recource>
<class>My_Articles_Model_Resource</class>
<entities>
<table_myarticles>
<table>my_articles</table>
</table_myarticles>
</entities>
</myarticles_recource>
</models>
<!-- Код для добавления таблиц в базу -->
<resources>
<marticles_setup>
<setup>
<module>My_Articles</module>
</setup>
</marticles_setup>
</resources>
<!-- Код для блока -->
<blocks>
<my_articles>
<class>My_Articles_Block</class>
</my_articles>
</blocks>
<!-- Код для хелпера -->
<helpers>
<myarticles>
<class>My_Articles_Helper</class>
</myarticles>
</helpers>
</global>
<!-- Код для админки -->
<admin>
<routers>
<myarticles_admin>
<use>admin</use>
<args>
<module>My_Articles</module>
<frontName>myarticles_admin</frontName>
</args>
</myarticles_admin>
</routers>
</admin>
<!-- Код для меню админки -->
<adminhtml>
<menu>
<myarticles module="myarticles">
<title>My Articles</title>
<sort_order>77</sort_order>
<action>myarticles_admin/adminhtml_articles</action>
</myarticles>
</menu>
</adminhtml>
</config>Создаем Grid (вывод списка статей) в админке
Тут мы формируем вывод grid-a. Мы указываем какие поля мы будем выводить и формируем выпадающий список для действий с записями.
Создаем папку:
app/code/local/My/Articles/Block/Adminhtml/Articles
Создаем файл:
app/code/local/My/Articles/Block/Adminhtml/Articles/Grid.php
Добавляем код:
<?php
class My_Articles_Block_Adminhtml_Articles_Grid extends Mage_Adminhtml_Block_Widget_Grid
{
/**
Инициализируем коллекцию.
*/
protected function _prepareCollection()
{
$collection = Mage::getModel("myarticles/articles")->getCollection();
$this->setCollection($collection);
return parent::_prepareCollection();
}
/**
Указываем поля, которые хотим видеть в гриде
*/
protected function _prepareColumns()
{
$helper = Mage::helper('myarticles');
$this->addColumn('id', array(
'header' => $helper->__('Articles ID'),
'width' => '50px',
'index' => 'id'
));
$this->addColumn('title', array(
'header' => $helper->__('Title'),
'index' => 'title',
'type' => 'text',
));
$this->addColumn('created', array(
'header' => $helper->__('Created'),
'index' => 'created',
'type' => 'date',
));
return parent::_prepareColumns();
}
/**
* Возвращаем ссылку на форму редактирования данными
* Кликнув на строку grid-а - мы перейдем на эту форму
* @param $model
* @return string
*/
public function getRowUrl($model)
{
return $this->getUrl('*/*/edit', array(
'id' => $model->getId(),
));
}
/**
* В заголовке grid-a будет выводится выпадающий список для выбора действий
* Тут мы добавляем в список параметр для удаления выбранных записей
* @return $this
*/
protected function _prepareMassaction()
{
$this->setMassactionIdField('id');
$this->getMassactionBlock()->setFormFieldName('article');
$this->getMassactionBlock()->addItem('delete', array(
'label' => $this->__('Delete'),
'url' => $this->getUrl('*/*/massDelete'),
));
return $this;
}
}
Создаем блок для редактирования
Тут мы создаем блок, внутри которого будет выводится виджет формы. Мы также инициализируем использование редактора (wysiwyg).
Создаем файл:
app/code/local/My/Articles/Block/Adminhtml/Articles/Edit.php
Добавляем код:
<?php
class My_Articles_Block_Adminhtml_Articles_Edit extends Mage_Adminhtml_Block_Widget_Form_Container
{
protected function _prepareLayout()
{
parent::_prepareLayout();
if (Mage::getSingleton('cms/wysiwyg_config')->isEnabled()) {
$this->getLayout()->getBlock('head')->setCanLoadTinyMce(true);
}
}
protected function _construct()
{
$this->_blockGroup = 'my_articles_block';
$this->_controller = 'adminhtml_articles';
}
public function getHeaderText()
{
$helper = Mage::helper('myarticles');
$model = Mage::registry('current_article');
if ($model->getId()) {
return $helper->__("Edit Articles item '%s'", $this->escapeHtml($model->getTitle()));
} else {
return $helper->__("Add Article item");
}
}
}
Создаем класс виджета формы
В этом классе, мы указываем поля, которые нам нужны в HTML форме.
Создаем каталог:
app/code/local/My/Articles/Block/Adminhtml/Articles/Edit
Создаем файл:
app/code/local/My/Articles/Block/Adminhtml/Articles/Edit/Form.php
Добавляем код:
<?php
class My_Articles_Block_Adminhtml_Articles_Edit_Form extends Mage_Adminhtml_Block_Widget_Form
{
protected function _prepareForm()
{
$helper = Mage::helper('myarticles');
$model = Mage::registry('current_article');
$form = new Varien_Data_Form(array(
'id' => 'edit_form',
'action' => $this->getUrl('*/*/save', array(
'id' => $this->getRequest()->getParam('id')
)),
'method' => 'post',
'enctype' => 'multipart/form-data'
));
$this->setForm($form);
$fieldset = $form->addFieldset('myarticles_form', array('legend' => $helper->__('Article Information')));
$fieldset->addField('title', 'text', array(
'label' => $helper->__('Title'),
'required' => true,
'name' => 'title',
));
$fieldset->addField('image', 'image', array(
'label' => $helper->__('Image'),
'name' => 'image',
));
$fieldset->addField('header_h1', 'text', array(
'label' => $helper->__('Header H1'),
'required' => true,
'name' => 'header_h1',
));
$fieldset->addField('meta_tag_keywords', 'text', array(
'label' => $helper->__('Keywords (SEO)'),
'required' => true,
'name' => 'meta_tag_keywords',
));
$fieldset->addField('meta_tag_description', 'text', array(
'label' => $helper->__('Description (SEO)'),
'required' => true,
'name' => 'meta_tag_description',
));
$fieldset->addField('preview', 'editor', array(
'label' => $helper->__('Preview'),
'required' => true,
'name' => 'preview',
));
$fieldset->addField('content', 'editor', array(
'label' => $helper->__('Content'),
'wysiwyg' => true,
'required' => true,
'config' => Mage::getSingleton('cms/wysiwyg_config'),
'name' => 'content',
));
$fieldset->addField('created', 'date', array(
'format' => Mage::app()->getLocale()->getDateFormat(Mage_Core_Model_Locale::FORMAT_TYPE_SHORT),
'image' => $this->getSkinUrl('images/grid-cal.gif'),
'label' => $helper->__('Created'),
'name' => 'created'
));
$form->setUseContainer(true);
if($data = Mage::getSingleton('adminhtml/session')->getFormData()){
$form->setValues($data);
} else {
$form->setValues($model->getData());
}
return parent::_prepareForm();
}
}
devreadwrite.com



Подборка адаптивных шаблонов для вашей CMS
Статьи по
Как получить и установить HTTPS сертификат на сайта

Комментарии
Комментарии отсутствуют, Вы можете быть первым