Як створити простий модуль "Hello World" в Magento?


305

Як можна виконати наступне в 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 також буде дуже корисною.


6
Схоже, система не визнає вашу суму.
Алан Шторм

2
Я ще не можу відкрити щедроту, тому що їй не виповнилося 48 годин .. але я відкрию її, як тільки зможу, і я нагороджу її найкращою відповіддю
натисніть Upvote

Ах, я не знав, що щедрості стосуються лише старих постів, вибачень.
Алан Шторм

3
У дитинстві він завжди мав тяжіння до маґентів; його код працює так само.
vol7ron

Відповіді:


539

Перш за все, настійно рекомендую придбати 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 (і перевірити нашу роботу). У додатку адміністратора

  1. Перейдіть до системи-> Кеш керування
  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-адреса з іменем 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, щоб побачити, як слід використовувати моделі та систему шаблонів / макетів.


4
Дякую, це дуже корисно. Будь ласка, подумайте над тим, щоб додати трохи інформації про використання моделі / бази даних та представлення даних, щоб відповідь була повною
натисніть Upvote

7
переконайтесь, що додаток / код / ​​локальний / MyCompanyName / HelloWorld / тощо / config.xml має той самий випадок, що і xml, розміщений у etc / модулях (MyCompanyName_HelloWorld НЕ mycompanyname_helloworld), інакше будуть записи в бекенді!
Моак

8
У мене є лише невеликий коментар до ідеальної відповіді Алана: "Щойно ми налаштували, це контролер модуля / frontName. Це НЕ контролер MVC". Це точно такий же тип контролера, як і FooController. У індексі ZF дія в IndexController викликається за замовчуванням, тому запит example.com/magento/index.php/helloworld викличе IndexController :: indexAction () у модулі helloworld. Таким чином, виклик ... / helloworld / foo спробує знайти FooController в модулі helloworld і викликати на ньому indexAction (). Щоб запустити IndexController :: fooAction (), вам потрібно запитати: ... / helloworld / index / foo.
Матус Земан

2
переконайтеся, що ви прочитали відповідь від @Matus Zeman, щоб зрозуміти, чому fooAction не знайдено в IndexController, це просто "нормальний" MVC / маршрутизатор Zend Framework, і ви використали поганий URL, тому вам слід видалити "Це НЕ MVC-контролер "частина вашої відповіді.
regilero

2
@ hypervisor666 Увімкніть "режим розробника" (google it). Якщо ввімкнено режим розробника, Magento вийде з ладу при будь-яких помилках у файлах XML.
Алан Шторм

39

Я боровся з Magento останній місяць або близько того, і я все ще намагаюся розібратися в цьому. Тож це справа сліпого, який веде сліпого. Документування документації мало, і форум / wiki в кращому випадку хаотичний. Мало того, але є кілька рішень, які або застаріли, або далеко не оптимальні. Я не впевнений, чи є у вас проект чи просто намагаєтесь його розібратися, але, мабуть, простіше, якщо ви почали з модифікації існуючої функціональності на відміну від створення чогось абсолютно нового. Для цього я б напевно перейшов із "Рекомендованими статтями для розробників" у вікі. Новий спосіб оплати був справжнім відкриттям очей.

Для налагодження я напевно рекомендую використовувати FirePHP і подивитися ваш джерело HTML, коли щось піде не так. Метод налагодження ole echo насправді не працює настільки добре.

Загальна архітектура настільки притаманна розуму, що навіть якби я цілком зрозумів це, мені потрібно було б написати книгу, щоб висвітлити її. Найкраще, що я можу зробити, - це дати вам поради, я б хотів, щоб хтось дав мені, коли я вперше почав ...

Тримайтеся подалі від основних файлів. Не змінюйте їх, натомість напишіть власний модуль та перезначте, що вам потрібно.

Magento використовує конфігураційні файли, що складаються з XML, щоб вирішити, що йому потрібно робити. Для того, щоб змусити його виконувати власні речі на відміну від основних функціональних можливостей, вам потрібен правильний xml. На жаль, не існує керівництва щодо того, як створити XML; вам потрібно переглянути приклади та зробити серйозне тестування. Для ускладнення речей вміст цих файлів значною мірою залежить від регістру. Однак якщо ви їх опановуєте, ви можете перекрити будь-яку частину основної функціональності, яка створює дуже потужну систему.

Magento використовує методи, як Mage::getModel('mymodel'), наприклад Mage::getSingleton('mysingleton'), Mage::helper('myhelper')для повернення об'єктів певних класів. Він знаходить їх за замовчуванням у своєму основному просторі імен. Якщо ви хочете, щоб він використовував ваш власний, вам потрібно замінити їх у своєму config.xmlфайлі.

Назва ваших класів повинна відповідати папці, в якій вони знаходяться.

Багато об'єктів у Magento врешті-решт поширюється на щось, що називається a Varien_Object. Це клас загального призначення (на кшталт швейцарського армійського ножа), і його мета в житті полягає в тому, щоб ви могли визначити свої власні методи / змінні на льоту. Наприклад, ви побачите, що він використовується як прославлений масив для передачі даних від одного методу до іншого.

Під час розробки переконайтесь, що кешування вимкнено. Це зробить магенто неприємно повільним, але це позбавить вас від великої травми голови (від удару його по столу).

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

Складіть речі на папері. Багато. Є нескінченна кількість фактоїдів, які вам знадобляться через 1-2 дні після того, як ви зіткнетеся з ними.

Мадженто любить ОО. Не дивуйтеся, якщо відстеження методу проведе вас через 5-10 різних класів.

Прочитайте керівництво дизайнера тут . Він призначений здебільшого для графічних дизайнерів, але він вам потрібен, щоб зрозуміти, де і чому закінчиться результат з вашого модуля. Для цього не забудьте увімкнути "Підказки шляху до шаблону" в розділі розробника панелі адміністратора.

Тут є більше, але я зупинюсь тут, перш ніж це перетвориться на дисертацію.


Будь ласка, опублікуйте більше, якщо можете, вся інформація дуже корисна :)
Клацніть Upvote

Міса, ви, ймовірно, повинні зареєструватися тут на Stackoverflow, якщо ви втратили файл cookie, всі ваші представники зникли б);
Натисніть Upvote

Дякую! Це дуже корисно. Ner
Ner

2

Я скоріше порекомендую Mage2Gen , це допоможе вам генерувати котельну плиту , і ви можете просто зосередитись на основній логіці бізнесу. це просто допомагає прискорити справи.


0

Модуль Magento - це група каталогів, що містять блоки, контролери, помічники та моделі, необхідні для створення певної функції магазину. Це одиниця налаштування на платформі Magento. Модулі Magento можуть бути створені для виконання декількох функцій з підтримкою логіки для впливу на досвід користувачів та зовнішній вигляд. Він має життєвий цикл, який дозволяє їх встановлювати, видаляти чи відключати. З точки зору як продавців, так і розробників розширень, модулі є центральним підрозділом платформи Magento.

Декларація модуля

Ми повинні оголосити модуль, використовуючи файл конфігурації. Як Magento 2 шукайте модуль конфігурації в каталозі etc. модуля. Тож тепер ми створимо файл конфігураційного модуля module.xml.

Код буде виглядати приблизно так:

<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd"> <module name="Cloudways_Mymodule" setup_version="1.0.0"></module> </config>

Реєстрація модуля Модуль повинен бути зареєстрований у системі Magento 2 за допомогою класу Magento Component Registrar. Тепер ми створимо файл registration.php у кореневому каталозі модуля:

app/code/Cloudways/Mymodule/registration.php

Кодекс виглядатиме так:

?php
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'Cloudways_Mymodule',
__DIR__
);

Перевірка стану модуля Після виконання вищезазначених кроків ми створили б простий модуль. Тепер ми будемо перевіряти стан модуля та чи він увімкнено чи відключений за допомогою наступного командного рядка:

php bin/magento module:status

php bin/magento module:enable Cloudways_Mymodule

Поділіться своїми відгуками, коли ви пройшли повний процес


0

Я намагався зробити свій модуль із загальносвітового підручника з magaplaza hello, але щось пішло не так. Я імпортував код цього модуля https://github.com/astorm/magento2-hello-world з github, і він працював. з цього модуля я створив його підкатегорії категорії ajax select drop downs Module. Після його установки в АПУ / каталозі коди вашої установки magento2 слідувати цьому URL .. http://www.example.com/hello_mvvm/hello/world Ви можете завантажити свій код тут https://github.com/sanaullahAhmad/Magento2_cat_subcat_ajax_select_dropdowns і помістіть його у свою папку aap / code. ніж виконувати ці команди ...

php bin/magento setup:update
php bin/magento setup:static-content:deploy -f
php bin/magento c:c

Тепер ви можете перевірити функціональність модуля за допомогою такої URL-адреси http: // {{www.example.com}} / hello_mvvm / hello / world


0

І,

Я пропоную вам дізнатися про конфігурацію системи.

Як відобразити всі категорії в полі конфігурації системи?

Тут я вирішив з хорошим прикладом. Це працює. Ви можете перевірити і дізнатися потік коду.

Є й інші занадто багато прикладів, яких слід вивчити.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.