Staubsauger2 Posted March 7, 2013 Report Share Posted March 7, 2013 Hallo, Kunden geben häufig Ihre Adressen in Kleinbuchstaben ein. Gibt es einen Code, der den jeweils ersten Buchstaben der Adressdaten automatisch groß umwandelt? Vielen Dank für Eure Antworten! Gruß Christian http://www.staubsaugerladen.de Link to comment Share on other sites More sharing options...
Sentor77 Posted March 7, 2013 Report Share Posted March 7, 2013 Moin, das kannst du mit ucwords($adresse)[/PHP] machen. LG Link to comment Share on other sites More sharing options...
ToppFeuerwerk Posted March 7, 2013 Report Share Posted March 7, 2013 Moin, hast Du auch noch einen Hinweis, wo ich das platzieren könnte, damit es auch funktioniert..? Danke... Das Problem nervt mich auch immer mal wieder.... Wäre es nicht dann auch sinnvoll es so zu machen??? ucwords(strtolower($adresse))[/PHP][/color][/color] Link to comment Share on other sites More sharing options...
Sentor77 Posted March 7, 2013 Report Share Posted March 7, 2013 Moin, deine Variante würde dann zusätzlic noch doppelte Großbuchstaben wie z.B. "HAuptstraße" vorbeugen. Werde ich wohl auch so übernehmen. Was noch nicht abgefangen wird sind Straßen mit Bindestrich: "Karl-schuhmann-str". Evt könnte man es so regeln: $tmp = strtolower($tmp); $array = explode('-', $tmp); foreach($array as &$value) { $value = ucfirst($value); } $tmp = implode('-', $array); [/PHP] Das ganze würde ich in der [code]xtFramework/classes/class.check_fields.php[/CODE] am Hookpoint[CODE] 'class.customer.php:_CustomerAddressData_check'[/code] einbauen und zwar für folgende Daten: [PHP]$data['customers_street_address'] $data['customers_city'][/PHP] Alternativ auch noch[PHP] $data['customers_firstname'] $data['customers_lastname'][/PHP] LG Link to comment Share on other sites More sharing options...
ToppFeuerwerk Posted March 7, 2013 Report Share Posted March 7, 2013 Hi, wow... Ausführlich... DANKE! Leider finde ich es nicht. Habe etwas ähliche gefunden in der class.customer.php Funktion: function _buildCustomerAddressData...[/PHP]Und dann: [PHP]$address_data_array = array ('customers_id' => $data['customers_id'],[/PHP]Das wäre ein Eintrag dazu: [PHP]'customers_company' => $data['customers_company'],[/PHP]Meine Änderung würde im ersten Moment so aussehen: [color=#000000][color=#0000BB][color=#000000][color=#0000BB][color=Black][PHP]'customers_company' => ucwords(strtolower($data['customers_company'])),[/PHP]Oder bin ich da auf dem Holzweg? Gruß[/color] [/color][/color][/color][/color] Link to comment Share on other sites More sharing options...
Sentor77 Posted March 7, 2013 Report Share Posted March 7, 2013 Moin, also auf dem Holzweg bist du nicht. Damit könntest du jeden Eintrag seperat behandeln und in das gewünschte Format bringe. Den großen Nachteil, den ich bei deiner Variante sehe ist, dass die Klasse direkt im Quellcode veränderst. Das solltest du aber vermeiden, damit bei einem Shopupdate diene Änderungen nicht verloren gehen. Aus diesem Grunde kann ich dir nur raten, hänge dich an den oben genannten Hookpoint an. Dazu erstellst du entweder selber ein Plugin oder nimmst ein installiertes und fügst den oben genannte Hookpoint ein. Dann kannst du ohne Schwierigkeiten deinen Code schreiben und gehst sicher, dass er nach dem nächsten Update auch noch da ist (wenn du dich natürlich in ein bestehendes Plugin reinhängst und dieses aktuallisiert wird, ist der Code natürlich auch weg...). Aber ansonsten würde deine Varaiante auf jeden Fall funktionieren. LG Link to comment Share on other sites More sharing options...
ToppFeuerwerk Posted March 7, 2013 Report Share Posted March 7, 2013 Hi, das dachte ich mir auch, den Quellcode nicht anfassen... Ehrlich gesagt, ich verstehe das mit dem Hook Point nicht.... ;( EDIT: Hab jetzt einiges probiert, aber ich verstehe den Zusammenhang nicht. Hast Du Lust mir das mal zu erklären...? Hab mir ein neues PlugIn erstellt. Zumindet nach bestem empfinden. Aber das geht mal GAR nicht... Gruß Link to comment Share on other sites More sharing options...
Sentor77 Posted March 7, 2013 Report Share Posted March 7, 2013 Moin, die Hookpoints sind ziemlich genial. Wenn du im Backend in der Kategorie "installierte Plugins" mal bei einem Plugin deiner Wahl auf "Hookpoints" klickst, bekommst du eine Liste aller verwendeten Hookpoints dieses Plugins. Dort hättest du z.B. auch die Möglichkeit einen neuen anzulegen. Im gesamten Quellcode sind an ettlichen Stellen Hookpoints vorhanden, an die man sich "hängen" kann. Den PHP-Code, den du dann im Backend bei den Hooks eingibst, wird dann genau an der Stelle im Quellcode ausgeführt, wo der Hookpoint zu finden ist. Ein Beispiel: in der Datei xtFramework/classes/class.product.php[/CODE] findest du in der Methode "buildData()" folgenden Hookpoint, ziemlich am Ende der Methode: [PHP]($plugin_code = $xtPlugin->PluginCode('class.product.php:BuildData_bottom')) ? eval($plugin_code) : false;[/PHP] Im konkreten Fall ist "class.product.php:BuildData_bottom" der Name des Hookpoints. Solltest du nun hergehen und im Backend einen neuen Hookpoint mit diesem Namen anlegen, dann wird der von dir eingegebene Code genau an der Stelle des Quelltextes ausgeführt an der der Hookpoint steht. In diesem Fall wird also [PHP]($plugin_code = $xtPlugin->PluginCode('class.product.php:BuildData_bottom')) ? eval($plugin_code) : false;[/PHP] durch deinen Code ersetzt. Dadurch hast du an dieser Stelle die Möglichkeit auf alle vorhergegangen Variablen zuzugreifen. An dieser Stelle könntest du z.B. den Inhalt von [PHP]$this->data['more_images'][/PHP] ändern, ohne direkt den Quelltext verändern zu müssen. Schau auch mal ins Handbuch in die Rubrik "Entwicklerinformationen". Dort wird dir erklärt wie du z.B. ein eigenes Plugin anlegst, über welches du dann ganz einfach auf diverse Hookpoints zugreien kannst. Ich hoffe ich konnte dir das Prinzip der Hookpoints etwas näher bringen. LG Link to comment Share on other sites More sharing options...
ToppFeuerwerk Posted March 7, 2013 Report Share Posted March 7, 2013 Hi, und vielen DANK! Etwas Licht ins Dunkel gekommen.... Noch ne DUMME Frage. Im PlugIn Verzeichnis, dort das "hooks" Verzeichnis. Muss dort der Name der Datei, den Namen des Hookpints haben, indem mein Code enthalten ist....? Eine Classe brauche ich doch nicht...?? EDIT: Meine Datei, für den Hookpoint: <?php $this->ucwords(strtolower($data['customers_firstname']); $this->ucwords(strtolower($data['customers_lastname']); $this->ucwords(strtolower($data['customers_company']); $this->_editStreet($data['customers_street_address']); $this->ucwords(strtolower($data['customers_city']); function _editStreet($data) { $data = strtolower($tmp); $array = explode('-', $data); foreach($array as &$value) { $value = ucfirst($value); } $data = implode('-', $array); return $data; } ?> [/PHP]Meine XML: [PHP] <?xml version="1.0" encoding="utf8"?> <xtcommerceplugin> <title>Manage Adress</title> <version>1.0.0</version> <code>mt_manage_adress</code> <url></url> <description>Manage Adress Character</description> <type>extension</type> <icon></icon> <db_install></db_install> <db_uninstall></db_uninstall> <plugin_code> <code> <hook>class.customer.php:_CustomerAddressData_check</hook> <phpcode><![CDATA[require_once _SRV_WEBROOT.'plugins/mt_manage_adress/hooks/manage_adress_character.php';]]></phpcode> <order>1</order> <active>1</active> </code> </plugin_code> <language_content> <phrase> <key></key> <class></class> <de> <value></value> </de> <en> <value></value> </en> </phrase> </language_content> </xtcommerceplugin> [/PHP]Gruß Link to comment Share on other sites More sharing options...
Sentor77 Posted March 7, 2013 Report Share Posted March 7, 2013 Bei der Namensvergabe bist du völlig frei. Wichtig ist, dass du die korrekte Datei in der plugins/pluginName/installer/pluginName.xml includierst. Ein minimales Setup für ein Plugin könnte so aussehen: Ordnerstruktur: PluginName installer pluginName.xml hooks meinHookpoint.php In die pluginName.xml könntest du dann folgendes schreiben: <?xml version="1.0" encoding="UTF-8"?> <xtcommerceplugin> [INDENT]<title>Plugin titel</title> <version>1.0.0</version> <code>pluginName</code><! Identisch mit Ordnernamen> <url>http://www.url.de</url> <description>Beschreibung des Plugins</description> <icon/> <type>Misc</type> <configuration/> <language_content/> <plugin_code> [INDENT]<code> [INDENT]<hook>hookpointName</hook> <!aus dem Quelltext> <phpcode><![CDATA[ [INDENT]include _SRV_WEBROOT.'plugins/pluginName/hooks/meinHookpoint.php';[/INDENT] ]]></phpcode> <order>0</order> <active>1</active>[/INDENT] </code>[/INDENT] </plugin_code>[/INDENT] </xtcommerceplugin> Damit würde dein Plugin nichts weiter machen, als an der Stelle des Hookpoints deine PHP-Datei zu includieren und den dortigen Code auszuführen. Im Prinzip also genau das, was du für dein Vorhaben benötigst. Allerdings würde ich nicht meine Beispielnamen verwenden LG Link to comment Share on other sites More sharing options...
ToppFeuerwerk Posted March 7, 2013 Report Share Posted March 7, 2013 Hi und wieder DANKE! So hab ich das nun gemacht.... Sag mal bitte was dazu... die XML: <?xml version="1.0" encoding="utf8"?> <xtcommerceplugin> <title>Manage Adress</title> <version>1.0.0</version> <code>mt_manage_adress</code> <url /> <description>Manage Adress Character</description> <type>extension</type> <icon /> <db_install /> <db_uninstall /> <plugin_code> <code> <hook>class.customer.php:_CustomerAddressData_check</hook> <phpcode><![CDATA[require_once _SRV_WEBROOT.'plugins/mt_manage_adress/hooks/manage_adress_character.php';]]></phpcode> <order>1</order> <active>1</active> </code> </plugin_code> <language_content /> </xtcommerceplugin> [/PHP] die Datei: [PHP] <?php $this->_checkCharacter($data['customers_firstname']); $this->_checkCharacter($data['customers_lastname']); $this->_checkCharacter($data['customers_company']); $this->_checkCharacter($data['customers_street_address']); $this->_checkCharacter($data['customers_city']); function _checkCharacter($check) { $pos = strpos($check, '-'); if ($pos === true) { $stuff = strtolower($check); $array = explode('-', $stuff); foreach($array as $value) { $value = ucfirst($value); } $stuff = implode('-', $array); } else { $stuff = ucwords(strtolower($check); } return $stuff; } ?> [/PHP] Link to comment Share on other sites More sharing options...
Sentor77 Posted March 7, 2013 Report Share Posted March 7, 2013 Und da bin ich wieder. Dein Code wird so leider nicht funktionieren. De rGrund ist, dass sich der Hookpoint innerhalb einer Methode einer Klasse befindet und somit dein Code auch dort ausgeführt wird. Es ist nicht möglich innerhalb einer Methode eine neue Funktion zu deklarieren. In diesem Fall würde ich einen Ordner "classes" anlegen, dort eine datei "class.MtManageAdress.php" erstellen und in dieser dann folgender code: class MtManageAdress { /** * Checks Character of an given string * * @param string $check The string to check * @return string The modified string */ public function _checkCharacter($check) { $pos = strpos($check, '-'); if ($pos !== false) { $stuff = strtolower($check); $array = explode('-', $stuff); foreach($array as $value) { $value = ucfirst($value); } $stuff = implode('-', $array); } else { $stuff = ucwords(strtolower($check)); } return $stuff; } } [/PHP] Deinen Hookdatei änderst du dann wie folgt ab: [PHP] require_once _SRV_WEBROOT._SRV_WEB_PLUGINS.'mt_manage_adress/classes/class.MtManageAdress.php'; $manageAddress = new MtManageAdress(); $data['customers_firstname'] = $manageAddress->_checkCharacter($data['customers_firstname']); $data['customers_lastname'] = $manageAddress->_checkCharacter($data['customers_lastname']); $data['customers_company'] = $manageAddress->_checkCharacter($data['customers_company']); $data['customers_street_address'] = $manageAddress->_checkCharacter($data['customers_street_address']); $data['customers_city'] = $manageAddress->_checkCharacter($data['customers_city']); [/PHP] In deiner $pos Abfrage habe ich noch eine Änderung gemacht. strpos() gibt FALSE oder einen numerischen wert zurück, unter anderem auch 0. Wenn du typensicher auf TRUE prüfst ( $pos === TRUE ) kannst du hier niemals in der if landen, da strpos einfach kein true zurück gibt. Deshalb prüfe ich jetzt auf !== FALSE. Damit landen wir bei einem numerischen Wert in der Schleife und bie FALSE, also nicht gefunden, ausserhalb der Schleife. Diese Angaben sind wie immer ohne Gewähr.... LG Link to comment Share on other sites More sharing options...
ToppFeuerwerk Posted March 7, 2013 Report Share Posted March 7, 2013 Hi.... DANKE!! Werde es testen.... Und mich wieder melden... EDIT: So... Das funzt nicht, wenn ....ich einen neuen Kunden registriere. ....ich eine existierend Adresse bearbeitet habe und auf "weiter" klicke. Beste Grüße Link to comment Share on other sites More sharing options...
ToppFeuerwerk Posted March 7, 2013 Report Share Posted March 7, 2013 Hi, ich nochmal.... Die Seiten bleiben nicht mehr weiss! Ich hab mich bei einem Zeichen vertippt. Mein Fehler. Aber die Änderung passiert nicht... Gruß Link to comment Share on other sites More sharing options...
Sentor77 Posted March 7, 2013 Report Share Posted March 7, 2013 Hast du das Plugin installiert und aktiviert? Link to comment Share on other sites More sharing options...
ToppFeuerwerk Posted March 7, 2013 Report Share Posted March 7, 2013 Du bist Lustig... Ja hab ich... Link to comment Share on other sites More sharing options...
Sentor77 Posted March 7, 2013 Report Share Posted March 7, 2013 So, da bin ich wieder.... Problem gefunden und gelöst. Wir wechseln den hookpoint: class.customer.php:_buildCustomerAddressData_top In deiner Xml datei ändern, plugin deinstallieren und neu installieren. und bitte in der check funktion schauen ob in der foreach-schleife das $value als Referenz übergeben wird; foreach($array as &$value) { $value = ucfirst($value); }[/PHP] Sprich das "&" ist hier sehr wichtig. Lass mich wissen ob es jetzt klappt. Ich bin morgen wieder da. LG Link to comment Share on other sites More sharing options...
ToppFeuerwerk Posted March 7, 2013 Report Share Posted March 7, 2013 Hi Du... ...bist mein Held!!! Das funktioniert. Sowohl bei neu Anmeldungen, als auch bei bestehenden Kunden! Sowei bei weiteren Adressen. Sehr geil... DANKE DIR! Gruß Link to comment Share on other sites More sharing options...
ToppFeuerwerk Posted March 7, 2013 Report Share Posted March 7, 2013 Ich nochmal... Damit alle was davon haben, anbei der Code: Die XML: <?xml version="1.0" encoding="utf8"?> <xtcommerceplugin> <title>Manage Adress Character</title> <version>1.0.0</version> <code>manage_adress</code> <url /> <description>Manage Adress Character</description> <type>extension</type> <icon /> <db_install /> <db_uninstall /> <plugin_code> <code> <hook>class.customer.php:_buildCustomerAddressData_top</hook> <phpcode><![CDATA[require_once _SRV_WEBROOT._SRV_WEB_PLUGINS.'manage_adress/hooks/manage_adress_character.php';]]></phpcode> <order>1</order> <active>1</active> </code> </plugin_code> <language_content /> </xtcommerceplugin> [/PHP]Die Classes: [PHP] <?php class manage_adress { public function _checkCharacter($check) { $pos = strpos($check, '-'); if ($pos !== false) { $stuff = strtolower($check); $array = explode('-', $stuff); foreach($array as &$value) { $value = ucfirst($value); } $stuff = implode('-', $array); } else { $stuff = ucwords(strtolower($check)); } return $stuff; } } ?> [/PHP]Der Hook: [PHP] <?php require_once _SRV_WEBROOT._SRV_WEB_PLUGINS.'manage_adress/classes/class.manage_adress.php'; $manage_adress = new manage_adress_char(); $data['customers_company'] = $manage_adress->_checkCharacter($data['customers_company']); $data['customers_company_2'] = $manage_adress->_checkCharacter($data['customers_company_2']); $data['customers_company_3'] = $manage_adress->_checkCharacter($data['customers_company_3']); $data['customers_firstname'] = $manage_adress->_checkCharacter($data['customers_firstname']); $data['customers_lastname'] = $manage_adress->_checkCharacter($data['customers_lastname']); $data['customers_street_address'] = $manage_adress->_checkCharacter($data['customers_street_address']); $data['customers_suburb'] = $manage_adress->_checkCharacter($data['customers_suburb']); $data['customers_city'] = $manage_adress->_checkCharacter($data['customers_city']); $data['customers_state'] = $manage_adress->_checkCharacter($data['customers_state']); ?> [/PHP]Gruß Link to comment Share on other sites More sharing options...
Sentor77 Posted March 8, 2013 Report Share Posted March 8, 2013 Moin, das freut mich ja, das es funktioniert hat. Der Nebeneffekt: du weißt jetzt sogar wie man Plugins schreibt und kannst so deinen Shop anpassen ohne den Quelltext zu verändern. Allerdings kann es passieren, dass es an einigen Stellen dann doch noch nötig sein wird. Wünsche dir gute Geschäfte. Auf bald. LG Link to comment Share on other sites More sharing options...
ToppFeuerwerk Posted March 8, 2013 Report Share Posted March 8, 2013 Hi und moin, jup, das finde ich auch einen sehr guten Nebeneffekt. ABER.... Wie stelle ich es an, wenn ich in diesem PlugIn noch einen weiteren Hook ansprechen will, in dem etwas anderes angepasst oder geprüft werden soll..? Ebenso gute Geschäfte Gruß Link to comment Share on other sites More sharing options...
Sentor77 Posted March 8, 2013 Report Share Posted March 8, 2013 Das ist ziemlich leicht. Du baust in deiner .xml einen neuen <code></code> Abschnitt ein in dem du den neuen Hook angibst. Der Rest funktioniert dann genau wie bei dem vorhergegangenen. Du musst auch nicht für jeden Hook eine eigene PHP-Datei anlegen. Wenn du nur wenig PHP-Code hast, dann kannst du das auch direct in den <code><phpcode></phpcode</code> Abschnitt schreiben. Also anstelle von require_once _SRV_WEBROOT._SRV_WEB_PLUGINS.'manage_adress/hooks/manage_adress_character.php';][/PHP] schreibst du dann den Code den du sonst in die die PHP-Datei im hook-Verzeichnis geschrieben hättest. Solltest du weitere Hilfsfuncktionen benötigen, schreibst du sie einfach in die Klasse, bindest die Klasse wie gehabt in deinen Hook ein, instanzierst sie und benutzt die neue Funktion. Wenn du die .xml veränderst, hast du 2 Möglichkeiten dne Code zum laufen zu bekommen: 1. Du deinstallierst dein Plugin und installierst es wieder 2. Du veränderst die .xml (Für spätere installationen) und zusätzlich lägst du im Backend den entsprechenden Hook manuell an und schreibst dne Code aus dem <code><phpcode></phpcode</code> Abschnitt ind das Textfeld. Damit ersparst du dir das andauernde deinstallieren. Bei der nächsten installation des Plugins werden dann alle Hooks installiert. Bsp: [code] <plugin_code> <code> <hook>page_registry.php:bottom</hook> <phpcode><![CDATA[ include _SRV_WEBROOT.'plugins/ds_mods/hooks/page_registry_php_bottom.php'; ]]></phpcode> <order>0</order> <active>1</active> </code> <code> <hook>module_customer.php:page</hook> <phpcode><![CDATA[ include _SRV_WEBROOT.'plugins/ds_mods/hooks/module_customer_php_page.php'; ]]></phpcode> <order>1</order> <active>1</active> </code> <code> <hook>class.currency.php:_getCurrency_bottom</hook> <phpcode><![CDATA[ include _SRV_WEBROOT.'plugins/ds_mods/hooks/class_currency_php__getCurrency_bottom.php'; ]]></phpcode> <order>2</order> <active>1</active> </code> <code> <hook>class.customer.php:customer_top</hook> <phpcode><![CDATA[ include _SRV_WEBROOT.'plugins/ds_mods/hooks/class_customer_php_customer_top.php'; ]]></phpcode> <order>3</order> <active>1</active> </code> </plugin_code> [/code] LG Link to comment Share on other sites More sharing options...
ToppFeuerwerk Posted March 8, 2013 Report Share Posted March 8, 2013 Danke... Du bist sehr hilfsbereit, das ehrt dich. Ich denke ich werde das alles in einzelen Datei machen, es ist übersichtlicher. Ich brauche ja nur eine Prüfung oder ein neuer Kunde min. 18 Jahre alt ist. Das hab ich mir gerade zusammen geschrieben. Naja, PHP ist nicht so meine stärke, aber man lernt nie aus. Muss nur noch herausfinden, wie ich die ERROR Blöcke anzapfe oder einen neuen mache... Gruß Link to comment Share on other sites More sharing options...
Sentor77 Posted March 8, 2013 Report Share Posted March 8, 2013 Auch hier hätte ich einen Anstoß parat: zuerst einmal deklarierst du in deinem Hook die Variable $info als global global $info[/PHP] Damit hast du jetzt an jeder Stelle deines Hooks Zugriff auf $info und diese ist wiederum eine Instanz der Klasse class.info_handler.php Falls du jetzt eine Meldung setzen möchtest, rufst du einfach folgendes auf: [PHP]$info->_addInfoSession('Deine Fehlermeldung','Fehlertyp');[/PHP] Über den Fehlertypen definierst du das aussehen deiner Meldung. In der templates/DEINTEMPLATE/xtCore/pages/info_handler.html findest du für jeden Errortype ein Template. Somit bist du unheimlich flexibel was deine Meldungen angeht. Was jetzt noch fehlt ist eine Weiterleitung nach dem Fehler. Dazu folgender Code: [PHP]$url=$xtLink->_link(array('page'=>'cart')); $xtLink->_redirect($url);[/PHP] Dies ist eine Weiterleitung auf die Warenkorbseite. Im dortigen Template wird [CODE]{$message}[/CODE] durch deine Fehlermedung im gewünschten Template ersetzt. LG Link to comment Share on other sites More sharing options...
ToppFeuerwerk Posted March 8, 2013 Report Share Posted March 8, 2013 Du wirst mir langsam unheimlich..... Mein Dank stapelt sich bei Dir im Keller!!! Was machst Du beruflich..? Oder, woher weisst Du das alles..? Gruß Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.