Как можно выполнить следующее в 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 также будет очень полезна.
Прежде всего, я настоятельно рекомендую вам купить 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 об этом (и проверить нашу работу). В приложении администратора
Теперь мы убедились, что Magento знает о модуле
Если вы можете работать с замедлением производительности, вы можете отключить кеш приложения при разработке/учебе. Ничто не расстраивает, а затем забывает очистить кеш и задаться вопросом, почему ваши изменения не появляются.
Затем нам нужно настроить структуру каталогов для модуля. Вам не понадобятся все эти каталоги, но нет никакого вреда в настройке их всех сейчас.
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, чтобы узнать, как использовать модели и систему шаблонов/макетов.
Я боролся с 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 разных классов.
Прочтите руководство по дизайну здесь. Это в основном предназначалось для графических дизайнеров, но вам нужно, чтобы понять, где и почему вывод из вашего модуля закончится. Для этого не забудьте включить "Советы по шаблону" в разделе разработчика панели администратора.
Там больше, но я остановлюсь здесь, пока это не превратится в диссертацию.