Вопрос

Как можно выполнить следующее в Magento?

  • Отобразите сообщение "Привет, мир", используя подход controller / view / model.Итак, если бы я пошел в 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 также будет очень полезной.

Это было полезно?

Решение

Прежде всего, я настоятельно рекомендую вам купить PDF/ Электронная книга от PHP Architect.Это 20 долларов США, но это единственный простой ресурс "Вот как работает Magento", который я смог найти.Я также начал писать Учебные пособия по Magento на моем собственном веб-сайте.

Во-вторых, если у вас есть выбор, и вы не являетесь опытным программистом или у вас нет доступа к опытному программисту (в идеале на PHP и Java), выбери другую тележку.Magento хорошо спроектирован, но он был спроектирован как решение для корзины покупок, поверх которого другие программисты могут создавать модули.Он не был спроектирован так, чтобы его было легко понять умным людям, но не программистам.

В-третьих, Magento MVC сильно отличается от Ruby на рельсах, Джанго, Инициатор кодирования, КакеФФП, и т.д.Модель MVC, популярная в наши дни среди разработчиков PHP.Я думаю, что это основано на Зенд модель, и все это очень похоже на Java-ООП.Там есть два контроллеры, о которых вам нужно беспокоиться.Контроллер модуля / frontName, а затем контроллер MVC.

В-четвертых, само приложение Magento построено с использованием той же модульной системы, которую будете использовать вы, поэтому знакомство с основным кодом является полезной тактикой обучения.Кроме того, многое из того, что вы будете делать с Magento, это переопределяющий существующие классы.То, что я здесь описываю, это создание новая функциональность, не переопределяющая.Имейте это в виду, когда будете просматривать имеющиеся там образцы кода.

Я собираюсь начать с вашего первого вопроса, показывая вам, как настроить контроллер / маршрутизатор для ответа на определенный URL.Это будет небольшой роман.Возможно, позже у меня будет время для тем, связанных с моделью / шаблоном, но сейчас у меня его нет.Я, однако, кратко остановлюсь на вашем SQL-вопросе.

Magento использует Подслушивающий архитектура базы данных.Всякий раз, когда это возможно, старайтесь использовать объекты модели, предоставляемые системой, чтобы получить необходимую вам информацию.Я знаю, что все это есть в таблицах SQL, но лучше не думать о получении данных с помощью необработанных SQL-запросов, иначе вы сойдете с ума.

Окончательный отказ от ответственности.Я пользуюсь Magento около двух или трех недель, так что будьте внимательны.Это упражнение предназначено для того, чтобы прояснить это в моей голове, а также для того, чтобы помочь переполнению стека.

Создайте модуль

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

  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

следует использовать имя интерфейса контроллера 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, в controller IndexController вам затем нужно явно вызвать этот контроллер следующим образом :http://example.com/magento/index.php/helloworld/index/foo потому что вторая часть URL-адреса есть и всегда будет именем controllerName .Такое поведение является наследованием фреймворка Zend, входящего в комплект поставки Magento.

Теперь вы должны быть в состоянии перейти по следующим URL-адресам и увидеть результаты ваших echo-инструкций

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

Другие советы

Я боролся с Magento в течение последнего месяца или около того, и я все еще пытаюсь разобраться в этом.Итак, это случай, когда слепой ведет слепого.Документации практически нет, а форум / wiki в лучшем случае хаотичен.Не только это, но и есть несколько решений, которые либо устарели, либо далеки от оптимальных.Я не уверен, есть ли у вас проект или вы просто пытаетесь разобраться в нем, но, вероятно, было бы проще, если бы вы начали с изменения существующей функциональности, а не с создания чего-то совершенно нового.Для этого я бы определенно воспользовался "Рекомендуемыми статьями для разработчиков" в вики.Новый способ оплаты one стал настоящим откровением.

Для отладки я бы определенно рекомендовал использование FirePHP и просматриваете свой HTML-исходный код, когда что-то идет не так.Метод отладки ole echo на самом деле работает не так уж хорошо.

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

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

Magento использует конфигурационные файлы, состоящие из XML, чтобы решить, что ему нужно делать.Чтобы заставить его запускать ваши собственные материалы в отличие от основной функциональности, вам нужен правильный xml.К сожалению, нет руководства о том, как создать ваш XML;вам нужно посмотреть на примеры и провести серьезное тестирование.Чтобы усложнить ситуацию, содержимое этих файлов в значительной степени чувствительно к регистру.Однако, если вы освоите их, вы сможете переопределить любую часть базовой функциональности, что делает систему очень мощной.

Magento использует такие методы, как Mage::getModel('mymodel'), Mage::getSingleton('mysingleton'), Mage::helper('myhelper') возвращать объекты определенных классов.Он находит их по умолчанию в своем основном пространстве имен.Если вы хотите, чтобы он использовал ваш собственный, вам нужно переопределить их в вашем config.xml файл.

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

Многие объекты в Magento в конечном счете расширяют нечто, называемое Varien_Object.Это класс общего назначения (что-то вроде швейцарского армейского ножа), и его назначение в жизни - позволить вам определять свои собственные методы / переменные "на лету".Например, вы увидите, что он используется как прославленный массив для передачи данных из одного метода в другой.

Во время разработки убедитесь, что у вас отключено кэширование.Это сделает magento мучительно медленным, но избавит вас от многих травм головы (если вы будете бить им по столу).

Ты увидишь $this часто используется.Это означает другой класс, в зависимости от того, в каком файле вы его видите. get_class($this) является вашим другом, особенно в сочетании с FirePHP.

Запишите все на бумаге.Очень много.Существует бесчисленное множество мелких фактов, которые вам понадобятся через 1-2 дня после того, как вы с ними столкнетесь.

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

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

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

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

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

Поделитесь своим отзывом, как только вы пройдете полный процесс

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top