Overloading von Produktinfos

Thema wurde von Cyrus (LeGong), 21. Oktober 2014 erstellt.

  1. barbara

    barbara G-WARD 2014-2020

    Registriert seit:
    14. August 2011
    Beiträge:
    35.474
    Danke erhalten:
    11.263
    Danke vergeben:
    1.607
    Vielleicht hat Gambio das da vergessen :)
    Ich weiß nur, das ich eine Datei
    user_classes/ overloads/ breadcrumb/ gm_breadcrumb.inc.php habe, die die includes/ classes/ breadcrumb.php überlädt.
    Deshalb gehe ich davon aus, dass das auch mit anderen Dateien aus dem Verzeichnis geht.
     
  2. Cyrus (LeGong)

    Cyrus (LeGong) Erfahrener Benutzer

    Registriert seit:
    21. Dezember 2011
    Beiträge:
    1.434
    Danke erhalten:
    342
    Danke vergeben:
    176
    #42 Cyrus (LeGong), 13. April 2015
    Zuletzt bearbeitet: 15. April 2015
    @Barbara,
    ja, ist es auch überladbar.
    in user_classes/overloads einen Ordner Namens "product" anlegen. Die Screibweise ist WICHTIG! In diesem Verzeichnis eine PHP-Datei mit dem Namen " cp_product.inc.php mit folgendem Inhalt speichern.
    PHP:
    <?php

    class cp_product extends cp_product_parent
    {
        function 
    buildDataArray(&$array$image 'thumbnail')
        {
            global 
    $xtPrice$main;
            
            
    $t_data_array=parent::buildDataArray($array$image);
                    
            
    //Additional info in $t_data_array
        
    $t_data_array['PRODUCTS_INHALT']=$array['products_inhalt'];
        
    //Additional info in $t_data_array

            
    return $t_data_array;
            
    // EOF GM_MOD
        
    }
    }
        
    ?>
    Cache und template_c leeren. Jetzt kann man die Änderung an Frontend sehen.

    Den Code habe ich jetzt geändert, damit es nicht zu Verwirrung führt.
     
  3. barbara

    barbara G-WARD 2014-2020

    Registriert seit:
    14. August 2011
    Beiträge:
    35.474
    Danke erhalten:
    11.263
    Danke vergeben:
    1.607
    Hallo Cyrus,

    habe das gerade in meiner Version 2.2 eingebaut.
    Passt sowohl für die Listen- als auch für die Kachelansicht.

    Für die Kachelansicht muss die Datei
    templates/ EyeCandy/ objects/ product_boxes_list.html
    angepasst werden, die man dann unter templates/ EyeCandy/ objects/ product_boxes_list-USERMOD.html
    speichert.

    Vielen Dank auch, für die Überarbeitung der Anleitung der Extrafelder :)
     
  4. Cyrus (LeGong)

    Cyrus (LeGong) Erfahrener Benutzer

    Registriert seit:
    21. Dezember 2011
    Beiträge:
    1.434
    Danke erhalten:
    342
    Danke vergeben:
    176
    Extra-Felder im Warenkorb

    Um die Extra-Felder auch in Warenkorb zu bekommen, müssen 2 Klassen überladen werden:
    ../includes/classes/shopping_cart.php
    ../system/classes/shopping_cart/OrderDetailsCartContentView.inc.php
    Die Sprachdateien von:
    ../lang/SPRACHE/sections/_samples/order_details.lang.inc.php mit unserem Text erweitert und in Verzeichnis sections gespeichert werden.
    Und nicht zu vergessen, eine HTML-Datei erweitern und in USERMOD speichern.
    ../templates/Eyecandy/modules/order_details.html erweitert und als order_details-USERMOD.html gespeichert werden
    Caches für Seitenausgabe und Modulinformationen leeren und das war es.
     
  5. Avenger

    Avenger G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    4.771
    Danke erhalten:
    1.478
    Danke vergeben:
    89
    Ich will das mal zum Anlass nehmen, darauf hinzuweisen, dass man mit dieser Vorgehensweise (die man leider immer noch sieht) das Potential des Overloadings nur rudimentär ausnutzt...

    Sinn des Overloadings ist es ja, Änderungen/Erweiterungen an bestehenden Klassen/Methoden zu machen, ohne dass man eine Abhängigkeit vom Code der zu überladenden Klasse/Methoden hat.

    Wenn man aber, wie hier, den kompletten Code der Originalmethode nimmt, und diesen ändert, ist man nämlich nicht mehr updatesicher!

    Denn man muss ja bei jedem Update immer prüfen, ob sich der Original-Code der Methode (hier: "buildDataArray") geändert hat, und dieses in seinem Overload-Modul evtl. korrigieren...

    Sinnvoller Weise sollte man das aber wie folgt strukturieren:

    PHP:
    <?php
    class cp_product extends cp_product_parent
    {
      function 
    buildDataArray(&$array$image 'thumbnail')
      {
        global 
    $xtPrice$main;

        
    $t_data_array=parent::buildDataArray($array$image);
        
    /*
        Hier folgt dann der code, den man benötigt, um seine gewünschten Änderungen/Erweiterungen
        in $t_data_array einzubringen
        */
        
    return $t_data_array;
      }
    }
    ?>
    Der Vorteil liegt auf der Hand:

    Was immer auch bei einem Update mit der Original "buildDataArray"-Methode geschieht hat keinen Einfluss auf den Code in meinem Overload-Modul!

    Erst dann ist man wirklich "updatesicher".
     
  6. Cyrus (LeGong)

    Cyrus (LeGong) Erfahrener Benutzer

    Registriert seit:
    21. Dezember 2011
    Beiträge:
    1.434
    Danke erhalten:
    342
    Danke vergeben:
    176
    @Avenger,
    ja, habe ich es mir gedacht, aber meine PHP-Wissen hat dafür nicht gereicht. :)
    Trotzdem muss man die ganze Funktion eingeben, sonst funktioniert es nicht. Also:
    PHP:
    <?php

    class cp_product extends cp_product_parent
    {
        function 
    buildDataArray(&$array$image 'thumbnail')
        {
            global 
    $xtPrice$main;
            
            
    $t_data_array=parent::buildDataArray($array$image);
                    
            
    $tax_rate $xtPrice->TAX[$array['products_tax_class_id']];

            
    $coo_properties_control MainFactory::create_object('PropertiesControl');
            
    $t_combi $coo_properties_control->get_cheapest_combi($array['products_id'], $_SESSION['languages_id']);
            
    $products_price $xtPrice->xtcGetPrice($array['products_id'], true1$array['products_tax_class_id'], $array['products_price'], 10truetrue$t_combi['products_properties_combis_id']);

            if(
    $t_combi != false)
            {
                
    $array['products_vpe_value'] = $t_combi['vpe_value'];
                
    $array['products_vpe'] = $t_combi['products_vpe_id'];
            }

            
    // BOF GM_MOD
            
    $buy_now '';
            
    $gm_buy_now_url '';
            
    $gm_qty '';
            
    $t_qty_array = array();
            
    $gm_buy_now xtc_draw_hidden_field('products_id'$array['products_id'], 'class="gm_products_id"');
            if(
    $_SESSION['customers_status']['customers_status_show_price'] != '0' && $xtPrice->gm_check_price_status($array['products_id']) == 0)
            {
                if(
    $_SESSION['customers_status']['customers_fsk18'] == '1')
                {
                    if(
    $array['products_fsk18'] == '0')
                    {
                        
    $buy_now $this->getBuyNowButton($array['products_id'], $array['products_name']);
                        
    $gm_buy_now_url xtc_href_link(basename($PHP_SELF), 'action=buy_now&BUYproducts_id=' $array['products_id'] . '&' xtc_get_all_get_params(array('action')), 'NONSSL');
                        
    $gm_qty xtc_draw_input_field('products_qty'$this->gm_min_order($array['products_id']), 'size="3" id="gm_attr_calc_qty_' $array['products_id'] . '" onkeyup="gm_calc_prices_listing(\'' $array['products_id'] . '\')"''text'true"gm_listing_form gm_class_input");
                        
    $gm_buy_now .= xtc_image_submit('button_in_cart.gif'IMAGE_BUTTON_IN_CART'class="gm_image_button"');
                        
    $t_qty_array = array('NAME' => 'products_qty',
                            
    'VALUE' => $this->gm_min_order($array['products_id']),
                            
    'SIZE' => '3',
                            
    'ID' => 'gm_attr_calc_qty_' $array['products_id'],
                            
    'ONKEYUP' => 'gm_calc_prices_listing(\'' $array['products_id'] . '\')',
                            
    'CLASS' => 'gm_listing_form gm_class_input',
                            
    'TYPE' => 'text');
                    }
                }
                else
                {
                    
    $buy_now $this->getBuyNowButton($array['products_id'], $array['products_name']);
                    
    $gm_buy_now_url xtc_href_link(basename($PHP_SELF), 'action=buy_now&BUYproducts_id=' $array['products_id'] . '&' xtc_get_all_get_params(array('action')), 'NONSSL');
                    
    $gm_qty xtc_draw_input_field('products_qty'$this->gm_min_order($array['products_id']), 'size="3" id="gm_attr_calc_qty_' $array['products_id'] . '" onkeyup="gm_calc_prices_listing(\'' $array['products_id'] . '\')"''text'true"gm_listing_form gm_class_input");
                    
    $gm_buy_now .= xtc_image_submit('button_in_cart.gif'IMAGE_BUTTON_IN_CART'class="gm_image_button"');
                    
    $t_qty_array = array('NAME' => 'products_qty',
                        
    'VALUE' => $this->gm_min_order($array['products_id']),
                        
    'SIZE' => '3',
                        
    'ID' => 'gm_attr_calc_qty_' $array['products_id'],
                        
    'ONKEYUP' => 'gm_calc_prices_listing(\'' $array['products_id'] . '\')',
                        
    'CLASS' => 'gm_listing_form gm_class_input',
                        
    'TYPE' => 'text');
                }
            }

            
    $t_shipping_status_id $array['products_shippingtime'];
            if(
    $xtPrice->gm_check_price_status($array['products_id']) == || $xtPrice->gm_check_price_status($array['products_id']) == 2)
            {
                if(
    $array['products_price'] > && $xtPrice->gm_check_price_status($array['products_id']) == 2)
                {
                    
    $gm_tax_info $main->getTaxInfo($tax_rate);
                }
                else
                {
                    
    $gm_tax_info '';
                }
                
    $gm_shipping_link '';
                
    $t_shipping_info_link_active '';
                
    $shipping_status_name '';
                
    $shipping_status_image '';
            }
            else
            {
                
    $gm_tax_info $main->getTaxInfo($tax_rate);
                
    $gm_shipping_link $main->getShippingLink(true);

                if(
    ACTIVATE_SHIPPING_STATUS == 'true')
                {
                    
    $shipping_status_name $main->getShippingStatusName($t_shipping_status_id);
                    
    $shipping_status_image $main->getShippingStatusImage($t_shipping_status_id);
                    
    $t_shipping_info_link_active $main->getShippingStatusInfoLinkActive($t_shipping_status_id);
                }
                else
                {
                    
    $shipping_status_name '';
                    
    $shipping_status_image '';
                    
    $t_shipping_info_link_active '';
                }
            }

            if(
    $gmSEOBoost->boost_products)
            {
                
    $gm_product_link xtc_href_link($gmSEOBoost->get_boosted_product_url($array['products_id'], $array['products_name']));
            }
            else
            {
                
    $gm_product_link xtc_href_link(FILENAME_PRODUCT_INFOxtc_product_link($array['products_id'], $array['products_name']));
            }

            
    $gm_products_stock gm_convert_qty(xtc_get_products_stock($array['products_id']), false);

            
    // set image size once a time if !exist
            
    if(isset($array['products_image_w']) && empty($array['products_image_w']) && xtc_not_null($array['products_image']))
            {
                
    $gm_imagesize $this->productImageSize($array['products_id'], $array['products_image']);
                
    $array['products_image_w'] = $gm_imagesize[0];
                
    $array['products_image_h'] = $gm_imagesize[1];
            }

            
    $gm_cat_search '';
            if(isset(
    $_GET['cat']))
            {
                
    $gm_cat_search '&cat=' $_GET['cat'];
            }
            if(isset(
    $_GET['keywords']))
            {
                
    $gm_cat_search '&keywords=' $_GET['keywords'];
                if(isset(
    $_GET['page']))
                {
                    
    $gm_cat_search .= '&page=' $_GET['page'];
                }
            }

            
    $t_form_array = array();
            
    $t_form_array = array('ID' => 'gm_add_to_cart_' $array['products_id'],
                
    'ACTION_URL' => xtc_href_link('index.php''action=buy_now&BUYproducts_id=' $array['products_id'] . $gm_cat_search'NONSSL'truetruetrue),
                
    'METHOD' => 'post',
                
    'ONSUBMIT' => 'return gm_quantity_check_listing(\'' $array['products_id'] . '\')'
            
    );

            
    $t_data_array = array('PRODUCTS_NAME' => htmlspecialchars_wrapper($array['products_name']),
                
    'COUNT' => $array['ID'],
                
    'PRODUCTS_ID' => $array['products_id'],
                
    'PRODUCTS_VPE' => $this->getVPEtext($array$products_price['plain']),
                
    'PRODUCTS_IMAGE' => $this->productImage($array['products_image'], $image),
                
    'PRODUCTS_IMAGE_W' => $array['products_image_w'],
                
    'PRODUCTS_IMAGE_H' => $array['products_image_h'],
                
    'PRODUCTS_IMAGE_WIDTH' => PRODUCT_IMAGE_THUMBNAIL_WIDTH,
                
    'PRODUCTS_IMAGE_PADDING' => ((PRODUCT_IMAGE_THUMBNAIL_HEIGHT 8) - $array['products_image_h']) / 2,
                
    'PRODUCTS_IMAGE_ALT' => $array['gm_alt_text'],
                
    'PRODUCTS_LINK' => $gm_product_link,
                
    'PRODUCTS_PRICE' => $products_price['formated'],
                
    'PRODUCTS_TAX_INFO' => $gm_tax_info,
                
    'PRODUCTS_SHIPPING_LINK' => $gm_shipping_link,
                
    'PRODUCTS_BUTTON_BUY_NOW' => $buy_now,
                
    'GM_PRODUCTS_BUTTON_BUY_NOW_URL' => $gm_buy_now_url,
                
    'GM_PRODUCTS_BUTTON_BUY_NOW' => $gm_buy_now,
                
    'PRODUCTS_SHIPPING_NAME' => $shipping_status_name,
                
    'PRODUCTS_SHIPPING_IMAGE' => $shipping_status_image,
                
    'PRODUCTS_SHIPPING_LINK_ACTIVE' => $t_shipping_info_link_active,
                
    'PRODUCTS_DESCRIPTION' => $array['products_description'],
                
    'PRODUCTS_INHALT' => $array['products_inhalt'],
                
    'PRODUCTS_EXPIRES' => $array['expires_date'],
                
    'PRODUCTS_CATEGORY_URL' => $array['cat_url'],
                
    'PRODUCTS_SHORT_DESCRIPTION' => $array['products_short_description'],
                
    'PRODUCTS_FSK18' => $array['products_fsk18'],
                
    'GM_FORM_ACTION' => xtc_draw_form('gm_add_to_cart_' $array['products_id'], xtc_href_link('index.php''action=buy_now&BUYproducts_id=' $array['products_id'] . $gm_cat_search'NONSSL'truetruetrue), 'post''onsubmit="return gm_quantity_check_listing(\'' $array['products_id'] . '\')"'),
                
    'FORM_DATA' => $t_form_array,
                
    'QTY_DATA' => $t_qty_array,
                
    'GM_FORM_END' => '</form>',
                
    'GM_PRODUCTS_QTY' => $gm_qty,
                
    'GM_PRODUCTS_STOCK' => $gm_products_stock,
                
    'PRODUCTS_META_DESCRIPTION' => $array['products_meta_description'],
                
    'PRODUCTS_WEIGHT' => gm_prepare_number((double)$array['products_weight'], $xtPrice->currencies[$xtPrice->actualCurr]['decimal_point']),
                
    'SHOW_PRODUCTS_WEIGHT' => $array['gm_show_weight']);

            return 
    $t_data_array;
            
    // EOF GM_MOD
        
    }
    }
        
    ?>
    Oder gibt es da auch eine Lösung?:confused:
     
  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
    Was hast Du denn konkret geändert in der Routine?
     
  8. Cyrus (LeGong)

    Cyrus (LeGong) Erfahrener Benutzer

    Registriert seit:
    21. Dezember 2011
    Beiträge:
    1.434
    Danke erhalten:
    342
    Danke vergeben:
    176
    PHP:
    $t_data_array = array('PRODUCTS_NAME' => htmlspecialchars_wrapper($array['products_name']),
    'PRODUCTS_INHALT' => $array['products_inhalt'],
    products_inhalt für Extra-Felder in ArtikelListenAnsicht eingefügt:

    ListenAnsicht.png
     
  9. Avenger

    Avenger G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    4.771
    Danke erhalten:
    1.478
    Danke vergeben:
    89
    Wenn ich das richtig sehe, dann ist nur diese Zeile neu:

    PHP:
    'PRODUCTS_INHALT' => $array['products_inhalt'],
    Dann sollte folgendes Overload-Modul funktionieren:

    PHP:
     <?php
    class cp_product extends cp_product_parent
    {
      function 
    buildDataArray(&$array$image 'thumbnail')
      {
        global 
    $xtPrice$main;

        
    $t_data_array=parent::buildDataArray($array$image);
        
    //Additional info in $t_data_array
        
    $t_data_array['PRODUCTS_INHALT']=$array['products_inhalt'];
        
    //Additional info in $t_data_array
        
    return $t_data_array;
      }
    }
    ?>
     
  10. Cyrus (LeGong)

    Cyrus (LeGong) Erfahrener Benutzer

    Registriert seit:
    21. Dezember 2011
    Beiträge:
    1.434
    Danke erhalten:
    342
    Danke vergeben:
    176
    ja, macht er auch.
    Vielen Dank.
     
  11. Avenger

    Avenger G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    4.771
    Danke erhalten:
    1.478
    Danke vergeben:
    89
    #51 Avenger, 15. April 2015
    Zuletzt bearbeitet: 15. April 2015
    Sieht doch auch viel übersichtlicher aus... :)

    Man muss das Overloading wirklich verinnerlichen, um den bestmöglichen Nutzen daraus zu ziehen.

    Sonst ist das alles vergebene Liebsmüh'.

    Meist kann man das so sauber trennen zwischen der Originalmethode (die durch parent::xxxx einbezogen wird), und den notwendigen Änderungen.

    Vor allen in der Version 2.2.
     
  12. Cyrus (LeGong)

    Cyrus (LeGong) Erfahrener Benutzer

    Registriert seit:
    21. Dezember 2011
    Beiträge:
    1.434
    Danke erhalten:
    342
    Danke vergeben:
    176
    Ja bis man soweit ist.
    Das selbe Problem hat man mit ../system/classes/shopping_cart/OrderDetailsCartContentView.inc.php. Wie kann man:
    PHP:
    'PRODUCTS_INHALT' => $t_products_inhalt,
    in
    PHP:
    $module_content[$i] = array(
                    
    'PRODUCTS_NAME' => $p_products_array[$i]['name'] . $mark_stock,
                    
    'PRODUCTS_QTY' => xtc_draw_input_field('cart_quantity[]'gm_convert_qty($p_products_array[$i]['quantity'], false), ' size="2" onblur="gm_qty_is_changed(' $p_products_array[$i]['quantity'] . ', this.value, \'' GM_QTY_CHANGED_MESSAGE '\')"''text'true"gm_cart_data gm_class_input") . xtc_draw_hidden_field('products_id[]'$p_products_array[$i]['id'], 'class="gm_cart_data"') . xtc_draw_hidden_field('old_qty[]'$p_products_array[$i]['quantity']),
                    
    'PRODUCTS_OLDQTY_INPUT_NAME' => 'old_qty[]',
                    
    'PRODUCTS_QTY_INPUT_NAME' => 'cart_quantity[]',
                    
    'PRODUCTS_QTY_VALUE' => gm_convert_qty($p_products_array[$i]['quantity'], false),
                    
    'PRODUCTS_ID_INPUT_NAME' => 'products_id[]',
                    
    'PRODUCTS_ID_EXTENDED' => $p_products_array[$i]['id'],
                    
    'PRODUCTS_MODEL' => $t_products_model,
                    
    'SHOW_PRODUCTS_MODEL' => SHOW_PRODUCTS_MODEL,
                    
    'PRODUCTS_SHIPPING_TIME' => $t_shipping_time,
                    
    'PRODUCTS_TAX' => (double)$p_products_array[$i]['tax'],
                    
    'PRODUCTS_INHALT' => $t_products_inhalt,
                    
    'PRODUCTS_IMAGE' => $image,
                    
    'IMAGE_ALT' => $p_products_array[$i]['name'],
                    
    'BOX_DELETE' => xtc_draw_checkbox_field('cart_delete[]'$p_products_array[$i]['id'], false'id="gm_delete_product_' $gm_products_id '"'),
                    
    'PRODUCTS_LINK' => $gm_product_link,
                    
    'PRODUCTS_PRICE' => $xtPrice->xtcFormat($p_products_array[$i]['price'] * $p_products_array[$i]['quantity'], true),
                    
    'PRODUCTS_SINGLE_PRICE' => $xtPrice->xtcFormat($p_products_array[$i]['price'], true),
                    
    'PRODUCTS_SHORT_DESCRIPTION' => xtc_get_short_description($p_products_array[$i]['id']),
                    
    'ATTRIBUTES' => '',
                    
    'PROPERTIES' => $t_properties_html,
                    
    'GM_WEIGHT' => $t_products_weight,
                    
    'PRODUCTS_ID' => $gm_products_id,
                    
    'UNIT' => $p_products_array[$i]['unit_name']
                );
    als Erweiterung einbauen, ohne den kompletten Code eingeben zu mussen?
    PHP:
    class mx_OrderDetailsCartContentView extends mx_OrderDetailsCartContentView_parent
    {
        function 
    get_html($p_products_array)
        {
            
    $coo_lang_file_master MainFactory::create_object('LanguageTextManager', array(), true);
            
    $coo_properties_control MainFactory::create_object('PropertiesControl');
            
    $coo_properties_view MainFactory::create_object('PropertiesView');

            
    $module_content = array();

            
    $coo_main = new main();
            
    $xtPrice = new xtcPrice($_SESSION['currency'], $_SESSION['customers_status']['customers_status_id']);
    ...
    ...
    $t_products_model $p_products_array[$i]['model'];
                
                
    // BOF CP
                
    $t_products_inhalt $p_products_array[$i]['inhalt'];
                
    // EOF CP
    ...
    ...
    $module_content[$i] = array(
                    
    'PRODUCTS_NAME' => $p_products_array[$i]['name'] . $mark_stock,
                    
    'PRODUCTS_QTY' => xtc_draw_input_field('cart_quantity[]'gm_convert_qty($p_products_array[$i]['quantity'], false), ' size="2" onblur="gm_qty_is_changed(' $p_products_array[$i]['quantity'] . ', this.value, \'' GM_QTY_CHANGED_MESSAGE '\')"''text'true"gm_cart_data gm_class_input") . xtc_draw_hidden_field('products_id[]'$p_products_array[$i]['id'], 'class="gm_cart_data"') . xtc_draw_hidden_field('old_qty[]'$p_products_array[$i]['quantity']),
                    
    'PRODUCTS_OLDQTY_INPUT_NAME' => 'old_qty[]',
                    
    'PRODUCTS_QTY_INPUT_NAME' => 'cart_quantity[]',
                    
    'PRODUCTS_QTY_VALUE' => gm_convert_qty($p_products_array[$i]['quantity'], false),
                    
    'PRODUCTS_ID_INPUT_NAME' => 'products_id[]',
                    
    'PRODUCTS_ID_EXTENDED' => $p_products_array[$i]['id'],
                    
    'PRODUCTS_MODEL' => $t_products_model,
                    
    'SHOW_PRODUCTS_MODEL' => SHOW_PRODUCTS_MODEL,
                    
    'PRODUCTS_SHIPPING_TIME' => $t_shipping_time,
                    
    'PRODUCTS_TAX' => (double)$p_products_array[$i]['tax'],
                    
    'PRODUCTS_INHALT' => $t_products_inhalt,
    ...
    ...
    ?>
     
  13. 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 ist leider etwas komplizierter, weil Gambio keine Methode vorgesehen hat, mit der man direkt in die Generierung eingreifen könnte.

    Also etwa so:

    wenn nach

    PHP:
    $module_content[$i]['PRODUCTS_VPE_ARRAY'] = get_products_vpe_array($p_products_array[$i]['id'], $p_products_array[$i]['price'], array(), $t_combis_id);
    z.B.

    PHP:
          $module_content[$i]=$this->add_private_module_data($module_content[$i],$p_products_array[$i]);
    vorhanden wäre, dann könnte man sehr einfach in einem Overload die Daten im aktuellen Artikel ändern.

    Aber man kann auch hier etwas tun.

    Allerdings muss man etwas "zaubern", weil diese OrderDetailsCartContentView-Klasse maximal Overload-unfreundlich ist.

    Das Problem ist, dass die "get_html"-Methode direkt das gerenderte HTML liefert, ohne irgendwie eingreifen zu können.

    Auch das in anderen Klassen in "prepare_html" und "build_html" aufgeteilte Verfahren wird hier nicht angewendet.

    Die einzig Overload-fähige Routine dort ist "build_html", so dass ich eigentlich nur dort etwas ändern kann.

    Das ist dann meine Version des Overloads:

    PHP:
    <?php
    class mx_OrderDetailsCartContentView extends mx_OrderDetailsCartContentView_parent
    {
      function 
    get_html($p_products_array)
      {
        
    //Save $p_products_array for build_html
        
    $this->p_products_array=$p_products_array;
        
    parent::get_html($p_products_array);
      }

      function 
    build_html()
      {
        
    //Get $module_content prepared by "get_html" so far
        
    $module_content=$this->get_content_array();
        
    $module_content=$module_content['module_content'];
        
    //Loop over saved products array and add my data to the $module_content entries
        
    foreach ($this->p_products_array as $index=>$product)
        {
          
    $module_content[$index]['PRODUCTS_INHALT']=$product['products_inhalt'];
        }
        
    //Save new $module_content entries
        
    $this->set_content_data('module_content'$module_content);
        return 
    parent::build_html();
      }
    }
    ?>
     
  14. Cyrus (LeGong)

    Cyrus (LeGong) Erfahrener Benutzer

    Registriert seit:
    21. Dezember 2011
    Beiträge:
    1.434
    Danke erhalten:
    342
    Danke vergeben:
    176
    ja, das gibt eine Leere WK zurück. Ich hatte auch mehrere Methoden ausprobiert aber alle mit dem selben Ergebnis. Leere WK.

    leere WK.png
     
  15. Avenger

    Avenger G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    4.771
    Danke erhalten:
    1.478
    Danke vergeben:
    89
    Hast Du das in einem Testshop aktiv?

    Dann könnte ich mal schauen....
     
  16. Cyrus (LeGong)

    Cyrus (LeGong) Erfahrener Benutzer

    Registriert seit:
    21. Dezember 2011
    Beiträge:
    1.434
    Danke erhalten:
    342
    Danke vergeben:
    176
    leider nur local. Ich lade ihn gleich hoch.
     
  17. Avenger

    Avenger G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    4.771
    Danke erhalten:
    1.478
    Danke vergeben:
    89
    #57 Avenger, 16. April 2015
    Zuletzt bearbeitet: 16. April 2015
    Ich habe mir das angesehen, und das Problem gefunden:


    PHP:
    <?php
    class mx_OrderDetailsCartContentView extends mx_OrderDetailsCartContentView_parent
    {
      function 
    get_html($p_products_array)
      {
        
    //Save $p_products_array for build_html
        
    $this->p_products_array=$p_products_array;
        return 
    parent::get_html($p_products_array);
      }

      function 
    build_html()
      {
        
    //Get $module_content prepared by "get_html" so far
        
    $module_content=$this->get_content_array();
        
    $module_content=$module_content['module_content'];
        
    //Loop over saved products array and add my data to the $module_content entries
        
    foreach ($this->p_products_array as $index=>$product)
        {
          
    $module_content[$index]['PRODUCTS_INHALT']=$product['products_inhalt'];
        }
        
    //Save new $module_content entries
        
    $this->set_content_data('module_content'$module_content);
        return 
    parent::build_html();
      }
    }
    ?>
    Vor dem "parent::get_html($p_products_array);" fehlte ein "return", so dass das natürlich leer war...

    Allerdings ist in den getesteten Artikeldaten kein Feld 'products_inhalt' enthalten, so dass da nichts angezeigt wird...

    PHP:
    p_products_array=

    Array
    (
        [
    0] => Array
            (
                [
    id] => 745
                
    [name] => Seer Habeh (eingelegter Knoblauch)
                [
    checkout_information] => Seer Habeh (eingelegter Knoblauch)

    Haltbarkeitca28 Tage

                
    [model] => vs-0175
                
    [image] => 745_0.jpg
                
    [inhalt] => 
                [
    price] => 1.99
                
    [quantity] => 1
                
    [weight] => 0.1000
                
    [shipping_time] => ca3-4 Tage
                
    [final_price] => 1.99
                
    [tax_class_id] => 2
                
    [quantity_unit_id] => 
                [
    unit_name] => 
                [
    attributes] => 
                [
    product_type] => 1
                
    [gm_weight] => 0.1000
            
    )

        [
    1] => Array
            (
                [
    id] => 874
                
    [name] => Oliven Kalamata Pikant
                
    [checkout_information] => 

                [
    model] => vs-0161
                
    [image] => 874_0.jpg
                
    [inhalt] => 
                [
    price] => 1.99
                
    [quantity] => 1
                
    [weight] => 0.1120
                
    [shipping_time] => ca3-4 Tage
                
    [final_price] => 1.99
                
    [tax_class_id] => 2
                
    [quantity_unit_id] => 
                [
    unit_name] => 
                [
    attributes] => 
                [
    product_type] => 1
                
    [gm_weight] => 0.1120
            
    )

    )
    Die Maxime bei Overloads ist also:

    wenn immer irgendwie möglich in einem Overload nicht den kompletten Code der Originalmethode einbinden, weil man sonst nicht mehr updatesicher ist!
     
  18. Avenger

    Avenger G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    4.771
    Danke erhalten:
    1.478
    Danke vergeben:
    89
    Wie dieses Beispiel zeigt, kann man auch in Klassen, die sehr Overload-unfreundlich sind, doch das eine oder andere bewirken, um nicht den kompletten Code der Originalmethode einbinden zu müssen..

    Wenn man die Funktionsweise der Gambio-Klassen versteht... :cool:

    Aber dennoch muss Gambio hier (und an einigen anderen Stellen) dringend nachbessern, um solche Klimmzüge vermeiden zu können.

    Wenn in einem Loop Daten-Arrays aufbereitet werden, muss einfach am Endes des Loops eine Methode verwendet werden, die es erlaubt, in den aktuellen Datensatz eigene Daten einzubringen.

    Wie schon erwähnt könnte das hier so aussehen:

     
  19. Cyrus (LeGong)

    Cyrus (LeGong) Erfahrener Benutzer

    Registriert seit:
    21. Dezember 2011
    Beiträge:
    1.434
    Danke erhalten:
    342
    Danke vergeben:
    176
    @Avenger,
    vielen Dank. Du hast bestimmt dir viel Mühe gegeben, aber trotzdem es Zeigt die Extra-Felder nicht an. Da hatte ich extra bei 2 Artikeln in den Extra-Feldern Abholartikel --> Gewürze -->Arrabiatta und basilikum bei Produkt-Inhalt werte eingegeben. Diese Werte werden aber nicht angezeigt.

    Overload01.png

    Overload02.png

    Bild 1 zeigt den Warenkorb mit deinen Änderungen an.
    Bild 2 zeigt den Warenkorb mit meinen Änderungen an.

    Ja genauso verstehe ich auch das Wort "Overload". Es ist bei manche Klassen und Methoden leicht zu erkennen wo man seine Erweiterung ohne das Original zu nutzen in einer Overload-Datei einbauen muss. Bei Manche Dateien ist es sehr schwer den richtigen Code festzulegen. Allerdings das liegt an mir. Mein Wissen über PHP, die ich vor einige Jahren gelernt hatte ist durch NICHT NUTZUNG verloren gegangen. Ich muss einfach mehr üben.

    Trotzdem möchte ich an diese Stelle mich bei dir für deine Mühe und Achtsamkeit bedanken. Falls du keine Zeit hast den Code zu verbessern ist auch nicht so schlimm. Man ist daran gewohnt bei Updates einige Datein nachträglich von Hand zu ändern. Soweit wie ich gehört und gelesen habe, dieser Aufwand bleibt bei Gambio Software noch im rahmen.
     
  20. Avenger

    Avenger G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    4.771
    Danke erhalten:
    1.478
    Danke vergeben:
    89
    Wo werden denn diese Inhalt-Daten erzeugt?