From ba323cf4dcf12406ce9e3caa880bd4ea06a9c790 Mon Sep 17 00:00:00 2001
From: Reinhold Kainhofer <reinhold@kainhofer.com>
Date: Sat, 27 Dec 2014 02:22:38 +0100
Subject: [PATCH] Implemanted custom variables / variable replacements

---
 .../Ordernumber/Block/Replacements.php        | 33 +++++-----
 .../OpenTools/Ordernumber/Helper/Data.php     | 63 ++++++++++++++++++-
 .../Model/Backend/Replacements.php            | 39 ++++++++++++
 .../OpenTools/Ordernumber/Model/Observer.php  |  6 +-
 .../OpenTools/Ordernumber/etc/system.xml      |  2 +-
 5 files changed, 120 insertions(+), 23 deletions(-)
 create mode 100644 app/code/community/OpenTools/Ordernumber/Model/Backend/Replacements.php

diff --git a/app/code/community/OpenTools/Ordernumber/Block/Replacements.php b/app/code/community/OpenTools/Ordernumber/Block/Replacements.php
index 02fcc0b..0f812f5 100644
--- a/app/code/community/OpenTools/Ordernumber/Block/Replacements.php
+++ b/app/code/community/OpenTools/Ordernumber/Block/Replacements.php
@@ -4,11 +4,11 @@ class OpenTools_Ordernumber_Block_Replacements extends Mage_Adminhtml_Block_Syst
 	protected $_addRowButtonHtml = array();
 	protected $_deleteRowButtonHtml = array();
 
-// 	function logitem($label, $item) {
-// 		Mage::Log($label . " " . get_class($item) . "\n", null, 'ordernumber.log');
-// 		Mage::Log(is_array($item)?$item:$item->debug(), null, 'ordernumber.log');
-// 		Mage::Log(get_class_methods(get_class($item)), null, 'ordernumber.log');
-// 	}
+	function logitem($label, $item) {
+		Mage::Log($label . " " . get_class($item) . "\n", null, 'ordernumber.log');
+		Mage::Log(is_array($item)?$item:$item->debug(), null, 'ordernumber.log');
+		Mage::Log(get_class_methods(get_class($item)), null, 'ordernumber.log');
+	}
 
 	/**
 	 * Returns html part of the setting.
@@ -29,9 +29,9 @@ class OpenTools_Ordernumber_Block_Replacements extends Mage_Adminhtml_Block_Syst
 		$html .= $this->_getRowHeader();
 
 // $this->logitem("render element: ", $element);
-		if ($this->_getValue('conditionvar')) {
-		    foreach ($this->_getValue('conditionvar') as $i => $var) {
-                $html .= $this->_getRowHtml($i);
+		if ($this->_getValue('')) {
+		    foreach ($this->_getValue('') as $i => $values) {
+                $html .= $this->_getRowHtml($i, $values);
 		    }
 		} else {
 		    $html .= $this->_getEmptyRowHtml();
@@ -161,16 +161,17 @@ class OpenTools_Ordernumber_Block_Replacements extends Mage_Adminhtml_Block_Syst
 	 * @param int $rowIndex
 	 * @return string
 	 */
-	protected function _getRowHtml($rowIndex = -1)
+	protected function _getRowHtml($rowIndex = -1, $values = array())
 	{
 	    static $class = 'odd';
+	    $disabled = $this->_getDisabled($rowIndex == -1);
 		$html  = '<tr class="'.$class.'">';
 		$class = ($class=='odd')?'even':'odd';
-		$html .= '<td class="oton-replacement-variable"><input name="' . $this->getElement()->getName() . '[conditionvar][]" value="' . $this->_getValue('conditionvar/' . $rowIndex) . '" ' . $this->_getDisabled($rowIndex == -1) . '/></td>';
-		$html .= '<td class="oton-replacement-value"   ><input name="' . $this->getElement()->getName() . '[conditionval][]" value="' . $this->_getValue('conditionval/' . $rowIndex) . '" ' . $this->_getDisabled($rowIndex == -1) . '/></td>';
+		$html .= '<td class="oton-replacement-variable"><input name="' . $this->getElement()->getName() . '[conditionvar][]" value="' . $values['conditionvar'] . '" ' . $disabled . '/></td>';
+		$html .= '<td class="oton-replacement-value"   ><input name="' . $this->getElement()->getName() . '[conditionval][]" value="' . $values['conditionval'] . '" ' . $disabled . '/></td>';
 		$html .= '<td>=></td>';
-		$html .= '<td class="oton-replacement-variable"><input name="' . $this->getElement()->getName() . '[newvar][]"       value="' . $this->_getValue('newvar/' . $rowIndex) .       '" ' . $this->_getDisabled($rowIndex == -1) . '/></td>';
-		$html .= '<td class="oton-replacement-newvalue"><input name="' . $this->getElement()->getName() . '[newval][]"       value="' . $this->_getValue('newval/' . $rowIndex) .       '" ' . $this->_getDisabled($rowIndex == -1) . '/></td>';
+		$html .= '<td class="oton-replacement-variable"><input name="' . $this->getElement()->getName() . '[newvar][]"       value="' . $values['newvar'] .       '" ' . $disabled . '/></td>';
+		$html .= '<td class="oton-replacement-newvalue"><input name="' . $this->getElement()->getName() . '[newval][]"       value="' . $values['newval'] .       '" ' . $disabled . '/></td>';
 		$html .= '<td>' . $this->_getDeleteRowButtonHtml() . '</td>';
 		$html .= '</tr>';
 
@@ -195,13 +196,9 @@ class OpenTools_Ordernumber_Block_Replacements extends Mage_Adminhtml_Block_Syst
 
 	protected function _getValue($key)
 	{
-		return $this->getElement()->getData('value/' . $key);
+		return $this->getElement()->getData(empty($key)?'value':('value/' . $key));
 	}
 
-	protected function _getSelected($key, $value)
-	{
-		return $this->getElement()->getData('value/' . $key) == $value ? 'selected="selected"' : '';
-	}
 
 	protected function _getJSAddRow($container, $template) {
 	    $js  = "
diff --git a/app/code/community/OpenTools/Ordernumber/Helper/Data.php b/app/code/community/OpenTools/Ordernumber/Helper/Data.php
index 0af289e..07ca2c3 100644
--- a/app/code/community/OpenTools/Ordernumber/Helper/Data.php
+++ b/app/code/community/OpenTools/Ordernumber/Helper/Data.php
@@ -121,19 +121,78 @@ function logitem($label, $item) {
         if (isset($info['creditmemo'])) {
             $this->setupCreditMemoReplacements($reps, $info['creditmemo'], $order, $nrtype);
         }
-Mage::Log('Replacements at end of setupReplacements(nrtype='.$nrtype.'): '.print_r($reps,1), null, 'ordernumber.log');
+// Mage::Log('Replacements at end of setupReplacements(nrtype='.$nrtype.'): '.print_r($reps,1), null, 'ordernumber.log');
 
         return $reps;
     }
 
+    function applyCustomVariables ($nrtype, $info, $reps, $customvars) {
+        static $listvars = array("groups", "skus");
+// Mage::getSingleton('core/session')->addWarning('<pre>custom variables, conditionvar='.$conditionvar.', reps='.print_r($reps,1).', customvars='.print_r($customvars,1).'</pre>');
+        $order = $info['order'];
+        $customer = $order->getCustomer();
+        $address = $order->getShippingAddress();
+        $store = $order->getStore();
+// $this->logitem("Order: ", $order);
+        foreach ($customvars as $c) {
+            $conditionvar = $c['conditionvar'];
+
+            $found = false;
+            $compareval = null;
+
+            if (!$found && isset($reps[$conditionvar])) {
+                $found = true;
+                $compareval = $reps[$conditionvar];
+            } elseif (isset($reps['['.$conditionvar.']'])) {
+                $found = true;
+                $compareval = $reps['['.$conditionvar.']'];
+            } elseif (in_array($conditionvar, $listvars)) {
+                // TODO: Handle lists
+                $found = true;
+                $compareval = null /* TODO */;
+            } elseif ($compareval = $order->getData($conditionvar)) {
+                // TODO: Handle order property
+                $found = true;
+            } elseif ($compareval = $customer->getData($conditionvar)) {
+                // TODO: Handle customer property
+                $found = true;
+            } elseif ($compareval = $address->getData($conditionvar)) {
+                // TODO: Handle address property
+                $found = true;
+            } elseif ($compareval = $store->getData($conditionvar)) {
+                // TODO: Handle store property
+                $found = true;
+            } else {
+                // TODO: Handly other possible properties!
+                // TODO: Print out warning that variable could not be found.
+                Mage::getSingleton('core/session')->addWarning($this->__('Unable to find variable "%s" used in the ordernumber custom variable definitions.', $conditionvar));
+            }
+            if ($found) {
+                if (is_array($compareval)) {
+                    $match = in_array($c['conditionval'], $compareval);
+                } else {
+                    $match = ($c['conditionval'] == $compareval);
+                }
+            }
+            if ($found && $match) {
+                $varname = '['.strtolower($c['newvar']).']';
+                $reps[$varname] = $c['newval'];
+            }
+// $this->logitem("Reps after $conditionvar: ", $order);
+        }
+        return $reps;
+    }
+
     function doReplacements ($fmt, $reps) {
         // First, replace all randomXXX[n] fields. This needs to be done with a regexp and a callback:
         $fmt = preg_replace_callback ('/\[(random)(.*?)([0-9]*?)\]/', array($this, 'replaceRandom'), $fmt);
         return str_ireplace (array_keys($reps), array_values($reps), $fmt);
     }
 
-    function replace_fields ($fmt, $nrtype, $info) {
+    function replace_fields ($fmt, $nrtype, $info, $customvars) {
         $reps = $this->setupReplacements ($nrtype, $info);
+        $reps = $this->applyCustomVariables ($nrtype, $info, $reps, $customvars);
+// $this->logitem("All replacements after custom variables: ", $reps);
         return $this->doReplacements($fmt, $reps);
     }
 
diff --git a/app/code/community/OpenTools/Ordernumber/Model/Backend/Replacements.php b/app/code/community/OpenTools/Ordernumber/Model/Backend/Replacements.php
new file mode 100644
index 0000000..5fc1cb1
--- /dev/null
+++ b/app/code/community/OpenTools/Ordernumber/Model/Backend/Replacements.php
@@ -0,0 +1,39 @@
+<?php
+class OpenTools_Ordernumber_Model_Backend_Replacements extends Mage_Adminhtml_Model_System_Config_Backend_Serialized
+{
+	function logitem($label, $item) {
+		Mage::Log($label . " " . get_class($item) . "\n", null, 'ordernumber.log');
+		Mage::Log(is_array($item)?$item:$item->debug(), null, 'ordernumber.log');
+		Mage::Log(get_class_methods(get_class($item)), null, 'ordernumber.log');
+	}
+
+    var $keywords = array("conditionvar", "conditionval", "newvar", "newval");
+
+    /**
+     * The form contains the values as one array for the conditionvars, one for the conditionvals,
+     * one for the newvariables, one for the newvalues. In the database we want to store it
+     * transposed as an array of (conditionvar, conditionval, newvariable, newval) arrays.
+     * Everything else should be inherited from the serialized config backend.
+     */
+    protected function _beforeSave()
+    {
+$this->logitem("OpenTools_Ordernumber_Model_Backend_Replacements: ", $this);
+        $vals = $this->getValue();
+        // Transpose the vals:
+        $vallist = array();
+        if ($vals) {
+            foreach ($vals[$this->keywords[1]] as $i => $dummy) {
+                $entry = array();
+                foreach ($this->keywords as $k) {
+                    $entry[$k] = $vals[$k][$i];
+                }
+                $vallist[] = $entry;
+            }
+        }
+Mage::Log("transposed vallist: ".print_r($vallist,1), null, 'ordernumber.log');
+        $this->setValue($vallist);
+        return parent::_beforeSave();
+    }
+
+
+}
\ No newline at end of file
diff --git a/app/code/community/OpenTools/Ordernumber/Model/Observer.php b/app/code/community/OpenTools/Ordernumber/Model/Observer.php
index 0f8c612..69bdb58 100644
--- a/app/code/community/OpenTools/Ordernumber/Model/Observer.php
+++ b/app/code/community/OpenTools/Ordernumber/Model/Observer.php
@@ -99,14 +99,16 @@ class OpenTools_Ordernumber_Model_Observer extends Mage_Core_Model_Abstract
                 default: /* Pre-defined counter formats saved in the /reset config field */
                     $counterfmt = $format . '|' . $reset; break;
             }
-            // Now apply the replacements
-            $nr = $helper->replace_fields ($format, $nrtype, $info);
             $customvars = Mage::getStoreConfig('ordernumber/replacements', $storeId);
             if (isset($customvars['replacements']))
                 $customvars = $customvars['replacements'];
             if ($customvars)
                 $customvars = unserialize($customvars);
 Mage::Log('customvars: '.print_r($customvars,1), null, 'ordernumber.log');
+
+            // Now apply the replacements
+            $nr = $helper->replace_fields ($format, $nrtype, $info, $customvars);
+
             // Split at a | to get the number format and a possibly different counter increment format
             // If a separate counter format is given after the |, use it, otherwise reuse the number format itself as counter format
             $parts = explode ("|", $nr);
diff --git a/app/code/community/OpenTools/Ordernumber/etc/system.xml b/app/code/community/OpenTools/Ordernumber/etc/system.xml
index f3ca80c..7c64741 100644
--- a/app/code/community/OpenTools/Ordernumber/etc/system.xml
+++ b/app/code/community/OpenTools/Ordernumber/etc/system.xml
@@ -364,7 +364,7 @@
                     <fields>
 						<replacements translate="label tooltip comment">
     						<frontend_model>opentools_ordernumber/replacements</frontend_model>
-    						<backend_model>adminhtml/system_config_backend_serialized</backend_model>
+    						<backend_model>opentools_ordernumber/backend_replacements</backend_model>
     						<sort_order>2</sort_order>
     						<show_in_default>1</show_in_default>
     						<show_in_website>1</show_in_website>
-- 
GitLab