Перш за все, настійно рекомендую придбати 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 - це унікальний простір імен для ваших модифікацій, це не повинно бути назвою вашої компанії, але це рекомендований конвент мій магенто. 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-адреса з іменем 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";
}
}
Щойно ми налаштували - це контролер модуля / 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 і index indexAction, а НЕ fooAction IndexController. Якщо ви хочете мати fooAction, тоді в контролері IndexController вам доведеться викликати цей контролер явно так: http://example.com/magento/index.php/helloworld/index/foo
адже друга частина URL-адреси є і завжди буде іменем
контролера. Така поведінка є спадщиною Zend Framework, що вкладається в Магенто.
Тепер ви маєте можливість перейти до наступних 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, щоб побачити, як слід використовувати моделі та систему шаблонів / макетів.