magento新闻模块开发(二)

Magento提供了强大的Grid Widget使我们能够方便的创建数据表格,现在我们为新闻模块创建后台数据表格。

修改config.xml配置文件,添加admin路由

<config>
    <admin>
        <routers>
            <news>
                <use>admin</use>
                <args>
                    <module>Xinson_News</module>
                    <frontName>news</frontName>
                </args>
            </news>
        </routers>
    </admin>
</config>


添加后台菜单

/app/code/local/Xinson/News/etc/adminhtml.xml 加到cms菜单里面。

<?xml version="1.0"?>
<config>
    <menu>
        <cms>
            <children>
                <news translate="title" module="news">
                    <title>News</title>
                    <action>news/adminhtml_news</action>
                    <sort_order>40</sort_order>
                </news>
            </children>
        </cms>
    </menu>
    <acl>
        <resources>
            <admin>
                <children>
                    <cms>
                        <children>
                            <news translate="title" module="news">
                                <title>News</title>
                                <sort_order>40</sort_order>
                            </news>
                        </children>
                    </cms>
                </children>
            </admin>
        </resources>
    </acl>
</config>


添加Grid表格

后台控制器indexAction

/app/code/local/Xinson/News/controllers/Adminhtml/NewsController.php

<?php

class Xinson_News_Adminhtml_NewsController extends Mage_Adminhtml_Controller_Action
{
    public function indexAction()
    {
        $this->_title($this->__('CMS'))->_title($this->__('News'));

        $this->loadLayout();
        $this->_setActiveMenu('cms/news');//当前选中状态
        $this->_addBreadcrumb(Mage::helper('adminhtml')->__('News Manager'), Mage::helper('adminhtml')->__('News Manager'));//Mage::helper('adminhtml')->__ 这样是访问语言包  $this->__addBreadcrumb

        $this->_addContent($this->getLayout()->createBlock('news/adminhtml_news'));//增加block
        $this->renderLayout();
    }
}

添加Block

/app/code/local/Xinson/News/Block/Adminhtml/News.php

<?php

class Xinson_News_Block_Adminhtml_News extends Mage_Adminhtml_Block_Widget_Grid_Container
{
    public function __construct()
    {
        $this->_controller = 'adminhtml_news'; //就是 Adminhtml/NewsController.php
        $this->_blockGroup = 'news'; //这是block组
        $this->_headerText = Mage::helper('news')->__('News Manager');
        $this->_addButtonLabel = Mage::helper('news')->__('Add News');
        parent::__construct();
    }
}

添加grid文件

/app/code/local/Xinson/News/Block/Adminhtml/News/Grid.php

<?php

class Xinson_News_Block_Adminhtml_News_Grid extends Mage_Adminhtml_Block_Widget_Grid
{
    public function __construct()
    {
        parent::__construct();
        $this->setId('newsGrid');
        $this->setDefaultSort('news_id');
        $this->setDefaultDir('ASC');
        $this->setSaveParametersInSession(true);
    }

    protected function _prepareCollection()
    {
        $collection = Mage::getModel('news/news')->getCollection();
        $this->setCollection($collection);
        return parent::_prepareCollection();
    }
    // 加列表 列值
    protected function _prepareColumns()
    {
        $this->addColumn('news_id', array(
            'header' => Mage::helper('news')->__('ID'),
            'align' =>'right',
            'width' => '50px',
            'index' => 'news_id',
        ));

        $this->addColumn('title', array(
            'header' => Mage::helper('news')->__('Title'),
            'align' =>'left',
            'index' => 'title',
        ));

        $this->addColumn('is_active', array(
            'header' => Mage::helper('news')->__('Status'),
            'align' => 'left',
            'width' => '80px',
            'index' => 'is_active',
            'type' => 'options',
            'options' => Mage::getSingleton('news/news')->getAvailableStatuses(),
        ));

        $this->addColumn('created_at', array(
            'header' => Mage::helper('news')->__('Created At'),
            'align' =>'left',
            'width' => '180px',
            'type' => 'datetime',
            'index' => 'created_at',
        ));

        $this->addColumn('updated_at', array(
            'header' => Mage::helper('news')->__('Updated At'),
            'align' =>'left',
            'width' => '180px',
            'type' => 'datetime',
            'index' => 'updated_at',
        ));

        $this->addColumn('action',
            array(
                'header' => Mage::helper('news')->__('Action'),
                'width' => '50px',
                'type' => 'action',
                'getter' => 'getId',
                'actions' => array(
                    array(
                        'caption' => Mage::helper('news')->__('Edit'),
                        'url' => array('base'=>'*/*/edit'),
                        'field' => 'id'
                    )
                ),
                'filter' => false,
                'sortable' => false,
                'index' => 'stores',
            ));

        return parent::_prepareColumns();
    }

    public function getRowUrl($row)
    {
        return $this->getUrl('*/*/edit', array('id' => $row->getId()));
    }
}

由于 _prepareColumns有 Mage::getSingleton('news/news')->getAvailableStatuses() 

在 /app/code/local/Xinson/News/Model/News.php中添加getAvailableStatuses()方法

<?php

class Xinson_News_Model_News extends Mage_Core_Model_Abstract
{
    //....

    const STATUS_ENABLED = 1;
    const STATUS_DISABLED = 0;

    public function getAvailableStatuses()
    {
        $statuses = new Varien_Object(array(
            self::STATUS_ENABLED => Mage::helper('news')->__('Enabled'),
            self::STATUS_DISABLED => Mage::helper('news')->__('Disabled'),
        ));

        return $statuses->getData();
    }
}


新闻模块创建和编辑

添加后台控制器的newAction和editAction方法

/app/code/local/Xinson/News/controllers/Adminhtml/NewsController.php

<?php

class Xinson_News_Adminhtml_NewsController extends Mage_Adminhtml_Controller_Action
{
    //...

    public function newAction()
    {
        $this->getRequest()->setParam('id', 0);
        $this->_forward('edit');
    }
    
    public function editAction()
    {
        $this->_title($this->__('CMS'))->_title($this->__('News'));
        
        $newsId = $this->getRequest()->getParam('id');
        $newsModel = Mage::getModel('news/news')->load($newsId);

        if ($newsModel->getId() || $newsId == 0) {
            $this->_title($newsModel->getId() ? $newsModel->getTitle() : $this->__('New News'));
            
            Mage::register('news_data', $newsModel);
            
            $this->loadLayout();
            $this->_setActiveMenu('cms/news');
            $this->_addBreadcrumb(Mage::helper('adminhtml')->__('News Manager'), Mage::helper('adminhtml')->__('News Manager'), $this->getUrl('*/*/'));
            $this->_addBreadcrumb(Mage::helper('adminhtml')->__('Edit News'), Mage::helper('adminhtml')->__('Edit News'));
            
            $this->getLayout()->getBlock('head')->setCanLoadExtJs(true);
            $this->_addContent($this->getLayout()->createBlock('news/adminhtml_news_edit'))
                ->_addLeft($this->getLayout()->createBlock('news/adminhtml_news_edit_tabs'));
            
            $this->renderLayout();
        } else {
            Mage::getSingleton('adminhtml/session')->addError(Mage::helper('news')->__('The news does not exist.'));
            $this->_redirect('*/*/');
        }
    }
}


添加Form Container

/app/code/local/Xinson/News/Block/Adminhtml/News/Edit.php

<?php

class Xinson_News_Block_Adminhtml_News_Edit extends Mage_Adminhtml_Block_Widget_Form_Container
{
    public function __construct()
    {
        $this->_objectId = 'id';
        $this->_blockGroup = 'news';
        $this->_controller = 'adminhtml_news';

        parent::__construct();
        //更新按钮文字
        $this->_updateButton('save', 'label', Mage::helper('news')->__('Save News'));
        $this->_updateButton('delete', 'label', Mage::helper('news')->__('Delete News'));
    }

    public function getHeaderText()
    {
        //判断区分 新增和编辑
        if(Mage::registry('news_data') && Mage::registry('news_data')->getId()) {
            return Mage::helper('news')->__("Edit News '%s'", $this->htmlEscape(Mage::registry('news_data')->getTitle()));
        } else {
            return Mage::helper('news')->__('Add News');
        }
    }
}


添加Form

/app/code/local/Xinson/News/Block/Adminhtml/News/Edit/Form.php

<?php

class Xinson_News_Block_Adminhtml_News_Edit_Form extends Mage_Adminhtml_Block_Widget_Form
{
    //编辑的form的参数,action地址
    protected function _prepareForm()
    {
        $form = new Varien_Data_Form(array(
            'id' => 'edit_form',
            'action' => $this->getUrl('*/*/save', array('id' => $this->getRequest()->getParam('id'))),
            'method' => 'post',
        ));
        
        $form->setUseContainer(true);
        $this->setForm($form);
        return parent::_prepareForm();
    }
}


添加Tabs

/app/code/local/Xinson/News/Block/Adminhtml/News/Edit/Tabs.php

<?php
//这是左边栏
class Xinson_News_Block_Adminhtml_News_Edit_Tabs extends Mage_Adminhtml_Block_Widget_Tabs
{
   
    public function __construct()
    {
        parent::__construct();
        $this->setId('news_tabs');
        $this->setDestElementId('edit_form');
        $this->setTitle(Mage::helper('news')->__('News Information'));
    }

    protected function _beforeToHtml()
    {
        $this->addTab('form_section', array(
            'label' => Mage::helper('news')->__('News Information'),
            'title' => Mage::helper('news')->__('News Information'),
            'content' => $this->getLayout()->createBlock('news/adminhtml_news_edit_tabs_form')->toHtml(),
        ));

        return parent::_beforeToHtml();
    }
}


 添加Tab Form

/app/code/local/Xinson/News/Block/Adminhtml/News/Edit/Tabs/Form.php

<?php
//这是编辑区
class Xinson_News_Block_Adminhtml_News_Edit_Tabs_Form extends Mage_Adminhtml_Block_Widget_Form
{
    protected function _prepareForm()
    {
        $model = Mage::registry('news_data');
        
        $form = new Varien_Data_Form();

        $fieldset = $form->addFieldset('news_form', array('legend'=>Mage::helper('news')->__('News information')));
        
        if ($model->getNewsId()) {
            $fieldset->addField('news_id', 'hidden', array(
                'name' => 'news_id',
            ));
        }
        $fieldset->addField('title', 'text', array(
            'name' => 'title',
            'label' => Mage::helper('news')->__('News Title'),
            'title' => Mage::helper('news')->__('News Title'),
            'required' => true,
        ));
        
        $fieldset->addField('is_active', 'select', array(
            'name' => 'is_active',
            'label' => Mage::helper('news')->__('Status'),
            'title' => Mage::helper('news')->__('News Status'),
            'required' => true,
            'options' => $model->getAvailableStatuses(),
        ));

        $fieldset->addField('content', 'editor', array(
            'name' => 'content',
            'label' => Mage::helper('news')->__('Content'),
            'title' => Mage::helper('news')->__('Content'),
            'required' => true,
            'style' => 'width:700px; height:300px;',
        ));

        $form->setValues($model->getData());
        $this->setForm($form);

        return parent::_prepareForm();
    }
}

刷新后台页面,点击Add News按钮新建新闻或点击表格中的某一行编辑新闻,观察是否显示编辑表单,下面我们为表单添加保存和删除的功能。


后台控制器的saveAction和deleteAction

/app/code/local/Xinson/News/controllers/Adminhtml/NewsController.php

<?php

class Xinson_News_Adminhtml_NewsController extends Mage_Adminhtml_Controller_Action
{
    //...
    
    public function saveAction()
    {
        if ($data = $this->getRequest()->getPost()) {
        
            $id = $this->getRequest()->getParam('id');
            $model = Mage::getModel('news/news')->load($id);
            if (!$model->getId() && $id) {
                Mage::getSingleton('adminhtml/session')->addError(Mage::helper('news')->__('This news no longer exists.'));
                $this->_redirect('*/*/');
                return;
            }
            
            if ($model->getCreatedAt() == NULL || $model->getUpdatedAt() == NULL) {
                $data['created_at'] = now();
                $data['updated_at'] = now();
            } else {
                $data['updated_at'] = now();
            }
            $model->setData($data);
            
            try {
                $model->save();
                
                Mage::getSingleton('adminhtml/session')->addSuccess(Mage::helper('news')->__('The news has been saved.'));
                
                Mage::getSingleton('adminhtml/session')->setFormData(false);
                
                if ($this->getRequest()->getParam('back')) {
                    $this->_redirect('*/*/edit', array('id' => $model->getId(), '_current'=>true));
                    return;
                }
                
                $this->_redirect('*/*/');
                return;
            } 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;
            }
        }
        $this->_redirect('*/*/');
    }
    
    public function deleteAction()
    {
        if ($id = $this->getRequest()->getParam('id')) {
            try {
                $model = Mage::getModel('news/news');
                $model->setId($id);
                $model->delete();
                Mage::getSingleton('adminhtml/session')->addSuccess(Mage::helper('news')->__('The news has been deleted.'));
                $this->_redirect('*/*/');
                return;
            } catch (Exception $e) {
                Mage::getSingleton('adminhtml/session')->addError($e->getMessage());
                $this->_redirect('*/*/edit', array('id' => $this->getRequest()->getParam('id')));
                return;
            }
        }
        Mage::getSingleton('adminhtml/session')->addError(Mage::helper('news')->__('Unable to find a news to delete.'));
        $this->_redirect('*/*/');
    }
}


你可能感兴趣的:(magento新闻模块开发(二))