Как создать простой модуль «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. Есть два контроллера, о которых вам нужно беспокоиться. Контроллер 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 (и проверить нашу работу). В приложении администратора

  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 с 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, чтобы увидеть, как следует использовать модели и систему шаблонов / макетов.


4
Спасибо, это очень полезно. Пожалуйста, рассмотрите возможность добавления информации об использовании модели / базы данных и представлений, чтобы ваш ответ мог быть завершен
нажмите Upvote

7
убедитесь, что app / code / local / MyCompanyName / HelloWorld / etc / config.xml имеет тот же регистр, что и xml, расположенный в etc / modules (MyCompanyName_HelloWorld НЕ mycompanyname_helloworld), иначе в записях бэкэнда будут записи!
Моак

8
У меня есть небольшой комментарий к идеальному ответу Алана: «То, что мы только что установили, это контроллер module / frontName. Это НЕ контроллер MVC». Это тот же тип контроллера, что и FooController. В ZF index действие в 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, это просто «нормальная» вещь Zend Framework MVC / router, и вы использовали неверный URL, поэтому вы должны удалить «Это НЕ MVC контроллер "часть вашего ответа.
Regilero

2
@ hypervisor666 Включите «режим разработчика» (Google). При включенном режиме разработчика Magento будет аварийно завершать работу при любых ошибках в файлах XML.
Алан Сторм

39

Я боролся с 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 дня после того, как вы столкнетесь с ними.

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

Прочитайте руководство дизайнера здесь . Он предназначен в основном для графических дизайнеров, но вам нужно понять, где и почему в итоге получится вывод из вашего модуля. Для этого не забудьте включить «Подсказки к шаблонам» в разделе для разработчиков панели администратора.

Это еще не все, но я остановлюсь здесь, прежде чем это превратится в диссертацию.


Пожалуйста, опубликуйте больше, если можете, вся информация очень полезна :)
Нажмите Upvote

Миса, вам, вероятно, стоит зарегистрироваться здесь в Stackoverflow, если вы потеряете свой cookie, все ваши представители исчезнут;)
Нажмите Upvote

Спасибо! Это очень полезно. Нер
Нер

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. Теперь мы создадим файл 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 world tutorial, но что-то пошло не так. Я импортировал код этого модуля https://github.com/astorm/magento2-hello-world из github, и он работал. из этого модуля я создал его подкатегории категорий ajax select выпадающий модуль. После установки в каталог aap / code вашей установки 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


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.