From 1c80c8fd4893140487a75a76ddc3e31d5c3a9e0b Mon Sep 17 00:00:00 2001 From: Reinhold Kainhofer <reinhold@kainhofer.com> Date: Fri, 26 Dec 2014 02:20:23 +0100 Subject: [PATCH] Implement counter changing; UI for custom variables; fix translations; update code to the new set of config fields --- .../OpenTools/Ordernumber/Block/Counters.php | 271 ++++++++++++++---- .../Ordernumber/Block/Replacements.php | 225 +++++++++++---- .../OpenTools/Ordernumber/Helper/Data.php | 17 +- .../Ordernumber/Model/Backend/Counters.php | 87 +++++- .../OpenTools/Ordernumber/Model/Observer.php | 54 +++- .../Ordernumber/Model/Ordernumber.php | 37 ++- .../Model/Resource/Ordernumber.php | 11 +- .../OpenTools/Ordernumber/etc/config.xml | 25 +- .../OpenTools/Ordernumber/etc/system.xml | 1 + .../install-0.1.0.php | 2 +- app/locale/de_DE/OpenTools_Ordernumber.csv | 5 +- app/locale/en_US/OpenTools_Ordernumber.csv | 3 + 12 files changed, 586 insertions(+), 152 deletions(-) diff --git a/app/code/community/OpenTools/Ordernumber/Block/Counters.php b/app/code/community/OpenTools/Ordernumber/Block/Counters.php index b77bcd3..c5b6b86 100644 --- a/app/code/community/OpenTools/Ordernumber/Block/Counters.php +++ b/app/code/community/OpenTools/Ordernumber/Block/Counters.php @@ -4,7 +4,9 @@ class OpenTools_Ordernumber_Block_Counters extends Mage_Adminhtml_Block_System_C protected $_addRowButtonHtml = array(); protected $_addRowDeleteButtonHtml = array(); protected $_editRowButtonHtml = array(); - protected $_removeRowButtonHtml = array(); + protected $_editCancelRowButtonHtml = array(); + protected $_deleteRowButtonHtml = array(); + protected $_undeleteRowButtonHtml = array(); protected $_types = null; protected $_dbModel = null; @@ -40,10 +42,6 @@ class OpenTools_Ordernumber_Block_Counters extends Mage_Adminhtml_Block_System_C { $this->setElement($element); -// $this->logitem("adminhtml/system_store: ", Mage::getSingleton('adminhtml/system_store')); -// $this->logitem("adminhtml/system_store store values for form: ", Mage::getSingleton('adminhtml/system_store')->getStoreValuesForForm(true, true)); -// $this->logitem("adminhtml/system_store website values for form: ", Mage::getSingleton('adminhtml/system_store')->getWebsiteValuesForForm(true, true)); -// $this->logitem("adminhtml/system_store stores structure: ", Mage::getSingleton('adminhtml/system_store')->getStoresStructure(true)); $html = ''; $html .= '<table id="ordernumber_counters_template_table" style="display:none">'; $html .= $this->_getRowHtmlNew(); @@ -72,7 +70,7 @@ class OpenTools_Ordernumber_Block_Counters extends Mage_Adminhtml_Block_System_C $html .= '<th>'. $this->__('Counter Type') . '</th>'; $html .= '<th>'. $this->__('Scope') . '</th>'; $html .= '<th>'. $this->__('Counter Name') . '</th>'; - $html .= '<th>'. $this->__('Counter') . '</th>'; + $html .= '<th>'. $this->__('Counter') . '</</th>'; $html .= '<th>' . $this->_getAddRowButtonHtml('ordernumber_counters_table', 'ordernumber_counters_template_table', 'Add New Counter') . '</th>'; $html .= '</tr>'; @@ -87,17 +85,16 @@ class OpenTools_Ordernumber_Block_Counters extends Mage_Adminhtml_Block_System_C protected function _getRowHtmlNew() { $html = '<tr>'; - $html .= '<td>' . $this->_getNumberTypeSelect($this->getElement()->getName() . '[new_counter_type][]') . '</td>'; - // TODO: Turn the text input to a select box - $html .= '<td>' . $this->_getNumberScopeSelect($this->getElement()->getName() . '[new_counter_scope][]') . '</td>'; - $html .= '<td><input type="text" name="' . $this->getElement()->getName() . '[new_counter_name][]" /></td>'; - $html .= '<td><input class="counter_edit validate-not-negative-number input-text" type="text" name="' . $this->getElement()->getName() . '[new_counter_value][]" /></td>'; + $html .= '<td>' . $this->_getNumberTypeSelect($this->getElement()->getName() . '[new_counter_type][]', true) . '</td>'; + $html .= '<td>' . $this->_getNumberScopeSelect($this->getElement()->getName() . '[new_counter_scope][]', true) . '</td>'; + $html .= '<td><input type="text" name="' . $this->getElement()->getName() . '[new_counter_name][]" disabled /></td>'; + $html .= '<td><input class="counter_edit validate-not-negative-number input-text" type="text" name="' . $this->getElement()->getName() . '[new_counter_value][]" disabled /></td>'; $html .= '<td>' . $this->_getAddRowDeleteButtonHtml() . '</td>'; $html .= '</tr>'; return $html; } - protected function _getNumberTypeSelect($name, $id='', $current=null) + protected function _getNumberTypeSelect($name, $id='', $disabled=true, $current=null) { $options = array(); foreach ($this->getNumberTypes() as $type=>$label) { @@ -105,28 +102,131 @@ class OpenTools_Ordernumber_Block_Counters extends Mage_Adminhtml_Block_System_C } $html = $this->getLayout()->createBlock('core/html_select') ->setName($name) + ->setClass($this->_getDisabled($disabled)) ->setValue($current) ->setOptions($options) - ->setDisabled($this->_getDisabled) + ->setExtraParams($this->_getDisabled($disabled)) ->toHtml(); return $html; } - protected function _getNumberScopeSelect($name, $id='', $current=null) + /** + * Retrieve stores structure; Adjusted from Mage_Adminhtml_Model_System_Store::getStoreValuesForForm + * to also include "All stores|views of website|store: ..." in the possible selections + * Also adjusted the values of the options + * + * @param bool $isAll + * @param array $storeIds + * @param array $groupIds + * @param array $websiteIds + * @return array + */ + public function _getScoreStructureOptions($isAll = false) + { + $sstore = Mage::getSingleton('adminhtml/system_store'); + $nonEscapableNbspChar = html_entity_decode(' ', ENT_NOQUOTES, 'UTF-8'); + $out = array(); + + if ($isAll) { + $out[] = array( + 'value' => '', + 'label' => $this->__('Global') + ); + } + + $websites = $sstore->getWebsiteCollection(); + foreach ($websites as $website) { + $websiteId = $website->getId(); + $siteStr = 'w'.(int)$websiteId; + if ($websiteIds && !in_array($websiteId, $websiteIds)) { + continue; + } + $out[] = array( + 'value' => $siteStr, + 'label' => $this->__('All stores of website: %s', $website->getName()) + ); + // We cannot nest optiongroups, so we have to emulate it by inserting an empty optiongroup and manually indenting the groups and stores + $out[] = array( + 'value' => array(), + 'label' => $this->__('Stores of website: %s', $website->getName()), + ); + + foreach ($website->getGroups() as $group) { + $groupId = $group->getId(); + $groupStr = $siteStr . 'g' . (int)$groupId; + + if ($groupIds && !in_array($groupId, $groupIds)) { + continue; + } + + $out[] = array( + 'value' => $groupStr, + 'label' => str_repeat($nonEscapableNbspChar, 4) . $this->__('All views of store: %s', $group->getName()), + ); + + $stores = array(); + foreach ($group->getStores() as $store) { + + $storeId = $store->getId(); + $storeStr = $groupStr . 's' . (int)$storeId; + if ($storeIds && !in_array($storeId, $storeIds)) { + continue; + } + $stores[] = array( + 'value' => $storeStr, + 'label' => str_repeat($nonEscapableNbspChar, 4) . $store->getName(), + ); + } + if (!empty($stores)) { + $out[] = array( + 'value' => $stores, + 'label' => str_repeat($nonEscapableNbspChar, 4) . $this->__('Views of store: %s', $group->getName()), + ); + } + } + } + return $out; + } + + protected function _getNumberScopeSelect($name, $disabled=true, $current=null) { - // TODO: Create the tree similar to ./app/code/core/Mage/Adminhtml/Model/System/Store.php, - // but let the user select websites and groups, too. -// $options = Mage::getSingleton('adminhtml/system_store')->getStoresStructure(true); - $options = Mage::getSingleton('adminhtml/system_store')->getStoreValuesForForm(true, true); + $options = $this->_getScoreStructureOptions(true); $html = $this->getLayout()->createBlock('core/html_select') ->setName($name) + ->setClass($this->_getDisabled($disabled)) ->setValue($current) ->setOptions($options) - ->setDisabled($this->_getDisabled) + ->setExtraParams($this->_getDisabled($disabled)) ->toHtml(); return $html; } + protected function _convertScopeToString($website_id, $group_id, $store_id) + { + $sstore = Mage::getSingleton('adminhtml/system_store'); + $nonEscapableNbspChar = html_entity_decode(' ', ENT_NOQUOTES, 'UTF-8'); + + $scopes = array(); + if ($website_id<=0) { + $scopes[] = $this->__('Global'); + } else { + $website = Mage::getModel('core/website')->load($website_id); + if ($website) + $scopes[] = $this->__('Website: %s', $website->getName()); + } + if ($group_id>0) { + $group = Mage::getModel('core/store_group')->load($group_id); + if ($group) + $scopes[] = str_repeat($nonEscapableNbspChar, 4) . $this->__('Store: %s', $group->getName()); + } + if ($store_id>0) { + $store = Mage::getModel('core/store')->load($store_id); + if ($store) + $scopes[] = str_repeat($nonEscapableNbspChar, 8) . $this->__('View: %s', $store->getName()); + } + return implode('<br />', $scopes); + } + /** * Retrieve html template for setting * @@ -141,35 +241,29 @@ class OpenTools_Ordernumber_Block_Counters extends Mage_Adminhtml_Block_System_C $class = ($class=='odd')?'even':'odd'; $types = $this->getNumberTypes(); $html .= '<td class="ordernumber_type">'.$types[$counter->getNumberType()].'</td>'; - - $scopes = array(); - if ($counter->getWebsiteId()==0) { - $scopes[] = $this->__('Global'); - } else { - $scopes[] = $this->__('Website #').(int)$counter->getWebsiteId(); - } - if ($counter->getGroupId()!=0) { - $scopes[] = $this->__('Group #').(int)$counter->getGroupId(); - } - if ($counter->getStoreId()!=0) { - $scopes[] = $this->__('Store #').(int)$counter->getStoreId(); - } - $html .= '<td class="ordernumber_scope">' . implode('<br />', $scopes) . '</td>'; + $html .= '<td class="ordernumber_scope">' . $this->_convertScopeToString($counter->getWebsiteId(), $counter->getGroupId(), $counter->getStoreId()) . '</td>'; $html .= '<td class="ordernumber_name">' . $counter->getNumberFormat() . '</td>'; - $html .= '<td class="ordernumber_counter">' . (int)$counter->getCount() . - '<input type="hidden" name="' . $this->getElement()->getName() . '[oldcounter][' . (int)$counter->getId() . ']" value="' . (int)$counter->getCount() . '" />' . - '<input style="display:none" class="counter_edit validate-not-negative-number input-text" name="' . $this->getElement()->getName() . '[counter][' . (int)$counter->getId() . ']" value="' . (int)$counter->getCount() . '" ' . $this->_getDisabled() . '/>' . + $html .= '<td class="ordernumber_counter">' . + '<div class="">' . (int)$counter->getCount() . '</div>' . + '<input type="hidden" disabled class="oton-counter-formelement oton-counter-edit oton-counter-delete" name="' . $this->getElement()->getName() . '[oldcounter][' . (int)$counter->getId() . ']" value="' . (int)$counter->getCount() . '" />' . + '<input style="display:none" disabled="disabled" class="oton-counter-formelement oton-counter-edit validate-not-negative-number input-text" name="' . $this->getElement()->getName() . '[counter][' . (int)$counter->getId() . ']" value="' . (int)$counter->getCount() . '" ' . $this->_getDisabled() . '/>' . '</td>'; - $html .= '<td>' . $this->_getEditRowButtonHtml() . $this->_getRemoveRowButtonHtml() . '</td>'; + $html .= '<td>' . + $this->_getEditRowButtonHtml() . + $this->_getEditCancelRowButtonHtml() . + '<input type="hidden" disabled class="oton-counter-formelement oton-counter-delete" name="'. $this->getElement()->getName() . '[deletecounter][]" value="' . (int)$counter->getId() . '" />' . + $this->_getDeleteRowButtonHtml() . + $this->_getUndeleteRowButtonHtml() . + '</td>'; $html .= '</tr>'; return $html; } - protected function _getDisabled() + protected function _getDisabled($forceDisabled=false) { - return $this->getElement()->getDisabled() ? ' disabled' : ''; + return ($forceDisabled || $this->getElement()->getDisabled()) ? ' disabled' : ''; } protected function _getValue($key) @@ -182,14 +276,60 @@ class OpenTools_Ordernumber_Block_Counters extends Mage_Adminhtml_Block_System_C return $this->getElement()->getData('value/' . $key) == $value ? 'selected="selected"' : ''; } + protected function _getJSAddRow($container, $template) { + $js = " + var tmpl=$('" . $template . "'); + Form.getElements(tmpl).invoke('enable').invoke('removeClassName', 'disabled'); + var newc=$('" . $template . "').innerHTML; + Element.insert($('" . $container . "'), {bottom: newc}); + $('" . $template . "').select('input, select, button').invoke('disable').invoke('addClassName', 'disabled'); "; + return $js; + } + protected function _getJSEditRow($selector) { + $js = " + $(this).up('" . $selector . "').select('.oton-counter-formelement').invoke('hide').invoke('disable').invoke('addClassName', 'disabled'); + $(this).up('" . $selector . "').select('.oton-counter-edit').invoke('show').invoke('enable').invoke('removeClassName', 'disabled');"; + return $js; + + } + protected function _getJSEditCancelRow($selector) { + $js = " + $(this).up('" . $selector . "').select('.oton-counter-formelement').invoke('hide').invoke('disable').invoke('addClassName', 'disabled'); + $(this).up('" . $selector . "').select('.oton-counter-display').invoke('show').invoke('enable').invoke('removeClassName', 'disabled');"; + return $js; + + } + protected function _getJSDeleteRow($selector) { + $js = " + var tr=$(this).up('" . $selector . "'); + tr.select('.oton-counter-formelement').invoke('hide').invoke('disable').invoke('addClassName', 'disabled'); + tr.select('.oton-counter-delete').invoke('show').invoke('enable').invoke('removeClassName', 'disabled'); + tr.setStyle({textDecoration: 'line-through'});"; + return $js; + } + protected function _getJSUndeleteRow($selector) { + $js = " + var tr=$(this).up('" . $selector . "'); + tr.select('.oton-counter-formelement').invoke('hide').invoke('disable').invoke('addClassName', 'disabled'); + tr.select('.oton-counter-display').invoke('show').invoke('enable').invoke('removeClassName', 'disabled'); + tr.setStyle({textDecoration: ''});"; + return $js; + } + protected function _getJSDeleteNewRow($selector) { + $js = "Element.remove($(this).up('" . $selector . "'))"; + return $js; + } + + + protected function _getAddRowDeleteButtonHtml($selector = 'tr', $title='Delete') { if (!$this->_addRowDeleteButtonHtml) { $this->_addRowDeleteButtonHtml = $this->getLayout()->createBlock('adminhtml/widget_button') ->setType('button') - ->setClass('delete v-middle ' . $this->_getDisabled()) + ->setClass('delete v-middle oton-counter-add-delete' . $this->_getDisabled()) ->setLabel($this->__($title)) - ->setOnClick("Element.remove($(this).up('" . $selector . "'))") + ->setOnClick($this->_getJSDeleteNewRow($selector)) ->setDisabled($this->_getDisabled()) ->toHtml(); } @@ -201,9 +341,9 @@ class OpenTools_Ordernumber_Block_Counters extends Mage_Adminhtml_Block_System_C if (!isset($this->_addRowButtonHtml[$container])) { $this->_addRowButtonHtml[$container] = $this->getLayout()->createBlock('adminhtml/widget_button') ->setType('button') - ->setClass('add ' . $this->_getDisabled()) + ->setClass('add oton-counter-add' . $this->_getDisabled()) ->setLabel($this->__($title)) - ->setOnClick("Element.insert($('" . $container . "'), {bottom: $('" . $template . "').innerHTML})") + ->setOnClick($this->_getJSAddRow($container, $template)) ->setDisabled($this->_getDisabled()) ->toHtml(); } @@ -215,27 +355,56 @@ class OpenTools_Ordernumber_Block_Counters extends Mage_Adminhtml_Block_System_C if (!$this->_editRowButtonHtml) { $this->_editRowButtonHtml = $this->getLayout()->createBlock('adminhtml/widget_button') ->setType('button') - ->setClass('edit v-middle ' . $this->_getDisabled()) + ->setClass('edit v-middle oton-counter-formelement oton-counter-display' . $this->_getDisabled()) ->setLabel($this->__($title)) - ->setOnClick("Element.toggle(Element.select($(this).up('" . $selector . "'), 'input.counter_edit'))") + ->setOnClick($this->_getJSEditRow($selector)) ->setDisabled($this->_getDisabled()) ->toHtml(); } return $this->_editRowButtonHtml; } - protected function _getRemoveRowButtonHtml($selector = 'tr', $title = 'Delete') + protected function _getEditCancelRowButtonHtml($selector = 'tr', $title='Cancel') { - if (!$this->_removeRowButtonHtml) { - $this->_removeRowButtonHtml = $this->getLayout()->createBlock('adminhtml/widget_button') + if (!$this->_editCancelRowButtonHtml) { + $this->_editCancelRowButtonHtml = $this->getLayout()->createBlock('adminhtml/widget_button') ->setType('button') - ->setClass('delete v-middle ' . $this->_getDisabled()) + ->setClass('cancel v-middle oton-counter-formelement oton-counter-edit' . $this->_getDisabled()) ->setLabel($this->__($title)) - ->setOnClick("Element.remove($(this).up('" . $selector . "'))") + ->setOnClick($this->_getJSEditCancelRow($selector)) ->setDisabled($this->_getDisabled()) + ->setStyle('display: none;') ->toHtml(); } - return $this->_removeRowButtonHtml; + return $this->_editCancelRowButtonHtml; + } + + protected function _getDeleteRowButtonHtml($selector = 'tr', $title = 'Delete') + { + if (!$this->_deleteRowButtonHtml) { + $this->_deleteRowButtonHtml = $this->getLayout()->createBlock('adminhtml/widget_button') + ->setType('button') + ->setClass('delete v-middle oton-counter-formelement oton-counter-display oton-counter-edit' . $this->_getDisabled()) + ->setLabel($this->__($title)) + ->setOnClick($this->_getJSDeleteRow($selector)) + ->setDisabled($this->_getDisabled()) + ->toHtml(); + } + return $this->_deleteRowButtonHtml; + } + protected function _getUndeleteRowButtonHtml($selector = 'tr', $title = 'Restore') + { + if (!$this->_undeleteRowButtonHtml) { + $this->_undeleteRowButtonHtml = $this->getLayout()->createBlock('adminhtml/widget_button') + ->setType('button') + ->setClass('v-middle oton-counter-formelement oton-counter-delete') + ->setLabel($this->__($title)) + ->setOnClick($this->_getJSUndeleteRow($selector)) + ->setDisabled($this->_getDisabled() || true) + ->setStyle('display: none;') + ->toHtml(); + } + return $this->_undeleteRowButtonHtml; } diff --git a/app/code/community/OpenTools/Ordernumber/Block/Replacements.php b/app/code/community/OpenTools/Ordernumber/Block/Replacements.php index 3360e78..02fcc0b 100644 --- a/app/code/community/OpenTools/Ordernumber/Block/Replacements.php +++ b/app/code/community/OpenTools/Ordernumber/Block/Replacements.php @@ -2,50 +2,153 @@ class OpenTools_Ordernumber_Block_Replacements extends Mage_Adminhtml_Block_System_Config_Form_Field { protected $_addRowButtonHtml = array(); - protected $_removeRowButtonHtml = 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'); +// } /** - * Returns html part of the setting + * Returns html part of the setting. * * @param Varien_Data_Form_Element_Abstract $element * @return string */ - public function render(Varien_Data_Form_Element_Abstract $element) + public function _getElementHtml(Varien_Data_Form_Element_Abstract $element) { $this->setElement($element); - $html = ''; + $html = ''; $html .= '<table id="ordernumber_replacements_template_table" style="display:none">'; - $html .= $this->_getRowTemplateHtml(); + $html .= $this->_getRowHtml(); $html .= '</table>'; - $html .= '<table id="ordernumber_replacements_table">'; + $html .= '<div class="grid"><table id="ordernumber_replacements_table" class="data" style="width: 100%;">'; $html .= $this->_getRowHeader(); - if ($this->_getValue('replacements')) { - foreach ($this->_getValue('replacements') as $i => $f) { - if ($i) { - $html .= $this->_getRowTemplateHtml($i); - } - } + +// $this->logitem("render element: ", $element); + if ($this->_getValue('conditionvar')) { + foreach ($this->_getValue('conditionvar') as $i => $var) { + $html .= $this->_getRowHtml($i); + } + } else { + $html .= $this->_getEmptyRowHtml(); } - $html .= '</table>'; - return '<tr id="row_' . $element->getHtmlId() . '"><td colspan="5">' . $html . '</td></tr>'; + $html .= '</table></div>'; + return $html; + } + + /** + * Render the whole table row for the form field. + * Adjusted from ./app/code/core/Mage/Adminhtml/Block/System/Config/Form/Field.php + * Adjustments: Removed label, form control spans two columns. + * + * @param Varien_Data_Form_Element_Abstract $element + * @return string + */ + public function render(Varien_Data_Form_Element_Abstract $element) + { + $id = $element->getHtmlId(); + + //$isDefault = !$this->getRequest()->getParam('website') && !$this->getRequest()->getParam('store'); + $isMultiple = $element->getExtType()==='multiple'; + + // replace [value] with [inherit] + $namePrefix = preg_replace('#\[value\](\[\])?$#', '', $element->getName()); + + $options = $element->getValues(); + + $addInheritCheckbox = false; + if ($element->getCanUseWebsiteValue()) { + $addInheritCheckbox = true; + $checkboxLabel = Mage::helper('adminhtml')->__('Use Website'); + } + elseif ($element->getCanUseDefaultValue()) { + $addInheritCheckbox = true; + $checkboxLabel = Mage::helper('adminhtml')->__('Use Default'); + } + + if ($addInheritCheckbox) { + $inherit = $element->getInherit()==1 ? 'checked="checked"' : ''; + if ($inherit) { + $element->setDisabled(true); + } + } + + if ($element->getTooltip()) { + $html .= '<td class="value with-tooltip" colspan="2">'; + $html .= $this->_getElementHtml($element); + $html .= '<div class="field-tooltip"><div>' . $element->getTooltip() . '</div></div>'; + } else { + $html .= '<td class="value">'; + $html .= $this->_getElementHtml($element); + }; + if ($element->getComment()) { + $html.= '<p class="note"><span>'.$element->getComment().'</span></p>'; + } + $html.= '</td>'; + + if ($addInheritCheckbox) { + + $defText = $element->getDefaultValue(); + if ($options) { + $defTextArr = array(); + foreach ($options as $k=>$v) { + if ($isMultiple) { + if (is_array($v['value']) && in_array($k, $v['value'])) { + $defTextArr[] = $v['label']; + } + } elseif ($v['value']==$defText) { + $defTextArr[] = $v['label']; + break; + } + } + $defText = join(', ', $defTextArr); + } + + // default value + $html.= '<td class="use-default">'; + $html.= '<input id="' . $id . '_inherit" name="' + . $namePrefix . '[inherit]" type="checkbox" value="1" class="checkbox config-inherit" ' + . $inherit . ' onclick="toggleValueElements(this, Element.previous(this.parentNode))" /> '; + $html.= '<label for="' . $id . '_inherit" class="inherit" title="' + . htmlspecialchars($defText) . '">' . $checkboxLabel . '</label>'; + $html.= '</td>'; + } + + $html.= '<td class="scope-label">'; + if ($element->getScope()) { + $html .= $element->getScopeLabel(); + } + $html.= '</td>'; + + $html.= '<td class="">'; + if ($element->getHint()) { + $html.= '<div class="hint" >'; + $html.= '<div style="display: none;">' . $element->getHint() . '</div>'; + $html.= '</div>'; + } + $html.= '</td>'; + + return $this->_decorateRowHtml($element, $html); } + /** * Retrieve html for the table header * @return string */ protected function _getRowHeader() { - $html = '<tr>'; + $html = '<tr class="headings">'; + $html .= '<th>'. $this->__('If Variable ...') . '</th>'; + $html .= '<th>'. $this->__('is / contains ...') . '</th>'; $html .= '<th></th>'; - $html .= '<th>Variable</th>'; - $html .= '<th>Condition</th>'; - $html .= '<th>Value</th>'; - $html .= '<th>New Variable</th>'; - $html .= '<th>New Value</th>'; + $html .= '<th>'. $this->__('Set this variable ..') . '</th>'; + $html .= '<th>'. $this->__('to value ...') . '</th>'; $html .= '<th>' . $this->_getAddRowButtonHtml('ordernumber_replacements_table', 'ordernumber_replacements_template_table', 'Add New Replacement') . '</th>'; $html .= '</tr>'; @@ -53,37 +156,42 @@ class OpenTools_Ordernumber_Block_Replacements extends Mage_Adminhtml_Block_Syst } /** - * Retrieve html template for setting + * Retrieve html template for variable replacements * * @param int $rowIndex * @return string */ - protected function _getRowTemplateHtml($rowIndex = 0) + protected function _getRowHtml($rowIndex = -1) { - $html = '<tr>'; - - $html .= '<td>If</td>'; - $html .= '<td><input style="width: 100px" name="' . $this->getElement()->getName() . '[variables][]" value="' . $this->_getValue('variables/' . $rowIndex) . '" ' . $this->_getDisabled() . '/></td>'; -// $html .= '<td>Condition</td>'; -// $html .= '<td>Value</td>'; -// $html .= '<td>New Variable</td>'; -// $html .= '<td>New Value</td>'; - -// $html .= '<div style="margin:5px 0 10px;">'; -// $html .= '<input style="width:100px;" name="' -// . $this->getElement()->getName() . '[addresses][]" value="' -// . $this->_getValue('addresses/' . $rowIndex) . '" ' . $this->_getDisabled() . '/> '; - - $html .= '<td>' . $this->_getRemoveRowButtonHtml() . '</td>'; + static $class = 'odd'; + $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>=></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>' . $this->_getDeleteRowButtonHtml() . '</td>'; $html .= '</tr>'; return $html; } - protected function _getDisabled() - { - return $this->getElement()->getDisabled() ? ' disabled' : ''; - } + /** + * Display notice that no custom variables have been defined... + */ + protected function _getEmptyRowHtml() + { + $html = '<tr class="oton-empty-row-notice">'; + $html .= '<td class="oton-empty-row-notice" colspan="6"><em>' . $this->__('No custom variables have been defined.') . '</em></td>'; + $html .= '</tr>'; + return $html; + } + + protected function _getDisabled($forceDisabled=false) + { + return ($forceDisabled || $this->getElement()->getDisabled()) ? ' disabled' : ''; + } protected function _getValue($key) { @@ -95,31 +203,50 @@ class OpenTools_Ordernumber_Block_Replacements extends Mage_Adminhtml_Block_Syst return $this->getElement()->getData('value/' . $key) == $value ? 'selected="selected"' : ''; } + protected function _getJSAddRow($container, $template) { + $js = " + var tmpl=$('" . $template . "'); + Form.getElements(tmpl).invoke('enable').invoke('removeClassName', 'disabled'); + var newc=$('" . $template . "').innerHTML; + Element.insert($('" . $container . "'), {bottom: newc}); + $('" . $template . "').select('input, select, button').invoke('disable').invoke('addClassName', 'disabled'); + $(this).up('table').select('tr.oton-empty-row-notice').invoke('hide');"; + + return $js; + } + protected function _getJSDeleteRow($selector) { + $js = "Element.remove($(this).up('" . $selector . "'))"; + return $js; + } + + + protected function _getAddRowButtonHtml($container, $template, $title='Add') { if (!isset($this->_addRowButtonHtml[$container])) { $this->_addRowButtonHtml[$container] = $this->getLayout()->createBlock('adminhtml/widget_button') ->setType('button') - ->setClass('add ' . $this->_getDisabled()) + ->setClass('add oton-replacement-add' . $this->_getDisabled()) ->setLabel($this->__($title)) - ->setOnClick("Element.insert($('" . $container . "'), {bottom: $('" . $template . "').innerHTML})") + ->setOnClick($this->_getJSAddRow($container, $template)) ->setDisabled($this->_getDisabled()) ->toHtml(); } return $this->_addRowButtonHtml[$container]; } - protected function _getRemoveRowButtonHtml($selector = 'tr', $title = 'Delete') + protected function _getDeleteRowButtonHtml($selector = 'tr', $title = 'Delete') { - if (!$this->_removeRowButtonHtml) { - $this->_removeRowButtonHtml = $this->getLayout()->createBlock('adminhtml/widget_button') + if (!$this->_deleteRowButtonHtml) { + $this->_deleteRowButtonHtml = $this->getLayout()->createBlock('adminhtml/widget_button') ->setType('button') - ->setClass('delete v-middle ' . $this->_getDisabled()) + ->setClass('delete v-middle oton-replacement-formelement oton-replacement-display oton-replacement-edit' . $this->_getDisabled()) ->setLabel($this->__($title)) - ->setOnClick("Element.remove($(this).up('" . $selector . "'))") + ->setOnClick($this->_getJSDeleteRow($selector)) ->setDisabled($this->_getDisabled()) ->toHtml(); } - return $this->_removeRowButtonHtml; + return $this->_deleteRowButtonHtml; } + } \ No newline at end of file diff --git a/app/code/community/OpenTools/Ordernumber/Helper/Data.php b/app/code/community/OpenTools/Ordernumber/Helper/Data.php index 3d8e31a..0af289e 100644 --- a/app/code/community/OpenTools/Ordernumber/Helper/Data.php +++ b/app/code/community/OpenTools/Ordernumber/Helper/Data.php @@ -33,7 +33,7 @@ function logitem($label, $item) { } return self::randomString ($alphabet, $len); } - + function setupDateTimeReplacements (&$reps, $nrtype) { $reps["[year]"] = date ("Y"); $reps["[year2]"] = date ("y"); @@ -48,7 +48,7 @@ function logitem($label, $item) { function setupAddressReplacements(&$reps, $prefix, $address, $nrtype) { if (!$address) return; $reps["[".$prefix."addressid]"] = $address->getId(); - + $reps["[".$prefix."firstname]"] = $address->firstname; $reps["[".$prefix."lastname]"] = $address->lastname; $reps["[".$prefix."company]"] = $address->company; @@ -65,7 +65,7 @@ function logitem($label, $item) { $reps["[".$prefix."countrycode2]"] = $country->iso2_code; $reps["[".$prefix."countrycode3]"] = $country->iso3_code; $reps["[".$prefix."countryid]"] = $country->getId(); - + } function setupStoreReplacements (&$reps, $order, $nrtype) { $store = $order->getStore(); @@ -88,14 +88,14 @@ function logitem($label, $item) { $this->setupAddressReplacements($reps, "", $address, $nrtype); $this->setupAddressReplacements($reps, "shipping", $shippingAddress, $nrtype); $this->setupAddressReplacements($reps, "billing", $billingAddress, $nrtype); - + $reps["[totalitems]"] = $order->total_item_count; $reps["[totalquantity]"] = $order->total_qty_ordered; } function setupShippingReplacements(&$reps, $order, $nrtype) { $reps["[shippingmethod]"] = $order->getShippingMethod(); } - + function setupShipmentReplacements (&$reps, $shipment, $order, $nrtype) { // TODO } @@ -121,16 +121,17 @@ 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'); + 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); } - - /* Type 0 means order number, type 1 means invoice number, type 2 means customer number, 3 means order password */ + function replace_fields ($fmt, $nrtype, $info) { $reps = $this->setupReplacements ($nrtype, $info); return $this->doReplacements($fmt, $reps); diff --git a/app/code/community/OpenTools/Ordernumber/Model/Backend/Counters.php b/app/code/community/OpenTools/Ordernumber/Model/Backend/Counters.php index 2ab8047..b1a417f 100644 --- a/app/code/community/OpenTools/Ordernumber/Model/Backend/Counters.php +++ b/app/code/community/OpenTools/Ordernumber/Model/Backend/Counters.php @@ -1,15 +1,96 @@ <?php class OpenTools_Ordernumber_Model_Backend_Counters extends Mage_Core_Model_Config_Data { + protected $_dbModel = null; + protected function _getModel() { + return Mage::getModel('opentools_ordernumber/ordernumber'); + } + + public function getModel() { + if (is_null($this->_dbModel)) + $this->_dbModel = $this->_getModel(); + return $this->_dbModel; + } + /** * Instead of storing the counter values in the config (they are NOT config values), * change the database and then clear the value: */ protected function _beforeSave() { - if (is_array($this->getValue())) { - // TODO: Store new values in the database - // Compare with old values + $vals = $this->getValue(); + $helper = Mage::helper('ordernumber'); + $session = Mage::getSingleton('core/session'); + if (is_array($vals)) { + $model = $this->getModel(); + // First check each existing counter + foreach ($vals['counter'] as $countid => $newval) { + $oldval = $vals['oldcounter'][$countid]; + // Check if the counter has changed meanwhile in the DB! + if ($oldval != $newval) { + $counter = $model->load($countid); + if ($counter->getCount() != $oldval) { + $session->addWarning($helper->__('Counter "%s" (type: %s) was changed in the background in the dabase from %d to %d. Overwriting with %d.', + $counter->getNumberFormat(), $model->readableType($counter->getNumberType()), $oldval, $counter->getCount(), $newval)); + } + $counter->setCount($newval) + ->save(); + $session->addSuccess($helper->__('Successfully changed counter "%s" (type: %s) from %d to %d', + $counter->getNumberFormat(), $model->reNadableType($counter->getNumberType()), $oldval, $counter->getCount())); + } + } + // Deleting counters: + foreach ($vals['deletecounter'] as $nr => $countid) { + $oldval = $vals['oldcounter'][$countid]; + // Check if the counter has changed meanwhile in the DB! + $counter = $model->load($countid); + if ($counter->getCount() != $oldval) { + $session->addWarning($helper->__('Counter "%s" (type: %s) was changed in the background in the dabase from %d to %d. Deleting it nonetheless.', + $counter->getNumberFormat(), $model->readableType($counter->getNumberType()), $oldval, $counter->getCount())); + } + $counter->delete(); + $session->addSuccess($helper->__('Successfully deleted counter "%s" (type: %s) with value %d', + $counter->getNumberFormat(), $model->readableType($counter->getNumberType()), $counter->getCount())); + } + // New counters + foreach ($vals['new_counter_type'] as $nr =>$countertype) { + // TODO: Check whether a counter with these name, scope and type already exists! + $scope = $vals['new_counter_scope'][$nr]; + // Extract the counter scope from the request variable + $website = 0; + $group = 0; + $store = 0; + // Loop through the characters and process groups w[0-9]+, g[0-9]+, s[0-9]+ + $i = 0; + $len = strlen($scope); + while ($i<$len) { + $ch = $scope[$i]; + $i++; + if ($i>=$len || !in_array($ch, array('w', 'g', 's'))) + continue; + $nr = 0; + while ($i<$len && ctype_digit($scope[$i])) { + $nr = $nr*10 + (int)$scope[$i]; + $i++; + } + switch ($ch) { + case 'w': $website = $nr; break; + case 'g': $group = $nr; break; + case 's': $store = $nr; break; + } + } + + $counter = $model->unsetData() + ->setNumberType($countertype) + ->setWebsiteId($website) + ->setGroupId($group) + ->setStoreId($store) + ->setNumberFormat($vals['new_counter_name'][$nr]) + ->setCount($vals['new_counter_value'][$nr]) + ->save(); + $session->addSuccess($helper->__('Successfully created counter "%s" (type: %s) with value %d', + $counter->getNumberFormat(), $model->readableType($counter->getNumberType()), $counter->getCount())); + } } } } \ 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 bcfc14d..0f8c612 100644 --- a/app/code/community/OpenTools/Ordernumber/Model/Observer.php +++ b/app/code/community/OpenTools/Ordernumber/Model/Observer.php @@ -27,21 +27,21 @@ class OpenTools_Ordernumber_Model_Observer extends Mage_Core_Model_Abstract parent::_construct(); $this->_init('ordernumber/ordernumber'); } - + protected $_dbModel = null; protected function _getModel() { return Mage::getModel('opentools_ordernumber/ordernumber'); } - + public function getModel() { - if (is_null($this->_dbModel)) + if (is_null($this->_dbModel)) $this->_dbModel = $this->_getModel(); return $this->_dbModel; } // This trigger is called directly after the increment ID is reserved for an order // TODO: Ideally, we would overwrite the reserveOrderId function! - // Then magento would not create/reserve an order in the first place + // Then magento would not create/reserve an order number in the first place public function sales_model_service_quote_submit_before ($observer) { $order = $observer->getEvent()->getOrder(); return $this->handle_new_number('order', $order, $order); @@ -67,7 +67,8 @@ class OpenTools_Ordernumber_Model_Observer extends Mage_Core_Model_Abstract } public function handle_new_number ($nrtype, $object, $order) { - $storeId = $order->getStore()->getStoreId(); + $store = $order->getStore(); + $storeId = $store->getStoreId(); $cfgprefix = 'ordernumber/'.$nrtype.'numbers'; $enabled = Mage::getStoreConfig($cfgprefix.'/active', $storeId); @@ -76,34 +77,59 @@ class OpenTools_Ordernumber_Model_Observer extends Mage_Core_Model_Abstract $object->setOrdernumberProcessed(true); $format = Mage::getStoreConfig($cfgprefix.'/format', $storeId); - $global = Mage::getStoreConfig($cfgprefix.'/global', $storeId); + $scope = Mage::getStoreConfig($cfgprefix.'/scope', $storeId); + $reset = Mage::getStoreConfig($cfgprefix.'/reset', $storeId); + $counterfmt = Mage::getStoreConfig($cfgprefix.'/resetformat', $storeId); $digits = Mage::getStoreConfig($cfgprefix.'/digits', $storeId); + $increment = Mage::getStoreConfig($cfgprefix.'/increment', $storeId); // First, replace all variables: $helper = Mage::helper('ordernumber'); $info = array('order'=>$order, $nrtype=>$object); - $nr = $helper->replace_fields ($format, $nrtype, $info); +// TODO: foreach ($customvars) + + // The ordernumber/XXXnumbers/reset contains some pre-defined counter names as + // well as enum values indicating certain behavior. Replace those by the actual + // counter names for the current counter: + switch ($reset) { + case 0: $format = $format . '|'; break; + case 1: $format = $format . '|' . $format; break; + case -1: $format = $foramt . '|' . $counterfmt; break; + 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'); // 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); $format = $parts[0]; - $counterfmt = ($global==1)?"":$parts[(count($parts)>1)?1:0]; - - // Now find the next counter that does not lead to duplicate + $counterfmt = $parts[(count($parts)>1)?1:0]; + + // Now find the next counter that does not lead to duplicate $newnumber = null; $model = $this->getModel(); - + $count = 0; $created = false; // Make up to 150 attempts to create a number... - while (empty($newnumber) && (count<150)) { + while (empty($newnumber) && (count<150)) { $count += 1; // Find the next counter value - $count = $model->getCounterValueIncremented($nrtype, $counterfmt); + $website_id = ($scope>=1)?$store->getWebsiteId():0; + $group_id = ($scope>=2)?$store->getGroupId():0; + $store_id = ($scope>=3)?$store->getStoreId():0; + $count = $model->getCounterValueIncremented($nrtype, $counterfmt, $increment, $website_id, $group_id, $store_id); $newnumber = str_replace ("#", sprintf('%0' . (int)$digits . 's', $count), $format); - + // Check whether that number is already in use. If so, attempt to create the next number: $modelname=($nrtype=='order') ? 'sales/order' : ('sales/order_'.$nrtype); $collection = Mage::getModel($modelname)->getCollection()->addFieldToFilter('increment_id', $newnumber); diff --git a/app/code/community/OpenTools/Ordernumber/Model/Ordernumber.php b/app/code/community/OpenTools/Ordernumber/Model/Ordernumber.php index 9d303f3..4331a25 100644 --- a/app/code/community/OpenTools/Ordernumber/Model/Ordernumber.php +++ b/app/code/community/OpenTools/Ordernumber/Model/Ordernumber.php @@ -1,25 +1,30 @@ <?php class OpenTools_Ordernumber_Model_Ordernumber extends Mage_Core_Model_Abstract { + protected $_numberTypes = array(); + public function _construct() { parent::_construct(); $this->_init('opentools_ordernumber/ordernumber'); } - public function getCounterValueIncremented($nrtype, $format) { + public function getCounterValueIncremented($nrtype, $format, $increment=1, $website_id=0, $group_id=0, $store_id=0) { $helper = Mage::helper('ordernumber'); - $this->loadNumberCounter($nrtype, $format); + $this->loadNumberCounter($nrtype, $format, $website_id, $group_id, $store_id); + $this->setWebsiteId($website_id); + $this->setGroupId($group_id); + $this->setStoreId($store_id); $this->setNumberType($nrtype); $this->setNumberFormat($format); - $count = $this->getCount()+1; + $count = $this->getCount() + $increment; $this->setCount($count); $res = $this->save(); return $count; } - public function loadNumberCounter($nrtype, $format) + public function loadNumberCounter($nrtype, $format, $website_id, $group_id, $store_id) { - $this->_getResource()->loadNumberCounter($this, $nrtype, $format); + $this->_getResource()->loadNumberCounter($this, $nrtype, $format, $website_id, $group_id, $store_id); $this->_afterLoad(); $this->setOrigData(); $this->_hasDataChanges = false; @@ -27,14 +32,20 @@ class OpenTools_Ordernumber_Model_Ordernumber extends Mage_Core_Model_Abstract } public function getNumberTypes() { - $helper = Mage::helper('ordernumber'); - $types = array( - 'order' => $helper->__('Order number'), - 'invoice' => $helper->__('Invoice'), - 'shipment' => $helper->__('Shipment'), - 'creditmemo' => $helper->__('Credit Memo'), - ); - return $types; + if (empty($this->_numberTypes)) { + $helper = Mage::helper('ordernumber'); + $this->_numberTypes = array( + 'order' => $helper->__('Order number'), + 'invoice' => $helper->__('Invoice'), + 'shipment' => $helper->__('Shipment'), + 'creditmemo' => $helper->__('Credit Memo'), + ); + } + return $this->_numberTypes; + } + public function readableType($type) + { + return $this->getNumberTypes()[$type]; } } \ No newline at end of file diff --git a/app/code/community/OpenTools/Ordernumber/Model/Resource/Ordernumber.php b/app/code/community/OpenTools/Ordernumber/Model/Resource/Ordernumber.php index 784bf50..d78c85d 100644 --- a/app/code/community/OpenTools/Ordernumber/Model/Resource/Ordernumber.php +++ b/app/code/community/OpenTools/Ordernumber/Model/Resource/Ordernumber.php @@ -5,15 +5,22 @@ class OpenTools_Ordernumber_Model_Resource_Ordernumber extends Mage_Core_Model_R $this->_init('opentools_ordernumber/ordernumber', 'ordernumber_id'); } - public function loadNumberCounter(Mage_Core_Model_Abstract $object, $nrtype, $format) { + public function loadNumberCounter(Mage_Core_Model_Abstract $object, $nrtype, $format, $website_id, $group_id, $store_id) { $read = $this->_getWriteAdapter(); if ($read && !is_null($nrtype)) { $typefield = $read->quoteIdentifier(sprintf('%s.%s', $this->getMainTable(), 'number_type')); $formatfield = $read->quoteIdentifier(sprintf('%s.%s', $this->getMainTable(), 'number_format')); + $websitefield = $read->quoteIdentifier(sprintf('%s.%s', $this->getMainTable(), 'website_id')); + $groupfield = $read->quoteIdentifier(sprintf('%s.%s', $this->getMainTable(), 'group_id')); + $storefield = $read->quoteIdentifier(sprintf('%s.%s', $this->getMainTable(), 'store_id')); + $select = $read->select() ->from($this->getMainTable()) ->where($typefield . '=?', $nrtype) - ->where($formatfield .'=?', $format); + ->where($formatfield .'=?', $format) + ->where($websitefield . '=?', $website_id) + ->where($groupfield . '=?', $group_id) + ->where($storefield . '=?', $store_id); $data = $read->fetchRow($select); if ($data) { $object->setData($data); diff --git a/app/code/community/OpenTools/Ordernumber/etc/config.xml b/app/code/community/OpenTools/Ordernumber/etc/config.xml index 3604aed..ec634d3 100644 --- a/app/code/community/OpenTools/Ordernumber/etc/config.xml +++ b/app/code/community/OpenTools/Ordernumber/etc/config.xml @@ -137,32 +137,37 @@ <default> <ordernumber> - <settings> - <active>0</active> - </settings> <ordernumbers> <active>0</active> <format>Order-[year]-#</format> + <scope>0</scope> + <reset>1</reset> <digits>0</digits> - <global>0</global> + <increment>1</increment> </ordernumbers> <invoicenumbers> <active>0</active> - <format>Invoice-[year]-#</format> + <format>INV-[year]-#</format> + <scope>0</scope> + <reset>1</reset> <digits>0</digits> - <global>0</global> + <increment>1</increment> </invoicenumbers> <shipmentnumbers> <active>0</active> - <format>Shipment-[year]-#</format> + <format>SH-[year]-#</format> + <scope>0</scope> + <reset>1</reset> <digits>0</digits> - <global>0</global> + <increment>1</increment> </shipmentnumbers> <creditmemonumbers> <active>0</active> - <format>CreditMemo-[year]-#</format> + <format>CM-[year]-#</format> + <scope>0</scope> + <reset>1</reset> <digits>0</digits> - <global>0</global> + <increment>1</increment> </creditmemonumbers> </ordernumber> </default> diff --git a/app/code/community/OpenTools/Ordernumber/etc/system.xml b/app/code/community/OpenTools/Ordernumber/etc/system.xml index 9d30234..f3ca80c 100644 --- a/app/code/community/OpenTools/Ordernumber/etc/system.xml +++ b/app/code/community/OpenTools/Ordernumber/etc/system.xml @@ -91,6 +91,7 @@ <show_in_default>1</show_in_default> <show_in_website>1</show_in_website> <show_in_store>1</show_in_store> + <can_be_empty>0</can_be_empty> <depends><active>1</active></depends> </increment> </fields> diff --git a/app/code/community/OpenTools/Ordernumber/sql/opentools_ordernumber_setup/install-0.1.0.php b/app/code/community/OpenTools/Ordernumber/sql/opentools_ordernumber_setup/install-0.1.0.php index 7f50ea1..570c707 100644 --- a/app/code/community/OpenTools/Ordernumber/sql/opentools_ordernumber_setup/install-0.1.0.php +++ b/app/code/community/OpenTools/Ordernumber/sql/opentools_ordernumber_setup/install-0.1.0.php @@ -26,7 +26,7 @@ $table = $installer->getConnection() ->addColumn('count', Varien_Db_Ddl_Table::TYPE_INTEGER, null, array('unsigned'=>true,'nullable'=>false), 'Counter') ->addIndex($installer->getIdxName( $installer->getTable('opentools_ordernumber/ordernumber'), - array('number_type', 'number_format'), + array('number_type', 'website_id', 'group_id', 'store_id', 'number_format'), Varien_Db_Adapter_Interface::INDEX_TYPE_UNIQUE ), array('number_type', 'number_format'), diff --git a/app/locale/de_DE/OpenTools_Ordernumber.csv b/app/locale/de_DE/OpenTools_Ordernumber.csv index 4926857..15943a4 100644 --- a/app/locale/de_DE/OpenTools_Ordernumber.csv +++ b/app/locale/de_DE/OpenTools_Ordernumber.csv @@ -1,4 +1,6 @@ - +# Translation file for the OpenTools Ordernumber Module for Magento +# (C) 2014-2015 Reinhold Kainhofer, Open Tools +# office@open-tools.net, http://www.open-tools.net/ "Add New Counter", "Neuer Zähler" "Add New Replacement", "Neue Ersetzung" "Counter ""Reset""", "Zähler ""zurücksetzen""" @@ -46,6 +48,7 @@ "Order Number", "Auftragsnummer" "Order Numbers", "Auftragsnummern" "Order number", "Auftragsnummer" +"Restore", "Wiederherstellen" "Scope of the counter", "Gültigkeitsbereich des Zählers" "Separate counter for each Format Value", "Eigener Zähler für jeden Format-Wert" "Separate counters for each Store View", "Eigene Zähler für jeden Shop-View" diff --git a/app/locale/en_US/OpenTools_Ordernumber.csv b/app/locale/en_US/OpenTools_Ordernumber.csv index b2e1a81..243f355 100644 --- a/app/locale/en_US/OpenTools_Ordernumber.csv +++ b/app/locale/en_US/OpenTools_Ordernumber.csv @@ -1,3 +1,6 @@ +# Translation file for the OpenTools Ordernumber Module for Magento +# (C) 2014-2015 Reinhold Kainhofer, Open Tools +# office@open-tools.net, http://www.open-tools.net/ "ORDERNUMBER_COUNTERTABLE_WARNING", "All changes made to the counter values will be applied when you press save. Please be aware that in the meantime an order might have been created, so the counter might already be out of date!" "ORDERNUMBER_FORMAT_COMMENT","For help, see <a href='http://open-tools.net/documentation/ordernumber-plugin-for-virtuemart.html'>our homepage</a>." "ORDERNUMBER_FORMAT_TOOLTIP","A string, where [...] indicates a variable and # is replaced with the counter. Possible (case-insensitive) variables are:<table> -- GitLab