How to Modulentwicklung [Teil 3]

Wie lege ich im Admin einen eigenen Menüpunkt “Fragen & Antworten” an?

Die Menüpunkte für den Admin sind in der Datei menu.xml hinterlegt, um unseren eigenen Menüpunkt hinzuzufügen legen wir innerhalb unseres Moduls eine eigene menu.xml Datei an.

Für unser Modul möchten wir gerne unter dem Adminmenüpunkt -> Artikel verwalten -> Alle Bewertungen unseren eigenen Menüpunkt Fragen und Antworten definieren.

 

Das OXID Framework besitzt an vielen Stellen seine Ecken und Kanten. Dies ist nun so eine. Um den Hauptmenüpunkt Artikel verwalten um einen eigenen Menüpunkt erweitern zu können müssen wir in der Original Datei menu.xml den Block suchen der diesen Hauptmenüpunkt enthält und kopieren diesen in unsere im Modulverzeichnis angelegte menu.xml Datei.

<?xml version="1.0" encoding="ISO-8859-15"?>
<OX>
    <OXMENU id="NAVIGATION_ESHOPADMIN">
        <MAINMENU id="mxmanageprod">
            <SUBMENU id="mxarticles" cl="article" list="article_list">
                <TAB id="tbclarticle_main" cl="article_main" />
                <TAB id="tbclarticle_extend" cl="article_extend" />
                <TAB id="tbclarticle_stock" cl="article_stock" />
                <TAB id="tbclarticle_attribute" cl="article_attribute" />
                <TAB id="tbclarticle_crossselling" cl="article_crossselling"/>
                <TAB id="tbclarticle_variant" cl="article_variant"/>
                <TAB id="tbclarticle_pictures" cl="article_pictures" />
                <TAB id="tbclarticle_files" cl="article_files" />
                <TAB id="tbclarticle_review" cl="article_review"/>
                <TAB id="tbclarticle_overview" cl="article_overview" />
                <TAB id="tbclarticle_seo" cl="article_seo" />
                <BTN id="article_new" />
                <BTN id="article_preview" />
            </SUBMENU>
            <SUBMENU id="mxattributes" cl="attribute" list="attribute_list">
                <TAB id="tbclattribute_main" cl="attribute_main" />
                <TAB id="tbclattribute_category" cl="attribute_category" />
                <BTN id="attribute_new" />
            </SUBMENU>
            <SUBMENU id="mxcategories" cl="category" list="category_list">
                <TAB id="tbclcategory_main" cl="category_main" />
                <TAB id="tbclcategory_text" cl="category_text" />
                <TAB id="tbclcategory_pictures" cl="category_pictures" />
                <TAB id="tbclcategory_order" cl="category_order" />
                <TAB id="tbclcategory_seo" cl="category_seo" />
                <BTN id="category_new" />
                <BTN id="category_refresh" />
                <BTN id="category_resetnrofarticles" />
            </SUBMENU>
            <SUBMENU id="mxsellist" cl="selectlist" list="selectlist_list">
                <TAB id="tbclselectlist_main" cl="selectlist_main" />
                <BTN id="selectlist_new" />
            </SUBMENU>
            <SUBMENU id="mxremlist" cl="list_review" />
        </MAINMENU>
    </OXMENU>
</OX>

Wir fügen unsere eigenen Menüpunkt unter dem letzten SUBMENU ein.

<SUBMENU id="bisquestionanswer" cl="bisquestionanswer_listofquestions" list="bisquestionanswer_listofquestions_List">
    <TAB id="tbclbisquestionanswer_listofquestions_main" cl="bisquestionAnswer_listofquestions_main" />
</SUBMENU>

In unserem Submenu haben wir nun einen allgemeinen Controller bisquestionanswer_listofquestions definiert. Dieser Controller würde schon ausreichen um ein eigenes Template für unseren Menüpunkt zu definieren und zu verwenden.

Da wir uns am OXID Admin Design Aufbau orientieren möchten haben wir noch einen eigenen Listenansicht Controller bisquestionanswer_listofquestions_List und für unseren Haupttab den Controller bisquestionAnswer_listofquestions_main definiert.

metadata.php um unsere Einträge erweitern

Zu allererst erweitern wir unsere bisherige metadata.php um die neuen Einträge für unsere eigenen Admin Controller im files Array und Admin Views im neu definierten Array Eintrag templates.

<?php

$sMetadataVersion = '1.1';

$aModule = array(
    'id'           => 'bisQuestionAnswer',
    'title'        => 'Modul f&uuml;r Fragen und Antworten zum Artikel',
    'extend'       => array(),
    'files'        => array(
        // core
        'bisQuestionAnswerEvents' => 'bisQuestionAnswer/core/bisquestionanswerevents.php',
        // admin controllers
        'bisQuestionAnswer_ListofQuestions' => 'bisQuestionAnswer/application/controllers/admin/bisquestionanswer_listofquestions.php',
        'bisQuestionAnswer_ListofQuestions_List' => 'bisQuestionAnswer/application/controllers/admin/bisquestionanswer_listofquestions_list.php',
        'bisQuestionAnswer_ListofQuestions_Main' => 'bisQuestionAnswer/application/controllers/admin/bisquestionanswer_listofquestions_main.php',
    ),
    'blocks'       => array(
        array(
            'template' => 'article_extend.tpl',
            'block' => 'admin_article_extend_form',
            'file' => '/views/blocks/article_extend.tpl'
        ),
    ),
    'settings'     => array(),
    'templates'    => array(
        'list_of_questions.tpl' => 'bisQuestionAnswer/views/admin/tpl/list_of_questions.tpl',
        'list_of_questions_list.tpl' => 'bisQuestionAnswer/views/admin/tpl/list_of_questions_list.tpl',
        'list_of_questions_main.tpl' => 'bisQuestionAnswer/views/admin/tpl/list_of_questions_main.tpl',
    ),
    'events'       => array(
        'onActivate'   => 'bisQuestionAnswerEvents::onActivate',
    ),
);

Eigene Sprachkonstanten definieren

Für unsere eigenen Sprachkonstanten legen wir in unseren Modul das Unterverzeichnis /modules/bisQuestionAnswer/views/admin/de/ an. Innerhalb des Unterverzeichnis legen wir die Sprachdatei bisquestionanswer_lang.php an.

<?php

$sLangName  = "Deutsch";
// -------------------------------
// RESOURCE IDENTIFIER = STRING
// -------------------------------
$aLang = array(
    'charset'                                       => 'ISO-8859-15',
    'bisquestionanswer'                             => 'Fragen und Antworten',
    'tbclbisquestionanswer_listofquestions_main'    => 'Stamm',
    'BIS_LIST_OF_QUESTION_LIST_MENUSUBITEM'         => 'Fragen und Antworten',
);

/*
[{ oxmultilang ident="GENERAL_YOUWANTTODELETE" }]
*/

Eigene Admin Controller anlegen

Für unseren eigenen Adminmenüpunkt Fragen und Antworten legen wir das Admin Controller Verzeichnis /modules/bisQuestionAnswer/application/controllers/admin/ an.

Unsere 3 eigene Admin Controller

  • Controller von unseren eigenen Adminmenüpunkt
    bisQuestionAnswer_ListofQuestions

    <?php
    
    class bisQuestionAnswer_ListofQuestions extends oxAdminView
    {
        protected $_sThisTemplate = 'list_of_questions.tpl';
    }
  • Controller für OXID Admin Listenansicht
    bisQuestionAnswer_ListofQuestions_List

    <?php
    
    class bisQuestionAnswer_ListofQuestions_List extends oxAdminList
    {
        protected $_sThisTemplate = 'list_of_questions_list.tpl';
    }
  • Controller für OXID Admin Detailansicht
    bisQuestionAnswer_ListofQuestions_Main

    <?php
    
    class bisQuestionAnswer_ListofQuestions_Main extends oxAdminDetails
    {
    
        public function render()
        {
            parent::render();
            return 'list_of_questions_main.tpl';
        }
    }

Eigene Admin Views anlegen

In unseren Admin Controllern haben wir 3 eigene Admin Templates den Controllern zugewiesen. Für unsere 3 Admin Templates legen wir das Verzeichnis tpl innerhalb des Verzeichnisses /modules/bisQuestionAnswer/views/admin/tpl/ an.

Unsere 3 eigene Admin Views

  • View von unseren eigenen Adminmenüpunkt, welcher die Listen- und Detailansicht einbindet
    list_of_questions.tpl

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    
    <html>
    <head>
        <title>[{ oxmultilang ident="GENERAL_ADMIN_TITLE" }]</title>
    </head>
    
    <!-- frames -->
    <frameset  rows="40%,*" border="0" onload="top.loadEditFrame('[{$oViewConf->getSelfLink()}]&[{ $editurl }][{ if $oxid }]&oxid=[{$oxid}][{/if}]');">
        <frame src="[{$oViewConf->getSelfLink()}]&[{ $listurl }][{ if $oxid }]&oxid=[{$oxid}][{/if}]" name="list" id="list" frameborder="0" scrolling="auto" noresize marginwidth="0" marginheight="0">
        <frame src="" name="edit" id="edit" frameborder="0" scrolling="auto" noresize marginwidth="0" marginheight="0">
    </frameset>
    
    
    </html>
  • View für OXID Admin Listenansicht
    list_of_questions_list.tpl

    [{include file="headitem.tpl" title="GENERAL_ADMIN_TITLE"|oxmultilangassign box="list"}]
    [{assign var="where" value=$oView->getListFilter()}]
    
    [{if $readonly}]
        [{assign var="readonly" value="readonly disabled"}]
        [{else}]
        [{assign var="readonly" value=""}]
        [{/if}]
    
    <script type="text/javascript">
        <!--
        window.onload = function ()
        {
            top.reloadEditFrame();
            [{ if $updatelist == 1}]
            top.oxid.admin.updateList('[{ $oxid }]');
            [{ /if}]
        }
        //-->
    </script>
    
    
    <div id="liste">
        <form name="search" id="search" action="[{ $oViewConf->getSelfLink() }]" method="post">
            [{include file="_formparams.tpl" cl="selectlist_list" lstrt=$lstrt actedit=$actedit oxid=$oxid fnc="" language=$actlang editlanguage=$actlang}]
            <table cellspacing="0" cellpadding="0" border="0" width="100%">
    
            </table>
        </form>
    </div>
    
    [{include file="pagetabsnippet.tpl"}]
    
    <script type="text/javascript">
        if (parent.parent)
        {   parent.parent.sShopTitle   = "[{$actshopobj->oxshops__oxname->getRawValue()|oxaddslashes}]";
            parent.parent.sMenuItem    = "[{ oxmultilang ident="GENERAL_MENUITEM" }]";
            parent.parent.sMenuSubItem = "[{ oxmultilang ident="BIS_LIST_OF_QUESTION_LIST_MENUSUBITEM" }]";
            parent.parent.sWorkArea    = "[{$_act}]";
            parent.parent.setTitle();
        }
    </script>
    </body>
    </html>
  • View für OXID Admin Detailansicht
    list_of_questions_main.tpl

    [{include file="headitem.tpl" title="GENERAL_ADMIN_TITLE"|oxmultilangassign}]
    
    [{if $readonly}]
        [{assign var="readonly" value="readonly disabled"}]
    [{else}]
        [{assign var="readonly" value=""}]
    [{/if}]
    
    <form name="transfer" id="transfer" action="[{ $oViewConf->getSelfLink() }]" method="post">
        [{ $oViewConf->getHiddenSid() }]
        <input type="hidden" name="oxid" value="[{ $oxid }]">
        <input type="hidden" name="cl" value="selectlist_main">
        <input type="hidden" name="editlanguage" value="[{ $editlanguage }]">
    </form>
    
    <form name="myedit" id="myedit" action="[{ $oViewConf->getSelfLink() }]" method="post">
        [{ $oViewConf->getHiddenSid() }]
        <input type="hidden" name="cl" value="selectlist_main">
        <input type="hidden" name="fnc" value="">
        <input type="hidden" name="oxid" value="[{ $oxid }]">
        <input type="hidden" name="editval[oxselectlist__oxid]" value="[{ $oxid }]">
    
        <table cellspacing="0" cellpadding="0" border="0" width="98%">
            <tr>
                <td valign="top" class="edittext">
                </td>
                <!-- Anfang rechte Seite -->
                <td valign="top" class="edittext" align="left" width="50%">
                </td>
            </tr>
        </table>
    </form>
    
    [{include file="bottomnaviitem.tpl"}]
    
    [{include file="bottomitem.tpl"}]

Die Admin View Templates sind vorerst reine Rohvorlagen und werden später um Quellcode ergänzt. Tüftle an wieder verwendbaren Snippets. Lasst euch überraschen! Fortsetzung folgt.

Fortsetzung

Im 4. Teil der Modulentwicklung geht es nächste Woche weiter mit:
Wie definiere ich eine eigene Datenbanktabelle, designe die Admin Templates und hinterlege die Funktionalität?

Key Learnings

  • Eigenen Admin Menüpunkt anlegen
  • Eigene Sprachkonstanten definieren
  • Eigene Listen- und Detailansicht Controller erstellen
  • Eigene Listen- und Detailansicht Views erstellen


0 Kommentare

Dein Kommentar

An Diskussion beteiligen?
Hinterlasse uns Deinen Kommentar!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.