RSS Мои друзья Контакты

Magento - создание CRUD модуля

Magento - это одна из самых сложных для программиста платформ. Но это только на первый взгляд. В следующих нескольких статьях я опровергну это на примере создания CRUD модуля цитат! Итак поехали :)

Начало

Создадим структуру директорий и файлов для нашего модуля

|-app
|---code
|-----local
|-------Freaks
|---------Quotes
|-----------Block
|-------------Content.php
|-----------controllers
|-------------IndexController.php
|-----------etc
|-------------config.xml
|-----------Model
|---design
|-----frontend
|-------base
|---------default
|-----------layout
|-------------freaks
|---------------quotes.xml
|---etc
|-----modules
|-------Freaks_All.xml

Создаем файл config.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Freaks_Quotes>
            <version>0.1.0</version>
        </Freaks_Quotes>
    </modules>
    <global>
        <blocks>
            <freaks_quotes>
                <class>Freaks_Quotes_Block</class>
            </freaks_quotes>
        </blocks>
    </global>
    <frontend>
        <routers>
            <Freaks_Quotes>
                <use>standard</use>
                <args>
                    <module>Freaks_Quotes</module>
                    <frontName>quotes</frontName>
                </args>
            </Freaks_Quotes>
        </routers>
        <layout>
            <updates>
                <freaks_quotes>
                    <file>freaks/quotes.xml</file>
                </freaks_quotes>
            </updates>
        </layout>
    </frontend>
</config>

Немного объясню что это все значит:

  • секция modules отвечают за версию вашего модуля. Это нужно, чтобы потом можно было обновить модуль, когда будет выпущена новая версия
  • blocks - указывает движку, где находятся блоки для отображения (по своей сути Magento отображает весь контент у виде вложеных блоков, что-то похожее на Drupal, если кто-то сталкивался)
  • frontend/routes - указываем routing, наш модуль на frontend-е будет доступен по адресу "/quotes"
  • frontend/layout/updates - указывает, какой файл отвечает за изменение макета, когда наш модуль включен

Чтобы модуль можно было начать тестировать, нужно для начала его включить. Открываем файл app/etc/modules/Freaks_All.xml

<?xml version="1.0"?>
<config>
<modules>
<Freaks_Quotes>
<active>true</active>
<codePool>local</codePool>
</Freaks_Quotes>
</modules>
</config>

Открываем файл app/design/frontend/base/default/layout/freaks/quotes.xml. Это layout-файл, который отвечает за отображение блоков при запросе пользователя.

<?xml version="1.0"?>
<layout version="0.1.0">
<freaks_quotes_index_index>
<reference name="content">
<block type="freaks_quotes/content" name="quotes.all" />
</reference>
</freaks_quotes_index_index>
</layout>

freaks_quotes_index_index - это один из handle-ов, которые генерирует Magento, когда открывается страница. В нашем случае мы говорим, что когда в нас модуль = freaks_quotes, контроллер = index и действие = index, тогда обращаемся к блоку контент посредством директивы reference и добавляем в него новый блок, который мы создали.

Теперь создаем контроллер, в нашем случае он очень простой, так как все что нужно сделать описано в layout файле.

<?php
class Freaks_Quotes_IndexController extends Mage_Core_Controller_Front_Action
{
public function indexAction()
{
$this->loadLayout()
->renderLayout();
}
}

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

<?php
class Freaks_Quotes_Block_Content extends Mage_Core_Block_Template
{
protected function _toHtml()
{
return 'Freaks_Quotes';
}
}

И последнее - заходим в панель администратора и там System > Configuration > Advanced > Advanced . Нажимаем кнопку Save Config (это нужно, чтобы разрешить выводить контент на сайте для нашего модуля.). Чистим кэш и заходим на нашу страничку цитат. На моем локальном компьютере - это http://mage.linux/quotes.

Если все работает я Вас поздравляю, если нет можете написать мне на почту, я с удовольствием Вам помогу.

База данных и модели

Изменим структуру директорий следующим образом

|-app
|---code
|-----local
|-------Freaks
|---------Quotes
|-----------Block
|-----------controllers
|-----------etc
|-----------Helper
|-------------Data.php
|-----------Model
|-------------Resource
|---------------Quote
|-----------------Collection.php
|---------------Quote.php
|-------------Quote.php
|-----------sql
|-------------freaks_quotes_setup
|---------------mysql4-install-0.2.0.php

Для управлением данными в Magento используются модели. Для одной таблицы нужно создать 3 модели, одна для управления бизнес логикой, вторая - называется resource модель, используется для непосредственной работы с базой данных и третья - для управления обновлениями. Вся информация о связях моделей находится в config.xml. Изменим его с учетом этого

<?xml version="1.0"?>
<config>
    <modules>
        <Freaks_Quotes>
            <version>0.2.0</version>
        </Freaks_Quotes>
    </modules>
    <global>
        <blocks>
            <freaks_quotes>
                <class>Freaks_Quotes_Block</class>
            </freaks_quotes>
        </blocks>
        <helpers>
            <freaks_quotes><class>Freaks_Quotes_Helper</class></freaks_quotes>
        </helpers>
        <models>
            <freaks_quotes>
                <class>Freaks_Quotes_Model</class>
                <resourceModel>quotes_resource</resourceModel>
            </freaks_quotes>
            <quotes_resource>
                <class>Freaks_Quotes_Model_Resource</class>
                <entities>
                    <quote>
                        <table>freaks_quotes</table>
                    </quote>
                </entities>
            </quotes_resource>
        </models>
        <resources>
            <freaks_quotes_setup>
                <setup>
                    <module>Freaks_Quotes</module>
                </setup>
                <connection>
                    <use>core_setup</use>
                </connection>
            </freaks_quotes_setup>
            <freaks_quotes_write>
                <connection>
                    <use>core_write</use>
                </connection>
            </freaks_quotes_write>
            <freaks_quotes_read>
                <connection>
                    <use>core_read</use>
                </connection>
            </freaks_quotes_read>
        </resources>
    </global>
    <frontend>
        <routers>
            <freaks_quotes>
                <use>standard</use>
                <args>
                    <module>Freaks_Quotes</module>
                    <frontName>quotes</frontName>
                </args>
            </freaks_quotes>
        </routers>
        <layout>
            <updates>
                <freaks_quotes>
                    <file>freaks/quotes.xml</file>
                </freaks_quotes>
            </updates>
        </layout>
    </frontend>
</config>

Теперь посмотрим, что и зачем было добавлено в конфигурацию

  • helpers - указывает суфикс класса-помощника, который понадобится в дальнейшем в шаблонах і блоках
  • models - модели для работы с базой данных и связь ресурс-модели и бизнес модели. resourceModel - это имя элемента xml-конфигурации, в котором описывается ресурс-модель
  • resources - указывает, модели для работы с данными для записи, чтения и обновления (или установки модуля)

Будьте внимательны и не забудьте поменять версию модуля в настройках, иначе файли установки модуля не будут выполнены!

Создадим модели. Открываем app/code/local/Freaks/Quotes/Model/Quote.php

<?php
class Freaks_Quotes_Model_Quote extends Mage_Core_Model_Abstract
{
protected function _construct()
{
$this->_init('freaks_quotes/quote');
}
}

этот код на самом деле почти ничего не делает :). Он всего лишь привязывает ресурс-модель к бизнес-модели. Создадим же теперь ресурс-модель в app/code/local/Freaks/Quotes/Model/Resource/Quote.php

<?php
class Freaks_Quotes_Model_Resource_Quote extends Mage_Core_Model_Mysql4_Abstract
{
protected function _construct()
{
$this->_init('freaks_quotes/quote', 'id');
}
}

На удивление код почти идентичен :), но делает он совсем другое... Эти строки значат, что нужно обратится в xml-конфигурацию по пути config > global > models > quotes_resource > entities > quote, чтобы узнать имя таблицы.

Теперь создадим модель-коллекции ресурс-модели. На самом деле, это обычный класс, который отвечает за работу с набором моделей, поэтому я не упоминал об этом классе, как об отдельной модели. Редактируем app/code/local/Freaks/Quotes/Model/Resource/Quote/Collection.php

<?php
class Freaks_Quotes_Model_Resource_Quote_Collection extends Mage_Core_Model_Mysql4_Collection_Abstract
{
protected function _construct()
{
$this->_init('freaks_quotes/quote');
}
}

В конструкторе задаем набор каких моделей будет содержать наша коллекция.

На конец осталось создать только файли установки модуля. Открываем app/code/local/Freaks/Quotes/sql/quotes_setup/mysql4-install-0.2.0.php

<?php
$installer = $this;
$installer->startSetup();

$installer->run("
CREATE TABLE `{$this->getTable('freaks_quotes/quote')}` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`dscr` mediumtext NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
"
);

$installer->endSetup();

После первого запроса на сайт, этот файл будет выполнен. Пробуем и смотрим, что же получилось. Добавим несколько строк тестовых данных в базу через любой удобный для вас UI (я, например, использую phpMyAdmin).

Блоки и шаблоны

По сколько модели созданы теперь можно работать с данными через очень простой интерфейс. Отредактируем наш блок (app/code/local/Freaks/Quotes/Block/Content.php)

<?php
class Freaks_Quotes_Block_Content extends Mage_Core_Block_Template
{
protected function _construct()
{
$this->setTemplate('freaks/quotes/view.phtml');
}

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

public function getCollection()
{
return Mage::getModel('freaks_quotes/quote')->getCollection();
}
}

В конструкторе блока устанавливаем ему шаблон, который будет отображать список цитат. Давайте создадим же этот файл (app/design/frontend/base/default/template/freaks/quotes/view.phtml)

<?php foreach ($this->getCollection() as $quote): ?>
<div class="quote-item">
<h4><a href="<?php echo $this->getRowUrl($quote) ?>"><?php echo $quote->getName() ?></a></h4>
<p><?php echo $quote->getDscr() ?></p>
</div>
<?php endforeach ?>

У меня он очень простой, вы же можете пофантазировать и поработать творчески ;) Обновим нашу страничку и смотрим результат

Свой модуль на Magento - результатЧтобы просматривать цытаты нужно создать viewAction в контроллере, блок и еще один шаблон. Приступим, редактируем app/code/local/Freaks/Quotes/controllers/indexController.php

<?php
class Freaks_Quotes_IndexController extends Mage_Core_Controller_Front_Action
{
public function indexAction()
{
$this->loadLayout()
->renderLayout();
}

public function viewAction()
{
$quote_id = (int)$this->getRequest()->getParam('id');
if (!$quote_id) {
$this->_forward('noRoute');
}
$this->loadLayout();
$this->getLayout()
->getBlock('quote.item')
->setQuoteId($quote_id);
$this->renderLayout();
}
}

Поскольку блоки наследуются от Varien_Object класса, то в него можно передать любое значение посредством сеттеров и геттеров. Именно таким образом передаем идентификатор цитаты в блок.

Создадим helper для модуля, так как в шаблонах нам нужно будет переводить строки. Открываем app/code/local/Freaks/Quotes/Helper/Data.php

<?php
class Freaks_Quotes_Helper_Data extends Mage_Core_Helper_Abstract
{
}

Да вот такой у нас "сложный" helper :)

В layout-конфигурации создадим handle для viewAction-а, в котором в контент подключим блок для отображения одной цитаты (app/design/frontend/base/default/layout/freaks/quotes.xml)

<?xml version="1.0"?>
<layout version="0.1.0">
<freaks_quotes_index_index>
<reference name="content">
<block type="freaks_quotes/content" name="quotes.all" />
</reference>
</freaks_quotes_index_index>

<freaks_quotes_index_view>
<reference name="content">
<block type="freaks_quotes/quote_content" name="quote.item" />
</reference>
</freaks_quotes_index_view>
</layout>

Создаем блок app/code/local/Freaks/Quotes/Block/Quote/Content.php

<?php
class Freaks_Quotes_Block_Quote_Content extends Mage_Core_Block_Template
{
protected function _construct()
{
$this->setTemplate('freaks/quotes/quote/view.phtml');
}

public function getQuote()
{
return Mage::getModel('freaks_quotes/quote')->load($this->getQuoteId());
}
}

Ну и последнее - шаблон app/design/frontend/base/default/template/freaks/quotes/quote/view.phtml

<?php $quote = $this->getQuote() ?>
<h1><?php echo Mage::helper('freaks_quotes')->__('View quote "%s"', $quote->getName()) ?></h1>
<p><?php echo $quote->getDscr() ?></p>

Проверяем результат :)

Свой модуль на Magento - просмотр цытата

Вот и все. В следующей статье создадим модуль для редактирования цитат в административной панели.

Этот модуль можно скачать ЗДЕСЬ.

Добавить комментарий

Комментариев: 49

  • romahaos
    Ответить 25 августа 2011 г., 12:28
    Спасибо за замечательную статью. Скажем так открыла глаза , но блин сложно.
  • XRumer
    Ответить 28 августа 2011 г., 9:11
    Это прям в точку!!! Другими словами и не скажешь! :) Ресурс Ваш почему-то слабо продвинутый и плохопосещаем. Советуем раскрутить его с помощью софта XRumer 7 Elite (ХРумер 7 Элите) скачать можно тут http://x-rumer.ru/ слышал убойная программа для оптимизации блог порталов.
  • Elena
    Ответить 12 октября 2011 г., 11:59
    У меня не создается таблица в БД. Поясните, пожалуйста, более подробно фразу "Будьте внимательны и не забудьте поменять версию модуля в настройках, иначе файлы установки модуля не будут выполнены!" Мне кажется где-то именно здесь у меня путаница, так как однажды такая таблица уже создавалась.
  • Elena
    Ответить 12 октября 2011 г., 16:39
    Огромная благодарность автору! Все так доступно описано. Если бы Вы еще подсказали, как можно вставить где-нибудь на сайте, например в меню, ссылку на этот самый список цитат - Вам бы цены не было!
  • snovyda
    Ответить 19 октября 2011 г., 3:35
    Огроменное Вам спасибо!
    Пока нашел ваш блог, чуть спать не пошел :)
    Теперь наверно уже и ложиться не буду... :)))
    Но ведь тут все понятно написано!
  • IrininaSviridova
    Ответить 23 октября 2011 г., 16:27
    Заманчиво спс автору! Об таком уже читала, а на том блоге немного по-другому написано...
  • annalustikova
    Ответить 17 ноября 2011 г., 4:08
    Благодарю публикатору это на мое усмотрение так же важно знать.
  • dengimiraorg
    Ответить 21 ноября 2011 г., 23:27
    Спасибо за пост. Что-нибудь еще о похожем интересно почитать. :)
  • Anton
    Ответить 13 января 2012 г., 15:18
    У меня почему-то не работает модуль. Взял уже тупо архив и распаковал. Не создает таблицу почему-то:
    SQLSTATE[42S02]: Base table or view not found: 1146 Table 'experiment.freaks_quotes' doesn't exist
    • Сергей (Администратор)
      Ответить 13 января 2012 г., 15:33
      Видимо не запустился апгрейд файл. Попробуйте почистить кэш
      • Anton
        Ответить 13 января 2012 г., 15:51
        Я это сразу исключил, т.к. у меня весь кеш отключен. Даже вручную папку кеша почистил. К сожалению, в чем-то еще проблема.
      • Anton
        Ответить 13 января 2012 г., 16:20
        Попробовал маженту переустановить. Все заработало. Так и не понял в чем причина была. Прошу прощения что поднял шум на ровном месте)) Статья офигенная, побольше б таких!
  • Varan
    Ответить 25 февраля 2012 г., 14:18
    О круто! Хороших рускоязычных статей по дев для мадженты мало. В основном недополненные, обрываются, или не выходят продолжения уроков. На вашем блоге вроде как все статьи заканчиваются:) Сейчас приступим к изучению)
  • Varan
    Ответить 25 февраля 2012 г., 17:21
    Прочел, сделал. Все отлично работает:) Спасибо за грамотную статью!)
  • Дмитрий
    Ответить 13 марта 2012 г., 15:36
    Спасибо за статьи, прекрасный блог.
    Не могли бы помочь с проблемой:
    Перед созданием viewAction в контроллере, когда нужно было обновить страничку и увидеть результат, я увидел ошибку:
    dbModel read resource does not implement Zend_Db_Adapter_Abstract
    • Сергей (Администратор)
      Ответить 14 марта 2012 г., 10:21
      Наверно в конфигах, что-то неправильно указали. У меня такого не было, но эксепшен пробрасывает класс Varien_Data_Collection_Db метод setConnection
    • Сергей (Администратор)
      Ответить 14 марта 2012 г., 16:52
      Может также быть отсутствие связи с базой
      • Дмитрий
        Ответить 30 марта 2012 г., 13:22
        Конфиги смотрел. В отчете действительно setConnection(false). Таблица freaks_quote в базе создается. Загвоздка получается, в return Mage::getModel('freaks_quotes/quote')->getCollection(); Пробовал print_r(Mage::getModel('freaks_quotes/quote')), выдает инфо об объекте. Причем через getSingleton() в этом же методе все получается, результаты возвращаются. Но хотелось бы через модели(
        • Дмитрий
          Ответить 30 марта 2012 г., 14:39
          Спасибо за внимание, таки разобрался. Если у кого такая ошибка, у меня заработало только после того, как я поменял $this->init('quotes/quote') и в связи с этим изменением внес соответствующие правки. Я не уверен, конечно, но почему то при описании ресурс модели используется <quotes_read>, <quotes_write>, а в URI модели freaks_quotes, а должно быть quotes.
          • Сергей (Администратор)
            Ответить 30 марта 2012 г., 20:00
            Да Вы правы там ошибка в конфигах должно быть freaks_quotes_read и write. Директивы read и write можно не указывать, тогда будут браться коровские по умолчанию.
  • Finaashkina
    Ответить 4 апреля 2012 г., 9:32
    Тема конечно интересная,только вот почему-то комментариев мало. видимо большинсто коментов фильтруются как спам. Вам бы вручную модерировать Ваш форум freaksidea.com уважаемый администратор
  • Сергей
    Ответить 16 мая 2012 г., 15:07
    Не создаются таблицы, коменты не помогли, обидно что никаких ошибок не показывает...
    • Сергей (Администратор)
      Ответить 16 мая 2012 г., 23:21
      Если Вы брали исходники, то там ошибка. Исправил, протестировал и перезалил сейчас все работает нормально. Не забывайте кэш почистить.
    • Сергей (Администратор)
      Ответить 16 мая 2012 г., 23:39
      Если будете использовать ту же базу, то нужно сначала выполнить запрос:
      > DELETE FROM `core_resource` WHERE `code` = 'freaks_quotes';

      Потом скопировать содержимое модуля в корень Мадженто, заменить все файлы при запросе. Потом ОБЯЗАТЕЛЬНО не забываем почистить кэш (кстати нужно удалить руками все содержимое var/cache или почистить кэш через админку, НО потом нужно проверить таблицу core_resouce и если там модуль уже есть, тогда придется создать еще один файл в директории модуля sql/freaks_quotes_setup/mysql4-upgrade-0.2.0-0.3.0.php, а в config.xml изменить версию модуля на 0.3.0). Обновляем страницу и все должно работать. Все это зависит от того как настроен кэш
      • Сергей
        Ответить 22 мая 2012 г., 14:26
        Извините - не понял фразу "Потом скопировать содержимое модуля в корень Мадженто, заменить все файлы при запросе"
        тоесть нужно из папки 'Quotes' скопировать все содержимое и вставить его в корень 'magento' тоесть туда где находится 'index.php'?
        • Сергей (Администратор)
          Ответить 22 мая 2012 г., 18:11
          Нет, под модулем имелось введу то, что в архиве лежит
          • Сергей
            Ответить 23 мая 2012 г., 12:28
            Заменил все файлы на скачанные, включил отображение всех ошибок, увидел то что и предполагалось - весь затык на этапе создания таблицы. Скажите, а где можно почитать поболее про то почему именно так создаются таблицы - не проще ли их просто вручную в том же phpmyadmin сделать?
            • Сергей (Администратор)
              Ответить 23 мая 2012 г., 14:48
              Сделайте в ручную, никаких проблем
              • Сергей
                Ответить 24 мая 2012 г., 14:38
                Спасибо - все работает, только непонятно почему в magento таким образом создаются таблицы, и почему иногда этот метод может не работать...
                • Сергей (Админ)
                  Ответить 24 мая 2012 г., 17:22
                  Это один из стандартных способов апгрейдов и создания модулей. Если "я" простой пользователь (не знаю ничего о SQL) хочу установить модуль то просто качаю его, чищу кэш, обновляю страничку и все работает.

                  Magento при каждой загрузке страницы проверяет нужно ли установить какой-нибудь модуль или проапргрейдить (позже были добавлены 2 настройки global/skip_process_modules_updates и global/skip_process_modules_updates_ignore_dev_mode чтобы это можно было отключить ибо много времени занимает). Установленные модули и их версии она хранит в таблице core_resource. При запросе пользователя собираются все модули и их версии из файлов app/etc/modules/*.xml. Потом вызывается Mage_Core_Model_Resource_Setup::applyAllDataUpdates(), в котором проверяется, есть ли модуль в базе, если нету, то запускаем install скрипт, если есть проверяется версия, если версия выше той которая в базе запускается upgrade скрипт, если ниже - rollback скрипт.
  • Gr1g0ry
    Ответить 18 июня 2012 г., 10:48
    Статья действительно замечательная!
    Но не совсем понятно наличие как задается расположение файлов отображения "Content.php"
    в xml задано
    <blocks>
    <freaks_quotes>
    <class>Freaks_Quotes_Block</class>
    </freaks_quotes>
    </blocks>
    а структура каталогов
    local/Freaks/Quotes/Block/Quote/Content.php

    Почему произошло добавление папки /Quote/ при описании модели?
    • Gr1g0ry
      Ответить 18 июня 2012 г., 11:21
      Прошу прощения, нужно было дочитать до конца прежде чем задавать вопросы.
      Я понял, что в Quotes/Block/Quote/Content.php формируется блок для вывода одной цитаты,
      а в Quotes/Block/Content.php - для списка цитат.
  • maxst
    Ответить 16 июля 2012 г., 17:03
    у меня вопрос по исходному коду - почему во всех конструкторах вы пишите _construct() вместо __construct() - 1 символ нижнего подчеркивания вместо двух
    • Сергей (Администратор)
      Ответить 16 июля 2012 г., 21:27
      Потому что это защищенный (а не публичный) метод, который нужно использовать для инициализации блоков и моделей. Что-то вроде договоренности, а кроме того в стандартном конструкторе Magento сама что-то инициализирует и потом вызывает метод _construct().
  • Игорь
    Ответить 16 июля 2012 г., 22:37
    выкидивает еррор Call to a member function setQuoteId() on a non-object все это происходит методе viewAction() контроллера...
    • Сергей (Администратор)
      Ответить 17 июля 2012 г., 20:26
      Видно у Вас layout update не применился. Попробуйте почистить кэш и посмотрите есть ли у вас файл app/design/frontend/base/default/layout/freaks/quotes.xml
      • Игорь
        Ответить 18 июля 2012 г., 22:43
        да, все верно, пасибо за совет. Именно в этом файле была ошибка.
  • globian
    Ответить 21 августа 2012 г., 15:09
    Сергей спасибо за статью, у вас ошибка .../etc/config.xml так и не исправлена, в должно стоять

    <quotes_resource>
    <class>Freaks_Quotes_Model_Resource</class>
    <entities>
    <quote>
    <table>quote</table>
    </quote>
    </entities>
    </quotes_resource>
    • Сергей (Администратор)
      Ответить 21 августа 2012 г., 21:48
      А ошибка где? В теге <table> можно указать любое имя для таблицы. Это именно имя таблицы в базе данных
  • Hosh
    Ответить 5 сентября 2012 г., 0:17
    Да, статья действительно здоровская. Единственная, из тех что я нашел, по которой можно мне, как новичку, что-нибудь наглядное сделать так, чтоб работало :) спасибо.
    Только у меня ошибка получилась под конец:
    Fatal error: Class 'Freaks_Quotes_Block_Content' not found in Z:\home\localhost\magento\app\code\core\Mage\Core\Model\Layout.php on line 491

    Почему он ссылается на коровский лэйаут?
    Как-то я пока не совсем понял принцип, по которому core код меняется на наш.
    • Dmitrik
      Ответить 14 апреля 2014 г., 21:29
      Он не меняется, а расширяет имеющийся класс. Изучили бы ООП для начала.

      Ошибка связана либо с отсутствием блока Content.php, либо с ошибкой его написания при расширении (extends).
  • Дмитрий
    Ответить 1 декабря 2012 г., 9:59
    А где-же продолжение, про редактирование в админке?..
    • Сергей (Администратор)
      Ответить 1 декабря 2012 г., 14:46
      http://freaksidea.com/php_and_somethings/show-6-magento-backend-sozdanie-crud-modulia
  • k1cker
    Ответить 27 марта 2013 г., 15:11
    кеш я отключил + почистил кеш вручную и все равно одно и тоже! И в чем дело? При чем, QUOTES добавляется в админпанель а при нажатии на нее выбивается


    There has been an error processing your request

    Exception printing is disabled by default for security reasons.

    Error log record number: 282011510
    • Сергей (Администратор)
      Ответить 27 марта 2013 г., 22:31
      посмотрите содержимое файла: var/report/282011510
  • Денис
    Ответить 17 июля 2013 г., 16:15
    Приветствую, Сергей.
    Отличная статья, спасибо! У меня назрел вопрос который поа не понимаю как решить. Вот есть кусок в locale.xml :

    <reference name="content">
    <block type="freaks_quotes/content" name="quotes.all" />
    </reference>
    Этим мы говорим что созданный нами блок референсим в контент. А как например референсить в кастомный структурный блок? Например:
    <reference name="mynewcusblock">
    <block type="freaks_quotes/content" name="quotes.all" />
    </reference>
    Пока ничего не выходит.
    • Сергей (Администратор)
      Ответить 19 июля 2013 г., 10:49
      Layout xml определяет только структуру блоков, а за их вывод отвечает метод _toHtml внутри класса блока. Есть блоки которые только и делают что выводят все дочерние блоки, а есть блоки в которых есть свои темплейты и чтобы вывести в них дочерний блок нужно написать: <?php echo $this->getChildHtml('child_block_alias') ?>
      • Денис
        Ответить 19 июля 2013 г., 11:15
        Примерно понял. Спасибо. Решил обойтись пока без создания кастомного структурного блока а сделал референс в header и в шаблонк хедера уже указал <?php echo $this->getChildHtml('quotes.all') ?>
  • Руслан
    Ответить 9 августа 2013 г., 12:11
    Благодарочка за статью. Хоть чуть чуть получается систематизировать знания и определить хоть какую то последовательность. Еще и на русском языке.