Verschachteltes Accordion

  • Der Übersicht halber versuche ich es hier noch einmal (sorry für die obige Darstellung:)


    Guten Abend zusammen,


    ich habe aus dem Core Modul "Mod_Articles_News" des aktuellen Joomla ein Accordion-Modul erstellt (der Name lautet "mod_accordion", welches die Beiträge einer im Modul ausgewählten Kategorie anzeigt: Die Titel des Beitrages werden im Frontend als Button Überschrift angezeigt und der Inhalt des Beitrages im Slider des Accordions.


    So weit so gut - es klappt alles (mit ein wenig Javascript aufgepeppt).


    Nun möchte ich jedoch auch die Möglichkeit eines verschachtelten Accordions (innerem Accordion) hinzufügen.


    Dazu habe ich in der "mod_accordion.xml" ein zusätzliches Feld eingefügt:



    Wie kann ich den Parameter des Feldes "catid2" ansprechen, dass dieser ebenfalls ausgegeben wird?


    Der php Code in meiner "default.php" sieht wie folgt aus:



    Die "helper.php" hatte ich ebenfalls erweitert um die "public static function getSub":



    Im inneren Bereich des Accordion werden jetzt aber leider lediglich die Beitragstitel (als Button) der äußeren Kategorie ausgewiesen (also quasi doppelt).



    Ich sehe momentan den Wald vor lauter Bäumen nicht mehr.


    Was übersehe ich?



    Vielen Dank für Eure Hilfe


    Liebe Grüße Pete

  • Du hast ja die Zeile schon entsprechend markiert.

    //Kategorie ID => Wechsel auf catid2 funktioniert nicht


    Ich würde das Abrufen der Daten in eine eigene Funktion bauen und diese dann jeweils mit catid und ein zweites mal mit catid2 aufrufen.

    Wenn man die Lösung hat, dann muss man nur noch das passende Problem finden.

  • Hallo Lukas,

    danke für Deine schnelle Antwort.


    In der "helper.php" aus der Joomla Core habe ich eine 2. Funktion eingebaut. Die native lautet public static function getList(&$params), wird mit "catid" angesprochen und meine hinzugefügte lautet public static function getSub(&$params), wird mit catid2 angesprochen.


    Oder habe ich Dich falsch verstanden?

  • hast Du denn die zweite Funktion auch in der mod_articles_news.php aufgerufen?

    Dort findest Du die Zeile

    $list = ModArticlesNewsHelper::getList($params);


    Genauso musst Du dann auch die zweite Funktion aufrufen:

    PHP
    $sub= ModArticlesNewsHelper::getSub($params);


    Du könntest auch mit nur einer Funktion arbeiten, muss die Funktion getList nur um den Parameter $my_catid erweitern.

    Beispiel:

    PHP
    public static function getList(&$params, $my_catid){
    ...
    Zeile 56: $model->setState('filter.category_id', $my_catid);
    ...
    }


    Aufruf in der mod_articles_news.php dann:

    PHP
    $list            = ModArticlesNewsHelper::getList($params, $params->get('catid', array()));
    $sub            = ModArticlesNewsHelper::getList($params, $params->get('catid2', array()));

    Wenn man die Lösung hat, dann muss man nur noch das passende Problem finden.

  • Danke Lukas,


    Zitat

    hast Du denn die zweite Funktion auch in der mod_articles_news.php aufgerufen?

    Dort findest Du die Zeile

    $list = ModArticlesNewsHelper::getList($params);

    Genauso musst Du dann auch die zweite Funktion aufrufen:

    Ja, das hatte ich - leider ohne Erfolg.


    Sympathischer ist mir aber Dein Ansatz, beide Parameter in einer Funktion aufzurufen.


    Das werde ich jetzt ausprobieren und melde mich dann zurück.


    Bis später


    Meine helper.php sie nun wie folgt aus:


    Meine mod_accordion.php:



    Meine mod_accordion.xml:


    Und meine Default.php:



    Leider bekomme ich jetzt einen Fatal Error ausgewiesen?!

  • lasse mal die Inhalte der $list und $sub temporär ausgeben, um zu sehen, ob die variablen gefüllt sind.

    In der default.php eintragen


    PHP
    <?php
    echo '<pre style="white-space:pre !important;">';
    print_r($list);
    echo '</pre>';
    echo '<pre style="white-space:pre !important;">';
    print_r($sub);
    echo '</pre>';
    ?>


    Ich habe das bei mir nachgebaut und es funktioniert soweit.

    Wenn man die Lösung hat, dann muss man nur noch das passende Problem finden.

  • In der default.php

    würde ich auch aus:
    <?php foreach ($sub as $item) : ?>

    das machen:

    <?php foreach ($sub as $subitem) : ?>


    das $item hast Du schon in der übergeordneten Schleife.

    Wenn man die Lösung hat, dann muss man nur noch das passende Problem finden.

  • Die Variablen sind beide gefüllt !!!


    ja, danke für den Hinweise, habe ich nun auch abgeändert.


    Zitat
    Ich habe das bei mir nachgebaut und es funktioniert soweit.

    wie sieht Deine helper.php denn genau aus?

  • Die Grundfunktion würde ich mir aber auch nochmal überlegen. Ich habe Kategorie eine ausgewählt und in Subkategorie ebenfalls.

    Jetzt werden, so wie von Dir ausgegeben in jedem Beitrag die Beiträge der Subkategorie ausgegeben.


    Hier mal bei mir die Testausgabe mit jeweils einer Kategorie. Ich habe das jetzt ohne der Accordion-Funktion und nur den Titel ausgeben lassen.


    Das ist die helper.php

    Wenn man die Lösung hat, dann muss man nur noch das passende Problem finden.

  • Die helper.php ist identisch mit meiner....


    In der default.php werden beide Variablen ($list und $sub) geprintet und sind mit den richtigen Kategorien gefüllt.


    Die mod_accordion.php haben wir auch überprüft.


    Wer findet den Fehler?! thinking


    Jetzt gibt es aber keine Fehlermeldung, dafür bleibt die Frontend Seite weiss.


    Diese Zeilen in der helper.php verursachen einen Fehler:


    PHP
    // Category filter
            $model->setState('filter.category_id', $params->get('catid', array()));
            //$model->setState('filter.category_id', $my_catid);    

    Wenn ich die obere Zeile aktiviere erscheint folgendes Frontend:


    Es werden die Beiträge der 1. Kategorie angezeigt, anschließend werden sie in den grauen Buttons wiederholt, statt dass die Subkategorie angezeigt wird.


    Wenn ich vom obigen Code die erste Zeile deaktiviere und die zweite Zeile mit "$my_catid aktiviere, bleibt das Frontend leer.

  • Ich habe auf meinem Testsystem die mod_articles_news überarbeitet.

    Das sind die beiden Felder in der XML (mod_articles_news.xml). Das erste ist das Original-Feld und das zweite habe ich hinzugefügt.

    Hier die mod_articles_news.php


    Dann habe ich die default.php kopiert und umbenannt nach accordeon.php, praktisch ein neues Layout erstellt. Das kann man ja im Modul auswählen. Zu Testzwecken, lasse ich dabei erst einmal nur den Titel ausgeben.

    Wenn man die Lösung hat, dann muss man nur noch das passende Problem finden.

  • Danke Lukas für Deine umfangreiche Hilfestellung.

    Bin leider erst jetzt wieder online.

    Werde mir das gleich in Ruhe anschauen und nachstellen.

    Melde mich dann wieder


    Leider funktioniert es so nicht.


    Folgendes habe ich ausprobiert:



    Meine mod_accordion.php hat weiterhin folgenden Code:

    Und meine Helper.php folgenden Code:



    Frontend zeigt folgendes:




    Die Hauptkategorie mit ihren 4 Beiträgen wird angezeigt. Die Subkategorie mit 1 Beitrag wird nicht angezeigt, statt dessen wird die Hauptkategorie wiederholt.

  • Ich sehe gerade, dass Du die Klasse in der helper.php scheinbar nicht richtig benannt hast. Dein Modul hat den Namen mod_accordion, dann muss auch alles zu diesem Namen benannt sein. Das gilt für die Helper-Klasse, LayoutPath usw.


    In Deinem Modul mod_accordion.php rufst Du die Helper-Klasse des Modul mod_article_news.php auf
    ModArticlesNewsHelper::getList()


    Du musst Deine Klasse auf Deinem Modul anpassen/umbenennen und diese dann aufrufen.

    abstract class ModAccordionHelper{

    ...

    }

    Und dann entsprechend aufrufen in der mod_accordion.php mit

    $list = ModAccordionHelper::getList($params, $params->get('catid', array()));

    $sub = ModAccordionHelper::getList($params, $params->get('subcatid', array()));

    Wenn man die Lösung hat, dann muss man nur noch das passende Problem finden.

  • Danke Tom !


    @Lukas:

    habe Deine Vorschläge aufgegriffen und die Klasse geändert und registriert => kein Erfolg.

    Zudem habe ich mir das Frontend noch einmal mit den Firefox Entwickler-Werkzeugen angeschaut. Mein Ergebnis lautet wie folgt:


    HK
    SK Ergebnis
    1. Beitrag Hauptkategorie korrekt
    1. Beitrag Subkategorie falsch (1. Titel HK - Beitrag #1 HK )
    2. Beitrag Subkategorie falsch (2. Titel HK - Beitrag #1 HK)
    3. Beitrag Subkategorie falsch (3. Titel HK - Beitrag #1 HK)
    4. Beitrag Subkategorie falsch (4. Titel HK - Beitrag #1 HK)
    2. Beitrag Hauptkategorie
    korrekt
    3. Beitrag Hauptkategorie korrekt
    4. Beitrag Hauptkategorie korrekt
  • Dann stimmt in der Ausgabe etwas nicht. Wenn die Variable $sub korrekt befüllt wird, aber trotzdem die Titel der Hauptkategorie ausgegeben werden, dann stimmt daran etwas nicht. Ich denke mal, dass Du statt der Subkategorie, dann die Hauptkategorie ausgeben lässt.


    Hast Du Dir dahingehend auch einmal die "_item.php" angeschaut?
    Die müsstest Du für die "Subkategorie" ebenfalls kopieren und entsprechend anpassen.

    Wenn man die Lösung hat, dann muss man nur noch das passende Problem finden.

  • Habe mir die "_item.php" angeschaut, finde dort aber keinerlei Passagen, die ich ändern müsste.


    Zitat

    Dann stimmt in der Ausgabe etwas nicht. Wenn die Variable $sub korrekt befüllt wird, aber trotzdem die Titel der Hauptkategorie ausgegeben werden, dann stimmt daran etwas nicht. Ich denke mal, dass Du statt der Subkategorie, dann die Hauptkategorie ausgeben lässt.

    Die Ausgabe wird ja über die "default.php" bestimmt, die ich weiter oben angezeigt habe.

    Mir fällt nicht ein, wo ich diese noch weiter anpassen sollte ?!

  • In der default.php rufst Du die For Schleife auf:

    PHP
    <?php foreach ($sub as $subitem) : ?>


    Innerhalb dieser lässt Du den Titel des jeweiligen "subitem" ausgeben

    PHP
    <?php echo $subitem->title; ?> 


    Danach möchtest Du den Beitrag des "subitem" ausgeben lassen. In dieser Zeile wird die Layout-Datei "_item.php" aufgerufen. Innerhalb des PHP Code dieser Datei wird aber nicht mehr das "subitem" angesprochen, sondern das "item" aus der übergeordneten (noch geöffneten) For Schleife.

    PHP
    <?php require JModuleHelper::getLayoutPath('mod_fraladesign_accordion', '_item'); ?>


    Du müsstest diese Datei kopieren und z.B. umbenennen nach _subitem.php und die Zeile zum Aufruf ändern nach

    PHP
    <?php require JModuleHelper::getLayoutPath('mod_fraladesign_accordion', '_subitem'); ?>


    Hier hast Du einige Einträge, die auf das aktuelle $subitem verweisen müssen und nicht auf das $item
    z.B. Zeile 15

    PHP
    aus:
    <?php if ($item->link !== '' && $params->get('link_titles')) : ?>
    muss:
    <?php if ($subitem->link !== '' && $params->get('link_titles')) : ?>


    Wenn man die Lösung hat, dann muss man nur noch das passende Problem finden.

  • Lukas, vielen Dank für Deine unglaublichen Bemühungen.

    Ich habe die von Dir angegebenen Codepassagen eingebaut.

    Meine Dateien sehen jetzt wie folgt aus:




    Die Datei "_subitem.php" habe ich von Dir kopiert.


    Nach wie vor ist im Frontend keine Veränderung zu erkennen.

    In der "helper.php" habe ich alternierend Zeile 59 auskommentiert. Der Effekt ist, dass bei aktiver Zeile das Frontend weiss bleibt (ohne Fehlermeldung), ich dafür aber in der "default.php" die Variablen "$list" und "$sub" richtig gefüllt auslesen kann.

    Ist diese Zeile 59 auskommentiert, ist das Accordion im Frontend zu sehen, aber die Subkategorie wird falsch ausgegeben.

    Es ist zum Verzweifeln.

  • Konnte leider nicht alle Dateien hochladen, da die Menge auf 10.000 Zeichen begrenzt ist. Hier nun die beiden fehlenden Dateien:


    Die Datei "_subitem.php" habe ich von Dir kopiert.