Skip to the content
Documentation
Help Start
Reading in:
  • German: 9,075 of 9,075 pages
About the help in other languages
All help pages

Module und Views

Seiten mit eigener Adresse - module.php und jeder ViewList-Schlüssel, ein View-Skript und eine View-Klasse, POST-Aktionen, Weiterleitungen und Fehler, anhand von eZModule und einer echten Erweiterung.

Download as PDF

Address: https://doc.exponential.earth/exphelp/viewer/help/extension-development/part-3-extension-developer/modules-and-views.md

On this page

This page is a translation. Read the English original

Module und Views

Teil 3, Kapitel 9. Jede Seite von Exponential, die keine Inhaltsseite ist, ist eine View eines Moduls: /user/login, /setup/extensions, /owner/change/123. Eine Erweiterung fügt Seiten hinzu, indem sie Module hinzufügt. Dieses Kapitel erklärt die Definitionsdatei, das View-Skript und das, was eine View zurückgibt. Die Klasse, die das alles ausführt, ist eZModule (lib/ezutils/classes/ezmodule.php).

Den Modulordner registrieren

In extension/mysite_hello/settings/module.ini.append.php:

<?php /* #?ini charset="utf-8"?

[ModuleSettings]
ExtensionRepositories[]=mysite_hello

*/ ?>

Jeder Ordner unter extension/mysite_hello/modules/ ist dann ein Modul. Die Adresse /hello/world/Ada führt die View world des Moduls hello mit dem Parameter Ada aus.

module.php

Eine echte Definition aus se7enxweb/ezownerchange (modules/owner/module.php):

<?php
$Module = array( 'name' => 'Owner', 'variable_params' => false );

$ViewList = array();
$ViewList['change'] = array(
    'script' => 'change.php',
    'functions' => array( 'change' ),
    'params' => array( 'ObjectID' ),
    'unordered_params' => array( 'group' => 'StartNode', 'node' => 'NodeID', 'scope' => 'Scope' ),
    'ui_context' => 'edit',
    'default_navigation_part' => 'ezcontentnavigationpart',
    'post_actions' => array( 'BrowseActionName' ),
    'single_post_actions' => array( 'BrowseCancelButton' => 'Cancel',
                                    'CancelButton' => 'Cancel',
                                    'BrowseOwnerButton' => 'BrowseOwner',
                                    'PreviewButton' => 'Preview',
                                    'ConfirmButton' => 'Confirm' ),
    'post_action_parameters' => array( 'Cancel' => array( 'CancelURI' => 'BrowseCancelURI' ) )
);

$FunctionList = array();
$FunctionList['change'] = array();
$FunctionList['subtree'] = array();
SchlüsselBedeutung
$Module['name']ein lesbarer Name
$Module['variable_params']true macht im View-Skript jeden Parameter zusätzlich zu $Params zu einer eigenen Variablen
'script'die Datei der View, neben module.php
'params'geordnete Parameter: /owner/change/123 ergibt $Params['ObjectID'] = '123'
'unordered_params'benannte Parameter an beliebiger Stelle dahinter: /(node)/59 ergibt $Params['NodeID'] = '59'
'functions'die Richtlinienfunktionen, die ein Benutzer braucht, um die View zu öffnen (Richtlinienfunktionen und Zugriffsprüfungen)
'default_navigation_part'welcher Reiter im oberen Menü der Administration aktiv ist
'ui_context'der Kontext der Oberfläche (edit, navigation, ...), den die Designs der Administration auswerten
'single_post_actions'der Name einer POST-Schaltfläche und die Aktion, die sie bedeutet
'post_actions'POST-Variablen, deren Wert die Aktion benennt
'post_action_parameters'POST-Variablen, die je Aktion bereitgestellt werden
$FunctionListdie Richtlinienfunktionen, die dieses Modul den Rollen anbietet

Ein View-Skript

modules/hello/world.php:

<?php
/** @var eZModule $Module */
$Module = $Params['Module'];
$name = isset( $Params['Name'] ) && $Params['Name'] !== '' ? $Params['Name'] : 'world';

$tpl = eZTemplate::factory();
$tpl->setVariable( 'name', $name );

$Result = array();
$Result['content'] = $tpl->fetch( 'design:hello/world.tpl' );
$Result['path'] = array( array( 'text' => 'Hello', 'url' => false ) );

Das Skript erhält $Params (mit dem Modul als $Params['Module']) und setzt $Result. Das Template maskiert, was aus der Adresse kam: {$name|wash}. Was $Result enthalten darf, steht im übernächsten Kapitel, View-Ergebnisse und das Pagelayout.

Eine View als Klasse

Seit 6.0.15 kann eine View eine Klasse sein; das einfache Skript oben funktioniert weiterhin. Die Klasse erweitert \Exponential\Runnable\ModuleView (kernel/private/classes/runnable/moduleview.php) und gibt das Ergebnis zurück:

<?php
// extension/mysite_hello/classes/runnable/views/hello/world.php
namespace Exponential\View\Extension\MysiteHello\Hello;

class World extends \Exponential\Runnable\ModuleView
{
    public function run( array $scope )
    {
        $name = isset( $scope['Params']['Name'] ) && $scope['Params']['Name'] !== '' ? $scope['Params']['Name'] : 'world';
        $tpl = \eZTemplate::factory();
        $tpl->setVariable( 'name', $name );
        return array( 'content' => $tpl->fetch( 'design:hello/world.tpl' ),
                      'path' => array( array( 'text' => 'Hello', 'url' => false ) ) );
    }
}

und die in module.php genannte View-Datei schrumpft auf eine Zeile:

<?php
return \Exponential\View\Extension\MysiteHello\Hello\World::main( __FILE__, get_defined_vars() );

Klassen lassen sich ohne Request testen und teilen sich Code mit Befehlen und Cronjob-Teilen; siehe Befehle, Cronjob-Teile und Modul-Views als Klassen.

Formulare und Aktionen

Eine View, die ein Formular verarbeitet, liest die Aktion, die das Modul aus dem POST abgeleitet hat:

<?php
$Module = $Params['Module'];
$http = eZHTTPTool::instance();

if ( $Module->isCurrentAction( 'Cancel' ) )
{
    return $Module->redirectTo( '/content/dashboard' );
}
if ( $Module->isCurrentAction( 'Confirm' ) )
{
    $comment = $http->postVariable( 'Comment', '' );
    // ... do the work, then redirect so a reload does not post again
    return $Module->redirectToView( 'world', array( 'Ada' ) );
}

Mit single_post_actions macht ein POST, der ConfirmButton enthält, isCurrentAction( 'Confirm' ) wahr. Formulare, die etwas ändern, müssen das Formular-Token mitführen (die Erweiterung ezformtoken fügt es in Formulare ein und prüft es); siehe ezformtoken und CSRF-Schutz.

Fehler

<?php
$object = eZContentObject::fetch( (int)$Params['ObjectID'] );
if ( !$object instanceof eZContentObject )
{
    return $Module->handleError( eZError::KERNEL_NOT_FOUND, 'kernel' );
}
if ( !$object->canRead() )
{
    return $Module->handleError( eZError::KERNEL_ACCESS_DENIED, 'kernel' );
}

eZError (kernel/classes/ezerror.php) enthält die Codes: KERNEL_ACCESS_DENIED (1), KERNEL_NOT_FOUND (2), KERNEL_NOT_AVAILABLE (3), KERNEL_MOVED (4), KERNEL_LANGUAGE_NOT_FOUND (5), KERNEL_FORM_TOKEN_REFUSED (6), KERNEL_MODULE_NOT_FOUND (20), KERNEL_MODULE_VIEW_NOT_FOUND (21) und weitere. Der Kernel zeigt die passende Fehlerseite an.

Prüfen

  1. php -l für jede Datei.
  2. Aktivieren, Caches leeren (Eine Erweiterung aktivieren).
  3. /hello/world/Ada öffnen.
  4. Wenn gemeldet wird, dass das Modul nicht existiert: ./console exp:ini where module.ini/ModuleSettings/ExtensionRepositories.

Ein Kernel-Modul ersetzen

Eine Erweiterung kann ein ganzes Kernel-Modul durch ein eigenes ersetzen; siehe Eine Erweiterung kann ein Kernel-Modul ersetzen. Eine View zu einem vorhandenen Modul fügen Sie mit dem RAD-Werkzeug View für ein vorhandenes Modul hinzu.

RAD

Assistent für Modul-Extensions (/setup/moduleextension) schreibt ein Modul mit Views, Templates, Richtlinien und Einstellungen; Modul-Assistent (/setup/modulewizard) schreibt ein Modul auf Grundlage vorhandener Datenbanktabellen. Siehe Mit RAD: ein Modul mit Views.

Verwandte Seiten

Werden Sie Exponential-Partner

Partner teilen ihre Informationen, stellen Mittel bereit, geben Beiträge zurück und entwickeln die Produkte mit uns, und so wächst Exponential. Eine Partner-Website und ein Dashboard sind für Mitte 2027 geplant: Werden Sie noch heute Partner, damit wir schneller wachsen und neue Funktionen früher liefern.

Something wrong on this page? Report an error

Documentation license

This documentation is free documentation, licensed under the GNU Free Documentation License 1.3 or later.

Exponential Copyright © 1998-2026 Exponential Foundation and 7x