Programmieren > Programme > Magento 2

Magento 2 - Frontend-Seite bauen

Die Erklärungen auf dieser Seite bauen auf der Seite Modul bauen auf. Wer noch nicht weis, wie man ein Magento-Modul baut. Sollte zuerst das erlernen, bevor er hier weiterliest.

URL

Wenn man eine neue Frontseite in Magento erstellen will, muss man erst überlegen, unter welcher URL diese erreichbar sein soll. Für Frontendseiten kann dann in einem weiteren Schritt eine SEO-freundliche URL generiert werden. Die hier gebaute URL bleibt aber trotzdem gültig. Die Syntax dieser URL ist.

http://magento.local/route_name/controller/action

Eine Beispiel-URL wäre also:

http://magento.local/helloworld/say/hallo

controller oder action kann weggelassen werden. Wird das getan gilt folgendes:

routes.xml

Der route_name muss einmal pro Modul festgelegt werden. Für Frontend-Seiten muss hierfür im Verzeichnis etc/frontend eine Datei mit Namen routes.xml mit folgendem Inhalt angelegt werden.

<?xml version="1.0" ?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">
    <router id="standard">
        <route frontName="helloworld" id="helloworld">
            <module name="ErichWeigand_HelloWorld"/>
        </route>
    </router>
</config>

Wenn diese Definition in einem Modul gemacht ist, können Frontend-Seiten erzeugt werden.

Controller-Klasse

Die PHP-Klasse die den Aufruf der URL nun tatsächlich abarbeitet, muss im Controller-Verzeichnis des Moduls vorhanden sein. Ich baue hier zuerst den Controller für http://magento.local/helloworld bzw. für http://magento.local/helloworld/index/index nach obiger Regel.

Hierfür lege ich im Controller-Verzeichnis das Verzeichnis Index an und darin die Datei Index.php mit folgendem Inhalt.

<?php

namespace ErichWeigand\HelloWorld\Controller\Index;

use Magento\Framework\App\Action\Context;
use Magento\Framework\View\Result\PageFactory;
use Magento\Framework\App\Action\Action;

class Index extends Action
{

    protected $_pageFactory;

    public function __construct(
            Context $context,
            PageFactory $pageFactory) {
        $this->_pageFactory = $pageFactory;
        return parent::__construct($context);
    }

    public function execute() {
        return $this->_pageFactory->create();
    }

}

Danach funktioniert diese Seite. Sie zeigt das Standard-Layout mit Header und Footer aber noch ohne sonstigen Inhalt.

Wenn der Seitenaufruf eine Json-Datenstruktur zurückgeben soll (z.B. für Ajax-Calls), sieht die PHP-Klasse folgendermassen aus.

<?php

namespace ErichWeigand\HelloWorld\Controller\Json;

use Magento\Framework\App\Action\Action;
use Magento\Framework\App\Action\Context;
use Magento\Framework\Controller\Result\JsonFactory;

class Index extends Action
{

    private $resultJsonFactory;

    public function __construct(
            Context $context,
            JsonFactory $resultJsonFactory) {
        parent::__construct($context);
        $this->resultJsonFactory = $resultJsonFactory;
    }

    public function execute() {
        $resultJson = $this->resultJsonFactory->create();
        return $resultJson->setData(['say' => 'hello world!']);
    }

}

Wenn ich dann diese URL Aufrufe, sieht dies so aus.

Layout

Um auf die neue Seite etwas anzuzeigen, wird folgendes benötigt.

layout.xml

helloworld_index_index.xml
<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="1column" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <referenceContainer name="content">
        <block class="ErichWeigand\HelloWorld\Block\Index" name="helloworld_index_index" template="ErichWeigand_HelloWorld::index.phtml" />
    </referenceContainer>
</page>

Block-Klasse

Index.php
<?php

namespace ErichWeigand\HelloWorld\Block;

class Index extends \Magento\Framework\View\Element\Template
{
    
}

Template-Datei

<h2>Hello World!</h2>

Danach sieht die selbst gebaute Seite folgendermassen aus.

Datei-Struktur

Alle Dateien des Moduls, das hier entstanden ist, sieht dann letztendlich so aus.