Список статей и страница статьи

Для вывода данных Magento использует классы блоков (мы уже использовали блоки в админке такие как Grid, Edit ...). В блок переносится бизнес-логика и этот блок можно будет использовать в разных частях страницы. Контроллер только инициализирует нужный блок.

Для вывода информации, нам нужно будет создать:

  1. класс блока для вывода списка статей
  2. класс блока для вывода страницы статьи
  3. создать xml файл лайаута в шаблоне
  4. добавить в настройки модуля информацию о блоках
  5. добавить функционал вывода блоков в контроллер
  6. создать шаблон для списка статей
  7. создать шаблон для страницы статьи

Создаем блок для вывода списка статей

Класс реализует функционал возвращающий коллекцию записей.

Для этого нам нужно создать файл:

app/code/local/My/Articles/Block/Articles.php

Добавляем код:

<?php

class My_Articles_Block_Articles extends Mage_Core_Block_Template
{

   public function getArticlesCollection()
   {
       $collection = Mage::getModel("myarticles/articles")->getCollection();
       $collection->setOrder('created', 'DESC');
       return $collection;
   }

}

Создаем класс для вывода страницы статьи

Создаем файл:

app/code/local/My/Articles/Block/View.php

и добавляем код:

<?php

class My_Articles_Block_View  extends Mage_Core_Block_Template
{
}

Создаем xml файл лайаута в шаблоне

В каталоге вашей темы (у меня: design/frontend/default/default), создаем каталог (если такого нет):

design/frontend/default/default/layout

и файл:

design/frontend/default/default/layout/my_articles.xml

Добавляем код:

<layout>
   <marticles_index_index>
       <reference name="content">
           <block type="my_articles_block/articles" template="my_articles/index.phtml" />
       </reference>
   </marticles_index_index>
   <marticles_index_view>
       <reference name="content">
           <block type="my_articles_block/articles" name="my_articles.content" template="my_articles/view.phtml" />
       </reference>
   </marticles_index_view>
</layout>

Добавляем в настройки модуля информацию о блоках

В файле настройки нашего модуля (app/code/local/My/Articles/etc/config.xml)

Тут мы добавляем параметры (см. комментарии):

  1. Данные для лайаута
  2. Данные для лайаута нашего модуля

добавляем код:

<?xml version="1.0" ?>
<config>
   <modules>
       <My_Articles>
           <version>1.0.0</version>
       </My_Articles>
   </modules>
   <frontend>
    <!-- Данные для лайаута -->
    <layout>
           <updates>
               <!-- Данные для лайаута нашего модуля -->
               <my_articles_block>
                   <file>my_articles.xml</file>
               </my_articles_block>
           </updates>
       </layout>
       <routers>
           <marticles>
               <use>standard</use>
               <args>
                   <module>My_Articles</module>
                   <frontName>articles</frontName>
               </args>
           </marticles>
       </routers>
   </frontend>
   <global>
       <!-- Код для моделей -->
       <models>
           <myarticles>
               <!-- Мы создали класс My_Articles_Model_Articles, в 
                этом параметре, мы указываем только путь к файлу My_Articles_Model без 
                имени файла Articles -->
               <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>
           <My_Articels_marticles_setup>
               <setup>
                   <module>My_Articles</module>
               </setup>
           </My_Articels_marticles_setup>
       </resources>
        <!-- Код для блока -->
       <blocks>
           <my_articles_block>
               <class>My_Articles_Block</class>
           </my_articles_block>
       </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>

Добавляем функционал вывода блоков в контроллер

Открываем файл:

app/code/local/My/Articles/controllers/IndexController.php

Добавляем код:

<?php

class My_Articles_IndexController extends Mage_Core_Controller_Front_Action
{

   public function indexAction()
   {
       $this->loadLayout();
       $this->renderLayout();
   }

   public function viewAction()
   {
       $id = Mage::app()->getRequest()->getParam('id', 0);
       $articles = Mage::getModel('myarticles/articles')->load($id);
       if ($articles->getId() > 0) {
           $this->loadLayout();
           $this->getLayout()->getBlock('my_articles.content')->assign(array(
               "item" => $articles,
           ));
           $this->renderLayout();
       } else {
           $this->_forward('noRoute');
       }
   }

}

Создаем шаблон для списка статей.

В каталоге вашей темы (у меня: design/frontend/default/default), создаем каталог (если его нет):

design/frontend/default/default/template

и

design/frontend/default/default/template/my_articles

Создаем файл:

design/frontend/default/default/template/my_articles/index.phtml

Добавляем код:

<?php

$items = $this->getArticlesCollection();
$articleViewUrl = Mage::getUrl('articles/index/view');
$helper = Mage::helper('myarticles');
?>
   <h1>Articles</h1>
   <?php foreach ($items as $item): ?>
       <div>
           <div>
               <a href="<?php echo $articleViewUrl; 
?>?id=<?php echo $item->getId(); ?>" title="<?php echo 
$item->getHeader(); ?>">
                   <?php echo $item->getHeader(); ?>
               </a>
           </div>
           <div style="float: left; width: 100px;">
               <?php if (is_file($helper->getImagePath($item->getId()))): ?>
               <a href="<?php echo $articleViewUrl; 
?>?id=<?php echo $item->getId(); ?>" title="<?php echo 
$item->getHeader(); ?>">
                   <img 
alt="<?php echo $item->getHeader(); ?>" style="width: 90px; 
height: 90px;" src="<?php echo 
$helper->getImageUrl($item->getId())?>">
               </a>
               <?php endif; ?>
           </div>
           <div style="float: left; margin-left: 10px;">
               <?php echo $item->getPreview(); ?>
               <p><a href="<?php echo $articleViewUrl; 
?>?id=<?php echo $item->getId(); ?>" title="<?php echo 
$item->getHeader(); ?>">Read More</a></p>
           </div>
           <div style="clear: both"></div>
       </div>
<?php endforeach; ?>

Создаем шаблон для страницы статьи

Создаем файл:

design/frontend/default/default/template/my_articles/view.phtml

Добавляем код:

<?php

$helper = Mage::helper('myarticles');
?>
<h1><?php echo $item->getTitle(); ?></h1>
<div style="float: left; width: 150px; margin-right: 10px;">
   <?php if (is_file($helper->getImagePath($item->getId()))): ?>
           <img alt="<?php echo $item->getHeader(); ?>" 
style="width: 150px; height: 150px; " src="<?php echo 
$helper->getImageUrl($item->getId())?>">
   <?php endif; ?>
</div>
<div class="content" style="float: left;"><?php echo $item->getContent(); ?></div>
<div style="clear: both"></div>

Готово.