Neuigkeiten
  • Die modified eCommerce Shopsoftware ist kostenlos, aber nicht umsonst.
    Spenden
  • Damit wir die modified eCommerce Shopsoftware auch zukünftig kostenlos anbieten können:
    Spenden
  • Thema: Smarty3 und php Tags

    voodoopupp

    • Fördermitglied
    • Beiträge: 1.869
    • Geschlecht:
    Smarty3 und php Tags
    am: 19. April 2016, 21:13:20
    Hi,

    ich würde gerne mal wissen, wie man in smarty 3 {php} Tags verwenden kann. Nein, korrekterweise würde ich eigentlich wissen wollen, wie man bestimmte Altlasten in Smarty 3 korrekt einsetzen sollte.

    Primär geht es um die Einbindung von Boxen an beliebigen Stellen, was vorher durch sowas möglich war:

    Code: PHP  [Auswählen]
    {php} global $smarty; echo $smarty->_tpl_vars['box_IMAGESLIDER']; {/php}

    Doch die {php} Tags sind in Smarty 3 deprecated und führen zu einem Fehler.

    Wie also sollte man das nun umsetzen?

    Hat da jemand schon eine Idee? Denn nur über die index.html lässt es sich ja nur bedingt IN einer Datei positionieren...

    Grüße
    Dominik

    Linkback: https://www.modified-shop.org/forum/index.php?topic=34834.0

    Tomcraft

    • modified Team
    • Gravatar
    • Beiträge: 46.370
    • Geschlecht:
    Re: Smarty3 und php Tags
    Antwort #1 am: 19. April 2016, 22:37:59
    Teste mal folgendes:

    Code: PHP  [Auswählen]
    {php} global $smarty; echo $template->getVariable('box_IMAGESLIDER'); {/php}

    Grüße

    Torsten

    burrito

    • Viel Schreiber
    • Beiträge: 535
    • Geschlecht:
    Re: Smarty3 und php Tags
    Antwort #2 am: 19. April 2016, 22:57:57
    Na ja, laut Smarty.net soll man ja auf die PHP-Tags verzichten.

    Entweder Du aktivierst sie wieder (obwohl man sie ja nicht mehr haben will) mit:

    Code: PHP  [Auswählen]
    $smarty->allow_php_tag = true

    oder (das finde ich besser) Du bindest den PHP-Code im Template über eine extra Datei ein:

    Code: PHP  [Auswählen]
    {include file=”php:foo.php”}

    Beide Quellen findest Du hier: Neue Features in Smarty 3

    Viel Erfolg

    burrito

    voodoopupp

    • Fördermitglied
    • Beiträge: 1.869
    • Geschlecht:
    Re: Smarty3 und php Tags
    Antwort #3 am: 20. April 2016, 09:27:12
    Teste mal folgendes:

    Code: PHP  [Auswählen]
    {php} global $smarty; echo $template->getVariable('box_IMAGESLIDER'); {/php}

    Grüße

    Torsten

    also grundsätzlich erhalte ich dann im log-Ordner folgenden Error:

    Code: PHP  [Auswählen]
    UNDEFINED_ERROR : LoggingManager: Syntax error in template ".../module/main_content.html"  on line 6 "{php} global $smarty; echo $template->getVariable('box_IMAGESLIDER'); {/php}" unknown tag "php" in File: .../includes/external/smarty/smarty_3/sysplugins/smarty_internal_templatecompilerbase.php on Line: 6

    Ist aber egal, ob ich den von mir genannten oder deinen Vorschlag nutze -> da beides eben die php-Tags verwendet.



    [...]
    oder (das finde ich besser) Du bindest den PHP-Code im Template über eine extra Datei ein:

    Code: PHP  [Auswählen]
    {include file=”php:foo.php”}
    [...]

    Nur wenn man eine Box einbinden möchte, wie genau müsste ich denn nun da vorgehen? Denn es gibt ja in source/boxes/ die entsprechende php-Datei der Box und in template/boxes die html-Datei?

    Grrüße
    Dominik

    hpzeller

    • Experte
    • Beiträge: 4.129
    • Geschlecht:
    Re: Smarty3 und php Tags
    Antwort #4 am: 20. April 2016, 11:09:37
    Hallo Dominik

    Dieser Anweisung folgend http://www.smarty.net/docs/en/language.function.php.tpl hier ein Vorschlag:

    Erstelle folgende Skriptdatei '/includes/external/smarty/smarty_3/plugins/function.get_tpl_var.php'

    mit diesem Inhalt

    Code: PHP  [Auswählen]
    <?php
    /**
     * Smarty plugin
     * @package Smarty
     * @subpackage plugins
     */



    /**
     * Smarty {get_tpl_var} function plugin
     */

    function smarty_function_get_tpl_var($params, $template)
    {
        global $smarty;
        if($params['var'] == '') {
            return;
        }

        return $smarty->getTemplateVars($params['var']);
    }
    ?>
     

    danach sollte deine Box mit folgendem Code im Template 'tpl_modified' angezeigt werden.

    Code: XML  [Auswählen]
    {get_tpl_var var="box_IMAGESLIDER"}

    Gruss
    Hanspeter

    hpzeller

    • Experte
    • Beiträge: 4.129
    • Geschlecht:
    Re: Smarty3 und php Tags
    Antwort #5 am: 20. April 2016, 13:25:13
    Nachtrag:

    Es ist wohl besser das Plugin 'function.get_tpl_var.php' in dieses Verzeichnis '/templates/tpl_modified/smarty/ zu legen, damit ist es dann speziell dem 'tpl_modified' Template zugeordnet und würde bei einem etwaigen Update von Smarty auch erhalten bleiben.

    Gruss
    Hanspeter

    voodoopupp

    • Fördermitglied
    • Beiträge: 1.869
    • Geschlecht:
    Re: Smarty3 und php Tags
    Antwort #6 am: 20. April 2016, 15:12:16
    Hallo Hanspeter,

    danke für die Hilfe. Hat soweit alles geklappt. Nun ist dieser Fehler schonmal weg und es kann weitergehen :D

    Ist schon etwas mühsam, alles umzustellen, aber mei, muss man halt mal machen :)

    Hatte es vorher schon in den template-eigenen Smarty Ordner gelegt, da es dort ja mehr Sinn macht ;)

    Grüße
    Dominik

    voodoopupp

    • Fördermitglied
    • Beiträge: 1.869
    • Geschlecht:
    Re: Smarty3 und php Tags
    Antwort #7 am: 20. April 2016, 15:55:24
    Jetzt wird es doch noch mal interessant: gibt es auch eine Möglichkeit das so abzubilden, dass es sowohl unter smarty 2 als auch unter smarty 3 läuft?

    Denn mit der aktuellen Anpassung geht zwar smarty 3, aber sobald man umschaltet, bekommt man dann diesen Error:

    Code: PHP  [Auswählen]
    [20-04-2016 15:52:51] E_ERROR   : LoggingManager: Call to undefined method Smarty::getTemplateVars() in File: .../templates/meintemplate/smarty/function.get_tpl_var.php on Line: 19

    Grüße
    Dominik

    hpzeller

    • Experte
    • Beiträge: 4.129
    • Geschlecht:
    Re: Smarty3 und php Tags
    Antwort #8 am: 20. April 2016, 18:31:21
    [...]
    Denn mit der aktuellen Anpassung geht zwar smarty 3, aber sobald man umschaltet, bekommt man dann diesen Error:

    Code: PHP  [Auswählen]
    [20-04-2016 15:52:51] E_ERROR   : LoggingManager: Call to undefined method Smarty::getTemplateVars() in File: .../templates/meintemplate/smarty/function.get_tpl_var.php on Line: 19
    [...]

    Versuche folgendes, ersetze diesen Code

    Code: PHP  [Auswählen]
    return $smarty->getTemplateVars($params['var']);

    mit diesem

    Code: PHP  [Auswählen]
    return function_exists(getTemplateVars) ? $smarty->getTemplateVars($params['var']) : $smarty->get_template_vars($params['var']);

    oder diesem

    Code: PHP  [Auswählen]
    return method_exists($template, getTemplateVars) ? $smarty->getTemplateVars($params['var']) : $smarty->get_template_vars($params['var']);

    Gruss
    Hanspeter

    voodoopupp

    • Fördermitglied
    • Beiträge: 1.869
    • Geschlecht:
    Re: Smarty3 und php Tags
    Antwort #9 am: 20. April 2016, 21:10:05
    Hallo Hanspeter,

    vielen Dank für die Hilfe! Beide Versionen funktionieren sowohl auf smarty 2 als auch smarty 3 - ganz toll!

    Jetzt stellt sich mir nur die Frage, welche Lösung die bessere ist? Und warum?

    Ach ja, um die Notices nicht zu erhalten, sollte es doch dann statt
    Code: PHP  [Auswählen]
    return function_exists(getTemplateVars)
    so sein
    Code: PHP  [Auswählen]
    return function_exists('getTemplateVars')

    bzw. statt
    Code: PHP  [Auswählen]
    return method_exists($template, getTemplateVars)
    so
    Code: PHP  [Auswählen]
    return method_exists($template, 'getTemplateVars')

    Grüße
    Dominik

    hpzeller

    • Experte
    • Beiträge: 4.129
    • Geschlecht:
    Re: Smarty3 und php Tags
    Antwort #10 am: 20. April 2016, 21:46:01
    Hallo Dominik,

    gut das du den Fehler mit den Anführungszeichen noch gesehen und korrigiert hast, nun zur Frage welche Code-Variante ist besser, darüber kann ich auch nur spekulieren, also ich denke das die Variante 'method_exists()' schneller ist als 'function_exists()', da man ja dieser Funktion ausser der gesuchten Methode auch noch das Objekt übergeben muss innerhalb dem gesucht werden soll, also die Suche einschränkt, während dem die Funktion 'function_exists()' im gesamten geladenen PHP-Code sucht.

    Gruss
    Hanspeter

    Tomcraft

    • modified Team
    • Gravatar
    • Beiträge: 46.370
    • Geschlecht:
    Re: Smarty3 und php Tags
    Antwort #11 am: 20. April 2016, 21:53:28
    Ich könnte ja nun noch die Funktion "is_callable" in den Raum werfen. :-D

    Sollte dann so sein:

    Code: PHP  [Auswählen]
    $methodVariable = array($template, 'getTemplateVars');
    return is_callable(&$methodVariable) ? $smarty->getTemplateVars($params['var']) : $smarty->get_template_vars($params['var']);

    :crazy:

    Grüße

    Torsten

    karsta.de

    • Experte
    • Beiträge: 3.157
    Re: Smarty3 und php Tags
    Antwort #12 am: 21. April 2016, 08:46:09
    Finde das alles hier sehr spannend und hilfreich, aber habe ich bei mir noch Fehler und brauche Unterstützung.

    Ich verwende die function.gunnartProductsList.php von gunnart.
    Da hieß es, um die Funktion im Template aufzurufen, müssen folgende Variablen global gemacht werden:
    Code: PHP  [Auswählen]
    {php}
    global $current_category_id, $actual_products_id;
    $this->assign('CatID',$current_category_id);
    $this->assign('ProdID',$actual_products_id);
    {/php}

    Habe es versucht mit euren Anregungen umzusetzen und zwar so:
    Code: PHP  [Auswählen]
    {assign var=CatID value=1  scope=global}
    {assign var=ProdID value=1 scope=global}

    Es wird auch eine Liste an Artikel ausgegeben, jedoch stimmt da was noch nicht, da ich möchte das nur jeweils Artikel einer bestimmten Kategorie gezeigt werden sollen.
    Wo muß ich die Variablen $current_category_id und $actual_products_id eintragen?

    Hatte es so versucht, leider wurde so keine Artikelliste angezeigt:
    Code: PHP  [Auswählen]
    {assign var=CatID value=current_category_id}
    {assign var=ProdID value=actual_products_id}

    hpzeller

    • Experte
    • Beiträge: 4.129
    • Geschlecht:
    Re: Smarty3 und php Tags
    Antwort #13 am: 21. April 2016, 13:45:22
    Hallo kgd

    Dieser Anweisung folgend http://www.smarty.net/docs/en/language.function.php.tpl hier ein Vorschlag:

    Erstelle folgende Skriptdatei '/templates/dein_template/function.set_tpl_var_from_global_scope.php'

    mit diesem Inhalt

    Code: PHP  [Auswählen]
    <?php
    /**
     * Smarty plugin
     */


    /**
     * Smarty {set_tpl_var_from_global_scope} custom function plugin
     */


    function smarty_function_set_tpl_var_from_global_scope($params, $template)
    {

        if (!empty($params['tplVar'] && !empty($GLOBALS[$params['globalVar']])))
            $template->assign($params['tplVar'],$GLOBALS[$params['globalVar']]);
    }
    ?>

    Im Template machst du die Variablen '$current_category_id' und '$actual_products_id' folgendermassen verfügbar

    Code: XML  [Auswählen]
    {set_tpl_var_from_global_scope tplVar="CatID" globalVar="current_category_id"}
    {set_tpl_var_from_global_scope tplVar="ProdID" globalVar="actual_products_id"}

    und so kann man sie dann im selben Template verwenden

    Code: XML  [Auswählen]
    {$CatID}
    {$ProdID}

    Gruss
    Hanspeter

    web0null

    • Experte
    • Beiträge: 1.998
    Re: Smarty3 und php Tags
    Antwort #14 am: 21. April 2016, 14:06:32
    Für einen simplen Test:
    Das ist ein Beispiel für isset() vs. array_key_exists()

    Code: PHP  [Auswählen]
    // ==================================================
    // test daten
    $array['a']['b']['test'] = 'test';
    // test daten
    // ==================================================
    $while = 10000;
    // Test1
    function test1() {
      global $while, $array;
      $t = microtime(true);
      while($i < $while) {
        // test
        isset($array['a']['b']['test']);
        // test
        ++$i;
      }
      return (microtime(true) - $t);
    }
    // Test2
    function test2() {
      global $while, $array;
      $t = microtime(true);
      while($i < $while) {
        // test
        array_key_exists('test', $array['a']['b']);
        // test
        ++$i;
      }
      return (microtime(true) - $t);
    }
    function test_reset() {
      global $array;
      unset($array);
    }
    // ==================================================
    echo('<pre>test1: '.print_r(test1(), true).'</pre>');
    echo('<pre>test2: '.print_r(test2(), true).'</pre>');
    test_reset();
    // ==================================================

    Gruß
    Werbung / Banner buchen
    1 Antworten
    1833 Aufrufe
    03. Mai 2016, 20:16:08 von GTB
    1 Antworten
    2227 Aufrufe
    13. Februar 2018, 11:59:11 von Teratek
    6 Antworten
    3951 Aufrufe
    22. September 2013, 01:00:58 von h-h-h