From 1a6682c01a23bce459ee8d65318b8e65f88c25bb Mon Sep 17 00:00:00 2001
From: Reinhold Kainhofer <reinhold@kainhofer.com>
Date: Sat, 17 Nov 2012 14:05:40 +0100
Subject: [PATCH] Version 1.3: Fix php 5.2 for real, fix german translation

---
 Makefile                                    |   2 +-
 de-DE.plg_vmshopper_ordernumber.sys.ini     |  30 ++---
 ordernumber.php                             | 123 +++++++++++---------
 ordernumber.xml                             |   4 +-
 releases/plg_vmshopper_ordernumber_v1.3.zip | Bin 0 -> 7983 bytes
 5 files changed, 88 insertions(+), 71 deletions(-)
 create mode 100644 releases/plg_vmshopper_ordernumber_v1.3.zip

diff --git a/Makefile b/Makefile
index b78bc96..39da238 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 ff13fdf..e457b8b 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 82516c6..c34aacc 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 683d48d..c2abd48 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
GIT binary patch
literal 7983
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
E0EG3iu>b%7

literal 0
HcmV?d00001

-- 
GitLab