Kann ich, ähnlich wie bei den Templates, die ganze Seite unter user_classes/overloads/ordner/... abspeichern, oder nur einzelne Codes? Woran sehe ich ob ein Script in user_classes/overloads, oder Extender, oder conf gespeichert werden muss? P.S. sollte es nicht einen Teil 5 geben?
Kann ich die Klasse order_total überladen? Ich habs so probiert aber da kommt ne Fehlermeldung: Fatal error: Cannot redeclare class ot_cod_fee_ORIGIN in /srv/www/01-reifen24.de/htdocs/includes/modules/order_total/ot_cod_fee.php on line 35 PHP: <?phpclass onepage_order_total extends onepage_order_total_parent { var $modules; function order_total_ORIGIN() { if (defined('MODULE_ORDER_TOTAL_INSTALLED') && xtc_not_null(MODULE_ORDER_TOTAL_INSTALLED)) { $this->modules = explode(';', MODULE_ORDER_TOTAL_INSTALLED); $modules = $this->modules; sort($modules); // cgoenner: we need to include the ot_coupon & ot_gv BEFORE ot_tax reset($modules); while (list (, $value) = each($modules)) { include_once (DIR_WS_LANGUAGES.$_SESSION['language'].'/modules/order_total/'.$value); include_once (DIR_WS_MODULES.'order_total/'.$value); $class = substr($value, 0, strrpos($value, '.')); $GLOBALS[$class] = new $class (); } unset($modules); } }}?> ich will das: include (DIR_WS_LANGUAGES.$_SESSION['language'].'/modules/order_total/'.$value); include (DIR_WS_MODULES.'order_total/'.$value); in das updatessicher machen: include_once (DIR_WS_LANGUAGES.$_SESSION['language'].'/modules/order_total/'.$value); include_once (DIR_WS_MODULES.'order_total/'.$value);
Sicher dat.... Das ist eigentlich schon updatesicher.... Warum also das überladen? Es gibt aber definitiv ein Problem: PHP: function order_total_ORIGIN() ist natürlich falsch, und muss PHP: function onepage_order_total() sein, damit die Funktion bei Aktivierung der Klasse ausgeführt wird.... Hier wird das zwar nicht verwendet, weil die komplette Routine ersetzt werden soll. Wenn man aber den Konstruktor einer "ORIGIN"-Klasse nur ergänzen will, ist Vorsicht angesagt... PHP: parent::order_total_ORIGIN(); wird zwar funktionieren, aber man verhindert damit die Mehrfachüberladung, da man direkt den Konstruktor der Parent-Klasse aufruft. Was also tun? Hat mich einige Zeit gekostet, bis ich das kapiert hatte: PHP: parent::__construct(); tut den Dienst!
Die Änderungen von include zu include_once sollen in der /includes/classes/order_total.php gemacht werden. Da funzt es auch, nur dachte ich mir wenn ein SP kommt der diese order_total.php überschreibt isses schlecht. Deswegen das mit den user_classes Ich habe parent::order_total_ORIGIN(); und parent::__construct(); getestet! CHACHE GELÖSCHT!!!! und leider ist diese Fehlermeldung immer noch.
negativ! So sieht das im Moment aus: PHP: <?phpclass onepage_order_total extends onepage_order_total_parent { function onepage_order_total() { parent::__construct(); if (defined('MODULE_ORDER_TOTAL_INSTALLED') && xtc_not_null(MODULE_ORDER_TOTAL_INSTALLED)) { $this->modules = explode(';', MODULE_ORDER_TOTAL_INSTALLED); $modules = $this->modules; sort($modules); // cgoenner: we need to include the ot_coupon & ot_gv BEFORE ot_tax reset($modules); while (list (, $value) = each($modules)) { include_once (DIR_WS_LANGUAGES.$_SESSION['language'].'/modules/order_total/'.$value); include_once (DIR_WS_MODULES.'order_total/'.$value); $class = substr($value, 0, strrpos($value, '.')); $GLOBALS[$class] = new $class (); } unset($modules); } }}?>
PHP: parent::__construct(); muss 'raus, da Du ja sonst diese Routine 2 mal ausführst. Du ersetzt ja den Kontruktor... Aber ich verstehe immer noch nicht, was Du Dir davon versprichst, statt "include" "include_once" zu verwenden.... m.E. kannst Du Dir das Überladen komplett sparen, weil der Konstruktor der "order_total"-Klasse ja nur einmal aufgerufen wird...
DANKE SUPPI, es funzt! Sinn ist es, für den OnePage-Checkout alles soweit updatessicher zu machen. Da steht in der Einbauanleitung volgendes drin: suche: include (DIR_WS_LANGUAGES.$_SESSION['language'].'/modules/order_total/'.$value); include (DIR_WS_MODULES.'order_total/'.$value); ersetze mit: include_once (DIR_WS_LANGUAGES.$_SESSION['language'].'/modules/order_total/'.$value); include_once (DIR_WS_MODULES.'order_total/'.$value); So, und jetzt dachte ich mir, diese Änderungen mit dem Überladen machen. Tick ich da falsch oder hab ich das im Grund falsch im Kopf!?!?!
Das ist m.E. völlig sinnfrei, vergiss das einfach.... Oder frage den Autor, was er damit erreichen will....
Gibt es irgendwo eine Liste, welche Klassen überladen werden können? Scheint ja noch nicht überall zu funktionieren.
Man kann alle Klassen überladen, außer einigen Zahlungsklassen von Drittanbietern. Das sind alle Gambio-Klassen, und auch alte Klassen (z.B. "products", aber auch "Smarty" und Zahlungs- und Versand-Klassen), die das Anhängsel "_ORIGIN" im Klassennamen haben... Der ganze Admin-Bereich ist leider nicht so ohne weiteres im Zugriff.... Über mein "USERMOD"-Konzept (http://www.gambio-forum.de/threads/...n-PHP-Programmen?p=38698&viewfull=1#post38698) kann ich mir das aber auch ermöglichen, ich habe mir so z.B. die "order"-Klasse überladen....
Nonito, Avenger,...? Was mach ich noch falsch? Ich bitte um eine kleine Hilfe ;-) Habe folgende Datei angelegt: /user_classes/overloads/AddressBookContentView/Packstation_AddressBookContentView.inc.php Mit folgendem Inhalt: Code: <?php /* -------------------------------------------------------------- AddressBookContentView.inc.php 2010-10-07 gambio Gambio GmbH http://www.gambio.de Copyright (c) 2010 Gambio GmbH 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(address_book.php,v 1.57 2003/05/29); www.oscommerce.com (c) 2003 nextcommerce (address_book.php,v 1.14 2003/08/17); www.nextcommerce.org (c) 2003 XT-Commerce - community made shopping http://www.xt-commerce.com ($Id: address_book.php 867 2005-04-21 18:35:29Z mz $) Released under the GNU General Public License ---------------------------------------------------------------------------------------*/ // include needed functions require_once (DIR_FS_INC.'xtc_address_label.inc.php'); require_once (DIR_FS_INC.'xtc_get_country_name.inc.php'); require_once (DIR_FS_INC.'xtc_count_customer_address_book_entries.inc.php'); class Packstation_AddressBookContentView extends Packstation_AddressBookContentView_parent { function AddressBookContentView() { $this->set_content_template('module/address_book.html'); $this->set_flat_assigns(true); } function get_html($p_coo_message_stack) { if($p_coo_message_stack->size('addressbook') > 0) { $this->set_content_data('error', $p_coo_message_stack->output('addressbook')); } $this->set_content_data('ADDRESS_DEFAULT', xtc_address_label($_SESSION['customer_id'], $_SESSION['customer_default_address_id'], true, ' ', '<br />')); $addresses_data = array(); //PkSt $addresses_query = xtc_db_query("select address_book_id, entry_firstname as firstname, entry_lastname as lastname, entry_company as company, entry_street_address as street_address, entry_suburb as suburb, entry_city as city, entry_postcode as postcode, entry_state as state, entry_zone_id as zone_id, entry_country_id as country_id from ".TABLE_ADDRESS_BOOK." where customers_id = '".(int) $_SESSION['customer_id']."' order by firstname, lastname"); $addresses_query = xtc_db_query("select address_book_id, entry_type_id as type_id, entry_firstname as firstname, entry_lastname as lastname, entry_company as company, entry_street_address as street_address, entry_suburb as suburb, entry_city as city, entry_postcode as postcode, entry_state as state, entry_zone_id as zone_id, entry_country_id as country_id from ".TABLE_ADDRESS_BOOK." where customers_id = '".(int) $_SESSION['customer_id']."' order by firstname, lastname"); while ($addresses = xtc_db_fetch_array($addresses_query)) { $format_id = xtc_get_address_format_id($addresses['country_id']); if ($addresses['address_book_id'] == $_SESSION['customer_default_address_id']) { $primary = 1; } else { $primary = 0; } //PkSt if ($addresses['type_id'] == 'p') { $packstation = 1; } else { $packstation = 0; } //PkSt $addresses_data[] = array ('NAME' => $addresses['firstname'].' '.$addresses['lastname'], 'BUTTON_EDIT' => '<a href="'.xtc_href_link(FILENAME_ADDRESS_BOOK_PROCESS, 'edit='.$addresses['address_book_id'], 'SSL').'">'.xtc_image_button('small_edit.gif', SMALL_IMAGE_BUTTON_EDIT).'</a>', 'BUTTON_DELETE' => '<a href="'.xtc_href_link(FILENAME_ADDRESS_BOOK_PROCESS, 'delete='.$addresses['address_book_id'], 'SSL').'">'.xtc_image_button('small_delete.gif', SMALL_IMAGE_BUTTON_DELETE).'</a>', 'ADDRESS' => xtc_address_format($format_id, $addresses, true, ' ', '<br />'), 'PRIMARY' => $primary, //PkSt 'PACKSTATION' => $packstation, //PkSt 'BUTTON_EDIT_URL' => xtc_href_link(FILENAME_ADDRESS_BOOK_PROCESS, 'edit='.$addresses['address_book_id'], 'SSL'), 'BUTTON_DELETE_URL' => xtc_href_link(FILENAME_ADDRESS_BOOK_PROCESS, 'delete='.$addresses['address_book_id'], 'SSL')); } $this->set_content_data('addresses_data', $addresses_data); $this->set_content_data('BUTTON_BACK', '<a href="'.xtc_href_link(FILENAME_ACCOUNT, '', 'SSL').'">'.xtc_image_button('button_back.gif', IMAGE_BUTTON_BACK).'</a>', 1); $this->set_content_data('BUTTON_BACK_LINK', xtc_href_link(FILENAME_ACCOUNT, '', 'SSL')); if(xtc_count_customer_address_book_entries() < MAX_ADDRESS_BOOK_ENTRIES) { $this->set_content_data('BUTTON_NEW', '<a href="'.xtc_href_link(FILENAME_ADDRESS_BOOK_PROCESS, '', 'SSL').'">'.xtc_image_button('button_add_address.gif', IMAGE_BUTTON_ADD_ADDRESS).'</a>', 1); $this->set_content_data('BUTTON_NEW_URL', xtc_href_link(FILENAME_ADDRESS_BOOK_PROCESS, '', 'SSL')); } $this->set_content_data('ADDRESS_COUNT', sprintf(TEXT_MAXIMUM_ENTRIES, MAX_ADDRESS_BOOK_ENTRIES)); $t_html_output = $this->build_html(); return $t_html_output; } } ?> Aber erhalte folgende Meldung... Fatal error: Call to a member function size() on a non-object in /var/www/web1413/html/system/views/account/AddressBookContentView.inc.php on line 36 Da steht folgendes: if($p_coo_message_stack->size('addressbook') > 0)
$p_coo_message_stack scheint nicht initialisiert zu sein... PHP: function AddressBookContentView() { $this->set_content_template('module/address_book.html'); $this->set_flat_assigns(true); } brauchst Du übrigens nicht mit aufzunehmen, das ändert sich ja nicht.... Du solltest auch ein PHP: $t_html_output=parent::get_html($p_coo_message_stack) in "function get_html($p_coo_message_stack)" mit aufnehmen, weil sonst die Überladungskette unterbrochen wird, und sonst niemand mehr das Ding überladen kann..
Hi Avenger, danke für dir Hinweise. Ich frag jetzt aber mal ganz doof: Wie initialisiere ich das Teil? Wenn ich ihm '' zuweise bekomme ich einen anderen Fehler: Fatal error: Call to a member function size() on a non-object in /var/www/web1413/html/user_classes/overloads/AddressBookContentView/Packstation_AddressBookContentView.inc.php on line 32 Wenn ich $p_coo_message_stack[] = ''; zuweise diesen:Fatal error: Cannot use object of type messageStack as array in /var/www/web1413/html/user_classes/overloads/AddressBookContentView/Packstation_AddressBookContentView.inc.php on line 31 Stehe im moment echt auf dem Schlauch. Eigentlich will ich ja nur einen Wert dem "$addresses_data[]" hinzufügen. Ist die Vorgehensweise dann korrekt das ganze Geraffel zu wiederholen und sozusagen neu aufzubauen? Danke Vorab!
Wenn du $p_coo_message_stack als Parameter in die Methode übergibst und in der Methode gleich via $p_coo_message_stack->size('addressbook') damit arbeiten möchtest, muss die Variable ein fertiges Objekt sein, d.h. initialisiere mal damit: PHP: $p_coo_message_stack = new messageStack();
Hm, jetzt meckert er das Original an?! Fatal error: Call to a member function size() on a non-object in /var/www/web1413/html/system/views/account/AddressBookContentView.inc.php on line 36 Hm, ist wieder weg, nachdem ich das Verzeichnis und die Datei in /overload/ gelöscht, Cache gelöscht und beides wieder angelegt habe. Komischer Effekt. Aber "er" scheint sie nicht zu benutzen... Edit: Ein "s" vergessen im Verzeichnisnamen, ich Döskopf! ES GEHT! DANKE nochmals Avenger & Nonito!
Ich hatte das bei mir getestet, das funktionierte einwandfrei.... Das Objekt wird richtig übergeben... Das wird so aber nicht funktionieren, weil "$p_coo_message_stack" ja dann nur lokal definiert ist, und nicht das "richtige" Objekt referenziert....
Guten Morgen, mal ´ne ganz dumme Frage: wozu brauche ich den ganzen Kram mit Überladung? Bisher habe ich Änderungen immer direkt im Code vorgenommen und gedacht, damit sei alles erledigt. Muss ich jetzt für jede Datei irgendwelche overload-Verzeichnisse angeben oder Konstruktoren erstellen? Mit objektorientierter Programmierung habe ich so gut wie noch nie zu tun gehabt (ausser mal eine Fortbildung in Java, und das war mir damals schon zu heavy). Vielen Dank für Eure Statements.