TAB als Content einbinden

Thema wurde von bazie, 29. März 2015 erstellt.

  1. barbara

    barbara G-WARD 2014-2020

    Registriert seit:
    14. August 2011
    Beiträge:
    33.570
    Danke erhalten:
    10.414
    Danke vergeben:
    1.498
    Werde ich gleich testen.
     
  2. barbara

    barbara G-WARD 2014-2020

    Registriert seit:
    14. August 2011
    Beiträge:
    33.570
    Danke erhalten:
    10.414
    Danke vergeben:
    1.498
    Hallo Till,

    Erst einmal Danke für Deine Unterstützung.

    In meinem Testshop ist der Ordner aber noch da, mit Inhalt.

    Jetzt habe ich die beiden Dateien in GXModules... geladen und die Overload-Datei angepasst.
    Und es kommt die selbe Fehlermeldung wie vorher auch. :(

    Kann es sein, dass das neue System die Datei "function.pt_eval.php" nicht mag?
    Das ist der Inhalt der Datei:
    PHP:
    <?php
    /**
    * Smarty plugin
    * @package Smarty
    * @subpackage plugins
    *
    * Copyright (c) 2015 Avenger, apprentice@gmx.de
    * "eval"-version for Smarty v3
    */


    /**
    * Smarty {eval} function plugin
    *
    * Type:     function<br>
    * Name:     eval<br>
    * Purpose:  evaluate a template variable as a template<br>
    * @link http://smarty.php.net/manual/en/language.function.eval.php {eval}
    *       (Smarty online manual)
    * @author Monte Ohrt <monte at ohrt dot com>
    * @param array
    * @param Smarty
    */
    function smarty_function_pt_eval($params, &$smarty)
    {
      if (!isset(
    $params['var'])) {
        
    $smarty->trigger_error("eval: missing 'var' parameter");
        return;
      }

      if(
    $params['var'] == '') {
        return;
      }
      if (
    method_exists($smarty,'_compile_source'))
      {
        
    $smarty->_compile_source('evaluated template'$params['var'], $_var_compiled);
        
    ob_start();
        
    $smarty->_eval('?>' $_var_compiled);
        
    $_contents ob_get_contents();
        
    ob_end_clean();

      }
      else
      {
        
    $_template = new Smarty_Internal_Template('eval:'.$params['var'], $smarty$smarty);
        
    $_contents=$_template->fetch();
      }

      if (!empty(
    $params['assign'])) {
        
    $smarty->assign($params['assign'], $_contents);
      } else {
        return 
    $_contents;
      }
    }

    /* vim: set expandtab: */

    ?>
     
  3. Anonymous

    Anonymous Administrator
    Mitarbeiter

    Registriert seit:
    26. April 2011
    Beiträge:
    1.018
    Danke erhalten:
    791
    Danke vergeben:
    198
    @barbara Der gesamte Ordner /includes/classes/smarty/ muss weg. Das gibt nur Probleme. Alle zusätzlichen Dateien die nicht zum Standard Smarty gehören und von uns ausgeliefert werden, sind nach /GXMainComponents/SmartyPlugins und /templates/Honeygrid/smarty/ gewandert, hier bitte keine Dateien ablegen. Wenn du im Ordner /includes/classes/smarty/plugins noch Dateien hast die mit pt_ anfangen, dann sollten die in GXModules verschoben werden. Cache leeren nicht vergessen, neue Smarty Plugins werden nur geladen, wenn diese in den genannten Ordnern liegen.

    Was für eine Overloaddatei hasst du denn noch, die angepasst werden musste? Es reicht norma aus die Plugins in den Ordner zu legen und dann kann direkt im Template mit der Funktion gearbeitet werden.
     
  4. barbara

    barbara G-WARD 2014-2020

    Registriert seit:
    14. August 2011
    Beiträge:
    33.570
    Danke erhalten:
    10.414
    Danke vergeben:
    1.498
    Hallo Till,

    Die o.g. Datei "function.pt_eval.php" wird direkt aufgerufen.

    die Overload-Datei ist
    GXUserComponents/ overloads/ GMTabTokenizer/ pt_cms_GMTabTokenizer.php
    mit diesem Inhalt:
    PHP:
    <?php
    /* --------------------------------------------------------------
    pt_cms_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_cms_GMTabTokenizer extends pt_cms_GMTabTokenizer_parent
    {
      var 
    $content_smarty;

      function 
    __construct($content)
      {
        if (!
    function_exists('smarty_function_pt_eval'))
        {
          include_once(
    'GXModules/BIS/ContentTab/SmartyPlugins/function.pt_eval.php');
        }
        
    $this->content_smarty=new Smarty;
        
    $tab_id='[TAB:';
        
    $pos=stripos(substr(strip_tags($content),0,30),$tab_id);
        if (
    $pos===false)
        {
          if (
    defined('TEXT_TABS_DESCRIPTION'))
          {
            
    $text_tabs_description=TEXT_TABS_DESCRIPTION;
          }
          else
          {
            
    $lang_file=get_usermod('lang/' $_SESSION['language'] . '/user_sections/product_info.lang.inc.php');
            include(
    DIR_FS_CATALOG.$lang_file);
            
    $text_tabs_description=$t_language_text_section_content_array['text_tabs_description'];
          }
          if (
    $text_tabs_description)
          {
            
    $content=$tab_id.$text_tabs_description.']'.PHP_EOL.$content;
          }
        }
        
    parent::__construct($content);
      }

      function 
    tokenize()
      {
        global 
    $product;

        if (
    $this->is_datasheet || $product->is_bundle_product)
        {
          return 
    0;
        }
        else
        {
          return 
    parent::tokenize();
        }
      }

      function 
    get_prepared_output()
      {
        
    $panel_content_local=$this->panel_content;
        
    $panel_content_size=sizeof($panel_content_local);
        if (
    $panel_content_size 0)
        {
          for(
    $i=0$i<$panel_content_size$i++)
          {
            
    $panel_content=$panel_content_local[$i];
            if (
    preg_match('#\{(.+)\}#',$panel_content,$matches)) //Any Smarty-tags in content?
            
    {
              
    //If yes, evaluate content with smarty
              
    $panel_content=smarty_function_pt_eval(array('var'=>$panel_content), $this->content_smarty);
              if (
    $panel_content)
              {
                
    $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];
                }
                
    $panel_content_local[$i]=$panel_content;
              }
            }
          }
          
    //Eliminate empty tabs...
          
    $tab_content_local=$this->tab_content;
          
    $this->tab_content=$this->panel_content=array();
          for (
    $i=0$i<$panel_content_size$i++)
          {
            
    $panel_content=$panel_content_local[$i];
            
    //if (trim(strip_tags($panel_content)))
            
    if (trim($panel_content))
            {
              
    $this->panel_content[]=$panel_content;
              
    $this->tab_content[]=$tab_content_local[$i];
            }
          }
        }
        if (
    sizeof($this->tab_content) > 0)
        {
          if (
    IS_SMART_PHONE)
          {
            
    $out=parent::get_prepared_output();
            
    //ui-collapsible-heading ui-collapsible-heading-collapsed
          
    }
          else
          {
            
    $tab_out '';
            
    $start_panel=-1;
            for(
    $i=0$i<sizeof($this->tab_content); $i++)
            {
              if (
    trim($this->panel_content[$i]))
              {
                
    $class 'ui-tabs';
                if (
    $start_panel<0)
                {
                  
    $start_panel=$i;
                  
    $class .= ' ui-tabs-selected';
                }
                
    $class =' class="'.$class.'"';
                
    //Avenger
                
    $s=strip_tags($this->tab_content[$i]);
                
    $tab_out  .= '
                <li id="tab_'
    .$i.'"'.$class.' rel="'.strtolower(xtc_cleanName($s)).'"><span>'.$s.'</span></li>'."\n";
                
    //Avenger
              
    }
            }
            if (
    $tab_out )
            {
              
    $out  '
              <div id="pt_tabbed_description_part">
                <ul class="ui-tabs-nav" style="overflow:hidden">'
    ."\n".
                  
    $tab_out  '
                </ul>'
    ."\n";
            }
            
    //Avenger
            
    $panel_out '';
            
    //Avenger
            
    for($i=0$i<sizeof($this->panel_content); $i++)
            {
              
    $class 'ui-tabs-panel';
              if (
    $i>$start_panel)
              {
                
    $class .= ' ui-tabs-hide';
              }
              
    $class ='class="'.$class.'"';
              
    $s=strip_tags($this->tab_content[$i]);
              
    $panel_out .= '
              <div '
    .$class.' id="panel_'.$i.'" rel="'.strtolower(xtc_cleanName($s)).'">'.$this->panel_content[$i].'</div>'."\n";
            }
            
    //Avenger
            //debugbreak();
            
    if ($panel_out)
            {
              
    $out.='
              <div class="ui-tabs-panel_header"></div>
                <div id="ui-tabs-panel_frame">'
                  
    .$panel_out '
                </div>
              <div class="ui-tabs-panel_footer"></div>'
    ;
            }
            
    $out.='
            </div>

            <script type="text/javascript">
            var start_panel="'
    .$start_panel.'";

            $(document).ready(function(){
              var tabs=$("#pt_tabbed_description_part li.ui-tabs");

              if (tabs.length > 1)
              {
                var open_panel=$("#panel_"+start_panel),open_tab=$("#tab_"+start_panel),this_panel,this_tab,id;

                tabs.click(function(){
                  this_tab=$(this);
                  if (this_tab.attr("id") != open_tab.attr("id"))
                  {
                    open_tab.removeClass("ui-tabs-selected");
                    open_tab=this_tab;
                    open_tab.addClass("ui-tabs-selected");
                    id=$(this).attr("id");
                    id=id.split("_");
                    id=id[1];
                    this_panel=$("#panel_"+id);
                    $(this)
                    this_panel.show();
                    open_panel.hide();
                    open_panel=this_panel;
                    open_panel.parents("#ui-tabs-panel_frame").attr("class",open_panel.attr("rel"));
                  }
                });
              }
            });
            </script>'
    ;
          }
        }
        else
        {
          
    $out=$this->input_content;
        }
        return 
    $out;
      }
    }
    ?>
    Die rote Zeile habe ich geändert, die war im Original:
    include_once(DIR_WS_CLASSES.'Smarty/plugins/function.pt_eval.php');

    Ich habe übrigens nicht extra stehen lassen, das wurde nur nciht vom Updater gelöscht.
    Da ist auch noch ein Order "CssMin" im Verzeichnis, der gehört da auch nicht hin, glaube ich.
     
  5. Sergej (Gambio)

    Sergej (Gambio) Erfahrener Benutzer
    Mitarbeiter

    Registriert seit:
    1. August 2016
    Beiträge:
    269
    Danke erhalten:
    129
    Danke vergeben:
    43
    #25 Sergej (Gambio), 20. Dezember 2017
    Zuletzt bearbeitet: 20. Dezember 2017
    Darf ich fragen, was genau das Ziel sein soll? :)
     
  6. barbara

    barbara G-WARD 2014-2020

    Registriert seit:
    14. August 2011
    Beiträge:
    33.570
    Danke erhalten:
    10.414
    Danke vergeben:
    1.498
    Wenn man in mehreren Artikel immer die gleichen Informationen als Tab anzeigen lassen möchte, müsste man die in jedem Artikel einzeln einfügen. Ändert sich etwas, müsste man jeden Artikel einzeln bearbeiten.
    Mit dem Teil kann man die Information im Content-Manager schreiben und die Content-ID im Tab eintragen.
    Man hat den Text nur an einer Stelle und es lässt sich einfach einfügen. (zumindest bisher)

    Die ursprüngliche Anleitung dazu ist hier:
    https://www.gambio.de/forum/threads/content-als-tab-in-artikeldetails.10062/
     
  7. Sergej (Gambio)

    Sergej (Gambio) Erfahrener Benutzer
    Mitarbeiter

    Registriert seit:
    1. August 2016
    Beiträge:
    269
    Danke erhalten:
    129
    Danke vergeben:
    43
    Okay, aber wozu eine neu smarty-Funktion?
    Wäre es nicht einfacher in deinem Overload "pt_cms_GMTabTokenizer.php" (wobei hier das .inc fehlt) direkt den Inhalt aus dem Content-Manager hinten anzufügen?
     
  8. barbara

    barbara G-WARD 2014-2020

    Registriert seit:
    14. August 2011
    Beiträge:
    33.570
    Danke erhalten:
    10.414
    Danke vergeben:
    1.498
    #28 barbara, 21. Dezember 2017
    Zuletzt bearbeitet: 6. März 2019
    Angenommen Du Hast Stoff.
    Dann musst Du Pflegehinweise bei den Artikeln einfügen.
    Für reine Baumwolle hast Du die Hinweise in Content 123, Für 80% Baumwolle und 20% irgendetwas steht der Text in Content 124....
    In den Artikeln trägst Du jetzt einfach die passende Co-Id ein.
    Damit bist Du flexibel und kannst die Texte einfach im Content-Manager verwalten.

    Bist Du sicher? Die originale Datei heißt "GMTabTokenizer.php", hat also auch kein "inc" und bis Version 3.6 hat das funktioniert. :)
     
  9. Sergej (Gambio)

    Sergej (Gambio) Erfahrener Benutzer
    Mitarbeiter

    Registriert seit:
    1. August 2016
    Beiträge:
    269
    Danke erhalten:
    129
    Danke vergeben:
    43
    Das ist mir soweit bewusst, was ich nicht nachvollziehen kann, wozu hier mit einer smarty-Funktion hantiert wird.

    Unter Artikel bearbeiten ein, zwei, drei, etc. neue Felder mit dem entsprechenden Co-Id hinzufügen.
    Im TabTokenizer liest man nun durch einen Overload die Felder aus, holt sich den Inhalt aus dem entsprechenden Content und klatsch es hinten an, fertig ist das updatesichere Kunststück ohne den Schnick-Schnack einer smarty-Funktion :)
     
  10. barbara

    barbara G-WARD 2014-2020

    Registriert seit:
    14. August 2011
    Beiträge:
    33.570
    Danke erhalten:
    10.414
    Danke vergeben:
    1.498
    Als Nicht-Programmierer freut man sich, wenn man eine Anleitung findet und nimmt die.
    Da fragt man nicht ob das auch anders geht :D

    Die Anleitung stammt noch aus GX 2.0-Zeiten. da war das mit Smarty vielleicht der beste Weg.
     
  11. Anonymous

    Anonymous Administrator
    Mitarbeiter

    Registriert seit:
    26. April 2011
    Beiträge:
    1.018
    Danke erhalten:
    791
    Danke vergeben:
    198
    Es geht hier um eine alte Integration, die aus einer älteren Shopversion übernommen werden muss. Hier sollte es wenn möglich ohne Anpassungen am Artikel gehen. Eine Neuentwicklung wie Sergej vorschlägt ist auch möglich, aber dann müssten alle Artikel neu überarbeitet werden.

    @barbara Wenn du mir mal ein Paket zusammenbastelst, prüfe ich das mal in meinen Shop ob da eventuell nur eine Kleinigkeit fehlt. So kann ich das schneller sehen wo es hakt.
     
  12. barbara

    barbara G-WARD 2014-2020

    Registriert seit:
    14. August 2011
    Beiträge:
    33.570
    Danke erhalten:
    10.414
    Danke vergeben:
    1.498
    Ich habe die drei Dateien zusammen gepackt.
    Die originale Overload-Datei ist als .bak mit im Paket.
     

    Anhänge:

  13. Anonymous

    Anonymous Beta-Held

    Registriert seit:
    22. März 2015
    Beiträge:
    2.381
    Danke erhalten:
    640
    Danke vergeben:
    412
    Es wäre natürlich schön wenn das auch einfacher geht. Aber wie Barbara schon sagt als Nicht-Programmierer verwendet man was da ist.
     
  14. Anonymous

    Anonymous Administrator
    Mitarbeiter

    Registriert seit:
    26. April 2011
    Beiträge:
    1.018
    Danke erhalten:
    791
    Danke vergeben:
    198
    Ich hab mir das ganze mal angeschaut und es ist leider mit der aktuellen Implementierung nicht möglich das ganze in der neuen Shopversion zum Laufen zu bringen. Da es interne Smarty Funktionen nutzt, die in der neuen Smarty3 Version anders behandelt werden müssen. Hier muss das ganze leider für die neue Version umgeschrieben werden.

    Wenn ich Zeit habe werde ich das mal versuchen an die neue Version anzupassen. Ich kann aber nicht versprechen, dass es ohne Anpassungen an den Artikel funktioniert.
     
  15. barbara

    barbara G-WARD 2014-2020

    Registriert seit:
    14. August 2011
    Beiträge:
    33.570
    Danke erhalten:
    10.414
    Danke vergeben:
    1.498
    Hallo Till,

    das wäre ganz lieb von Dir, wenn Du das hinbekommen würdest.
    Was ich nicht so ganz verstehe, wenn es an Smarty3 liegt, warum ging das bis Shop-Version 3.6?

    Im Artikel wird es einfach mit
    {pt_load_cms_data coID=6}
    aufgerufen.
    Könnte man das bei einer Änderung mit einem SQL-Befehl lösen?
     
  16. Anonymous

    Anonymous Administrator
    Mitarbeiter

    Registriert seit:
    26. April 2011
    Beiträge:
    1.018
    Danke erhalten:
    791
    Danke vergeben:
    198
    @barbara Wir haben mit 3.7 auf die allerneuste Smarty Version gesetzt um die Blöcke nutzen zu können, das was in der alten Smarty Version noch ging geht mit der neuen nicht mehr. Da müssen andere Funktionen genutzt werden. Da ist es einfacher man schreibt das komplett neu ohne umständliche Smarty Funktionen, dann sollte das auch in Zukunft wenn sich Smarty wieder ändert weiterhin funktionieren.

    Ja, man kann das mit SQL lösen, wenn wir eine neue Methode zum Einbinden haben, dann braucht man im Artikel nur noch eine Zuweisung zum Content. Das kann dann ein anderer Wert sein und muss nicht unbedingt über {pt_load_cms_data coID=6} laufen.
     
  17. barbara

    barbara G-WARD 2014-2020

    Registriert seit:
    14. August 2011
    Beiträge:
    33.570
    Danke erhalten:
    10.414
    Danke vergeben:
    1.498
    Noch eine Frage dazu, die mir mal gestellt wurde:
    Besteht eigentlich die Möglichkeit, dass man erst einen Text einträgt und dann darunter die Content-Seite ausgibt?
    Bisher konnte man nur entweder einen eingetragenen Text, oder die Seite des Content-Managers anzeigen lassen.
     
  18. Anonymous

    Anonymous Administrator
    Mitarbeiter

    Registriert seit:
    26. April 2011
    Beiträge:
    1.018
    Danke erhalten:
    791
    Danke vergeben:
    198
    @barbara Wenn du das benötigst kann man das bei der Neuentwicklung berücksichtigen. Man könnte z.B. ein Platzhalter einbauen, wo der Text aus dem Content stehen soll, sodass der gesamte andere Text darum auch mit ausgegeben wird.
     
  19. Anonymous

    Anonymous Beta-Held

    Registriert seit:
    22. März 2015
    Beiträge:
    2.381
    Danke erhalten:
    640
    Danke vergeben:
    412
    Den Wunsch von Barbara fände ich auch Cool.
     
  20. barbara

    barbara G-WARD 2014-2020

    Registriert seit:
    14. August 2011
    Beiträge:
    33.570
    Danke erhalten:
    10.414
    Danke vergeben:
    1.498
    Ich könnte das durchaus gut gebrauchen :D,
    aber die Frage hat mir jemand gestellt, bei dem ich das Teil von Avenger installiert habe.
    Das wurde das "notgedrungen" in 2 Tabs gelöst.