Ответ 1
Прежде всего, я настоятельно рекомендую вам купить 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, чтобы узнать, как использовать модели и систему шаблонов/макетов.