Прежде всего, я настоятельно рекомендую вам купить PDF / E-Book от PHP Architect . Это 20 долларов США, но это единственный простой ресурс «Вот как работает Magento», который мне удалось найти. Я также начал писать учебные пособия по Magento на своем собственном сайте .
Во-вторых, если у вас есть выбор, и вы не являетесь опытным программистом или не имеете доступа к опытному программисту (в идеале на PHP и Java), выберите другую корзину . Magento хорошо спроектирован, но он был спроектирован как решение для корзины покупок, над которым другие программисты могут создавать модули. Он не был спроектирован так, чтобы его могли легко понять люди умные, но не программисты.
В-третьих, Magento MVC сильно отличается от Ruby on Rails , Django , CodeIgniter , CakePHP и т. Д. Модель MVC, популярная в наши дни среди разработчиков PHP. Я думаю, что он основан на модели Zend , и все это очень похоже на ООП Java. Есть два контроллера, о которых вам нужно беспокоиться. Контроллер module / 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 - это уникальное пространство имен для ваших модификаций, оно не обязательно должно быть именем вашей компании, но это рекомендуемое соглашение, мой magento HelloWorld
это имя вашего модуля.
Очистить кеш приложения
Теперь, когда файл модуля установлен, нам нужно сообщить об этом Magento (и проверить нашу работу). В приложении администратора
- Перейдите в Система-> Управление кешем
- Выберите «Обновить» в меню «Весь кэш».
- Нажмите Сохранить настройки кэша
Теперь мы убедились, что 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 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 есть и всегда будет controllerName. Такое поведение является наследием 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, чтобы увидеть, как следует использовать модели и систему шаблонов / макетов.