diff --git a/Makefile b/Makefile index b78bc963557de6d32c7b1e05d39be4173dca8bd6..39da238db9a3363e728b401f8fa2996193c76b2c 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ BASE=ordernumber PLUGINTYPE=vmshopper -VERSION=1.2 +VERSION=1.3 PLUGINFILES=$(BASE).php $(BASE).xml index.html # TRANSDIR=../../../administrator/language/ diff --git a/de-DE.plg_vmshopper_ordernumber.sys.ini b/de-DE.plg_vmshopper_ordernumber.sys.ini index ff13fdf62d81cdcda0bfaa3ce190669693315b81..e457b8bf38ffeae04484531c7c0d103e45097f8a 100644 --- a/de-DE.plg_vmshopper_ordernumber.sys.ini +++ b/de-DE.plg_vmshopper_ordernumber.sys.ini @@ -2,11 +2,11 @@ ; Copyright (C) 2012 Reinhold Kainhofer. All rights reserved. ; License http://www.gnu.org/licenses/gpl.html GNU/GPL ; Note : All ini files need to be saved as UTF-8 - No BOM -VMSHOPPER_ORDERNUMBER = "VM2 - Plugin zur Einstellung zu Bestellungs- und Rechnungsnummern" -VMSHOPPER_ORDERNUMBER_DESC = "Dieses Plugin erlaubt es Ihnen, das Format von Bestellungs- und Rechnungsnummern in VirtueMart 2 anzupassen.<br/><br/> +VMSHOPPER_ORDERNUMBER = "VM2 - Plugin zur Anpassung von Auftrags- und Rechnungsnummern" +VMSHOPPER_ORDERNUMBER_DESC = "Dieses Plugin erlaubt es Ihnen, das Format von Auftrags- und Rechnungsnummern in VirtueMart 2 anzupassen.<br/><br/> <div style='font-weight: normal'> <p style='font-weight: normal'> - Das Format der Bestellungs- und Rechnungsnummern ist ein einfacher Text, wobei <tt>#</tt> die laufende Nummer anzeigt und <tt>[variable]</tt> als Variable interpretiert und durch deren Wert ersetzt wird. Aktuell sind folgende Variablen möglich (Groß-/Kleinschreibung ist egal):<table border=1> + Das Format der Auftrags- und Rechnungsnummern ist ein einfacher Text, wobei <tt>#</tt> die laufende Nummer anzeigt und <tt>[variable]</tt> als Variable interpretiert und durch deren Wert ersetzt wird. Aktuell sind folgende Variablen möglich (Groß-/Kleinschreibung ist egal):<table border=1> <tr><td>year</td><td>Aktuelles Jahr (4 Ziffern)</td></tr> <tr><td>year2</td><td>Aktuelles Jahr (2 Ziffern)</td></tr> <tr><td>month</td><td>Aktuelles Monat (2 Ziffern); mit führenden Nullen wenn nötig</td></tr> @@ -26,8 +26,8 @@ VMSHOPPER_ORDERNUMBER_DESC = "Dieses Plugin erlaubt es Ihnen, das Format von Bes <tr><td>userID</td><td>(Interne) VirtueMart Benutzer ID</td></tr> <tr><td>IPaddress</td><td>IP-Addresse des Käufers</td></tr> <tr><th colspan=2><em>Nur für Rechnungsnummern:</em></td></tr> - <tr><td>orderNumber</td><td>Bestellungsnummer, für die die Rechnung erstellt wird</td></tr> - <tr><td>orderID</td><td>(Interne) Bestellungs-ID, für die die Rechnung erstellt wird</td></tr> + <tr><td>orderNumber</td><td>Auftragsnummer, für die die Rechnung erstellt wird</td></tr> + <tr><td>orderID</td><td>(Interne) Auftrags-ID, für die die Rechnung erstellt wird</td></tr> <tr><td>Lastname</td><td>Nachname des Käufers (Rechnungsadresse)</td></tr> <tr><td>Firstname</td><td>Vorname des Käufers (Rechnungsadresse)</td></tr> <tr><td>Company</td><td>Unternehmen des Käufers (Rechnungsadresse)</td></tr> @@ -44,19 +44,19 @@ PLG_ORDERNUMBER_NO = "Nein" PLG_ORDERNUMBER_COUNTER_GLOBAL="Global" PLG_ORDERNUMBER_COUNTER_PERFORMAT = "Eigener Zähler pro Formatwert" -PLG_ORDERNUMBER_ORDERNR = "<b>Bestellungsnummern</b>" -PLG_ORDERNUMBER_ORDERNR_CUSTOMIZE = "Bestellungsnummern anpassen" -PLG_ORDERNUMBER_ORDERNR_CUSTOMIZE_DESC = "Hier ankreuzen, wenn Sie Ihre Bestellungsnummern anpassen möchten und nicht die Standardeinstellung benutzen möchten." -PLG_ORDERNUMBER_ORDERNR_FMT="Format der Bestellungsnummern" -PLG_ORDERNUMBER_ORDERNR_FMT_DESC="Hier können Sie Ihr eigenes Format für Bestellungsnummern angeben." +PLG_ORDERNUMBER_ORDERNR = "<b>Auftragsgsnummern</b>" +PLG_ORDERNUMBER_ORDERNR_CUSTOMIZE = "Auftragsnummern anpassen" +PLG_ORDERNUMBER_ORDERNR_CUSTOMIZE_DESC = "Hier ankreuzen, wenn Sie Ihre Auftragsnummern anpassen möchten und nicht die Standardeinstellung benutzen möchten." +PLG_ORDERNUMBER_ORDERNR_FMT="Format der Auftragsnummern" +PLG_ORDERNUMBER_ORDERNR_FMT_DESC="Hier können Sie Ihr eigenes Format für Auftragsnummern angeben." PLG_ORDERNUMBER_ORDERNR_COUNTER = "Zähler" PLG_ORDERNUMBER_ORDERNR_COUNTER_DESC = "Wählen Sie aus, ob der Zähler global oder pro Formatwert laufen soll. Z.B. beginnt bei einem Format '[year]-#' und einem Zähler pro Formatwert der Zähler jedes Jahr bei 1." -PLG_ORDERNUMBER_PASSWD = "<b>Bestellungspasswort</b>" -PLG_ORDERNUMBER_PASSWD_CUSTOMIZE = "Bestellungspasswort anpassen" -PLG_ORDERNUMBER_PASSWD_CUSTOMIZE_DESC = "Hier ankreuzen, wenn Sie Ihre Bestellungspasswörter anpassen möchten und nicht die Standardeinstellung benutzen möchten." -PLG_ORDERNUMBER_PASSWD_FMT = "Format of the order password" -PLG_ORDERNUMBER_PASSWD_FMT_DESC = "Hier können Sie Ihr eigenes Format für Bestellungspasswörter angeben (# wird nicht ersetzt)." +PLG_ORDERNUMBER_PASSWD = "<b>Auftragspasswort</b>" +PLG_ORDERNUMBER_PASSWD_CUSTOMIZE = "Auftragspasswort anpassen" +PLG_ORDERNUMBER_PASSWD_CUSTOMIZE_DESC = "Hier ankreuzen, wenn Sie Ihre Auftragspasswörter anpassen möchten und nicht die Standardeinstellung benutzen möchten." +PLG_ORDERNUMBER_PASSWD_FMT = "Format der Auftragspasswörter" +PLG_ORDERNUMBER_PASSWD_FMT_DESC = "Hier können Sie Ihr eigenes Format für Auftragspasswörter angeben (# wird nicht ersetzt)." PLG_ORDERNUMBER_INVOICENR = "<b>Rechnungsnummern</b>" PLG_ORDERNUMBER_INVOICENR_CUSTOMIZE = "Rechnungsnummern anpassen" diff --git a/ordernumber.php b/ordernumber.php index 82516c69a4e9ab2e5cd2669c4e5f584f80b58b6d..c34aacc048e3d3d94e18554f6e9b87ab31dcbd9e 100644 --- a/ordernumber.php +++ b/ordernumber.php @@ -10,6 +10,63 @@ defined('_JEXEC') or die( 'Direct Access to ' . basename( __FILE__ ) . ' is not allowed.' ) ; if (!class_exists('vmShopperPlugin')) require(JPATH_VM_PLUGINS . DS . 'vmshopperplugin.php'); +/* For php 5.2 we cannot use lambda functions or any other way to pass local variables to the callback. + The only way to pass a local variable to a callback for preg_replace_callback is to + create a class instance... */ +class ReplacementCallback { + private $orderDetails; + + function __construct($orderDetails) { + $this->orderDetails = $orderDetails; + } + + function replace ($match) { + $varname = strtolower($match[1]); + switch ($varname) { + case "year": return date ("Y"); + case "year2": return date ("y"); + case "month": return date("m"); + case "day": return date("d"); + case "hour": return date("H"); + case "hour12": return date("h"); + case "ampm": return date("a"); + case "minute": return date("i"); + case "second": return date("s"); + case "random": + /* the regexp matches (random)(Type)(Len) as match 1 to 3, Len is optional */ + $len = ($match[3]?$match[3]:1); + // Fallback: If no Type is given, use Digit + $alphabet = "0123456789"; + // Select the correct alphabet depending on Type + switch (strtolower($match[2])) { + case "digit": $alphabet = "0123456789"; break; + case "hex": $alphabet = "0123456789abcdef"; break; + case "letter": $alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; break; + case "uletter": $alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; break; + case "lletter": $alphabet = "abcdefghijklmnopqrstuvwxyz"; break; + case "alphanum": $alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; break; + } + return self::randomString ($alphabet, $len); + case "vendorid": return ($this->orderDetails->virtuemart_vendor_id); + case "userid": return ($this->orderDetails->virtuemart_user_id); + case "ipaddress": return ($this->orderDetails->ip_address); + + // Only for Invoice: + case "ordernumber": return ($this->orderDetails->order_number); + case "orderid": return ($this->orderDetails->virtuemart_order_id); + case "lastname": return ($this->orderDetails->last_name); + case "firstname": return ($this->orderDetails->first_name); + case "company": return ($this->orderDetails->company); + case "city": return ($this->orderDetails->city); + case "zip": return ($this->orderDetails->zip); + case "orderstatus": return ($this->orderDetails->order_status); + } + // No variable type matched, so don't replace, return the original string + return $match[0]; + } +} + + class plgVmShopperOrdernumber extends vmShopperPlugin { function __construct(& $subject, $config) { @@ -47,50 +104,6 @@ class plgVmShopperOrdernumber extends vmShopperPlugin { } /* Replace the format variables, match[1] is the variable name, match[2] and match[3] are only used for random fields */ - static function replacementCallback ($match, $orderDetails) { - $varname = strtolower($match[1]); - switch ($varname) { - case "year": return date ("Y"); - case "year2": return date ("y"); - case "month": return date("m"); - case "day": return date("d"); - case "hour": return date("H"); - case "hour12": return date("h"); - case "ampm": return date("a"); - case "minute": return date("i"); - case "second": return date("s"); - case "random": - /* the regexp matches (random)(Type)(Len) as match 1 to 3, Len is optional */ - $len = ($match[3]?$match[3]:1); - // Fallback: If no Type is given, use Digit - $alphabet = "0123456789"; - // Select the correct alphabet depending on Type - switch (strtolower($match[2])) { - case "digit": $alphabet = "0123456789"; break; - case "hex": $alphabet = "0123456789abcdef"; break; - case "letter": $alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; break; - case "uletter": $alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; break; - case "lletter": $alphabet = "abcdefghijklmnopqrstuvwxyz"; break; - case "alphanum": $alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; break; - } - return self::randomString ($alphabet, $len); - case "vendorid": return ($orderDetails->virtuemart_vendor_id); - case "userid": return ($orderDetails->virtuemart_user_id); - case "ipaddress": return ($orderDetails->ip_address); - - // Only for Invoice: - case "ordernumber": return ($orderDetails->order_number); - case "orderid": return ($orderDetails->virtuemart_order_id); - case "lastname": return ($orderDetails->last_name); - case "firstname": return ($orderDetails->first_name); - case "company": return ($orderDetails->company); - case "city": return ($orderDetails->city); - case "zip": return ($orderDetails->zip); - case "orderstatus": return ($orderDetails->order_status); - } - // No variable type matched, so don't replace, return the original string - return $match[0]; - } function replace_fields ($fmt, $orderDetails) { // Match variables for the form random[type][count] and everything else. @@ -99,12 +112,19 @@ class plgVmShopperOrdernumber extends vmShopperPlugin { '/\[(random)(.*?)([0-9]*?)\]/', // For randomTypeN, spit the three parts '/\[([^\]]+)\]/' // Everything else matches whole variable name ); - $callback = function ($match) use ($orderDetails) { - return self::replacementCallback ($match, $orderDetails); - }; - - return preg_replace_callback ($patterns, $callback, $fmt); -// return preg_replace_callback ($patterns, function ($match) use ($orderDetails) { return self::replacementCallback ($match, $orderDetails); }, $fmt); +// // TODO: in php 5.3 and 5.4 we can easier pass $orderDetails to the callback +// function my_callback ($match) { +// return self::replacementCallback ($match, $orderDetails); +// }; +// return preg_replace_callback ($patterns, +// function ($match) use ($orderDetails) { +// return self::replacementCallback ($match, $orderDetails); +// }, $fmt); + + /* php 5.2 does not allow lambda functions and there is no other way to + pass a local variable to the callback than a class instance! */ + $callback = new ReplacementCallback ($orderDetails); + return preg_replace_callback ($patterns, array($callback, 'replace'), $fmt); } /* Type 0 means order number, type 1 means invoice number */ @@ -154,8 +174,6 @@ class plgVmShopperOrdernumber extends vmShopperPlugin { } function plgVmOnUserInvoice($orderDetails,&$data) { - // print("<pre>plgVmOnUserInvoice, orderDetails=");print_r($orderDetails);print("</pre>"); - // print("<pre>plgVmOnUserInvoice, data=");print_r($data);print("</pre>"); // Is order number customization enabled? if ($this->params->get('customize_invoice_number')) { // check the default configuration @@ -168,7 +186,6 @@ class plgVmShopperOrdernumber extends vmShopperPlugin { $fmt = $this->params->get ('invoice_number_format', "#"); $global = $this->params->get ('invoice_number_global', 1); $invoicenr = $this->format_number ($fmt, (object)$orderDetails, $nrtype, $global); - // print("<pre> invoice nr format: $fmt, resulting in $invoicenr</pre>"); $data['invoice_number'] = $invoicenr; } } diff --git a/ordernumber.xml b/ordernumber.xml index 683d48de9fbefec563997904306518ca312d69ed..c2abd488afbb88a8ff88478b59722fda23944296 100644 --- a/ordernumber.xml +++ b/ordernumber.xml @@ -7,7 +7,7 @@ <authorUrl>http://www.kainhofer.com/</authorUrl> <copyright>Copyright (C) 2012 Reinhold Kainhofer. All rights reserved.</copyright> <license>http://www.gnu.org/licenses/gpl-3.0.html GNU/GPLv3</license> - <version>1.1.0</version> + <version>1.3.0</version> <releaseDate>2012-11-13</releaseDate> <releaseType>Major update</releaseType> <downloadUrl>http://www.kainhofer.com/virtuemart-2-extensions/</downloadUrl> @@ -47,7 +47,7 @@ <option value="1">PLG_ORDERNUMBER_YES</option> <option value="0">PLG_ORDERNUMBER_NO</option> </field> - <field name="invoice_number_format" type="text" default="[year]/#" label="PLG_ORDERNUMBER_INVOICENR_FMT" description="PLG_ORDERNUMBER_INVOICENR_FMT_DESC"/> + <field name="invoice_number_format" type="text" default="[year]-#" label="PLG_ORDERNUMBER_INVOICENR_FMT" description="PLG_ORDERNUMBER_INVOICENR_FMT_DESC"/> <field name="invoice_number_global" type="radio" default="0" label="PLG_ORDERNUMBER_INVOICENR_COUNTER" description="PLG_ORDERNUMBER_INVOICENR_COUNTER_DESC"> <option value="1">PLG_ORDERNUMBER_COUNTER_GLOBAL</option> <option value="0">PLG_ORDERNUMBER_COUNTER_PERFORMAT</option> diff --git a/releases/plg_vmshopper_ordernumber_v1.3.zip b/releases/plg_vmshopper_ordernumber_v1.3.zip new file mode 100644 index 0000000000000000000000000000000000000000..6b1e35b916d01a4933767507b984cc5591d3f2f6 Binary files /dev/null and b/releases/plg_vmshopper_ordernumber_v1.3.zip differ