Ankündigung

Einklappen
Keine Ankündigung bisher.

4.9 Merkliste Hinzufügen funktioniert nicht, wenn "replaceInsertTags" im Template

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • 4.9 Merkliste Hinzufügen funktioniert nicht, wenn "replaceInsertTags" im Template

    Hallo!

    Ich habe für einen Kunden ein schnelles Feature hinzugefügt, bei dem ich im Listen-Template "unsauber" einfach über einen Inserttag ein anderes Inhaltselement mir ziehe und das über PHP dann "zerstückle". Das Inhaltselement ist ein CE.

    Alleine wenn die folgende Zeile über dem foreach Loop im Template steht, funktioniert die Merkliste nicht mehr. Das heißt, wenn man auf "Merkliste hinzufügen" klickt, dann lädt die Seite neu, das Element "scheint" auf der Merkliste zu stehen, weil dann stattdessen "Merkliste entfernen" angezeigt wird, aber es ist nicht wirklich auf der Merkliste. Sofern man stattdessen über die Readerseite das Item auf die Merkliste hinzufügt funktioniert es normal. Wenn ich die folgende Zeile aus dem Listen-Template entferne, funktioniert die Merkliste ebenfalls normal.

    Code:
    $HTMLcontent = $this->replaceInsertTags('{{insert_content::108275}}');

    Hat jemand eine Idee woran das liegen könnte? Ich kann bei bedarf auch den Code vom CE hier reinkopieren.

    VG, Filip

  • #2
    Wichtig: Seite darf nicht im Seitencache liegen!

    Falls man Merkliste-Inhalte bzw. Inhalte die irgendwie mit Sessiondaten laufen, über Inserttags holt, sollte man den Inserttag auf nocache fahren. https://github.com/contao/core-bundl...oller.php#L761
    http://www.premium-contao-themes.com

    Kommentar


    • #3
      Zitat von Tim Beitrag anzeigen
      Wichtig: Seite darf nicht im Seitencache liegen!

      Falls man Merkliste-Inhalte bzw. Inhalte die irgendwie mit Sessiondaten laufen, über Inserttags holt, sollte man den Inserttag auf nocache fahren. https://github.com/contao/core-bundl...oller.php#L761
      Das Problem bleibt weiterhin bestehen, wenn ich den Inserttag so aufrufe.

      Code:
      $HTMLcontent = $this->replaceInsertTags('{{insert_content::108275}}', false);
      Benutzen ich den so richtig?

      Kommentar


      • #4
        Was genau fügst du denn via Inserttag ein? Liegt die Merkliste in dem CE, das via Inserttag eingefügt wird?

        Beim Hinzufügen lädt die Seite neu und der Status wird auf Entfernen gesetzt. Inwiefern liegt das Element dann nicht in der Merkliste? Wie äußert sich das bzw. woher weisst du das?
        http://www.premium-contao-themes.com

        Kommentar


        • #5
          Ich füge über den Inserttag ein Customelement ein das sozusagen als Stopper in der Produktliste fungiert. Das Customelement hat nichts mit dem CC oder der Merkliste zu tun. Somit kann der Kunde an fünfter Stelle im Listenmodul einen Stopper für eine andere Aktion anzeigen lassen.

          Das Element liegt in sofern nicht in der Merkliste, das es nicht über das Listenmodul mit dem Merklisten Filter angezeigt wird, es nicht über das inserttag "customcatalognotelist::total" ausgegeben wird und wenn man auf die Item-Detailseite geht, dort der state wieder auf "Merkliste hinzufügen" steht.

          Wenn ich den Inserttag im fehlerhaften CC Listenmodul entferne, dann wird der State sozusagen wieder zurückgesetzt und der Merklisten Button ist mit allen anderen Listen/Detailseiten/Inserttags gesynced.


          Code für das CE:
          Code:
          <div class="imagebox--wrapper">
              <wbr/>
              <?php foreach($this->group('content') as $i => $fields): ?>
              <section class="flex-wrapper <?php echo $this->field('background#'.$i)->value(); ?> iconbox--content <?php if (!$this->field('img#'.$i)->value()): ?>img-icon <?php endif; ?> <?php echo $this->class; ?> <?php echo $this->field('style')->value(); ?> block" <?php echo $this->cssID; ?><?php if ($this->style): ?> style="<?php echo $this->style; ?>"<?php endif; ?>>
                  <div class="<?php if ($this->field('img#'.$i)->value()): ?>one_half <?php endif; ?>imgicon--wrapper p-40 p-30-m p-30-t bg-darkgray invert">
                      <?php echo $this->field('icon#'.$i)->html(); ?>
                      <div class="iconbox--headline color-white">
                          <h4 class="mb-10"><?php echo $this->field('headline#'.$i)->value(); ?></h4>
                      </div>
                      <div class="iconbox--text mb-30"><?php echo $this->field('text#'.$i)->html(); ?></div>
                      <div class="iconbox--link link--button of-visible">
                          <?php if ($this->field('link')->option('linkText')): ?>
                          <?php echo $this->field('link#'.$i)->html(); ?>
                          <?php endif; ?>
                      </div>
                  </div>
                  <?php if ($this->field('img#'.$i)->value()): ?>
                  <div class="one_half">
                      <div class="imagebox--image h-100">
                          <?php echo $this->field('img#'.$i)->html(); ?>
                      </div>
                  </div>
                  <?php endif; ?>
              </section>
              <wbr/>
              <?php endforeach; ?>
          </div>
          Code für die CC Liste:
          Code:
          <?php if(!$this->empty): ?>
          <?php
          if ($GLOBALS['TL_LANGUAGE'] == 'de') {
              $HTMLcontent = $this->replaceInsertTags('{{insert_content::108275}}', false);
          } else {
              $HTMLcontent = $this->replaceInsertTags('{{insert_content::108517}}', false);
          };
          $einklinker = explode("<wbr/>",$HTMLcontent);
          $objLength = count($einklinker);
          $einklinker = array_slice($einklinker, 1, $objLength-2);
          $length = count($einklinker);
          $randomArticle = random_int(0, $length-1);
          $i = 0;
          //<script>console.log(`<?php print_r($HTMLcontent); `)</script>
          ?>
          <?php foreach($this->entries as $entry): ?>
              <div class="block entry product--wrapper one_half mb-20" <?php echo $this->cssID; ?>>
                  <span class="span-expand">
                      <a href="<?php echo $entry->links('detail')->url; ?>"></a>
                  </span>
                  <div class="product--notelist notelist offsetleft">
                      <?php echo $entry->field('notelist')->html("customelement_attr_notelist"); ?>
                  </div>
                  <div class="product--image">
                      <?php //<img src="echo $entry->field('img')->generate(); " alt=""> ?>
                      <?php
                      // echo $entry->field('img')->generate();
                      $image_path = $entry->field('img')->generate();
                      $image = \Picture::create($image_path, 9)->getTemplateData(); // 1 ist die ID der Bildgröße, einfach durch Deine ID ersetzen
                      $this->insert('picture_default', $image);
                      ?>
                  </div>
                  <div class="product--content">
                      <?php
                      if ($entry->field('overline')->value()):
                      ?>
                      <div class="product--overline">
                          <?php echo $entry->field('overline')->value(); ?>
                      </div>
                      <?php endif; ?>
                      <h2 class="product--headline"><?php echo strip_tags($entry->field('name')->value(), "<strong>");  ?></h2>
                      <div class="product--teaser">
                          <?php echo $entry->field('teaser')->value(); ?>
                      </div>
                      <div class="product--link link--button button--gray button--text--regular">
                          <p class="link"><a href="<?php echo $entry->links('detail')->url; ?>">{{iflng::de}}Produkt ansehen{{iflng::en}}Product Details{{iflng}}</a></p>
                      </div>
                  </div>
              </div>
          <?php
          if($i === 3):
              echo $einklinker[$randomArticle];
          endif;
          $i++;
          ?>
          <?php endforeach; ?>
          
          <?php else: ?>
          <p class="info empty">Keine Produkte gefunden</p>
          <?php endif;?>

          Kommentar


          • #6
            Inkludiere mal einen anderen Content zur Prüfung ob es allgemein an der replaceInsertTags Methode liegt.
            http://www.premium-contao-themes.com

            Kommentar


            • #7
              Zitat von Tim Beitrag anzeigen
              Inkludiere mal einen anderen Content zur Prüfung ob es allgemein an der replaceInsertTags Methode liegt.
              Wenn ich ein Contao Native Element per Inserttag einbinde, dann funktioniert es einwandfrei. Aber wenn ich versuche irgendein Customelement per Inserttag einzubinden, tritt der gleiche Fehler immer auf.

              Ich verwende in den inkludierten CEs auch keine Inserttags oder ähnliches, was im Cache gespeichert werden würde.

              Kommentar


              • #8
                In meiner lokalen Testumgebung kann ich es nicht reproduzieren. Ich teste es noch online gegen...

                Auch online sehe ich keine Probleme: http://dev.premium-contao-themes.com/catalog-297.html

                Angehängte Dateien
                Zuletzt geändert von Tim; 09.04.2021, 11:10.
                http://www.premium-contao-themes.com

                Kommentar


                • #9
                  Zitat von Tim Beitrag anzeigen
                  In meiner lokalen Testumgebung kann ich es nicht reproduzieren. Ich teste es noch online gegen...

                  Auch online sehe ich keine Probleme: http://dev.premium-contao-themes.com/catalog-297.html
                  Wenn du ein Objekt auf die Merkliste setzt, updated sich bei deinem Beispiel auch oben rechts die Zahl nicht, bzw. auf der notelist seite wird nichts angezeigt. Ich teste das gerade im FF Developer Edition. (Bei Chromium Browsern ebenfalls nicht.)
                  Angehängte Dateien
                  Zuletzt geändert von filipt; 09.04.2021, 11:21.

                  Kommentar


                  • #10
                    Platziere deine Inserttag ausserhalb des customcatalog_ Templates z.B. im mod_customcatalog Template. Das sollte besser klappen.
                    http://www.premium-contao-themes.com

                    Kommentar


                    • #11
                      Ich würde gerne innerhalb des Foreach Loops diesen Stopper einblenden lassen.

                      Ich kann das notfalls natürlich auch über JS so lösen, das das HTML dann nachträglich hinzugefügt wird. Die Lösung direkt über PHP wäre mir hier lieber, da das dann performanter im frontend abläuft.

                      Gibt es da keine Lösung? Weswegen tritt dieser Fehler eigentlich auf?

                      Kommentar


                      • #12
                        Platziere das inserttag ausserhalb z.B. im mod_customcatalog vor der $this->customcatalog Ausgabe und lege die HTML Ausgabe in eine Globale und greife die im foreach ab. $this->customcatalog ist quasi die Ausgabe des customcatalog_ Templates.
                        Jede Globale, die vorher deklariert wird ist darin aufrufbar.
                        Zuletzt geändert von Tim; 09.04.2021, 11:56.
                        http://www.premium-contao-themes.com

                        Kommentar


                        • #13
                          Zitat von Tim Beitrag anzeigen
                          Platziere das inserttag ausserhalb z.B. im mod_customcatalog vor der $this->customcatalog Ausgabe und lege die HTML Ausgabe in eine Globale und greife die im foreach ab. $this->customcatalog ist quasi die Ausgabe des customcatalog_ Templates.
                          Jede Globale, die vorher deklariert wird ist darin aufrufbar.
                          Dazu hab ich jetzt noch eine technische Frage. Wenn ich im mod_customcatalog Template die Variable $GLOBALS['custom_stopper'] oder direkt $custom_stopper definiere, kann ich diese nicht als $GLOBALS['custom_stopper'] oder als $custom_stopper im Listentemplate ausgeben. Beide Variablen sind bei mir leer.

                          Ist da was an meiner Denkweise falsch? Der Code steht vor dem $this-customcatalog.

                          Kommentar


                          • #14
                            Es muss eine Globale sein.

                            mod_customcatalog:

                            $GLOBALS['custom_stopper'] = 'hallo';
                            $this->customcatalog (durchläuft customcatalog_)

                            customcatalog_
                            echo $GLOBALS['custom_stopper']; // hallo

                            http://www.premium-contao-themes.com

                            Kommentar


                            • #15
                              Hast recht. ->customcatalog feuert vor dem mod_ Template. My bad.

                              Du kannst es noch eine Ebene höher machen z.B. langconfig (falls so hoch deklariert, muss event. das Template direkt in /templates liegen, damit es global erkannt wird)
                              $GLOBALS['TEST'] = Controller::getContentElement(ID-DES-INHALTSELEMENTS);
                              Zuletzt geändert von Tim; 09.04.2021, 13:13.
                              http://www.premium-contao-themes.com

                              Kommentar

                              Lädt...
                              X