Hier ein paar Codeschnipsel die Dir vielleicht weiterhelfen können.

[Magento] Pflichtfelder bei der Registrierung ändern

Da sind wir mal wieder beim Magento-Shopsystem. Ich kann nicht sagen das ich von dem System sehr begeistert bin. Um da durchzusteigen muss man Magento studiert haben. Aber egal.

Das Problem heute: Wie ändere ich Pflichtfelder bei der Registrierung.

Aktueller Fall ist das nur der Vorname, Nachname, E-Mail und Passwort.

Magento Version: 1.4.1.1

Als erstes nehmen wir uns die Registrierungsform vor. Die ist unter “/app/design/frontend/base/default/template/checkout/onepage/billing.phtml“.
Hier suchen wir alle Felder die wir nicht als Pflichtfelder haben wollen und entfernen in der entsprechenden Zeile erst einmal die “<em>*</em>“. Dann noch im Formularfeld selbst den CSS-Code in ändern.
Wenn man Pflichtfelder hinzufügen möchte, dann natürlich andersrum.
Das war es in der Datei auch schon.
Bei der Postleitzahl ist noch eine änderung ganz unten vorzunehmen. Aus der Zeile:

var billingRegionUpdater = new RegionUpdater('billing:country_id', 'billing:region', 'billing:region_id', countryRegions, undefined, ''billing: postcode');

machen wir

var billingRegionUpdater = new RegionUpdater('billing:country_id', 'billing:region', 'billing:region_id', countryRegions, undefined, '');

Das gleiche muss auch in der Datei “/app/design/frontend/base/default/template/checkout/onepage/shipping.phtml” gemacht werden.

Jetzt müssen wir die Prüfung durch PHP deaktivieren, für die Nicht-Pflichtfelder. Das passiert in der “/app/code/core/Mage/Customer/Model/Address/Abstract.php”. Ganz unten die Prüfungen auskommentieren die nicht erfolgen sollen.

Das sollte es gewesen sein. Bei mir funktioniert es :-)

[PHP] Dateiupload und Dateidownload

Jeder macht das eine und einige machen auch das andere. Die Rede ist vom Hoch- und Runterladen von Dateien im Internet. Jeder kann etwas herunter laden. Ob die Bedienungsanleitung, im PDF-Format, für den Fernseher oder ein schickes Bildchen als Bildschirmhintergrund oder oder oder… die Möglichkeiten sind schier unbegrenzt. Auf der anderen Seite gibt es natürlich auch I-Net Nutzer die auch Dinge hochladen.

Hier möchte ich kurz erklären wie man es als PHP Programmierer lösen kann. Viele Wege führen bekanntlich nach Rom. Hier mein Weg.
Als erstes der Upload. Hier brauchen wir natürlich überhaupt erst einmal eine HTML-Form mit einem Dateifeld. In seiner einfachsten Form würde das so aussehen:

<form enctype="multipart/form-data" method="post">
<input name="file" type="file" />
<input name="Submit" type="submit" value="Senden" />
</form>

Hier kann der User dann seine Datei auswählen und die Form abschicken. Damit wird, in diesem Fall, die Datei erneut aufgerufen und die Formulardaten mit übergeben. Sprich die Dateidaten. Diese können nun mit PHP erfasst und ausgewertet werden.

if(!empty($_FILES["file"]["name"])) {
	$UploadFolder = "./uploads/";

	//Dateinamen auf ungueltige Zeichen pruefen
	$Dateiname = preg_replace('/[^a-z0-9.-_]/', '', strtolower($_FILES["file"]["name"]));

	//Existiert die Datei auch noch nicht
	if(!file_exists($UploadFolder.$Dateiname)) {
		//An die richtige Stelle kopieren
		move_uploaded_file($_FILES['file']['tmp_name'], $UploadFolder.$Dateiname);
		if(!file_exists($UploadFolder.$Dateiname)) {
			echo "Datei konnte nicht hochgeladen werden. Bitte wenden Sie sich an einen Administrator.";
		} else {
			//Datei ist hochgeladen
		}
	} else {
		echo "Es existiert bereits eine Datei mit diesem Dateinamen. Bitte bennenen Sie die Datei um.";
	}
}

So. Damit haben wir die Datei hochgeladen und in dem Ordner „Uploads“ abgelegt. Das ist natürlich nicht alles. Jeder muss hier seinen eigenen Weg gehen.
Der Dateiname muss z.B. irgendwo (Datenbank) gespeichert werden, damit sich das System später daran “erinnert”. Aber für den Upload selbst reicht das.

Kommen wir zum 2. Teil. Dem Download der Datei.

Ein User hat jetzt eine Bedienungsanleitung auf einer Webseite hochgeladen und für andere Benutzer zum Download zur Verfügung gestellt. Jetzt kommt ein anderer User und möchte die Datei downloaden.

Als Programmierer wäre es das einfachste einfach einen Link zu veröffentlichen der auf die Datei, im Dateisystem, zeigt. Das hätte aber den Nachteil das dieser Link kopiert werden könnte und jeder die Datei einfach herunterladen kann. Schlecht wenn das vielleicht eigentlich nur registrierte Mitglieder dürfen sollen.
Also muss eine andere Lösung her. Hier wieder mein Weg nach Rom ;-)

$UploadFolder = "./uploads/"; //Name des Ordners mit der Downloaddatei
$FileName = "musterdatei.pdf"; //Name der Downloaddatei

header("Content-Type: ".$mimeType);
header("Content-Length: ".filesize($UploadFolder.$FileName));
header("Content-Disposition: attachment; filename="".$FileName.""");
readfile($UploadFolder.$FileName);
exit;

Ja, das war es schon ;-) Aber es ist etwas komplizierter als es auf den ersten Blick scheint. Ich denke die ersten beiden Variablen sind klar. Der Content-Type beschreibt die Datei. Ob es ein Bild, PDF, Word-Dokument oder sonst was ist. Am besten ist hier diesen beim Upload gleich mit zu speichern. Denn das ist der einzige Zeitpunkt wo Du den Content Type “geliefert” bekommst. Sonst könnte man ihn noch über die Dateierweiterung rausbekommen.

Content-Length ist die Länge der Datei. Vorsicht, nicht wirklich die Größe. Da 1 Zeichen aber einem Byte entspricht – wie praktisch – können wir einfach die Dateigröße in Byte (!) angeben. ;-)

Bei Content-Disposition wird einfach gesagt Dateianhang und den Dateinamen. Hier muss nicht der Originale Dateiname angegeben werden, es könnte auch ein fiktiver angegeben werden.

Und zu guter letzt noch mit readfile die Datei einlesen und gleichzeitig ausgeben.

Ganz wichtig ist hier noch das vor diesem Code keine Ausgabe an den Browser gemacht werden darf. Am besten ist es für den Download eine eigene Datei zu erstellen und vor diesem Code nur das nötigste zu tun. Zum Beispiel checken ob der User, der den Download starten möchte, auch die Berechtigung hat oder die Variablen aus einer Datenbank auslesen. Aber keinerlei ausgaben an den Browser machen, sonst erscheinen ganz viele komische Zeichen im Browser ;-)

.htaccess – Webseite mit oder ohne WWW

Hallo,

da meine Lieblingsseite, zur Frage “www erzwingen bei einer Webseite durch .htaccess”, anscheinend nicht mehr online ist, nehme ich mir einfach mal die Freiheit raus hier selbst einen Artikel darüber zu schreiben und den Ansatz zu kopieren.

Also, es ist ja (hoffentlich) allseits bekannt das Google keinen Dublicated Contant mag (also mehrfach die gleichen Texte). Das passiert natürlich auch wenn man eine Webseite einmal mit “www” und einmal ohne aufrufen kann. Deswegen gibt es eine Umleitung. Wenn ein User die Webseite ohne “www” aufruft dann wird er gleich zur Webseite mit “www” Umgeleitet.

Das ist jedoch auch interessant wenn man mit seiner Webseite von http://www.domainA.de zu http://www.domainB.de umgezogen ist.
Der unten stehende Code ist einer der besten die ich jemals im Netz gesehen habe. Denn er funktioniert 1a und ist flexibel. Außerdem werden auch Parameter mit übergeben. Es geht also nichts verloren bei der Umleitung (Dateinamen, Parameter, etc.)

Hier nun der Code. Einfach die Domain anpassen und in die eigene .htaccess einbauen:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^domainA.de$ [NC]
RewriteRule ^(.*) http://www.domainA.de%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTP_HOST} ^domainA.de$ [NC]
RewriteRule ^(.*) http://www.domainA.de/ [L,R=301]

[PrestaShop] Rechnungs-PDF in Bestell-E-Mail

Hallo zusammen,

heute gab es mal wieder ein problem zu lösen das evtl. auch andere interessieren könnte. Zumindest jeden der einen PrestaShop im einsatz hat.

Das problem: Wenn ein kunde etwas im shop bestellt dann erhält er natürlich eine bestellbestätigung per email. Nur wird hier die rechnung nicht mitgeschickt.

Die lösung: Recht einfach, nur nicht einfach zu finden. :-)

Schritt 1) In den administrationsbereich des shops gehen und hier auf “orders” -> “statuses” klicken (sorry, ist bei mir die englische version). Dann in der tabelle bei “invoice” alles anklicken außer “Chanceled” und “Payment error”. – Das müssen wir machen da sonst die rechnung nicht direkt bei der bestellung generiert wird.

Schritt 2) Jetzt müssen wir ein bisschen in den quellcode. Suche die datei “/classes/paymentmodule.php” und suchen sie die folgende passage (ungefähr bei zeile 350):

// Join PDF invoice
if (intval(Configuration::get('PS_INVOICE')) AND Validate::isLoadedObject($orderStatus) AND $orderStatus->invoice AND $order->invoice_number)
{
	$fileAttachment['content'] = PDF::invoice($order, 'S');
	$fileAttachment['name'] = Configuration::get('PS_INVOICE_PREFIX', intval($order->id_lang)).sprintf('%06d', $order->invoice_number).'.pdf';
	$fileAttachment['mime'] = 'application/pdf';
}
else
	$fileAttachment = NULL;

und mache daraus:

// Join PDF invoice
//if (intval(Configuration::get('PS_INVOICE')) AND Validate::isLoadedObject($orderStatus) AND $orderStatus->invoice AND $order->invoice_number)
//{
	$fileAttachment['content'] = PDF::invoice($order, 'S');
	$fileAttachment['name'] = Configuration::get('PS_INVOICE_PREFIX', intval($order->id_lang)).sprintf('%06d', $order->invoice_number).'.pdf';
	$fileAttachment['mime'] = 'application/pdf';
//}
//else
//	$fileAttachment = NULL;

Jetzt wird immer eine Rechnung an die mail angehängt. Es gibt aber noch einen kleinen schönheitsfehler. Den bügeln wir so aus… ca. zeile 300 suchen… sieht in etwa so aus.

...
	// Send an e-mail to customer
	if ($id_order_state != _PS_OS_ERROR_ AND $id_order_state != _PS_OS_CANCELED_ AND $customer->id)
	{
		$invoice = new Address(intval($order->id_address_invoice));
		$delivery = new Address(intval($order->id_address_delivery));
		$carrier = new Carrier(intval($order->id_carrier));
		$delivery_state = $delivery->id_state ? new State(intval($delivery->id_state)) : false;
		$invoice_state = $invoice->id_state ? new State(intval($invoice->id_state)) : false;
...

und hängen da einfach die folgende (letzte) zeile dran

...
	// Send an e-mail to customer
	if ($id_order_state != _PS_OS_ERROR_ AND $id_order_state != _PS_OS_CANCELED_ AND $customer->id)
	{
		$invoice = new Address(intval($order->id_address_invoice));
		$delivery = new Address(intval($order->id_address_delivery));
		$carrier = new Carrier(intval($order->id_carrier));
		$delivery_state = $delivery->id_state ? new State(intval($delivery->id_state)) : false;
		$invoice_state = $invoice->id_state ? new State(intval($invoice->id_state)) : false;
		$order = new Order(intval($order->id));
...

Damit sollte es funktionieren und schön aussehen :-)

Wer nun, wie ich, noch änderungen an der rechnung selbst vornehmen möchte der muss leider auch in den code. Die datei ist “/classes/PDF.php”. Aber bitte nur für änderungen die sonst nicht vorgenommen werden können. Adresse und footer und so kann alles im admin eingestellt werden ;)

Soweit erst einmal dazu. Bei fragen, bitte gleich fragen… bevor ich wieder vergessen hab wie das war :-)

Achso… prestashop 1.3.0.10

Affiliate Tracking Code in PrestaShop einbinden

Hallo zusammen,

da ich jetzt meinen ersten eigenen Online-Shop eröffnet habe bin ich auch schnell auf die Frage gestoßen wie die Kunden zu mir finden. Oder wer mir dabei helfen kann.
Schnell war eine Antwort gefunden… Affiliate Marketing. Das gefällt mir im Moment eh am besten von den Marketingmethoden die ich so kenne und wofür mein Geldbeutel reicht. Alles andere ist entweder unwirtschaftlich oder schlicht zu teuer… meist beides.

Also habe ich bei beim Affiliatenetzwerk meines Vertrauens eine neue Kampagne gestartet und dann die große Frage… wie kriege ich den Tracking-Code in meinen Presta Shop System? :-o
Das ist gar nicht so einfach da ja auch noch variablen übergeben werden müssen.

Zum Glück gibt es ja das Internet :-) Und so wurde ich in einem Forum fündig. Hier das Zitat der Zusammenfassung von PaoloPinkel

 

1.) In die init.php gehört folgendes:

@session_start();
if(Tools::getValue('belboon')){
  $_SESSION['belboonSession'] = Tools::getValue('belboon');
}

2.) In die order-confirmation.php gehört:

$smarty->assign('belboon',$order->getTotalProductsWithTaxes());
$smarty->assign('belboonSession',$_SESSION['belboonSession']);

3.) In die order-confirmation.tpl, gehört der von Belboon vorgegebene Code. In diesem Code-Schnipsel ersetzt man NETTOWARENWERT durch {$belboon}, ORDERCODE durch {$id_order} und xxxx,yyyy durch {$belboonSession}.

Das war’s. Wer Umsatzsteuer abführt, muß von getTotalProductsWithTaxes() irgendwie noch die Steuern abziehen, sonst zahlt er zu viel Provision.

(Zitat von http://www.homepage-community.de/…)

PaoloPinkel hat sich bei Belboon angmeldet. Ich nutze ein anders Netzwerk. Ist aber das gleiche Prinzip. Man muss nur die Variablen anpassen.

Danke an PaoloPinkel und Chris.

Viele Grüße
Gordon

[PHP] Alle belegten Variablen anzeigen/ausgeben

Hallo,

heute habe ich mich spaßeshalber mal gefragt wie eigentlich die variablen am Ende meines Skripts aussehen. Ich meine da wird eine variable vergeben, Skripte included, datenbankabfragen gemacht… und ich bemühe mich immer die variablen wieder frei zu geben wenn ich sie nicht mehr brauche. Aber erwische ich auch alle… oder Frist mein Skript mehr und mehr speicher? Und wie kann ich das kontrollieren?

Es gibt auch hier eine Funktion in PHP die das beantworten kann. get_defined_vars() gibt alle aktuell belegten variablen aus.

print_r(get_defined_vars());

Dieser Aufruf am Ende eines Skriptes (oder irgendwo mittendrin) und man weiß sofort welche Variablen belegt sind und wo man noch aufräumen muss/kann.

Sehr schön :-)

Gruss
Gordon

[PHP] Array in ein String umwandeln

Hallo zusammen,

heute mal wieder etwas das ich des öfteren benötige. Ein Array in einen String umwandeln… um ihn dann, zum Beispiel, in eine Datenbank oder ein Cookie zu schreiben.

Das geht zum einen sehr einfach mit implode und mit explode um ihn wieder in ein Array zu verwandeln.

$String = implode(";", $Array);

und

$Array = explode(";", $String);

 

Soweit, sogut. Kommt man nun aber mit einem multidimensionalen Array daher, sieht es mit dieser Methode schon schwierig aus. Man müsste jetzt das ganze rekursiv machen und das ist umständlich und stößt auch ganz schnell an seine Grenzen.

Hier gibt es aber noch eine andere schöne Funktion in PHP. Das Zauberwort heißt serialize bzw. unserialize. Diese Funktion macht jedes Array zu einem String… oder wie das PHP Handbuch sagt ‘speicherbare Repräsentation’… schönes Wort :-)

$String = serialize($Array);

und

$Array = unserialize($String);

Einfach und simpel… so wie es sein soll ;-)

Gruss
Gordon

[PHP] Passwort generieren

Hi,

da ich auch das ab und zu brauche und jedes mal eine gute Funktion suche… hier meine Gedächtnissstütze :-)

$pwZeichen = 'wertzupasdfghkyxcvbnmWERTZUPLKJHGFDSAYXCVBNM23456789';
srand ((double)microtime()*1000000);
for($i = 0; $i < 5; $i++) {
$passwort .= substr( $pwZeichen, (rand()%(strlen ($pwZeichen) ) ), 1);
}

In der Variable $pwZeichen sind alle Zeichen aufgeführt die in dem Passwort verwendet werden. srand startet den Zufallsgenerator (sonst würde das Passwort aus ein und dem selben Zeichen bestehen ;-)
Die ‘for’-Schleife bestimmt wieviele Zeichen das Passwort hat. Hier 5. Du kannst den Wert aber auch verändern. Und zu guter letzte werden die Zeichen hintereinander in die Variable $passwort geschrieben.

Das wars schon ;-)

[PHP] Nur Buchstaben und Zahlen im String lassen

Nachdem ich diesen Schnipsel heute zum bestimmt 10 mal gesucht habe wird es jetzt Zeit ihn endlich mal hier zu verewigen.

Ihr kennt das vielleicht… da hat man einen String – egal ob einen Dateinamen beim Dateiupload oder eine Usereingabe in einem Textfeld – und dort stehen Sachen drin die man einfach sooo nie wollte.

Bestes Beispiel war heute eine Kundin die mir Mitteilte das sie Bilder in ein Systemhochladen wollte und die Bilder werden einfach nicht angenommen. Beim Blick auf den Dateinamen im Ordner wurde mir klar warum der Browser nix anzeigte… der Dateiname lautete: “1_tr352&amp;3 web2 the hill Da3 DSC03254.jpg”…
Genau für soetwas ist die folgende Funktion wundervoll… sie macht daraus einfach “3_1tr352amp3web2thehillDa3DSC03254.jpg”… gut, immer noch nicht schön… aber besser und der Browser kommt mit klar.

Anderes, einfacheres Beispiel… der User gibt irgendwo “bla(§blub1.- Dß?3äüö” ein (warum auch immer)… die Funktion macht daraus “blablub1D3”.

Man kann natürlich auch noch andere Zeichen zulassen, wie z.B. Umlaute, Leerzeichen, Punkt, Komma, etc. Was man möchte.

Hier nun die Funktion:

$String = preg_replace('/[^a-z0-9]/', '', $String); //nur kleine Buchstaben und Zahlen

$String = preg_replace('/[^a-zA-Z0-9]/', '', $String); //kleine und grosse Buchstaben und Zahlen

$String = preg_replace('/[^a-zA-Z0-9äÄöÖüÜß]/', '', $String); //kleine und grosse Buchstaben, Umlaute und Zahlen

$String = preg_replace('/[^a-zA-Z0-9äÄöÖüÜß., ]/', '', $String); //kleine und grosse Buchstaben, Umlaute, Komma, Punkt, Leerzeichen und Zahlen

[CSS] Tooltips ohne Javascript!

Hallo zusammen,

heute mal wieder ein netter Codeschnipsel für den täglichen Einsatz :)
Wie in der Überschrift schon erwähnt, es geht um einen Tooltip ohne Javascript. Jeder kenn sicher diese kleinen Fensterchen (oder auch Sprechblase genannt) das aufgeht wenn man mit der Maus über einem Objekt steht. Ob dort nun kleine Informationen oder Hilfen angezeigt werden… der Verwendungszweck ist sehr unterschiedlich.

Meist werden diese Fenster per Javascript initialisiert. Das aber kann auch Probleme mit sich bringen. So wie ich es jetzt mitkriegen musste. Ich wollte in solch einem Javascript Tooltip ein weiteres Java (Ajax) ausführen… nicht möglich. Auch ist es per CSS schöner falls der User gar keine Javascript aktiviert hat. Und es sieht per CSS nicht schlechter aus!

Dieser Codeschnipsel ist mal nicht von mir. Zu finden ist er bei: Trent Richardson

Ich wünsche viel Spaß damit ;)

Gruß
Gordon