Как создать простой модуль «Hello World» в Magento?

269

Как можно выполнить следующее в Magento?

  • Отобразите сообщение "Hello World", используя подход контроллера/представления/модели. Итак, если бы я пошел в http://example.com/myController, он отобразил бы строку "Hello World". Возможность показать эту строку в шаблоне моего веб-сайта (например, заголовок, нижний колонтитул и т.д.) Станет бонусом.

  • Как добавить метод к этому контроллеру (или, если необходимо, новый контроллер), который взаимодействует с моделью, и выполняет запрос Select * FROM articles where id='10' и возвращает строку (содержащую столбцы id, title, content), чтобы контроллер? А затем используйте контроллер, чтобы включить представление, которое будет отображать эту строку. Таким образом, переход к http://example.com/myController/show_row (или что-то подобное) отобразит строку внутри представления. (Не нужно быть фантазией, просто echo $row->id; или что-то подобное будет работать.)

Любая другая информация о структуре кода Magento также будет очень полезна.

  • 6
    Похоже, система не определяет вашу награду.
  • 2
    Я пока не могу открыть награду, потому что ей не 48 часов ... но я открою ее, как только смогу, и награду лучшим ответом
Показать ещё 2 комментария
Теги:
magento
controller

2 ответа

487
Лучший ответ

Прежде всего, я настоятельно рекомендую вам купить PDF/E-Book от PHP Architect. Это 20 долларов США, но это единственный простой "Здесь, как работает Magento", который я смог найти. Я также начал писать учебные пособия Magento на моем собственном веб-сайте.

Во-вторых, если у вас есть выбор, и вы не опытный программист или не имеете доступа к опытному программисту (в идеале на PHP и Java), выберите другую корзину. Magento хорошо спроектирован, но он был спроектирован как решение для корзины покупок, которое другие программисты могут создавать поверх модулей. Это не было легко понято для людей, которые умны, но не являются программистами.

В-третьих, Magento MVC сильно отличается от Ruby on Rails, Django, CodeIgniter, CakePHP и т.д. Модель MVC, популярная у разработчиков PHP в наши дни. Я думаю, что это основано на модели Zend, и все это очень похоже на Java OOP. Там два контроллера нужно беспокоиться. Контроллер модуля /frontName, а затем контроллер MVC.

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

Я собираюсь начать с вашего первого вопроса, показывая вам, как настроить контроллер/маршрутизатор для ответа на определенный URL. Это будет небольшой роман. У меня могло бы быть время позже для темы, связанной с моделью/шаблоном, но пока нет. Я, однако, кратко поговорю с вашим вопросом SQL.

Magento использует архитектуру базы данных EAV. По возможности старайтесь использовать объекты модели, которые система предоставляет для получения необходимой вам информации. Я знаю все это в таблицах SQL, но лучше не думать о захвате данных, используя необработанные SQL-запросы, или вы сойдете с ума.

Окончательный отказ от ответственности. Я использую Magento в течение двух или трех недель, поэтому предостерегаю. Это упражнение, чтобы получить это прямо в моей голове, так как это поможет Stack Overflow.

Создать модуль

Все добавления и настройки Magento выполняются через модули. Итак, первое, что вам нужно сделать, это создать новый модуль. Создайте XML файл в app/modules, названный следующим образом

cd /path/to/store/app
touch etc/modules/MyCompanyName_HelloWorld.xml
<?xml version="1.0"?>
<config>
     <modules>
        <MyCompanyName_HelloWorld>
            <active>true</active>
            <codePool>local</codePool>
        </MyCompanyName_HelloWorld>
     </modules>
</config>

MyCompanyName - уникальное пространство имен для ваших модификаций, это не должно быть ваше название компании, но это рекомендуемое соглашение my magento. HelloWorld - это имя вашего модуля.

Очистить кеш приложения

Теперь, когда файл модуля находится на месте, нам нужно сообщить Magento об этом (и проверить нашу работу). В приложении администратора

  • Перейти к System- > Cache Management
  • Выберите "Обновить" в меню "Все кэширование"
  • Нажмите Сохранить настройки кэша

Теперь мы убедились, что Magento знает о модуле

  • Перейдите в раздел Система- > Конфигурация
  • Нажмите "Дополнительно"
  • В поле "Отключить выходные модули" найдите новый модуль с именем "MyCompanyName_HelloWorld"

Если вы можете работать с замедлением производительности, вы можете отключить кеш приложения при разработке/учебе. Ничто не расстраивает, а затем забывает очистить кеш и задаться вопросом, почему ваши изменения не появляются.

Настройка структуры каталогов

Затем нам нужно настроить структуру каталогов для модуля. Вам не понадобятся все эти каталоги, но нет никакого вреда в настройке их всех сейчас.

mkdir -p app/code/local/MyCompanyName/HelloWorld/Block
mkdir -p app/code/local/MyCompanyName/HelloWorld/controllers
mkdir -p app/code/local/MyCompanyName/HelloWorld/Model
mkdir -p app/code/local/MyCompanyName/HelloWorld/Helper
mkdir -p app/code/local/MyCompanyName/HelloWorld/etc
mkdir -p app/code/local/MyCompanyName/HelloWorld/sql

И добавьте файл конфигурации

touch app/code/local/MyCompanyName/HelloWorld/etc/config.xml

и внутри файла конфигурации добавьте следующее, что по сути является "пустой" конфигурацией.

<?xml version="1.0"?>
<config>
    <modules>
        <MyCompanyName_HelloWorld>
            <version>0.1.0</version>
        </MyCompanyName_HelloWorld>
    </modules>
</config>

Облегчив работу, этот файл конфигурации позволит вам сообщить Magento, какой код вы хотите запустить.

Настройка маршрутизатора

Затем нам нужно настроить маршрутизаторы модулей. Это позволит системе понять, что мы обрабатываем любые URL-адреса в виде

http://example.com/magento/index.php/helloworld

Итак, в вашем файле конфигурации добавьте следующий раздел.

<config>
<!-- ... -->
    <frontend>
        <routers>
            <!-- the <helloworld> tagname appears to be arbitrary, but by
            convention is should match the frontName tag below-->
            <helloworld>
                <use>standard</use>
                <args>
                    <module>MyCompanyName_HelloWorld</module>
                    <frontName>helloworld</frontName>
                </args>
            </helloworld>
        </routers>
    </frontend>
<!-- ... -->
</config>

То, что вы здесь говорите, это "любой URL-адрес с frontName из helloworld...

http://example.com/magento/index.php/helloworld

должен использовать frontName controller MyCompanyName_HelloWorld ".

Итак, с приведенной выше конфигурацией, когда вы загружаете страницу helloworld выше, вы получите страницу 404. Это потому, что мы не создали файл для нашего контроллера. Теперь сделаем это.

touch app/code/local/MyCompanyName/HelloWorld/controllers/IndexController.php

Теперь попробуйте загрузить страницу. Прогресс! Вместо 404 вы получите исключение PHP/Magento

Controller file was loaded but class does not exist

Итак, откройте созданный файл и вставьте следующий код. Имя класса должно основываться на имени, которое вы указали в своем маршрутизаторе.

<?php
class MyCompanyName_HelloWorld_IndexController extends Mage_Core_Controller_Front_Action{
    public function indexAction(){
        echo "We're echoing just to show that this is what called, normally you'd have some kind of redirect going on here";
    }
}

То, что мы только что установили, это контроллер module/frontName. Это контроллер по умолчанию и действие модуля по умолчанию. Если вы хотите добавить контроллеры или действия, вы должны помнить, что первая часть дерева URL-адреса Magento неизменна, они всегда будут идти таким образом http://example.com/magento/index.php/frontName/controllerName/actionName

Итак, если вы хотите совместить этот URL

http://example.com/magento/index.php/helloworld/foo

У вас должен быть FooController, который вы можете сделать следующим образом:

touch app/code/local/MyCompanyName/HelloWorld/controllers/FooController.php
<?php
class MyCompanyName_HelloWorld_FooController extends Mage_Core_Controller_Front_Action{
    public function indexAction(){
        echo 'Foo Index Action';
    }

    public function addAction(){
        echo 'Foo add Action';
    }

    public function deleteAction(){
        echo 'Foo delete Action';
    }
}

Обратите внимание, что контроллер IndexController по умолчанию и действие indexAction по умолчанию могут быть неявными, но должны быть явными, если что-то приходит после него. Таким образом, http://example.com/magento/index.php/helloworld/foo будет соответствовать контроллеру FooController и действию indexAction и НЕ действию fooAction для IndexController. Если вы хотите иметь fooAction, то в контроллере IndexController вы должны вызвать этот контроллер явно следующим образом: http://example.com/magento/index.php/helloworld/index/foo, потому что вторая часть URL-адреса и всегда будет именем контроллера. Это поведение является наследованием Zend Framework в комплекте Magento.

Теперь вы можете нажать следующие URL-адреса и увидеть результаты своих эхо-заявлений

http://example.com/magento/index.php/helloworld/foo
http://example.com/magento/index.php/helloworld/foo/add
http://example.com/magento/index.php/helloworld/foo/delete

Итак, это должно дать вам базовую идею о том, как Magento отправляет диспетчеру. Отсюда я хотел бы посоветоваться с существующими классами контроллеров Magento, чтобы узнать, как использовать модели и систему шаблонов/макетов.

  • 3
    Спасибо, это очень полезно. Пожалуйста, рассмотрите возможность добавления информации об использовании модели / базы данных и представлений, чтобы ваш ответ мог быть завершен.
  • 1
    Я очень рекомендую книгу, с которой он связан, я получил ее сегодня и сейчас читаю. Это очень полезно
Показать ещё 21 комментарий
33

Я боролся с Magento в течение последнего месяца или около того, и я все еще пытаюсь понять это. Так что это случай слепых, ведущих слепых. Там немного в пути документации и форума/вики в лучшем случае хаотично. Не только это, но есть несколько решений, которые либо устарели, либо далеки от оптимального. Я не уверен, есть ли у вас проект или просто пытается понять его, но, вероятно, это проще, если вы начали с изменения существующей функциональности, а не для создания чего-то совершенно нового. Для этого я определенно поеду с "Рекомендуемыми статьями для разработчиков" в вики. Новый способ оплаты был настоящим открытием.

Для отладки я определенно рекомендовал с помощью FirePHP и посмотрел ваш HTML-источник, когда что-то пойдет не так. Метод отладки ole echo не очень хорошо работает.

Общая архитектура настолько умозрительно сложна, что, даже если бы я ее полностью понял, мне нужно было бы написать книгу, чтобы ее покрыть. Лучшее, что я могу сделать, это дать вам совет, который я хотел бы, чтобы кто-то дал мне, когда я только начал...

Держитесь подальше от основных файлов. Не изменяйте их, вместо этого напишите свой собственный модуль и переопределите то, что вам нужно.

Magento использует конфигурационные файлы, состоящие из XML, чтобы решить, что ему нужно делать. Чтобы заставить его запускать свои собственные вещи, а не основные функции, вам нужен правильный xml. К сожалению, нет руководства по созданию XML; вам нужно взглянуть на примеры и провести серьезное тестирование. Чтобы усложнить ситуацию, содержимое этих файлов в основном зависит от регистра. Однако, если вы справитесь с ними, вы можете переопределить любую часть базовой функциональности, которая обеспечивает очень мощную систему.

Magento использует методы типа Mage::getModel('mymodel'), Mage::getSingleton('mysingleton'), Mage::helper('myhelper') для возврата объектов определенных классов. Он находит их по умолчанию в своем основном пространстве имен. Если вы хотите, чтобы он использовался самостоятельно, вам необходимо переопределить их в файле config.xml.

Название ваших классов должно соответствовать папке, в которой они находятся.

Многие объекты в Magento в конечном итоге расширят что-то, называемое Varien_Object. Это класс общего назначения (вроде как швейцарский армейский нож), и его цель в жизни - позволить вам определять свои собственные методы/переменные "на лету". Например, вы увидите, что он используется в качестве прославленного массива для передачи данных от одного метода к другому.

Во время разработки убедитесь, что кеширование отключено. Это будет мучительно мучительно медленным, но это сэкономит вам много травм головы (от удара его на вашем столе).

Вы увидите, что $this используется много. Это означает другой класс, в зависимости от того, какой файл вы его видите. get_class($this) является вашим другом, особенно в сочетании с FirePHP.

Сложите вещи на бумаге. Много. Есть бесчисленное множество фактоидов, которые вам понадобятся через 1-2 дня после того, как вы их встретите.

Magento любит OO. Не удивляйтесь, если трассировка метода проведет вас через 5-10 разных классов.

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

Там больше, но я остановлюсь здесь, пока это не превратится в диссертацию.

  • 0
    Пожалуйста, напишите больше, если можете, вся информация очень полезна :)
  • 0
    Миса, тебе, вероятно, стоит зарегистрироваться здесь в Stackoverflow, если ты потеряешь куки, все твои представители исчезнут;)
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню