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: Variablen in shopping_cart auch bei order_details zur Verfügung stellen

    zack

    • Neu im Forum
    • Beiträge: 33
    Ich habe eine Abfrage in der Datei shopping_cart.php erstellt und dort eine Variable erzeugt:
    Code: PHP  [Auswählen]
    if ($XXX > 0){
            $smarty->assign('XYZ', 1);
    }
     
    Die Variable kann ich in der template/.../module/shopping_cart.html weiterverarbeiten. Ich benötige Sie aber in der template/.../module/order_details.html. Wie kann ich die Variable dort abrufen oder übertragen?

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

    hpzeller

    • Experte
    • Beiträge: 4.129
    • Geschlecht:
    Hallo zack,

    vorausgesetzt du hast in der 'shopping_cart.php' diesen Code

    Code: PHP  [Auswählen]
    if ($XXX > 0){
            $smarty->assign('XYZ', 1);
    }
     

    vor dieser Codezeile

    Code: PHP  [Auswählen]
    require (DIR_WS_MODULES.'order_details_cart.php');

    eingefügt, kannst du die Variable in der 'template/.../module/shopping_cart.html' verfügbar machen, in dem du in der 'includes/modules/order_details_cart.php' folgenden Code einfügst.

    Code: PHP  [Auswählen]
    $module_smarty->assign('XYZ', $smarty->getTemplateVars('XYZ'));

    Gruss
    Hanspeter

    zack

    • Neu im Forum
    • Beiträge: 33
    Danke für die schnelle Antwort. Leider kommt aber immer ein weißes Fenster anstatt des Warenkorbs wenn ich den Code in die 'includes/modules/order_details_cart.php' einbaue.
    Ich bin mir auch nicht sicher ob du vielleicht etwas missverstanden hast. Die Variable die ich in der 'shopping_cart.php' erzeuge ist bereits ohne irgendwelche anderen Codes in der 'template/.../module/shopping_cart.html' durch {$XYZ} abzurufen. Ich will es aber auch in der 'template/.../module/order_details.html' abrufen können.

    hpzeller

    • Experte
    • Beiträge: 4.129
    • Geschlecht:
    [...]
    Ich bin mir auch nicht sicher ob du vielleicht etwas missverstanden hast. Die Variable die ich in der 'shopping_cart.php' erzeuge ist bereits ohne irgendwelche anderen Codes in der 'template/.../module/shopping_cart.html' durch {$XYZ} abzurufen. Ich will es aber auch in der 'template/.../module/order_details.html' abrufen können.

    Nein ich habe dich schon richtig verstanden, aber ich habe mit 'template/.../module/shopping_cart.html' versehentlich das falsche Verzeichnis gepostet, ich meinte natürlich dieses Verzeichnis
    'templates/dein_template/module/order_details.html'.

    Anstatt

    Code: PHP  [Auswählen]
    $module_smarty->assign('XYZ', $smarty->getTemplateVars('XYZ'));

    kannst du auch mal diesen code einfügen

    Code: PHP  [Auswählen]
    $module_smarty->assign('XYZ', $smarty->get_template_vars('XYZ'));

    und achte darauf, dass du ihn nach

    Code: PHP  [Auswählen]
    $module_smarty = new Smarty;

    einbaust.

    Ansonsten, im Ordner log nach PHP-Errormeldungen ausschau halten bzw. Error-Reporting einschalten.

    Gruss
    Hanspeter

    zack

    • Neu im Forum
    • Beiträge: 33
    Danke Hanspeter,

    mit dem Code
    Code: PHP  [Auswählen]
    $module_smarty->assign('XYZ', $smarty->get_template_vars('XYZ'));
    funktioniert es.

    Den Code habe ich direkt vor die Zeile
    Code: PHP  [Auswählen]
    $module = $module_smarty->fetch(CURRENT_TEMPLATE.'/module/order_details.html');
    eingesetzt.
    Jetzt kann ich die Variable die ich mit einer Funktion in der shopping_cart.php erzeuge, z.B.
    Code: PHP  [Auswählen]
    if ($XXX > 0){
            $smarty->assign('XYZ', 1);
    }
    require (DIR_WS_MODULES.'order_details_cart.php');
    in der 'template/.../module/order_details.html' abrufen.

    Meine Abfragen und Funktionen sind natürlich komplexer, aber das Prinzip funktioniert.

    Vielen Dank.

    zack

    • Neu im Forum
    • Beiträge: 33
    Ich hatte das Modul "Versandkostenfreie Artikel" umgeschrieben und es auf Artikel zur Selbstabholung angewendet. Hat auch jahrelang funktioniert.
    Leider funktioniert es aber nicht mehr wenn ich auf PHP 8 umstelle. Sieht jemand spontan einen Fehler im folgenden Code der nicht mit PHP 8 konform ist?

    Code aus der shopping_cart.php:
    Code: PHP  [Auswählen]
    // nur selbstabholung - start
    $only_selfpickup_products_query = "SELECT products_id FROM ".TABLE_PRODUCTS." WHERE only_selfpickup ='1';";
    $only_selfpickup_products_query = xtDBquery($only_selfpickup_products_query);
    $onlyself_contents = 0;

    while ($only_selfpickup_products = xtc_db_fetch_array($only_selfpickup_products_query)){
      // prüft ob Artikel mit der Kennzeichnung "nur selbstabholung" im Warenkorb sind
      $products_id_os = $_SESSION['cart']->in_cart_os($only_selfpickup_products['products_id']);
      if ($products_id_os){
        // ... sind welche drin zählt er sie hoch
        $onlyself_contents += $_SESSION['cart']->get_quantity_os($products_id_os);
      }
    }

    // löst aus wenn Artikel mit der Kennzeichnung "nur selbstabholung" im Warenkorb sind
    if ($onlyself_contents > 0){
            $smarty->assign('ONLY_SELFPICKUP', 1);
    }
    require (DIR_WS_MODULES.'order_details_cart.php');
    // nur selbstabholung - end

    Timm

    • Fördermitglied
    • Beiträge: 6.165
    Moin

    Es wäre einfacher, wenn du die dazugehörige Fehlermeldung aus dem log noch postest.

    Gruß Timm

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.741
    • Geschlecht:
    Es sollte mich wundern wenn das mal funktioniert hat.
    Es wird für die Query die gecachte Version benutzt (= xtDBquery()), dann allerdings muß bei
    Code: PHP  [Auswählen]
    xtc_db_fetch_array$(only_selfpickup_products_query, true)

    ein zweiter Parameter, nämlich das true  benutzt werden.

    Außerdem sollte bei Verwendung von $_SESSION['cart']  vorher abgefragt werden ob die Session, hier das shoppingCart-Objekt, auch vorhanden ist.

    Gruß,
    noRiddle

    *NACHTRAG*
    Ich würd's so machen:
    Code: PHP  [Auswählen]
    // nur selbstabholung - start
    $only_selfpickup_products_query = "SELECT products_id FROM ".TABLE_PRODUCTS." WHERE only_selfpickup ='1';";
    $only_selfpickup_products_query = xtDBquery($only_selfpickup_products_query);
    $onlyself_contents = 0;

    if(xtc_db_num_rows($only_selfpickup_products_query, true) > 0) {
      while($only_selfpickup_products = xtc_db_fetch_array($only_selfpickup_products_query, true)) {
        if(isset($_SESSION['cart'])) {
          // prüft ob Artikel mit der Kennzeichnung "nur selbstabholung" im Warenkorb sind
          $products_id_os = $_SESSION['cart']->in_cart_os($only_selfpickup_products['products_id']);
          if($products_id_os === true){
            // ... sind welche drin zählt er sie hoch
            $onlyself_contents += $_SESSION['cart']->get_quantity_os($products_id_os);
          }
        }
      }
    }

    // löst aus wenn Artikel mit der Kennzeichnung "nur selbstabholung" im Warenkorb sind
    if ($onlyself_contents > 0){
            $smarty->assign('ONLY_SELFPICKUP', 1);
    }
    require (DIR_WS_MODULES.'order_details_cart.php');
    // nur selbstabholung - end

    Da ich jedoch nicht weiß, ob der Code noch von anderen Dingen, anderem Code, abhängt, kann ich keine Gewähr geben, daß das so funktioniert.

    Im Übrigen hoffe ich du hast das Ganze update-sicher gemacht.

    hpzeller

    • Experte
    • Beiträge: 4.129
    • Geschlecht:
    Hallo zack,

    ersetze testweise folgende Codezeile

    Code: PHP  [Auswählen]
      $products_id_os = $_SESSION['cart']->in_cart_os($only_selfpickup_products['products_id']);

    mit dieser

    Code: PHP  [Auswählen]
      $products_id_os = settype($_SESSION['cart']->in_cart_os($only_selfpickup_products['products_id']), "integer");

    und folgende Zeile

    Code: PHP  [Auswählen]
            $onlyself_contents += $_SESSION['cart']->get_quantity_os($products_id_os);

    mit dieser Zeile.

    Code: PHP  [Auswählen]
            $onlyself_contents += settype($_SESSION['cart']->get_quantity_os($products_id_os), "integer");

    Gruss
    Hanspeter

    zack

    • Neu im Forum
    • Beiträge: 33
    Hallo,
    danke an euch. Ich habe mal beide Änderungen getestet. Leider funktioniert es aber dennoch nicht. Wie erwähnt hat es immer funktioniert und funktioniert auch bei XAMPP. Nur auf dem Server wenn ich von PHP 7 auf 8 umstelle funktioniert es nicht.
    Ich habe aber jetzt noch einen Fehler im LOG-File. Er macht jetzt auch eine Funktion in der includes/classes/shopping_cart.php dafür verantwortlich und zwar diese Zeile
    Code: PHP  [Auswählen]
    while (list ($products_id,) = each($this->contents)) {

    Hier noch die gesamte Funktion
    Code: PHP  [Auswählen]
    // nur selbstabholung - start
           
            function in_cart_os($p_id) {
        $product_id_list = ', ';
                    if (is_array($this->contents)) {
                            reset($this->contents);
                            while (list ($products_id,) = each($this->contents)) {
                                    $product_id_list = ', '.$products_id.'{';
            $string_needle = ', '.$p_id.'{';
            if (substr_count($product_id_list, $string_needle) != '0'){
              return $products_id;
            }
                            }
                            return false;
                    }  
      }
           
           
           
            function get_quantity_os($p_id) {
             if (is_array($this->contents)) {
                    reset($this->contents);
        if (substr_count($p_id, '{') == '0'){
          return $this->get_quantity($p_id);
        } else {
          $p_quantity = 0;
          $p_root_id = substr($p_id, 0, strpos($p_id, '{')  );
          while (list ($products_id,) = each($this->contents)) {
                                    $product_id_list = ', '.$products_id.'{';
            $string_needle = ', '.$p_root_id.'{';
            if (substr_count($product_id_list, $string_needle) != '0'){
              $p_quantity += $this->get_quantity($products_id);
            }
                            }
          return $p_quantity;
        }
       }
      }

    // nur selbstabholung - end

    hpzeller

    • Experte
    • Beiträge: 4.129
    • Geschlecht:
    Ersetze die monierte Zeile

    Code: PHP  [Auswählen]
                            while (list ($products_id,) = each($this->contents)) {

    mit dieser,

    Code: PHP  [Auswählen]
                            foreach(array_keys($this->contents) as $products_id) {

    oder dieser.

    Code: PHP  [Auswählen]
                            foreach($this->contents as $products_id => $notUsed) {

    Nachtrag: Die erste Option soll laut diesem Beitrag 50% - 60% langsamer sein als die zweite Option.

    Gruss
    Hanspeter

    zack

    • Neu im Forum
    • Beiträge: 33
    Danke Hanspeter,

    du bist echt super. Das war die Lösung. Es funktioniert wieder.
    Es lag nur an der class/shopping_cart.php
    Jetzt tauchen aber noch mehr Fehler auf. Scheinbar ist eines meiner Versandmodule auch nicht kompatibel mit PHP8.
    Vielen Dank für die schnelle Hilfe.
               
    anything