Jump to content
xt:Commerce Community Forum

Ersten Buchstaben in Adressen immer groß


Staubsauger2

Recommended Posts

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

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

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

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

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

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

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

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

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

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

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

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

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

:) 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

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

Archived

This topic is now archived and is closed to further replies.

×
  • Create New...