Bestimmte Kommentare aus "orders_status_history" sollen sowohl auf der Seite "account_history" als auch auf "account_history_info" angezeigt werden. Wie bekomme ich dies mit einem Overload gebacken?
OK. Für die Account_history würde ich an der Methode _buildOrderDataArray ansetzen um dort eine weitere Variable zu deklarieren. Diese zieht sich anhand der vorhandenen Order ID deine Comments aus der DB -> orders_stytus_history. Beispiel: PHP: protected function _buildOrderDataArray(array $orderData, $p_count) { $orderDataArray = array ('ORDER_ID' => $orderData['orders_id'], 'ORDER_STATUS' => $orderData['orders_status_name'], 'ORDER_DATE' => xtc_date_long($orderData['date_purchased']), 'ORDER_PRODUCTS' => (int)$p_count, 'ORDER_TOTAL' => strip_tags($orderData['order_total']), 'ORDER_BUTTON' => '<a href="'.xtc_href_link(FILENAME_ACCOUNT_HISTORY_INFO, 'page='.(empty($this->page) ? "1" : (int)$this->page) .'&order_id='.$orderData['orders_id'], 'SSL').'">'.xtc_image_button('small_view.gif', SMALL_IMAGE_BUTTON_VIEW).'</a>', 'BUTTON_URL' => xtc_href_link(FILENAME_ACCOUNT_HISTORY_INFO, 'page='.(empty($this->page) ? "1" : (int)$this->page) .'&order_id='.$orderData['orders_id'], 'SSL')); return $orderDataArray; } das ist die original Methode und diese erweitere ich als Overload: PHP: protected function _buildOrderDataArray(array $orderData, $p_count) { $orderDataArray = array ('ORDER_ID' => $orderData['orders_id'], 'ORDER_STATUS' => $orderData['orders_status_name'], 'ORDER_STATUS_HIS => _buildStatHistory($orderData['orders_id']), 'ORDER_DATE' => xtc_date_long($orderData['date_purchased']), 'ORDER_PRODUCTS' => (int)$p_count, 'ORDER_TOTAL' => strip_tags($orderData['order_total']), 'ORDER_BUTTON' => '<a href="'.xtc_href_link(FILENAME_ACCOUNT_HISTORY_INFO, 'page='.(empty($this->page) ? "1" : (int)$this->page) .'&order_id='.$orderData['orders_id'], 'SSL').'">'.xtc_image_button('small_view.gif', SMALL_IMAGE_BUTTON_VIEW).'</a>', 'BUTTON_URL' => xtc_href_link(FILENAME_ACCOUNT_HISTORY_INFO, 'page='.(empty($this->page) ? "1" : (int)$this->page) .'&order_id='.$orderData['orders_id'], 'SSL')); return $orderDataArray; } wie du siehst gibts da ne neue Methode _buildStatHistory (Beispielname!) welche du in deinen Overload mit reinpackst und da werden deine Comments erstellt. Wie du die darstellst ist dann deine Sache. Wenn nur immer der letzte Comments dargestellt werden soll, ist das ein Einzelwert, sollten mehrere angezeigt werden, machs über ein Array welches du mit foreach im Templates ausgibst. Bei der account_history_info ist dass das gleiche System.... nur da eben die prepare_data()-Methode überladen!
Die SQL-Abfrage wäre als Beispiel so: SELECT comments FROM 'orders_status_history' WHERE 'orders_id' = "deine-Übergabevariable" AND 'comments' LIKE ('SONDERZEICHEN%'); Wichtig ist das vor SONDERZEICHEN kein % steht, somit akzeptiert die Abfrage nur die SONDERZEICHEN welche am Anfang deines Strings stehen...
Technisch ist das keine gute Lösung, weil die komplette Methode übernommen und erweitert wird. Bei zukünftigen evtl. Erweiterungen dieser Methode durch Gambio passt das evtl, nicht mehr. Ziel muss es immer sein, die Original-Methode ohne Änderungen zu bewahren, und durch das Overload nur eigene Änderungen beizusteuern. Was hier ja kein Problem ist. Ich würde das so lösen: PHP: protected function _buildOrderDataArray(array $orderData, $p_count){ //Get Original data $orderDataArray=parent::_buildOrderDataArray(array $orderData, $p_count); //Add my data $orderDataArray['ORDER_STATUS_HIS']=_buildStatHistory($orderData['orders_id']); return $orderDataArray;} Änderungen an der Standard-_buildOrderDataArray-Methode stören mich da nicht mehr.
Ein weiterer Nachteil einer Komplettkopie ist, dass das Overload-Chaining nicht mehr funktioniert! D.h., wenn ein anderes Modul auch diese Routine überladen will, dann kann sie das nicht tun, weil eben die Chaining-Kette nicht durch "parent" durchlaufen wird.