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

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

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

Прежде всего, я настоятельно рекомендую вам купить 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 в течение двух или трех недель, поэтому предостерегаю. Это упражнение, чтобы получить это прямо в моей голове, а также помочь переполнению стека.

Создание модуля

Все дополнения и настройки 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 об этом (и проверить нашу работу). В приложении администратора

  1. Перейти к System-> Cache Management
  2. Выберите «Обновить» в меню «Все кэширование»
  3. Нажмите «Сохранить настройки кэша».

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

  1. Перейдите в раздел Система-> Конфигурация
  2. Нажмите Дополнительно.
  3. В поле «Отключить выходные модули» найдите новый модуль с именем «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's 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, чтобы посмотреть, как использовать модели и систему шаблонов / макетов.

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

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

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

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

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

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

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

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

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

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

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

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

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

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