How much about Magento do not write, but still a lot of questions;) © jeje
<?xml version="1.0" ?> <config> <modules> <DS_News> <version>0.0.1</version> </DS_News> </modules> </config>
<?xml version="1.0" ?> <config> <modules> <DS_News> <active>true</active> <codePool>local</codePool> </DS_News> </modules> </config>
<?php die('DS News module setup'); $installer = $this; $installer->startSetup(); $installer->run("CREATE TABLE ds_news_entities ( `news_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `title` VARCHAR(255) NOT NULL, `content` TEXT NOT NULL, `created` DATETIME, PRIMARY KEY (`news_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); $installer->endSetup();
<?xml version="1.0" ?> <config> <modules> ... </modules> <global> <resources> <dsnews_setup> <setup> <module>DS_News</module> </setup> </dsnews_setup> </resources> </global> </config>
DELETE FROM `core_resource` WHERE `code` = 'dsnews_setup';
<?xml version="1.0" ?> <config> ... <global> <models> <dsnews> <resourceModel>dsnews_resource</resourceModel> </dsnews> <dsnews_resource> <entities> <table_news> <table>ds_news_entities</table> </table_news> </entities> </dsnews_resource> </models> <resources> ... </resources> </global> </config>
<?php $installer = $this; $tableNews = $installer->getTable('dsnews/table_news'); die($tableNews); $installer->startSetup(); $installer->getConnection()->dropTable($tableNews); $table = $installer->getConnection() ->newTable($tableNews) ->addColumn('news_id', Varien_Db_Ddl_Table::TYPE_INTEGER, null, array( 'identity' => true, 'nullable' => false, 'primary' => true, )) ->addColumn('title', Varien_Db_Ddl_Table::TYPE_TEXT, '255', array( 'nullable' => false, )) ->addColumn('content', Varien_Db_Ddl_Table::TYPE_TEXT, null, array( 'nullable' => false, )) ->addColumn('created', Varien_Db_Ddl_Table::TYPE_DATETIME, null, array( 'nullable' => false, )); $installer->getConnection()->createTable($table); $installer->endSetup();
DELETE FROM `core_resource` WHERE `code` = 'dsnews_setup';
<?xml version="1.0" ?> <config> <modules> ... </modules> <frontend> <routers> <dsnews> <use>standard</use> <args> <module>DS_News</module> <frontName>news</frontName> </args> </dsnews> </routers> </frontend> <global> ... </global> </config>
<?php class DS_News_IndexController extends Mage_Core_Controller_Front_Action { public function indexAction() { echo '<h1>News</h1>'; } }
<h1>Template ds_news/index.phtml</h1>
<?xml version="1.0" ?> <layout> <dsnews_index_index> <reference name="content"> <block type="core/template" template="ds_news/index.phtml" /> </reference> </dsnews_index_index> </layout>
<?xml version="1.0" ?> <config> <modules> ... </modules> <frontend> <layout> <updates> <dsnews> <file>ds_news.xml</file> </dsnews> </updates> </layout> <routers> ... </routers> </frontend> <global> ... </global> </config>
<?php class DS_News_IndexController extends Mage_Core_Controller_Front_Action { public function indexAction() { $this->loadLayout(); $this->renderLayout(); } }
<?php class DS_News_IndexController extends Mage_Core_Controller_Front_Action { public function indexAction() { $this->loadLayout(); $layoutHandles = $this->getLayout()->getUpdate()->getHandles(); echo '<pre>' . print_r($layoutHandles, true) . '</pre>'; } }
Array ( [0] => default [1] => STORE_default [2] => THEME_frontend_ [package] _ [theme] [3] => dsnews_index_index [4] => customer_logged_out )
INSERT INTO `ds_news_entities` VALUES (NULL, 'News 1', 'News 1 Content', '2013-10-16 17:45'), (NULL, 'News 2', 'News 2 Content', '2013-11-07 04:12'), (NULL, 'News 3', 'News 3 Content', '2014-01-12 15:55');
<h1>News</h1> <?php $news = Mage::registry('news'); foreach ($news as $item) { echo '<h2>' . $item['title'] . '</h2>'; }
<?php class DS_News_IndexController extends Mage_Core_Controller_Front_Action { public function indexAction() { $resource = Mage::getSingleton('core/resource'); $read = $resource->getConnection('core_read'); $table = $resource->getTableName('dsnews/table_news'); $select = $read->select() ->from($table, array('news_id', 'title', 'content', 'created')) ->order('created DESC'); $news = $read->fetchAll($select); Mage::register('news', $news); $this->loadLayout(); $this->renderLayout(); } }
<?xml version="1.0" ?> <config> <modules> ... </modules> <frontend> ... </frontend> <global> <models> <dsnews> <class>DS_News_Model</class> <resourceModel>dsnews_resource</resourceModel> </dsnews> <dsnews_resource> <class>DS_News_Model_Resource</class> <entities> <table_news> <table>ds_news_entities</table> </table_news> </entities> </dsnews_resource> </models> <resources> ... </resources> </global> </config>
<?php class DS_News_Model_News extends Mage_Core_Model_Abstract { public function _construct() { parent::_construct(); $this->_init('dsnews/news'); } }
<?php class DS_News_Model_Resource_News extends Mage_Core_Model_Mysql4_Abstract { public function _construct() { $this->_init('dsnews/table_news', 'news_id'); } }
<?php class DS_News_Model_Resource_News_Collection extends Mage_Core_Model_Mysql4_Collection_Abstract { public function _construct() { parent::_construct(); $this->_init('dsnews/news'); } }
<?php class DS_News_IndexController extends Mage_Core_Controller_Front_Action { public function indexAction() { $news = Mage::getModel('dsnews/news')->getCollection()->setOrder('created', 'DESC'); $viewUrl = Mage::getUrl('news/index/view'); echo '<h1>News</h1>'; foreach ($news as $item) { echo '<h2><a href="' . $viewUrl . '?id=' . $item->getId() . '">' . $item->getTitle() . '</a></h2>'; } } public function viewAction() { $newsId = Mage::app()->getRequest()->getParam('id', 0); $news = Mage::getModel('dsnews/news')->load($newsId); if ($news->getId() > 0) { echo '<h1>' . $news->getTitle() . '</h1>'; echo '<div class="content">' . $news->getContent() . '</div>'; } else { $this->_forward('noRoute'); } } }
<?xml version="1.0" ?> <config> ... <global> <blocks> <dsnews> <class>DS_News_Block</class> </dsnews> </blocks> ... </global> </config>
<?php class DS_News_Block_News extends Mage_Core_Block_Template { public function getNewsCollection() { $newsCollection = Mage::getModel('dsnews/news')->getCollection(); $newsCollection->setOrder('created', 'DESC'); return $newsCollection; } }
<?php class DS_News_Block_View extends Mage_Core_Block_Template { }
<layout> <dsnews_index_index> <reference name="content"> <block type="dsnews/news" template="ds_news/index.phtml" /> </reference> </dsnews_index_index> <dsnews_index_view> <reference name="content"> <block type="dsnews/view" name="news.content" template="ds_news/view.phtml" /> </reference> </dsnews_index_view> </layout>
<?php $news = $this->getNewsCollection(); $newsViewUrl = Mage::getUrl('news/index/view'); ?> <h1>News</h1> <?php foreach ($news as $item): ?> <h2> <a href="<?php echo $newsViewUrl; ?>?id=<?php echo $item->getId(); ?>"> <?php echo $item->getTitle(); ?> </a> </h2> <?php endforeach; ?>
<h1><?php echo $newsItem->getTitle(); ?></h1> <div class="content"><?php echo $newsItem->getContent(); ?></div>
<?php class DS_News_IndexController extends Mage_Core_Controller_Front_Action { public function indexAction() { $this->loadLayout(); $this->renderLayout(); } public function viewAction() { $newsId = Mage::app()->getRequest()->getParam('id', 0); $news = Mage::getModel('dsnews/news')->load($newsId); if ($news->getId() > 0) { $this->loadLayout(); $this->getLayout()->getBlock('news.content')->assign(array( "newsItem" => $news, )); $this->renderLayout(); } else { $this->_forward('noRoute'); } } }
<?php class DS_News_Adminhtml_NewsController extends Mage_Adminhtml_Controller_Action { public function indexAction() { echo '<h1>News Module: Admin section</h1>'; } }
<?xml version="1.0" ?> <config> ... <admin> <routers> <dsnews_admin> <use>admin</use> <args> <module>DS_News</module> <frontName>dsnews_admin</frontName> </args> </dsnews_admin> </routers> </admin> ... </config>
<?xml version="1.0" ?> <config> ... <adminhtml> <menu> <dsnews module="dsnews"> <title>News</title> <sort_order>77</sort_order> <action>dsnews_admin/adminhtml_news</action> </dsnews> </menu> </adminhtml> ... </config>
<?php class DS_News_Helper_Data extends Mage_Core_Helper_Abstract { }
<?xml version="1.0" ?> <config> ... <global> ... <helpers> <dsnews> <class>DS_News_Helper</class> </dsnews> </helpers> ... </global> ... </config>
<?php class DS_News_Adminhtml_NewsController extends Mage_Adminhtml_Controller_Action { public function indexAction() { $this->loadLayout(); $this->_setActiveMenu('dsnews'); $contentBlock = $this->getLayout()->createBlock('dsnews/adminhtml_news'); $this->_addContent($contentBlock); $this->renderLayout(); } }
<?php class DS_News_Block_Adminhtml_News extends Mage_Adminhtml_Block_Abstract { public function _toHtml() { return '<h1>News Module: Admin section</h1>'; } }
<?php class DS_News_Block_Adminhtml_News extends Mage_Adminhtml_Block_Widget_Grid_Container { protected function _construct() { parent::_construct(); $helper = Mage::helper('dsnews'); $this->_blockGroup = 'dsnews'; $this->_controller = 'adminhtml_news'; $this->_headerText = $helper->__('News Management'); $this->_addButtonLabel = $helper->__('Add News'); } }
<?php class DS_News_Block_Adminhtml_News_Grid extends Mage_Adminhtml_Block_Widget_Grid { protected function _prepareCollection() { $collection = Mage::getModel('dsnews/news')->getCollection(); $this->setCollection($collection); return parent::_prepareCollection(); } protected function _prepareColumns() { $helper = Mage::helper('dsnews'); $this->addColumn('news_id', array( 'header' => $helper->__('News ID'), 'index' => 'news_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(); } }
<?php class DS_News_Block_Adminhtml_News_Grid extends Mage_Adminhtml_Block_Widget_Grid { protected function _prepareCollection(){ ... } protected function _prepareColumns(){ ... } protected function _prepareMassaction() { $this->setMassactionIdField('news_id'); $this->getMassactionBlock()->setFormFieldName('news'); $this->getMassactionBlock()->addItem('delete', array( 'label' => $this->__('Delete'), 'url' => $this->getUrl('*/*/massDelete'), )); return $this; } }
<?php class DS_News_Adminhtml_NewsController extends Mage_Adminhtml_Controller_Action { public function indexAction(){ ... } public function massDeleteAction() { $news = $this->getRequest()->getParam('news', null); if (is_array($news) && sizeof($news) > 0) { try { foreach ($news as $id) { Mage::getModel('dsnews/news')->setId($id)->delete(); } $this->_getSession()->addSuccess($this->__('Total of %d news have been deleted', sizeof($news))); } catch (Exception $e) { $this->_getSession()->addError($e->getMessage()); } } else { $this->_getSession()->addError($this->__('Please select news')); } $this->_redirect('*/*'); } }
<?php class DS_News_Adminhtml_NewsController extends Mage_Adminhtml_Controller_Action { public function indexAction() { $this->loadLayout()->_setActiveMenu('dsnews'); $this->_addContent($this->getLayout()->createBlock('dsnews/adminhtml_news')); $this->renderLayout(); } public function newAction() { $this->_forward('edit'); } public function editAction() { $id = (int) $this->getRequest()->getParam('id'); Mage::register('current_news', Mage::getModel('dsnews/news')->load($id)); $this->loadLayout()->_setActiveMenu('dsnews'); $this->_addContent($this->getLayout()->createBlock('dsnews/adminhtml_news_edit')); $this->renderLayout(); } public function saveAction() { if ($data = $this->getRequest()->getPost()) { try { $model = Mage::getModel('dsnews/news'); $model->setData($data)->setId($this->getRequest()->getParam('id')); if(!$model->getCreated()){ $model->setCreated(now()); } $model->save(); Mage::getSingleton('adminhtml/session')->addSuccess($this->__('News 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() { if ($id = $this->getRequest()->getParam('id')) { try { Mage::getModel('dsnews/news')->setId($id)->delete(); Mage::getSingleton('adminhtml/session')->addSuccess($this->__('News was deleted successfully')); } catch (Exception $e) { Mage::getSingleton('adminhtml/session')->addError($e->getMessage()); $this->_redirect('*/*/edit', array('id' => $id)); } } $this->_redirect('*/*/'); } public function massDeleteAction(){ ... } }
<?php class DS_News_Block_Adminhtml_News_Grid extends Mage_Adminhtml_Block_Widget_Grid { protected function _prepareCollection(){ ... } protected function _prepareColumns(){ ... } protected function _prepareMassaction(){ ... } public function getRowUrl($model) { return $this->getUrl('*/*/edit', array( 'id' => $model->getId(), )); } }
<?php class DS_News_Block_Adminhtml_News_Edit extends Mage_Adminhtml_Block_Widget_Form_Container { protected function _construct() { $this->_blockGroup = 'dsnews'; $this->_controller = 'adminhtml_news'; } public function getHeaderText() { $helper = Mage::helper('dsnews'); $model = Mage::registry('current_news'); if ($model->getId()) { return $helper->__("Edit News item '%s'", $this->escapeHtml($model->getTitle())); } else { return $helper->__("Add News item"); } } }
<?php class DS_News_Block_Adminhtml_News_Edit_Form extends Mage_Adminhtml_Block_Widget_Form { protected function _prepareForm() { $helper = Mage::helper('dsnews'); $model = Mage::registry('current_news'); $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('news_form', array('legend' => $helper->__('News Information'))); $fieldset->addField('title', 'text', array( 'label' => $helper->__('Title'), 'required' => true, 'name' => 'title', )); $fieldset->addField('content', 'editor', array( 'label' => $helper->__('Content'), 'required' => true, '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(); } }
<?php class DS_News_Adminhtml_NewsController extends Mage_Adminhtml_Controller_Action { public function indexAction(){ ... } public function newAction(){ ... } public function editAction() { $id = (int) $this->getRequest()->getParam('id'); $model = Mage::getModel('dsnews/news'); if($data = Mage::getSingleton('adminhtml/session')->getFormData()){ $model->setData($data)->setId($id); } else { $model->load($id); } Mage::register('current_news', $model); $this->loadLayout()->_setActiveMenu('dsnews'); $this->_addLeft($this->getLayout()->createBlock('dsnews/adminhtml_news_edit_tabs')); $this->_addContent($this->getLayout()->createBlock('dsnews/adminhtml_news_edit')); $this->renderLayout(); } public function saveAction(){ ... } public function deleteAction() { ... } public function massDeleteAction(){ ... } }
<?php class DS_News_Block_Adminhtml_News_Edit_Tabs extends Mage_Adminhtml_Block_Widget_Tabs { public function __construct() { $helper = Mage::helper('dsnews'); parent::__construct(); $this->setId('news_tabs'); $this->setDestElementId('edit_form'); $this->setTitle($helper->__('News Information')); } protected function _prepareLayout() { $helper = Mage::helper('dsnews'); $this->addTab('general_section', array( 'label' => $helper->__('General Information'), 'title' => $helper->__('General Information'), 'content' => $this->getLayout()->createBlock('dsnews/adminhtml_news_edit_tabs_general')->toHtml(), )); $this->addTab('custom_section', array( 'label' => $helper->__('Custom Fields'), 'title' => $helper->__('Custom Fields'), 'content' => $this->getLayout()->createBlock('dsnews/adminhtml_news_edit_tabs_custom')->toHtml(), )); return parent::_prepareLayout(); } }
<?php class DS_News_Block_Adminhtml_News_Edit_Form extends Mage_Adminhtml_Block_Widget_Form { protected function _prepareForm() { $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' )); $form->setUseContainer(true); $this->setForm($form); return parent::_prepareForm(); } }
<?php class DS_News_Block_Adminhtml_News_Edit_Tabs_General extends Mage_Adminhtml_Block_Widget_Form { protected function _prepareForm() { $helper = Mage::helper('dsnews'); $model = Mage::registry('current_news'); $form = new Varien_Data_Form(); $fieldset = $form->addFieldset('general_form', array( 'legend' => $helper->__('General Information') )); $fieldset->addField('title', 'text', array( 'label' => $helper->__('Title'), 'required' => true, 'name' => 'title', )); $fieldset->addField('content', 'editor', array( 'label' => $helper->__('Content'), 'required' => true, '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->setValues($model->getData()); $this->setForm($form); return parent::_prepareForm(); } }
<?php class DS_News_Block_Adminhtml_News_Edit_Tabs_Custom extends Mage_Adminhtml_Block_Widget { protected function _toHtml() { return '<h2>Custom Fields</h2>'; } }
<?php class DS_News_Block_Adminhtml_News_Edit_Tabs_General extends Mage_Adminhtml_Block_Widget_Form { protected function _prepareForm() { $helper = Mage::helper('dsnews'); $model = Mage::registry('current_news'); $form = new Varien_Data_Form(); $fieldset = $form->addFieldset('general_form', array('legend' => $helper->__('General Information'))); $fieldset->addField('title', 'text', array( 'label' => $helper->__('Title'), 'required' => true, 'name' => 'title', )); $fieldset->addField('content', 'editor', array( 'label' => $helper->__('Content'), 'required' => true, 'name' => 'content', )); $fieldset->addField('image', 'image', array( 'label' => $helper->__('Image'), 'name' => 'image', )); $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' )); $formData = array_merge($model->getData(), array('image' => $model->getImageUrl())); $form->setValues($formData); $this->setForm($form); return parent::_prepareForm(); } }
<?php class DS_News_Helper_Data extends Mage_Core_Helper_Abstract { public function getImagePath($id = 0) { $path = Mage::getBaseDir('media') . '/ds_news'; if ($id) { return "{$path}/{$id}.jpg"; } else { return $path; } } public function getImageUrl($id = 0) { $url = Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_MEDIA) . 'ds_news/'; if ($id) { return $url . $id . '.jpg'; } else { return $url; } } }
<?php class DS_News_Model_News extends Mage_Core_Model_Abstract { protected function _construct() { parent::_construct(); $this->_init('dsnews/news'); } protected function _afterDelete() { $helper = Mage::helper('dsnews'); @unlink($helper->getImagePath($this->getId())); return parent::_afterDelete(); } public function getImageUrl() { $helper = Mage::helper('dsnews'); if ($this->getId() && file_exists($helper->getImagePath($this->getId()))) { return $helper->getImageUrl($this->getId()); } return null; } }
<?php class DS_News_Adminhtml_NewsController extends Mage_Adminhtml_Controller_Action { public function indexAction(){ ... } public function newAction(){ ... } public function editAction(){ ... } public function saveAction() { $id = $this->getRequest()->getParam('id'); if ($data = $this->getRequest()->getPost()) { try { $helper = Mage::helper('dsnews'); $model = Mage::getModel('dsnews/news'); $model->setData($data)->setId($id); if (!$model->getCreated()) { $model->setCreated(now()); } $model->save(); $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 } else { if (isset($data['image']['delete']) && $data['image']['delete'] == 1) { @unlink($helper->getImagePath($id)); } } Mage::getSingleton('adminhtml/session')->addSuccess($this->__('News 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' => $id )); } return; } Mage::getSingleton('adminhtml/session')->addError($this->__('Unable to find item to save')); $this->_redirect('*/*/'); } public function deleteAction(){ ... } public function massDeleteAction(){ ... } }
console.log('DS News admin');
#general_form label { color: #FF0000; font-weight: bold; }
<?php class DS_News_Adminhtml_NewsController extends Mage_Adminhtml_Controller_Action { public function indexAction(){ ... } public function newAction(){ ... } public function editAction() { $id = (int) $this->getRequest()->getParam('id'); $model = Mage::getModel('dsnews/news'); if ($data = Mage::getSingleton('adminhtml/session')->getFormData()) { $model->setData($data)->setId($id); } else { $model->load($id); } Mage::register('current_news', $model); $this->loadLayout()->_setActiveMenu('dsnews'); $this->getLayout()->getBlock('head')->addItem('skin_js', 'ds_news/adminhtml/scripts.js'); $this->getLayout()->getBlock('head')->addItem('skin_css', 'ds_news/adminhtml/styles.css'); $this->_addLeft($this->getLayout()->createBlock('dsnews/adminhtml_news_edit_tabs')); $this->_addContent($this->getLayout()->createBlock('dsnews/adminhtml_news_edit')); $this->renderLayout(); } public function saveAction(){ ... } public function deleteAction(){ ... } public function massDeleteAction(){ ... } }
$this->getLayout()->getBlock('head')->addItem('skin_js', 'ds_news/adminhtml/scripts.js'); $this->getLayout()->getBlock('head')->addItem('skin_css', 'ds_news/adminhtml/styles.css');
on $this->getLayout()->getBlock('head')->addJs('ds_news/adminhtml/scripts.js'); $this->getLayout()->getBlock('head')->addItem('js_css', 'ds_news/adminhtml/styles.css');
<?php echo '<h1>Upgrade DS News to version 0.0.2</h1>'; exit; $installer = $this; $tableCategories = $installer->getTable('dsnews/table_categories'); $tableNews = $installer->getTable('dsnews/table_news'); $installer->startSetup(); $installer->getConnection()->dropTable($tableCategories); $table = $installer->getConnection() ->newTable($tableCategories) ->addColumn('category_id', Varien_Db_Ddl_Table::TYPE_INTEGER, null, array( 'identity' => true, 'nullable' => false, 'primary' => true, )) ->addColumn('title', Varien_Db_Ddl_Table::TYPE_TEXT, '255', array( 'nullable' => false, )); $installer->getConnection()->createTable($table); $installer->getConnection()->addColumn($tableNews, 'category_id', array( 'comment' => 'News Category', 'default' => '0', 'nullable' => false, 'type' => Varien_Db_Ddl_Table::TYPE_INTEGER, )); $installer->endSetup();
<?xml version="1.0" ?> <config> <modules> <DS_News> <version>0.0.2</version> </DS_News> </modules> ... <global> ... <models> <dsnews> <class>DS_News_Model</class> <resourceModel>dsnews_resource</resourceModel> </dsnews> <dsnews_resource> <class>DS_News_Model_Resource</class> <entities> <table_categories> <table>ds_news_categories</table> </table_categories> <table_news> <table>ds_news_entities</table> </table_news> </entities> </dsnews_resource> </models> ... </global> </config>
<?php class DS_News_Model_Category extends Mage_Core_Model_Abstract { protected function _construct() { parent::_construct(); $this->_init('dsnews/category'); } protected function _afterDelete() { $newsCollection = Mage::getModel('dsnews/news')->getCollection() ->addFieldToFilter('category_id', $this->getId()); foreach($newsCollection as $news){ $news->setCategoryId(0)->save(); } return parent::_afterDelete(); } }
<?php class DS_News_Block_Adminhtml_News_Edit_Tabs_General extends Mage_Adminhtml_Block_Widget_Form { protected function _prepareForm() { ... $fieldset->addField('category_id', 'select', array( 'label' => $helper->__('Category'), 'name' => 'category_id', 'values' => $helper->getCategoriesOptions(), )); ... } }
<?php class DS_News_Helper_Data extends Mage_Core_Helper_Abstract { public function getImagePath($id = 0){ ... } public function getImageUrl($id = 0){ ... } public function getCategoriesList() { $categories = Mage::getModel('dsnews/category')->getCollection()->load(); $output = array(); foreach($categories as $category){ $output[$category->getId()] = $category->getTitle(); } return $output; } public function getCategoriesOptions() { $categories = Mage::getModel('dsnews/category')->getCollection()->load(); $options = array(); $options[] = array( 'label' => '', 'value' => '' ); foreach ($categories as $category) { $options[] = array( 'label' => $category->getTitle(), 'value' => $category->getId(), ); } return $options; } }
<?php class DS_News_Block_Adminhtml_News_Grid extends Mage_Adminhtml_Block_Widget_Grid { protected function _prepareCollection(){ ... } protected function _prepareColumns() { $helper = Mage::helper('dsnews'); $this->addColumn('news_id', array( 'header' => $helper->__('News ID'), 'index' => 'news_id', 'width' => '100px', )); $this->addColumn('title', array( 'header' => $helper->__('Title'), 'index' => 'title', 'type' => 'text', )); $this->addColumn('category', array( 'header' => $helper->__('Category'), 'index' => 'category_id', 'options' => $helper->getCategoriesList(), 'type' => 'options', 'width' => '150px', )); $this->addColumn('created', array( 'header' => $helper->__('Created'), 'index' => 'created', 'type' => 'date', )); return parent::_prepareColumns(); } protected function _prepareMassaction(){ ... } public function getRowUrl($model){ ... } }
<?xml version="1.0" ?> <config> ... <adminhtml> <menu> <dsnews module="dsnews"> <title>News</title> <sort_order>77</sort_order> <children> <dsnews_news translate="title" module="dsnews"> <title>News</title> <sort_order>10</sort_order> <action>dsnews_admin/adminhtml_news</action> </dsnews_news> <dsnews_category translate="title" module="dsnews"> <title>Categories</title> <sort_order>20</sort_order> <action>dsnews_admin/adminhtml_category</action> </dsnews_category> </children> </dsnews> </menu> </adminhtml> ... </config>
<?php class DS_News_Model_Category extends Mage_Core_Model_Abstract { protected function _construct(){ ... } protected function _afterDelete() { foreach($this->getNewsCollection() as $news){ $news->setCategoryId(0)->save(); } return parent::_afterDelete(); } public function getNewsCollection() { $collection = Mage::getModel('dsnews/news')->getCollection(); $collection->addFieldToFilter('category_id', $this->getId()); return $collection; } }
<?php class DS_News_Block_Adminhtml_Category_Edit_Tabs_News extends Mage_Adminhtml_Block_Widget_Grid { public function __construct() { parent::__construct(); $this->setId('categoryNewsGrid'); $this->setUseAjax(true); } protected function _prepareCollection() { $collection = Mage::registry('current_category')->getNewsCollection(); $this->setCollection($collection); return parent::_prepareCollection(); } protected function _prepareColumns() { $helper = Mage::helper('dsnews'); $this->addColumn('ajax_grid_news_id', array( 'header' => $helper->__('News ID'), 'index' => 'news_id', 'width' => '100px', )); $this->addColumn('ajax_grid_title', array( 'header' => $helper->__('Title'), 'index' => 'title', 'type' => 'text', )); $this->addColumn('ajax_grid_created', array( 'header' => $helper->__('Created'), 'index' => 'created', 'type' => 'date', )); return parent::_prepareColumns(); } public function getGridUrl() { return $this->getUrl('*/*/news', array('_current' => true)); } }
<?php class DS_News_Block_Adminhtml_Category_Edit_Tabs extends Mage_Adminhtml_Block_Widget_Tabs { public function __construct(){ ... } protected function _prepareLayout() { $helper = Mage::helper('dsnews'); $this->addTab('general_section', array( 'label' => $helper->__('General Information'), 'title' => $helper->__('General Information'), 'content' => $this->getLayout()->createBlock('dsnews/adminhtml_category_edit_tabs_general')->toHtml(), )); $this->addTab('news_section', array( 'class' => 'ajax', 'label' => $helper->__('News'), 'title' => $helper->__('News'), 'url' => $this->getUrl('*/*/news', array('_current' => true)), )); return parent::_prepareLayout(); } }
<?php class DS_News_Adminhtml_CategoryController extends Mage_Adminhtml_Controller_Action { public function indexAction(){ ... } public function newAction(){ ... } public function editAction(){ ... } public function saveAction(){ ... } public function deleteAction(){ ... } public function newsAction() { $id = (int) $this->getRequest()->getParam('id'); $model = Mage::getModel('dsnews/category')->load($id); Mage::register('current_category', $model); if (Mage::app()->getRequest()->isAjax()) { $this->loadLayout(); echo $this->getLayout()->createBlock('dsnews/adminhtml_category_edit_tabs_news')->toHtml(); } } }
<?php class DS_News_Block_Adminhtml_Category_Edit_Tabs extends Mage_Adminhtml_Block_Widget_Tabs { public function __construct(){ ... } protected function _prepareLayout() { $helper = Mage::helper('dsnews'); $category = Mage::registry('current_category'); $this->addTab('general_section', array( 'label' => $helper->__('General Information'), 'title' => $helper->__('General Information'), 'content' => $this->getLayout()->createBlock('dsnews/adminhtml_category_edit_tabs_general')->toHtml(), )); if($category->getId()){ $this->addTab('news_section', array( 'class' => 'ajax', 'label' => $helper->__('News'), 'title' => $helper->__('News'), 'url' => $this->getUrl('*/*/news', array('_current' => true)), )); } return parent::_prepareLayout(); } }
<?php class DS_News_Block_Adminhtml_Category_Edit_Tabs_News extends Mage_Adminhtml_Block_Widget_Grid { public function __construct() { parent::__construct(); $this->setDefaultFilter(array('ajax_grid_in_category' => 1)); $this->setId('categoryNewsGrid'); $this->setSaveParametersInSession(false); $this->setUseAjax(true); } protected function _prepareCollection() { $collection = Mage::getModel('dsnews/news')->getCollection(); $this->setCollection($collection); return parent::_prepareCollection(); } protected function _prepareColumns() { $helper = Mage::helper('dsnews'); $this->addColumn('ajax_grid_in_category', array( 'align' => 'center', 'header_css_class' => 'a-center', 'index' => 'news_id', 'type' => 'checkbox', 'values' => $this->getSelectedNews(), )); $this->addColumn('ajax_grid_news_id', array( 'header' => $helper->__('News ID'), 'index' => 'news_id', 'width' => '100px', )); $this->addColumn('ajax_grid_title', array( 'header' => $helper->__('Title'), 'index' => 'title', 'type' => 'text', )); $this->addColumn('ajax_grid_created', array( 'header' => $helper->__('Created'), 'index' => 'created', 'type' => 'date', )); return parent::_prepareColumns(); } protected function _addColumnFilterToCollection($column) { if ($column->getId() == 'ajax_grid_in_category') { $collection = $this->getCollection(); $selectedNews = $this->getSelectedNews(); if ($column->getFilter()->getValue()) { $collection->addFieldToFilter('news_id', array('in' => $selectedNews)); } elseif (!empty($selectedNews)) { $collection->addFieldToFilter('news_id', array('nin' => $selectedNews)); } } else { parent::_addColumnFilterToCollection($column); } return $this; } public function getGridUrl() { return $this->getUrl('*/*/news', array('_current' => true, 'grid_only' => 1)); } public function getSelectedNews() { if (!isset($this->_data['selected_news'])) { $selectedNews = Mage::app()->getRequest()->getParam('selected_news', null); if(is_null($selectedNews) || !is_array($selectedNews)){ $category = Mage::registry('current_category'); $selectedNews = $category->getNewsCollection()->getAllIds(); } $this->_data['selected_news'] = $selectedNews; } return $this->_data['selected_news']; } }
<?php class DS_News_Adminhtml_CategoryController extends Mage_Adminhtml_Controller_Action { public function indexAction(){ ... } public function newAction(){ ... } public function editAction(){ ... } public function saveAction() { $categoryId = $this->getRequest()->getParam('id'); if ($data = $this->getRequest()->getPost()) { try { $helper = Mage::helper('dsnews'); $model = Mage::getModel('dsnews/category'); $model->setData($data)->setId($categoryId); $model->save(); $categoryId = $model->getId(); $categoryNews = $model->getNewsCollection()->getAllIds(); if ($selectedNews = $this->getRequest()->getParam('selected_news', null)) { $selectedNews = Mage::helper('adminhtml/js')->decodeGridSerializedInput($selectedNews); } else { $selectedNews = array(); } $setCategory = array_diff($selectedNews, $categoryNews); $unsetCategory = array_diff($categoryNews, $selectedNews); foreach($setCategory as $id){ Mage::getModel('dsnews/news')->setId($id)->setCategoryId($categoryId)->save(); } foreach($unsetCategory as $id){ Mage::getModel('dsnews/news')->setId($id)->setCategoryId(0)->save(); } Mage::getSingleton('adminhtml/session')->addSuccess($this->__('Category 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' => $categoryId )); } return; } Mage::getSingleton('adminhtml/session')->addError($this->__('Unable to find item to save')); $this->_redirect('*/*/'); } public function deleteAction(){ ... } public function newsAction() { $id = (int) $this->getRequest()->getParam('id'); $model = Mage::getModel('dsnews/category')->load($id); $request = Mage::app()->getRequest(); Mage::register('current_category', $model); if ($request->isAjax()) { $this->loadLayout(); $layout = $this->getLayout(); $root = $layout->createBlock('core/text_list', 'root', array('output' => 'toHtml')); $grid = $layout->createBlock('dsnews/adminhtml_category_edit_tabs_news'); $root->append($grid); if (!$request->getParam('grid_only')) { $serializer = $layout->createBlock('adminhtml/widget_grid_serializer'); $serializer->initSerializerBlock($grid, 'getSelectedNews', 'selected_news', 'selected_news'); $root->append($serializer); } $this->renderLayout(); } } }
<?php echo '<h1>Upgrade DS News to version 0.0.3</h1>'; exit; $installer = $this; $tableNews = $installer->getTable('dsnews/table_news'); $installer->startSetup(); $installer->getConnection() ->addColumn($tableNews, 'link', array( 'comment' => 'News URL link', 'type' => Varien_Db_Ddl_Table::TYPE_TEXT, 'length' => '255', 'nullable' => true, )); $installer->getConnection() ->addKey($tableNews, 'IDX_UNIQUE_NEWS_LINK', 'link', Varien_Db_Adapter_Interface::INDEX_TYPE_UNIQUE); foreach (Mage::getModel('dsnews/news')->getCollection() as $news) { try { $news->load($news->getId())->setDataChanges(true)->save(); } catch (Exception $e) { $news->setId($news->getId())->setLink($news->getId())->save(); } } $installer->endSetup();
<?xml version="1.0" ?> <config> <modules> <DS_News> <version>0.0.3</version> </DS_News> </modules> ... </config>
<?php class DS_News_Helper_Data extends Mage_Core_Helper_Abstract { public function getImagePath($id = 0){ ... } public function getImageUrl($id = 0){ ... } public function getCategoriesList(){ ... } public function getCategoriesOptions(){ ... } public function prepareUrl($url) { return trim(preg_replace('/-+/', '-', preg_replace('/[^a-z0-9]/sUi', '-', strtolower(trim($url)))), '-'); } }
<?php class DS_News_Model_News extends Mage_Core_Model_Abstract { protected function _construct(){ ... } protected function _afterDelete(){ ... } protected function _beforeSave() { $helper = Mage::helper('dsnews'); if (!$this->getData('link')) { $this->setData('link', $helper->prepareUrl($this->getTitle())); } else { $this->setData('link', $helper->prepareUrl($this->getData('link'))); } return parent::_beforeSave(); } public function getImageUrl(){ ... } }
<?php class DS_News_Block_Adminhtml_News_Edit_Tabs_General extends Mage_Adminhtml_Block_Widget_Form { protected function _prepareForm() { ... $fieldset->addField('link', 'text', array( 'label' => $helper->__('Link'), 'name' => 'link', )); ... } }
<?xml version="1.0" ?> <config> ... <global> ... <events> <controller_front_init_routers> <observers> <dsnews> <class>DS_News_Controller_Router</class> <method>initControllerRouters</method> </dsnews> </observers> </controller_front_init_routers> </events> ... </global> </config>
<?php class DS_News_Controller_Router extends Mage_Core_Controller_Varien_Router_Abstract { public function initControllerRouters($observer) { $front = $observer->getEvent()->getFront(); $front->addRouter('dsnews', $this); } public function match(Zend_Controller_Request_Http $request) { $identifier = trim($request->getPathInfo(), '/'); $cmd = explode('/', $identifier); if ($cmd[0] == 'news') { if (count($cmd) == 1) { return $this->_fillRequest($request); } else { $model = Mage::getModel('dsnews/news')->load($cmd[1], 'link'); if ($model->getId()) { $params = array( 'id' => $model->getId() ); return $this->_fillRequest($request, $params, 'index', 'view'); } } } return false; } protected function _fillRequest($request, $cmd = array(), $controller = 'index', $action = 'index') { $request->setModuleName('news') ->setControllerName($controller) ->setActionName($action) ->setParam('is_routed', 1); if (is_array($cmd) && count($cmd)) { foreach ($cmd as $key => $value) { $request->setParam($key, $value); } } $request->setAlias(Mage_Core_Model_Url_Rewrite::REWRITE_REQUEST_PATH_ALIAS, $request->getPathInfo()); return true; } }
Source: https://habr.com/ru/post/180555/
All Articles