Include in Artikel Contentdetail / Editor (TAB)

Thema wurde von datenchaos, 20. Mai 2012 erstellt.

  1. datenchaos

    datenchaos Erfahrener Benutzer

    Registriert seit:
    13. Oktober 2011
    Beiträge:
    106
    Danke erhalten:
    36
    Danke vergeben:
    6
    Hallo zusammen,

    ich bin auf der Suche nach einer halbwegs einfachen Lösung um "zentral gepflegten Content" bei ausgesuchten Artikeln in einem extra TAB anzuzeigen.
    z.B. die Content-Bildergalerie A soll bei 43 verschiedenen Artikeln als TAB eingebunden werden. Punkt ist, dass sich dieser zentrale Content ändert und dann habe ich wenig Lust 43 Artikel nachzupflegen. Das Ganze kommt nicht nur 1x, sondern x-fach mit verschiedenstem zentralem Content vor.
    • Simpelste Lösung ist wohl mit einem iFrame, was jedoch aus SuMa Sicht wahrscheinlich nicht so prickelnd ist.
    • PHP Include wird nicht interpretiert
    • Mit Smarty (ähnlich wie wie hier) kenne ich mich leider nicht aus und scheint mir darum etwas oversized

    Am liebsten wäre es mir, wenn es eine Updatesichere Systemanpassung gäbe, so dass man PHP im Contenteditor verwenden kann. Dazu habe ich jedoch nichts gefunden.

    Jemand eine Idee?
     
  2. Dennis (MotivMonster.de)

    Dennis (MotivMonster.de) G-WARD 2013/14/15/16

    Registriert seit:
    22. September 2011
    Beiträge:
    30.948
    Danke erhalten:
    6.089
    Danke vergeben:
    1.078
    Beruf:
    Mann für alles :)
    Ort:
    Weilburg
    Simple Lösung wäre z.B. wenn du die Bilder in einem eigenem Ordner für die Gruppe A hinterlegst und dann im TAP einfach per html die Bilder einbaust.
    Ändert sich ein Bild änderst du einfach die Datei auf dem Server. Dann musst nicht an jeden Artikel ran.

    Wäre zwar nicht die eleganteste Lösung aber eine simple umzusetzende.
     
  3. Manni_HB

    Manni_HB G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    9.098
    Danke erhalten:
    1.540
    Danke vergeben:
    909
    Ort:
    Bremen
    #3 Manni_HB, 20. Mai 2012
    Zuletzt bearbeitet: 20. Mai 2012
    Da gibbet eine Möglichkeit: Der "Auspufffilter" - sorry, gemeint ist "..\includes\classes\Smarty\plugins\outputfilter.note.php" ist ein mächtig DIng, das sowas mit Links macht!

    Beipspiel:
    Du hast (z.B. im ContentManager) eine Seite gebaut, die so aussieht:
    HTML:
    <div style="text-align: left;"><img align="right" title="Kartoffelherkunftsl&auml;nder" alt="Kartoffelherkunftsl&auml;nder" src="images/EigeneBilder/Textbilder/KartoffelnWelt.png" />Die heute kultivierten Kartoffeln stammen von verschiedenen Landsorten ab, die in den Anden vom westlichen Venezuela bis nach Argentinien und der Insel Chilo&eacute; bzw.</div>
    
    Im "Auspufffilter" fügst Du VOR "return $tpl_output.$cop;" dies ein:
    PHP:
    //    ############################################## EOF MBr[002] ###########################################    
        
    $mbr_ersatz    '
        <div style="text-align: left;"><img align="right" title="Kartoffelherkunftsl&auml;nder" alt="Kartoffelherkunftsl&auml;nder" src="images/EigeneBilder/Textbilder/KartoffelnWelt.png" />Die heute kultivierten Kartoffeln stammen von verschiedenen Landsorten ab, die in den Anden vom westlichen Venezuela bis nach Argentinien und der Insel Chilo&eacute; bzw.</div>    
        '
    ;
        
    $tpl_output preg_replace('/@mbr_zusatz_tab@/'$mbr_ersatz$tpl_output);
    //    ############################################## EOF MBr[002] ###########################################    
    In den Produktbeschreibungen, wo diese Info erscheinen soll fügst Du folgenden Tab ein "[TAB:Zusatzinfo blabla]@mbr_zusatz_tab@

    Dann ersetzt der "Auspuffilter" beim Parsen die
    @mbr_zusatz_tab@ mit dem Inhalt von $mbr_ersatz.
     
  4. datenchaos

    datenchaos Erfahrener Benutzer

    Registriert seit:
    13. Oktober 2011
    Beiträge:
    106
    Danke erhalten:
    36
    Danke vergeben:
    6
    Vielen Dank Manfred, das Vorgehen mit dem "Auspufffilter" trifft das glaube ich recht gut. Werde das die Tage mal ausprobieren.
    Hast Du eine Einschätzung bzgl. Performanceauswirkungen? Denke bei mir wäre das etwa 10-15x soviel HTML je Platzhalter wie in Deinem Beispiel. Davon würde ich dann ca. 30-40 verschiedenen HTML Fragemente in die outputfilter auslagern.

    Danke & Gruß
     
  5. Manni_HB

    Manni_HB G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    9.098
    Danke erhalten:
    1.540
    Danke vergeben:
    909
    Ort:
    Bremen
    Also mein armer "Auspufffilter" muss echt viel tun und die Parsetime ist davon gänzlich unbeeindruckt!
     
  6. Avenger

    Avenger G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    4.771
    Danke erhalten:
    1.478
    Danke vergeben:
    89
    Das mag zwar funktionieren, aber ich halte das für eine ziemlich grottige und unübsichtliche Lösung....

    Denn der Outputfilter wird bei jedem Template durchlaufen und führt viele vergebliche "replace"-Operationen durch.

    Sehr viel eleganter wäre es m.E., eine "Smarty"-Funktion (z.B."load_cms_data") zu entwickeln, die man dann einfach in den "TAB" der Produktbeschreibung verwendet, wo man die CMS-Seite einbinden will....

    PHP:
    [TAB:Externes CMS]
    {
    load_cms_data coID=1234}
    wobei "1234" die Gruppen-Id der CMS-Seite ist, die eingebunden werden soll.

    Sehr viel übersichtlicher, sehr viel eleganter, und nur dort Rechenleistung verwendend, wo es nötig ist.
     
  7. Avenger

    Avenger G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    4.771
    Danke erhalten:
    1.478
    Danke vergeben:
    89
    Da die Meisten wohl mit der Implementierung einer solchen Lösung leicht überfordert sind, und ich gerade so was auch gut brauchen kann, habe ich das mal implementiert....

    Folgenden Code als "includes\classes\Smarty\plugins\function.pt_load_cms_data.php" speichern:
    (Das ist das Smarty-Plugin zum Laden von CMS-Inhalten.)

    PHP:
    <?php
    /* --------------------------------------------------------------
    function.pt_load_cms_data.php 2011-10-25 Avenger

    Copyright (c) 2012 Avenger, entwicklung@powertemplate.de
    Smarty function to allow inclusion of CMS content into template

    Usage:

    {pt_load_cms_data coID=1234}

    with coID equal the group id of the page requested

    --------------------------------------------------------------
    */

    function smarty_function_pt_load_cms_data($params, &$smarty)
    {
      
    $content='';
      
    $coID=$params['coID'];
      if (
    $coID)
      {
        if (
    GROUP_CHECK == 'true')
        {
          
    $group_check "AND group_ids LIKE '%c_".$_SESSION['customers_status']['customers_status_id']."_group%'";
        }
        
    $dbQuery "
          SELECT
            content_title,
            content_text,
            content_file,
            gm_link
          FROM
            "
    .TABLE_CONTENT_MANAGER."
          WHERE
            content_group = '"
    .intval($coID)."' AND
            languages_id = '"
    .(int) $_SESSION['languages_id']."'
            "
    .$group_check;
        
    $dbQuery xtDBquery($dbQuery);
        
    $dbQuery xtc_db_fetch_array($dbQuery,true);
        if (
    $dbQuery)
        {
          
    $content_title=trim($dbQuery['content_title']);
          
    $content_file=trim($dbQuery['content_file']);
          if (
    $content_file)
          {
            
    $content_file='media/content/'.$content_file;
            
    $content_file_path=DIR_FS_CATALOG.$content_file;
            
    $have_direct_link=false;
            
    $is_file_content_file=is_file($content_file);
            if (
    $is_file_content_file)
            {
              if (
    strpos($content_file'.php'))
              {
                
    ob_start();
                include(
    $content_file);
                
    $content=ob_end_clean();
              }
              else
              {
                
    $content=file_get_contents($content_file_path);
                
    $is_text_file=strpos($content_file'.txt')!==false;
                if (
    $is_text_file)
                {
                  
    $content="<pre>".$content."</pre>";
                }
              }
            }
          }
          else
          {
            
    $content=$dbQuery['content_text'];
          }
          
    $content_smarty=new Smarty;
          while (
    strpos($content,'{')!==false)
          {
            
    $content=smarty_function_eval(array('var'=>$content), $content_smarty);
          }
        }
      }
      return 
    $content_title.'###'.$content;
    }
    ?>
    Das reicht aber leider noch nicht ganz, da der Gambio "TABTokenizer" kein Rendering der TAB-Inhalte durch Smarty erlaubt (was wir aber für die Einbindung unseres Smarty-Plugins unbedingt brauchen), so dass wir dem das auch noch beibringen müssen....
    (Kann man sicher auch für den reinen Ersatz von Smarty-Variablen in den TABs gut gebrauchen.)

    Dazu folgenden Code als "user_classes\overloads\GMTabTokenizer\pt_GMTabTokenizer.php" speichern (und Cache löschen!):

    PHP:
    <?php
    /* --------------------------------------------------------------
     pt_GMTabTokenizer.php 2010-05-25 gm
     Gambio GmbH
     http://www.gambio.de
     Copyright (c) 2010 Gambio GmbH

     Copyright (c) 2012 Avenger, entwicklung@powertemplate.de
     Extend TAB tokenizer to allow smarty-rendering of TAB content.

     Released under the GNU General Public License (Version 2)
     [http://www.gnu.org/licenses/gpl-2.0.html]
     --------------------------------------------------------------

     based on:
     (c) 2000-2001 The Exchange Project  (earlier name of osCommerce)
     (c) 2002-2003 osCommerce(boxes.php,v 1.32 2003/05/27); www.oscommerce.com
     (c) 2003     nextcommerce (boxes.php,v 1.11 2003/08/13); www.nextcommerce.org
     (c) 2003 XT-Commerce - community made shopping http://www.xt-commerce.com ($Id: boxes.php 899 2005-04-29 02:40:57Z hhgag $)

     Released under the GNU General Public License
     ---------------------------------------------------------------------------------------*/

    class pt_GMTabTokenizer extends pt_GMTabTokenizer_parent
    {
      var 
    $content_smarty;

      function 
    pt_GMTabTokenizer($content)
      {
        include_once(
    DIR_WS_CLASSES.'Smarty/plugins/function.eval.php');
        
    $this->content_smarty=new Smarty;
        
    parent::GMTabTokenizer($content);
      }

      function 
    get_prepared_output()
      {
        if(
    sizeof($this->panel_content) > 0)
        {
                for(
    $i=0$i<sizeof($this->panel_content); $i++)
          {
                    
    $panel_content=$this->panel_content[$i];
            if (
    strpos($panel_content,'}')!==false)
            {
              
    $panel_content=smarty_function_eval(array('var'=>$panel_content), $this->content_smarty);
              
    $panel_content_parts=explode('###',$panel_content);
              if (
    count($panel_content_parts)>1)
              {
                
    $this->tab_content[$i]=$panel_content_parts[0];
                
    $panel_content=$panel_content_parts[1];
              }
              
    $this->panel_content[$i]=$panel_content;
            }
                }
        }
        return 
    parent::get_prepared_output();
      }
    }
    ?>
    Mit diesen Modulen habe ich bei einem Artikel folgende TAB-Definition gemacht:

    PHP:
    [TAB:abcde]
    {
    pt_load_cms_data coID=6}
    (Der TAB-Name ist dabei belanglos, er wird durch den Titel der CMS-Seite ersetzt.)

    Damit erhalte ich dann den "Gutscheine"-Tab (coID=6) im Artikel (s. Bild).
     

    Anhänge:

  8. Avenger

    Avenger G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    4.771
    Danke erhalten:
    1.478
    Danke vergeben:
    89
    "{pt_load_cms_data} coID=xxxxx" kann man natürlich auch außerhalb von TABs überall verwenden....
     
  9. Manni_HB

    Manni_HB G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    9.098
    Danke erhalten:
    1.540
    Danke vergeben:
    909
    Ort:
    Bremen
    Eingebaut - getestet - BEGEISTERT =>>> DANKE!!
     
  10. Dennis (MotivMonster.de)

    Dennis (MotivMonster.de) G-WARD 2013/14/15/16

    Registriert seit:
    22. September 2011
    Beiträge:
    30.948
    Danke erhalten:
    6.089
    Danke vergeben:
    1.078
    Beruf:
    Mann für alles :)
    Ort:
    Weilburg
    Vielleicht sollte man auch mal einen Forenbereich für die Erweiterungen machen also neben den Fix Bereich. Damit man das auch alles wiederfindet später.
     
  11. Manni_HB

    Manni_HB G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    9.098
    Danke erhalten:
    1.540
    Danke vergeben:
    909
    Ort:
    Bremen
    Bei Anwendung die Funktion irgendwo im Template wäre es m.E. besser, dass der Titel der Contentseite nicht angezeigt wird.
     
  12. Avenger

    Avenger G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    4.771
    Danke erhalten:
    1.478
    Danke vergeben:
    89
    Ja, hat was für sich.....

    Kann man relativ einfach lösen, indem man dem Plugin einen zusätzlichen Parameter spendiert, um die Titel-Rückgabe zu steuern:

    PHP:
    {pt_load_cms_data coID=1234 set_title=true}
    Das Plugin sieht dann so aus:

    PHP:
    <?php
    /* --------------------------------------------------------------
    function.pt_load_cms_data.php 2011-10-25 Avenger

    Copyright (c) 2012 Avenger, entwicklung@powertemplate.de
    Smarty function to allow inclusion of CMS content into template

    Usage:

    {pt_load_cms_data coID=1234 set_title=true/false}

    with coID equal the group id of the page requested

    --------------------------------------------------------------
    */

    function smarty_function_pt_load_cms_data($params, &$smarty)
    {
      
    $content='';
      
    $coID=$params['coID'];
      if (
    $coID)
      {
        
    $set_title=$params['set_title'];
        if (
    GROUP_CHECK == 'true')
        {
          
    $group_check "AND group_ids LIKE '%c_".$_SESSION['customers_status']['customers_status_id']."_group%'";
        }
        
    $dbQuery "
          SELECT
            content_title,
            content_text,
            content_file,
            gm_link
          FROM
            "
    .TABLE_CONTENT_MANAGER."
          WHERE
            content_group = '"
    .intval($coID)."' AND
            languages_id = '"
    .(int) $_SESSION['languages_id']."'
            "
    .$group_check;
        
    $dbQuery xtDBquery($dbQuery);
        
    $dbQuery xtc_db_fetch_array($dbQuery,true);
        if (
    $dbQuery)
        {
          
    $content_title=trim($dbQuery['content_title']);
          
    $content_file=trim($dbQuery['content_file']);
          if (
    $content_file)
          {
            
    $content_file='media/content/'.$content_file;
            
    $content_file_path=DIR_FS_CATALOG.$content_file;
            
    $have_direct_link=false;
            
    $is_file_content_file=is_file($content_file);
            if (
    $is_file_content_file)
            {
              if (
    strpos($content_file'.php'))
              {
                
    ob_start();
                include(
    $content_file);
                
    $content=ob_end_clean();
              }
              else
              {
                
    $content=file_get_contents($content_file_path);
                
    $is_text_file=strpos($content_file'.txt')!==false;
                if (
    $is_text_file)
                {
                  
    $content="<pre>".$content."</pre>";
                }
              }
            }
          }
          else
          {
            
    $content=$dbQuery['content_text'];
          }
          
    $content_smarty=new Smarty;
          while (
    strpos($content,'{')!==false)
          {
            
    $content=smarty_function_eval(array('var'=>$content), $content_smarty);
          }
        }
      }
      if (
    $set_title)
      {
        
    $content=$content_title.'###'.$content;
      }
      return 
    $content;
    }
    ?>
     
  13. Manni_HB

    Manni_HB G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    9.098
    Danke erhalten:
    1.540
    Danke vergeben:
    909
    Ort:
    Bremen
    Wo Du gerade so schön dabei bist, dann kannste es aber auch zur absoluten Perfektion bringen: KDNr- und/oder zeitabhängige Anzeige!!
    Ich habe sowas seit langem mit dem "Gunnart" Modul in Betrieb - siehe hier...

    Und zwar sehen meine entsprechenden Contentseite so aus:
    Titel: "BlaBlaBla@22126" => Dieser Text wird nur dem KD 22126 angezeigt
    Überschrift: "@date:2011-04-22 00:01|2011-04-26 01:00" ==> Dieser Text erscheint nur vom 22.04.2011 (00:01) bis 26.04.2011 (01:00)

    Damit lassen sich sehr feine Sachen machen! :)
     
  14. Avenger

    Avenger G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    4.771
    Danke erhalten:
    1.478
    Danke vergeben:
    89
    In dem Download-Modul werden keine Titel-Parameter ausgewertet.

    Gibt es da noch was anderes?
     
  15. Manni_HB

    Manni_HB G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    9.098
    Danke erhalten:
    1.540
    Danke vergeben:
    909
    Ort:
    Bremen
    Sorry - hätte erwähnen sollen, dass ich a´bisserl Hand angelegt habe! Siehe Anhang.
     

    Anhänge:

  16. Manni_HB

    Manni_HB G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    9.098
    Danke erhalten:
    1.540
    Danke vergeben:
    909
    Ort:
    Bremen
    Dein "pt_GMTabTokenizer" hat noch ein kleines Prob:
    Bis eben wurde in den Tabs die Filter Values {$VALUE_geeignet} aufgelöst - war glaube ich auch von Dir?!
    Nun nicht mehr!
     
  17. Manni_HB

    Manni_HB G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    9.098
    Danke erhalten:
    1.540
    Danke vergeben:
    909
    Ort:
    Bremen
    Ich habe ich der "...\module\product_info\standard.html" dies:
    Code:
    {if $PRODUCTS_DESCRIPTION !=''}
           {eval var=$PRODUCTS_DESCRIPTION}   
    {/if}
    
    Und wenn ich nun den "pt_GMTabTokenizer" weg lasse - funktioniert alles bestens!?!? <grübel, grübel>
    Außer der Anzeige des Content-Titels! :(
     
  18. Manni_HB

    Manni_HB G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    9.098
    Danke erhalten:
    1.540
    Danke vergeben:
    909
    Ort:
    Bremen
    Hallo Avenger,

    magst Du mal drüber schauen - ich habe es (mit meinen Mitteln!!) jetzt soweit, dass es zeit- und/oder userabhängig funktioniert.
     

    Anhänge:

  19. datenchaos

    datenchaos Erfahrener Benutzer

    Registriert seit:
    13. Oktober 2011
    Beiträge:
    106
    Danke erhalten:
    36
    Danke vergeben:
    6
    WOW, super, hier geht's ja voll ab ;-)
    Das ist echt eine schöne Lösung. Erinnert mich ein wenig an das content_insert Tag von Contao.
    Das wird einiges an Zeit sparen und es gibt sicher eine Menge nette Anwendungsfälle dafür.

    Muss erst noch ein Service Pack einspielen und werde es danach mal testen.

    Vielen Dank!
     
  20. Daniel (Gambio)

    Daniel (Gambio) Erfahrener Benutzer

    Registriert seit:
    8. April 2011
    Beiträge:
    1.901
    Danke erhalten:
    1.620
    Danke vergeben:
    424
    ;-) sind wir gerade dabei, hängt gerade leider etwas bei mir. So ein Thread geht aber in den kommenden Tagen live. Zunächst werden wir dort ausschließlich unsere eigenen Erweiterungen gebündelt und werden dann schauen wie wir auch die von Euch veröffentlichten Erweiterungfen dort unterbringen, ohne dass die Übersichtlichkeit verloren geht.