Oh danke euch Beiden. Ich fasse lieber die SQL nicht an. Habe Angst dort etwas kaputt zu machen. Aber dafür hat man ein Glück euch, die den Unwissenden weiterhelfen. Danke.
So, ich habe mal versucht mich in das Thema einzulesen. Ich stoße an meine Grenzen und bin der Überzeugung, dass man solche Dinge ohne PHP-Kenntnisse nicht hin bekommt. Da ich noch nicht mal die einzelnen Variablen kenne bzw. nicht weiss, welche Funktionen diese Variablen haben. Deshalb kann ich schlecht einen Overload erstellen. Das hieße, ich müsste mich jetzt erstmal hinsetzen und PHP lernen. Diese würde ich bestimmt auch hinbekommen, bin ja schließlich nicht doof. Aber zeitlich momentan nicht machbar durch meinen Hauptberuf. Im Forum habe ich nachlesen können wie und wo ich solch ein Overload erstelle bzw. wie der Anfang ist. In diesem Fall müsste ein Ordner AccountEditContentView in user_classes\overloads erstellt werden. Dann eine Datei mit dem Namen birthday_AccountEditContentView.inc.php in dem Ordner AccountEditContentView hinzufügen. Der Anfang dieser Datei müsste nach den Anleitungen dann wie folgt sein: PHP: <?php class birthday_AccountEditContentView extends birthday_AccountEditContentView_parent { } ?> Das ist alles kein Problem. Nun muss ich aber die AccountEditContentView durch Befehle überladen und genau da hört es bei mir jetzt auf, weil ich genau diese Befehle nicht kenne. Und eine SQL-Abfrage könnte wie folgt lauten: PHP: <?php $abfrage = "SELECT customers_dob FROM customers"; $ergebnis = mysql_query($abfrage); while($row = mysql_fetch_object($ergebnis)) { echo "$row->customers_dob"; } ?> Und wenn ich das richtig verstanden habe, kann ich $abfrage und $ergebnis frei definieren. Diese Abfrage gibt nun den Wert der Spalte customer_dob der Tabell customers aus. Nun muss ich der Abfrage genau sagen, welche Werte ich aus der Spalte genau haben möchte und das soll über das Attribut WHERE funktionieren. Mit dem Attribut LIKE kann man innerhalb der Spalte nach einem Wert suchen. Zum Beispiel: Gib mir den Wert aus der Spalte customers_dob vom Kunden xyz aus. Das müsste dann über die customers_id erfolgen. PHP: <?php $abfrage = "SELECT customers_dob FROM customers WEHRE customers_id LIKE $smarty.session.customer_id"; $ergebnis = mysql_query($abfrage); while($row = mysql_fetch_object($ergebnis)) { echo "$row->customers_dob"; } ?> Nun würde mir halt nur die richten Befehle für die Overlaod-Datei fehlen. Ich hoffe, ich habe es nun richtig wider gegeben. Die while-Schleife glaube ich, brauch man für das Vorhaben nicht sowie echo. Echo gibt nur den Wert aus und die while-Schleife erübrigt sich, weil wir nach einem bestimmten Wert suchen. Ah, okay.
Ich habe zwar dir die Antwort per Email geschickt, aber hier nochmals, falls sonst jemand diese Erweiterung braucht. Außerdem, hoffe ich, dass eine oder andere eventuell eine bessere Overload-Methode vorschlägt. Um die Daten von DateOfBirth im Kundenkontenbereich sichtbar zu machen, müssen diese Daten auch im Session geladen werden. Erst dann kann man diese Daten über $Smarty in "account-USERMOD.html" abrufen. Dafür habe ich die Datei "system/classes/accounts/LoginContentControl.inc.php" per Overload wie folgt erweitert: 1: in dem Ordner "user_classes/overloads" einen neuen Ordner mit dem Namen "LoginContentControl" erstellen. 2: den untenstehenden PHP-Code in eine Datei mit dem Namen "dob_LoginContentControl.inc.php" reinkopieren und diese Datei in dem neu erstellten Ordner speichern. PHP: <?php// BOF requires for the date formaterequire_once(DIR_FS_INC . 'xtc_date_short.inc.php');require_once(DIR_FS_INC . 'xtc_date_long.inc.php');require_once(DIR_FS_INC . 'xtc_date_raw.inc.php');// EOFclass dob_LoginContentControl extends dob_LoginContentControl_parent{ public function proceed() { $gm_log = MainFactory::create_object('GMTracker'); $gm_log->gm_delete(); $info_message = ''; if($gm_log->gm_ban() == false) { if(isset($this->v_data_array['GET']['action']) && ($this->v_data_array['GET']['action'] == 'process')) { $email_address = xtc_db_prepare_input($this->v_data_array['POST']['email_address']); $password = xtc_db_prepare_input($this->v_data_array['POST']['password']); // Check if email exists $check_customer_query = xtc_db_query("SELECT customers_id, customers_vat_id, customers_firstname, customers_lastname, customers_dob, customers_gender, customers_password, customers_email_address, customers_default_address_id FROM " . TABLE_CUSTOMERS . " WHERE customers_email_address = '" . xtc_db_input($email_address) . "' AND account_type = '0'" ); if(!xtc_db_num_rows($check_customer_query)) { $this->v_data_array['GET']['login'] = 'fail'; $info_message = TEXT_LOGIN_ERROR; $gm_log->gm_track(); $coo_econda = $this->coo_econda; if(is_object($coo_econda)) { $coo_econda->_loginFailUserUnknown(); } } else { $check_customer = xtc_db_fetch_array($check_customer_query); // Check that password is good $t_valid_password = xtc_validate_password($password, $check_customer['customers_password']); // try admin login if($t_valid_password === false) { $t_sql = "SELECT customers_password FROM " . TABLE_CUSTOMERS . " WHERE customers_id = 1 AND customers_status = 0"; $t_result = xtc_db_query($t_sql); if(xtc_db_num_rows($t_result) == 1) { $t_result_array = xtc_db_fetch_array($t_result); $t_valid_password = xtc_validate_password($password, $t_result_array['customers_password']); } } if($t_valid_password === false) { $this->v_data_array['GET']['login'] = 'fail'; $gm_log->gm_track(); $info_message = TEXT_LOGIN_ERROR; $coo_econda = $this->coo_econda; if(is_object($coo_econda)) { $coo_econda->_loginFailPasswordInvalid(); } } else { $gm_log->gm_delete(true); if(SESSION_RECREATE == 'True') { xtc_session_recreate(); } $check_country_query = xtc_db_query("SELECT entry_country_id, entry_zone_id, customer_b2b_status FROM " . TABLE_ADDRESS_BOOK . " WHERE customers_id = '" . (int)$check_customer['customers_id'] . "' AND address_book_id = '" . $check_customer['customers_default_address_id'] . "'" ); $check_country = xtc_db_fetch_array($check_country_query); $_SESSION['customer_gender'] = $check_customer['customers_gender']; $_SESSION['customer_first_name'] = $check_customer['customers_firstname']; $_SESSION['customer_last_name'] = $check_customer['customers_lastname']; // BOF $_SESSION['customer_dob'] = xtc_date_short($check_customer['customers_dob']); // EOF $_SESSION['customer_id'] = $check_customer['customers_id']; $_SESSION['customer_vat_id'] = $check_customer['customers_vat_id']; $_SESSION['customer_default_address_id'] = $check_customer['customers_default_address_id']; $_SESSION['customer_country_id'] = $check_country['entry_country_id']; $_SESSION['customer_zone_id'] = $check_country['entry_zone_id']; update_customer_b2b_status($check_country['customer_b2b_status']); $t_customers_info_array = array( 'customers_info_date_of_last_logon' => 'now()', 'customers_info_number_of_logons' => 'customers_info_number_of_logons + 1' ); $this->wrapped_db_perform(__FUNCTION__, TABLE_CUSTOMERS_INFO, $t_customers_info_array, 'update', 'customers_info_id = ' . (int)$_SESSION['customer_id'], 'db_link', false); xtc_write_user_info((int)$_SESSION['customer_id']); // restore cart contents $_SESSION['cart']->restore_contents(); $_SESSION['wishList']->restore_contents(); $coo_login_extender_component = MainFactory::create_object('LoginExtenderComponent'); $coo_login_extender_component->set_data('customers_id', (int)$_SESSION['customer_id']); $coo_login_extender_component->proceed(); $coo_econda = $this->coo_econda; if(is_object($coo_econda)) { $coo_econda->_loginUser(); } if($_SESSION['cart']->count_contents() > 0) { if(isset($this->v_data_array['GET']['checkout_started']) && $this->v_data_array['GET']['checkout_started'] == 1) { $this->set_redirect_url(xtc_href_link(FILENAME_CHECKOUT_SHIPPING, '', 'SSL')); } else { $this->set_redirect_url(xtc_href_link(FILENAME_ACCOUNT, '', 'SSL')); } } else { $this->set_redirect_url(xtc_href_link(FILENAME_DEFAULT)); } } } } } else { // delete banned ips $info_message = GM_LOGIN_ERROR; } if($this->v_data_array['GET']['info_message']) { $info_message = htmlentities_wrapper($this->v_data_array['GET']['info_message']); } elseif(isset($_SESSION['gm_info_message'])) { $info_message = htmlentities_wrapper(urldecode($_SESSION['gm_info_message'])); unset($_SESSION['gm_info_message']); } $t_checkout_started_get_param = ''; if(isset($this->v_data_array['GET']['checkout_started']) && $this->v_data_array['GET']['checkout_started'] == 1) { $t_checkout_started_get_param = 'checkout_started=1'; } $t_input_mail_value = ''; if(isset($this->v_data_array['POST']['email_address'])) { $t_input_mail_value = htmlentities_wrapper(gm_prepare_string($this->v_data_array['POST']['email_address'], true)); } $coo_login_view = MainFactory::create_object('LoginContentView'); $coo_login_view->set_('info_message', $info_message); $coo_login_view->set_('checkout_started_get_param', $t_checkout_started_get_param); $coo_login_view->set_('input_mail_value', $t_input_mail_value); $coo_login_view->set_('cart_contents_count', $_SESSION['cart']->count_contents()); $this->v_output_buffer = $coo_login_view->get_html(); return parent::proceed(); }} 3: Nun, um die DateOfBirth auch anzeigen zu lassen muss die Datei "templates/EyeCandy/module/account.html" mit zwei zeilen wie folgt erweitert werden: HTML: <dt>Geburtsdatum</dt> <dd>{$smarty.session.customer_dob}</dd> 4: Diese Datei wird nun als account-USERMOD.html in dem selben Ordner gespeichert. 5: Shop Caches leeren nicht vergessen. Wo man diese zwei Zeilen in der Datei "account.html" integriert, hängt davon ab, wo es erscheinen soll. Wie gesagt, würde ich gerne noch dazu lernen, wenn jemand eine bessere Methode vorschlägt.