Как создать простой модуль Hello World в Magento?

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

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

Ответ 2

Я боролся с 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 различных классов.

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

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

Ответ 3

Я скорее рекомендую Mage2Gen, это поможет вам сгенерировать шаблон, и вы сможете просто сосредоточиться на основной бизнес-логике. это только помогает ускорить вещи.

Ответ 4

Модуль 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

Поделитесь своим мнением после прохождения полного процесса

Ответ 5

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