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?
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.
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änder" alt="Kartoffelherkunftslä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é 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änder" alt="Kartoffelherkunftslä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é 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.
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ß
Also mein armer "Auspufffilter" muss echt viel tun und die Parsetime ist davon gänzlich unbeeindruckt!
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.
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 AvengerCopyright (c) 2012 Avenger, entwicklung@powertemplate.deSmarty function to allow inclusion of CMS content into templateUsage:{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).
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.
Bei Anwendung die Funktion irgendwo im Template wäre es m.E. besser, dass der Titel der Contentseite nicht angezeigt wird.
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 AvengerCopyright (c) 2012 Avenger, entwicklung@powertemplate.deSmarty function to allow inclusion of CMS content into templateUsage:{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;}?>
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!
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!
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!
Hallo Avenger, magst Du mal drüber schauen - ich habe es (mit meinen Mitteln!!) jetzt soweit, dass es zeit- und/oder userabhängig funktioniert.
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!
;-) 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.