Skip to content
Snippets Groups Projects
Commit 1c80c8fd authored by Reinhold Kainhofer's avatar Reinhold Kainhofer
Browse files

Implement counter changing; UI for custom variables; fix translations; update...

Implement counter changing; UI for custom variables; fix translations; update code to the new set of config fields
parent f54639ef
Branches
Tags
No related merge requests found
Showing
with 586 additions and 152 deletions
...@@ -4,7 +4,9 @@ class OpenTools_Ordernumber_Block_Counters extends Mage_Adminhtml_Block_System_C ...@@ -4,7 +4,9 @@ class OpenTools_Ordernumber_Block_Counters extends Mage_Adminhtml_Block_System_C
protected $_addRowButtonHtml = array(); protected $_addRowButtonHtml = array();
protected $_addRowDeleteButtonHtml = array(); protected $_addRowDeleteButtonHtml = array();
protected $_editRowButtonHtml = array(); protected $_editRowButtonHtml = array();
protected $_removeRowButtonHtml = array(); protected $_editCancelRowButtonHtml = array();
protected $_deleteRowButtonHtml = array();
protected $_undeleteRowButtonHtml = array();
protected $_types = null; protected $_types = null;
protected $_dbModel = null; protected $_dbModel = null;
...@@ -40,10 +42,6 @@ class OpenTools_Ordernumber_Block_Counters extends Mage_Adminhtml_Block_System_C ...@@ -40,10 +42,6 @@ class OpenTools_Ordernumber_Block_Counters extends Mage_Adminhtml_Block_System_C
{ {
$this->setElement($element); $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 = '';
$html .= '<table id="ordernumber_counters_template_table" style="display:none">'; $html .= '<table id="ordernumber_counters_template_table" style="display:none">';
$html .= $this->_getRowHtmlNew(); $html .= $this->_getRowHtmlNew();
...@@ -72,7 +70,7 @@ class OpenTools_Ordernumber_Block_Counters extends Mage_Adminhtml_Block_System_C ...@@ -72,7 +70,7 @@ class OpenTools_Ordernumber_Block_Counters extends Mage_Adminhtml_Block_System_C
$html .= '<th>'. $this->__('Counter Type') . '</th>'; $html .= '<th>'. $this->__('Counter Type') . '</th>';
$html .= '<th>'. $this->__('Scope') . '</th>'; $html .= '<th>'. $this->__('Scope') . '</th>';
$html .= '<th>'. $this->__('Counter Name') . '</th>'; $html .= '<th>'. $this->__('Counter Name') . '</th>';
$html .= '<th>'. $this->__('Counter') . '</th>'; $html .= '<th>'. $this->__('Counter') . '</</th>';
$html .= '<th>' . $this->_getAddRowButtonHtml('ordernumber_counters_table', $html .= '<th>' . $this->_getAddRowButtonHtml('ordernumber_counters_table',
'ordernumber_counters_template_table', 'Add New Counter') . '</th>'; 'ordernumber_counters_template_table', 'Add New Counter') . '</th>';
$html .= '</tr>'; $html .= '</tr>';
...@@ -87,17 +85,16 @@ class OpenTools_Ordernumber_Block_Counters extends Mage_Adminhtml_Block_System_C ...@@ -87,17 +85,16 @@ class OpenTools_Ordernumber_Block_Counters extends Mage_Adminhtml_Block_System_C
protected function _getRowHtmlNew() protected function _getRowHtmlNew()
{ {
$html = '<tr>'; $html = '<tr>';
$html .= '<td>' . $this->_getNumberTypeSelect($this->getElement()->getName() . '[new_counter_type][]') . '</td>'; $html .= '<td>' . $this->_getNumberTypeSelect($this->getElement()->getName() . '[new_counter_type][]', true) . '</td>';
// TODO: Turn the text input to a select box $html .= '<td>' . $this->_getNumberScopeSelect($this->getElement()->getName() . '[new_counter_scope][]', true) . '</td>';
$html .= '<td>' . $this->_getNumberScopeSelect($this->getElement()->getName() . '[new_counter_scope][]') . '</td>'; $html .= '<td><input type="text" name="' . $this->getElement()->getName() . '[new_counter_name][]" disabled /></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][]" disabled /></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->_getAddRowDeleteButtonHtml() . '</td>'; $html .= '<td>' . $this->_getAddRowDeleteButtonHtml() . '</td>';
$html .= '</tr>'; $html .= '</tr>';
return $html; return $html;
} }
protected function _getNumberTypeSelect($name, $id='', $current=null) protected function _getNumberTypeSelect($name, $id='', $disabled=true, $current=null)
{ {
$options = array(); $options = array();
foreach ($this->getNumberTypes() as $type=>$label) { foreach ($this->getNumberTypes() as $type=>$label) {
...@@ -105,28 +102,131 @@ class OpenTools_Ordernumber_Block_Counters extends Mage_Adminhtml_Block_System_C ...@@ -105,28 +102,131 @@ class OpenTools_Ordernumber_Block_Counters extends Mage_Adminhtml_Block_System_C
} }
$html = $this->getLayout()->createBlock('core/html_select') $html = $this->getLayout()->createBlock('core/html_select')
->setName($name) ->setName($name)
->setClass($this->_getDisabled($disabled))
->setValue($current) ->setValue($current)
->setOptions($options) ->setOptions($options)
->setDisabled($this->_getDisabled) ->setExtraParams($this->_getDisabled($disabled))
->toHtml(); ->toHtml();
return $html; 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('&#160;', 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, $options = $this->_getScoreStructureOptions(true);
// 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);
$html = $this->getLayout()->createBlock('core/html_select') $html = $this->getLayout()->createBlock('core/html_select')
->setName($name) ->setName($name)
->setClass($this->_getDisabled($disabled))
->setValue($current) ->setValue($current)
->setOptions($options) ->setOptions($options)
->setDisabled($this->_getDisabled) ->setExtraParams($this->_getDisabled($disabled))
->toHtml(); ->toHtml();
return $html; return $html;
} }
protected function _convertScopeToString($website_id, $group_id, $store_id)
{
$sstore = Mage::getSingleton('adminhtml/system_store');
$nonEscapableNbspChar = html_entity_decode('&#160;', 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 * Retrieve html template for setting
* *
...@@ -141,35 +241,29 @@ class OpenTools_Ordernumber_Block_Counters extends Mage_Adminhtml_Block_System_C ...@@ -141,35 +241,29 @@ class OpenTools_Ordernumber_Block_Counters extends Mage_Adminhtml_Block_System_C
$class = ($class=='odd')?'even':'odd'; $class = ($class=='odd')?'even':'odd';
$types = $this->getNumberTypes(); $types = $this->getNumberTypes();
$html .= '<td class="ordernumber_type">'.$types[$counter->getNumberType()].'</td>'; $html .= '<td class="ordernumber_type">'.$types[$counter->getNumberType()].'</td>';
$html .= '<td class="ordernumber_scope">' . $this->_convertScopeToString($counter->getWebsiteId(), $counter->getGroupId(), $counter->getStoreId()) . '</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_name">' . $counter->getNumberFormat() . '</td>'; $html .= '<td class="ordernumber_name">' . $counter->getNumberFormat() . '</td>';
$html .= '<td class="ordernumber_counter">' . (int)$counter->getCount() . $html .= '<td class="ordernumber_counter">' .
'<input type="hidden" name="' . $this->getElement()->getName() . '[oldcounter][' . (int)$counter->getId() . ']" value="' . (int)$counter->getCount() . '" />' . '<div class="">' . (int)$counter->getCount() . '</div>' .
'<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() . '/>' . '<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>'; '</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>'; $html .= '</tr>';
return $html; 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) protected function _getValue($key)
...@@ -182,14 +276,60 @@ class OpenTools_Ordernumber_Block_Counters extends Mage_Adminhtml_Block_System_C ...@@ -182,14 +276,60 @@ class OpenTools_Ordernumber_Block_Counters extends Mage_Adminhtml_Block_System_C
return $this->getElement()->getData('value/' . $key) == $value ? 'selected="selected"' : ''; 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') protected function _getAddRowDeleteButtonHtml($selector = 'tr', $title='Delete')
{ {
if (!$this->_addRowDeleteButtonHtml) { if (!$this->_addRowDeleteButtonHtml) {
$this->_addRowDeleteButtonHtml = $this->getLayout()->createBlock('adminhtml/widget_button') $this->_addRowDeleteButtonHtml = $this->getLayout()->createBlock('adminhtml/widget_button')
->setType('button') ->setType('button')
->setClass('delete v-middle ' . $this->_getDisabled()) ->setClass('delete v-middle oton-counter-add-delete' . $this->_getDisabled())
->setLabel($this->__($title)) ->setLabel($this->__($title))
->setOnClick("Element.remove($(this).up('" . $selector . "'))") ->setOnClick($this->_getJSDeleteNewRow($selector))
->setDisabled($this->_getDisabled()) ->setDisabled($this->_getDisabled())
->toHtml(); ->toHtml();
} }
...@@ -201,9 +341,9 @@ class OpenTools_Ordernumber_Block_Counters extends Mage_Adminhtml_Block_System_C ...@@ -201,9 +341,9 @@ class OpenTools_Ordernumber_Block_Counters extends Mage_Adminhtml_Block_System_C
if (!isset($this->_addRowButtonHtml[$container])) { if (!isset($this->_addRowButtonHtml[$container])) {
$this->_addRowButtonHtml[$container] = $this->getLayout()->createBlock('adminhtml/widget_button') $this->_addRowButtonHtml[$container] = $this->getLayout()->createBlock('adminhtml/widget_button')
->setType('button') ->setType('button')
->setClass('add ' . $this->_getDisabled()) ->setClass('add oton-counter-add' . $this->_getDisabled())
->setLabel($this->__($title)) ->setLabel($this->__($title))
->setOnClick("Element.insert($('" . $container . "'), {bottom: $('" . $template . "').innerHTML})") ->setOnClick($this->_getJSAddRow($container, $template))
->setDisabled($this->_getDisabled()) ->setDisabled($this->_getDisabled())
->toHtml(); ->toHtml();
} }
...@@ -215,27 +355,56 @@ class OpenTools_Ordernumber_Block_Counters extends Mage_Adminhtml_Block_System_C ...@@ -215,27 +355,56 @@ class OpenTools_Ordernumber_Block_Counters extends Mage_Adminhtml_Block_System_C
if (!$this->_editRowButtonHtml) { if (!$this->_editRowButtonHtml) {
$this->_editRowButtonHtml = $this->getLayout()->createBlock('adminhtml/widget_button') $this->_editRowButtonHtml = $this->getLayout()->createBlock('adminhtml/widget_button')
->setType('button') ->setType('button')
->setClass('edit v-middle ' . $this->_getDisabled()) ->setClass('edit v-middle oton-counter-formelement oton-counter-display' . $this->_getDisabled())
->setLabel($this->__($title)) ->setLabel($this->__($title))
->setOnClick("Element.toggle(Element.select($(this).up('" . $selector . "'), 'input.counter_edit'))") ->setOnClick($this->_getJSEditRow($selector))
->setDisabled($this->_getDisabled()) ->setDisabled($this->_getDisabled())
->toHtml(); ->toHtml();
} }
return $this->_editRowButtonHtml; return $this->_editRowButtonHtml;
} }
protected function _getRemoveRowButtonHtml($selector = 'tr', $title = 'Delete') protected function _getEditCancelRowButtonHtml($selector = 'tr', $title='Cancel')
{ {
if (!$this->_removeRowButtonHtml) { if (!$this->_editCancelRowButtonHtml) {
$this->_removeRowButtonHtml = $this->getLayout()->createBlock('adminhtml/widget_button') $this->_editCancelRowButtonHtml = $this->getLayout()->createBlock('adminhtml/widget_button')
->setType('button') ->setType('button')
->setClass('delete v-middle ' . $this->_getDisabled()) ->setClass('cancel v-middle oton-counter-formelement oton-counter-edit' . $this->_getDisabled())
->setLabel($this->__($title)) ->setLabel($this->__($title))
->setOnClick("Element.remove($(this).up('" . $selector . "'))") ->setOnClick($this->_getJSEditCancelRow($selector))
->setDisabled($this->_getDisabled()) ->setDisabled($this->_getDisabled())
->setStyle('display: none;')
->toHtml(); ->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;
} }
......
...@@ -2,50 +2,153 @@ ...@@ -2,50 +2,153 @@
class OpenTools_Ordernumber_Block_Replacements extends Mage_Adminhtml_Block_System_Config_Form_Field class OpenTools_Ordernumber_Block_Replacements extends Mage_Adminhtml_Block_System_Config_Form_Field
{ {
protected $_addRowButtonHtml = array(); 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 * @param Varien_Data_Form_Element_Abstract $element
* @return string * @return string
*/ */
public function render(Varien_Data_Form_Element_Abstract $element) public function _getElementHtml(Varien_Data_Form_Element_Abstract $element)
{ {
$this->setElement($element); $this->setElement($element);
$html = ''; $html = '';
$html .= '<table id="ordernumber_replacements_template_table" style="display:none">'; $html .= '<table id="ordernumber_replacements_template_table" style="display:none">';
$html .= $this->_getRowTemplateHtml(); $html .= $this->_getRowHtml();
$html .= '</table>'; $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(); $html .= $this->_getRowHeader();
if ($this->_getValue('replacements')) {
foreach ($this->_getValue('replacements') as $i => $f) { // $this->logitem("render element: ", $element);
if ($i) { if ($this->_getValue('conditionvar')) {
$html .= $this->_getRowTemplateHtml($i); 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 * Retrieve html for the table header
* @return string * @return string
*/ */
protected function _getRowHeader() 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></th>';
$html .= '<th>Variable</th>'; $html .= '<th>'. $this->__('Set this variable ..') . '</th>';
$html .= '<th>Condition</th>'; $html .= '<th>'. $this->__('to value ...') . '</th>';
$html .= '<th>Value</th>';
$html .= '<th>New Variable</th>';
$html .= '<th>New Value</th>';
$html .= '<th>' . $this->_getAddRowButtonHtml('ordernumber_replacements_table', $html .= '<th>' . $this->_getAddRowButtonHtml('ordernumber_replacements_table',
'ordernumber_replacements_template_table', 'Add New Replacement') . '</th>'; 'ordernumber_replacements_template_table', 'Add New Replacement') . '</th>';
$html .= '</tr>'; $html .= '</tr>';
...@@ -53,37 +156,42 @@ class OpenTools_Ordernumber_Block_Replacements extends Mage_Adminhtml_Block_Syst ...@@ -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 * @param int $rowIndex
* @return string * @return string
*/ */
protected function _getRowTemplateHtml($rowIndex = 0) protected function _getRowHtml($rowIndex = -1)
{ {
$html = '<tr>'; static $class = 'odd';
$html = '<tr class="'.$class.'">';
$html .= '<td>If</td>'; $class = ($class=='odd')?'even':'odd';
$html .= '<td><input style="width: 100px" name="' . $this->getElement()->getName() . '[variables][]" value="' . $this->_getValue('variables/' . $rowIndex) . '" ' . $this->_getDisabled() . '/></td>'; $html .= '<td class="oton-replacement-variable"><input name="' . $this->getElement()->getName() . '[conditionvar][]" value="' . $this->_getValue('conditionvar/' . $rowIndex) . '" ' . $this->_getDisabled($rowIndex == -1) . '/></td>';
// $html .= '<td>Condition</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>Value</td>'; $html .= '<td>=></td>';
// $html .= '<td>New Variable</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>New Value</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 .= '<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>';
$html .= '</tr>'; $html .= '</tr>';
return $html; return $html;
} }
protected function _getDisabled() /**
{ * Display notice that no custom variables have been defined...
return $this->getElement()->getDisabled() ? ' disabled' : ''; */
} 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) protected function _getValue($key)
{ {
...@@ -95,31 +203,50 @@ class OpenTools_Ordernumber_Block_Replacements extends Mage_Adminhtml_Block_Syst ...@@ -95,31 +203,50 @@ class OpenTools_Ordernumber_Block_Replacements extends Mage_Adminhtml_Block_Syst
return $this->getElement()->getData('value/' . $key) == $value ? 'selected="selected"' : ''; 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') protected function _getAddRowButtonHtml($container, $template, $title='Add')
{ {
if (!isset($this->_addRowButtonHtml[$container])) { if (!isset($this->_addRowButtonHtml[$container])) {
$this->_addRowButtonHtml[$container] = $this->getLayout()->createBlock('adminhtml/widget_button') $this->_addRowButtonHtml[$container] = $this->getLayout()->createBlock('adminhtml/widget_button')
->setType('button') ->setType('button')
->setClass('add ' . $this->_getDisabled()) ->setClass('add oton-replacement-add' . $this->_getDisabled())
->setLabel($this->__($title)) ->setLabel($this->__($title))
->setOnClick("Element.insert($('" . $container . "'), {bottom: $('" . $template . "').innerHTML})") ->setOnClick($this->_getJSAddRow($container, $template))
->setDisabled($this->_getDisabled()) ->setDisabled($this->_getDisabled())
->toHtml(); ->toHtml();
} }
return $this->_addRowButtonHtml[$container]; return $this->_addRowButtonHtml[$container];
} }
protected function _getRemoveRowButtonHtml($selector = 'tr', $title = 'Delete') protected function _getDeleteRowButtonHtml($selector = 'tr', $title = 'Delete')
{ {
if (!$this->_removeRowButtonHtml) { if (!$this->_deleteRowButtonHtml) {
$this->_removeRowButtonHtml = $this->getLayout()->createBlock('adminhtml/widget_button') $this->_deleteRowButtonHtml = $this->getLayout()->createBlock('adminhtml/widget_button')
->setType('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)) ->setLabel($this->__($title))
->setOnClick("Element.remove($(this).up('" . $selector . "'))") ->setOnClick($this->_getJSDeleteRow($selector))
->setDisabled($this->_getDisabled()) ->setDisabled($this->_getDisabled())
->toHtml(); ->toHtml();
} }
return $this->_removeRowButtonHtml; return $this->_deleteRowButtonHtml;
} }
} }
\ No newline at end of file
...@@ -33,7 +33,7 @@ function logitem($label, $item) { ...@@ -33,7 +33,7 @@ function logitem($label, $item) {
} }
return self::randomString ($alphabet, $len); return self::randomString ($alphabet, $len);
} }
function setupDateTimeReplacements (&$reps, $nrtype) { function setupDateTimeReplacements (&$reps, $nrtype) {
$reps["[year]"] = date ("Y"); $reps["[year]"] = date ("Y");
$reps["[year2]"] = date ("y"); $reps["[year2]"] = date ("y");
...@@ -48,7 +48,7 @@ function logitem($label, $item) { ...@@ -48,7 +48,7 @@ function logitem($label, $item) {
function setupAddressReplacements(&$reps, $prefix, $address, $nrtype) { function setupAddressReplacements(&$reps, $prefix, $address, $nrtype) {
if (!$address) return; if (!$address) return;
$reps["[".$prefix."addressid]"] = $address->getId(); $reps["[".$prefix."addressid]"] = $address->getId();
$reps["[".$prefix."firstname]"] = $address->firstname; $reps["[".$prefix."firstname]"] = $address->firstname;
$reps["[".$prefix."lastname]"] = $address->lastname; $reps["[".$prefix."lastname]"] = $address->lastname;
$reps["[".$prefix."company]"] = $address->company; $reps["[".$prefix."company]"] = $address->company;
...@@ -65,7 +65,7 @@ function logitem($label, $item) { ...@@ -65,7 +65,7 @@ function logitem($label, $item) {
$reps["[".$prefix."countrycode2]"] = $country->iso2_code; $reps["[".$prefix."countrycode2]"] = $country->iso2_code;
$reps["[".$prefix."countrycode3]"] = $country->iso3_code; $reps["[".$prefix."countrycode3]"] = $country->iso3_code;
$reps["[".$prefix."countryid]"] = $country->getId(); $reps["[".$prefix."countryid]"] = $country->getId();
} }
function setupStoreReplacements (&$reps, $order, $nrtype) { function setupStoreReplacements (&$reps, $order, $nrtype) {
$store = $order->getStore(); $store = $order->getStore();
...@@ -88,14 +88,14 @@ function logitem($label, $item) { ...@@ -88,14 +88,14 @@ function logitem($label, $item) {
$this->setupAddressReplacements($reps, "", $address, $nrtype); $this->setupAddressReplacements($reps, "", $address, $nrtype);
$this->setupAddressReplacements($reps, "shipping", $shippingAddress, $nrtype); $this->setupAddressReplacements($reps, "shipping", $shippingAddress, $nrtype);
$this->setupAddressReplacements($reps, "billing", $billingAddress, $nrtype); $this->setupAddressReplacements($reps, "billing", $billingAddress, $nrtype);
$reps["[totalitems]"] = $order->total_item_count; $reps["[totalitems]"] = $order->total_item_count;
$reps["[totalquantity]"] = $order->total_qty_ordered; $reps["[totalquantity]"] = $order->total_qty_ordered;
} }
function setupShippingReplacements(&$reps, $order, $nrtype) { function setupShippingReplacements(&$reps, $order, $nrtype) {
$reps["[shippingmethod]"] = $order->getShippingMethod(); $reps["[shippingmethod]"] = $order->getShippingMethod();
} }
function setupShipmentReplacements (&$reps, $shipment, $order, $nrtype) { function setupShipmentReplacements (&$reps, $shipment, $order, $nrtype) {
// TODO // TODO
} }
...@@ -121,16 +121,17 @@ function logitem($label, $item) { ...@@ -121,16 +121,17 @@ function logitem($label, $item) {
if (isset($info['creditmemo'])) { if (isset($info['creditmemo'])) {
$this->setupCreditMemoReplacements($reps, $info['creditmemo'], $order, $nrtype); $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; return $reps;
} }
function doReplacements ($fmt, $reps) { function doReplacements ($fmt, $reps) {
// First, replace all randomXXX[n] fields. This needs to be done with a regexp and a callback: // 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); $fmt = preg_replace_callback ('/\[(random)(.*?)([0-9]*?)\]/', array($this, 'replaceRandom'), $fmt);
return str_ireplace (array_keys($reps), array_values($reps), $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) { function replace_fields ($fmt, $nrtype, $info) {
$reps = $this->setupReplacements ($nrtype, $info); $reps = $this->setupReplacements ($nrtype, $info);
return $this->doReplacements($fmt, $reps); return $this->doReplacements($fmt, $reps);
......
<?php <?php
class OpenTools_Ordernumber_Model_Backend_Counters extends Mage_Core_Model_Config_Data 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), * Instead of storing the counter values in the config (they are NOT config values),
* change the database and then clear the value: * change the database and then clear the value:
*/ */
protected function _beforeSave() protected function _beforeSave()
{ {
if (is_array($this->getValue())) { $vals = $this->getValue();
// TODO: Store new values in the database $helper = Mage::helper('ordernumber');
// Compare with old values $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
...@@ -27,21 +27,21 @@ class OpenTools_Ordernumber_Model_Observer extends Mage_Core_Model_Abstract ...@@ -27,21 +27,21 @@ class OpenTools_Ordernumber_Model_Observer extends Mage_Core_Model_Abstract
parent::_construct(); parent::_construct();
$this->_init('ordernumber/ordernumber'); $this->_init('ordernumber/ordernumber');
} }
protected $_dbModel = null; protected $_dbModel = null;
protected function _getModel() { protected function _getModel() {
return Mage::getModel('opentools_ordernumber/ordernumber'); return Mage::getModel('opentools_ordernumber/ordernumber');
} }
public function getModel() { public function getModel() {
if (is_null($this->_dbModel)) if (is_null($this->_dbModel))
$this->_dbModel = $this->_getModel(); $this->_dbModel = $this->_getModel();
return $this->_dbModel; return $this->_dbModel;
} }
// This trigger is called directly after the increment ID is reserved for an order // This trigger is called directly after the increment ID is reserved for an order
// TODO: Ideally, we would overwrite the reserveOrderId function! // 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) { public function sales_model_service_quote_submit_before ($observer) {
$order = $observer->getEvent()->getOrder(); $order = $observer->getEvent()->getOrder();
return $this->handle_new_number('order', $order, $order); return $this->handle_new_number('order', $order, $order);
...@@ -67,7 +67,8 @@ class OpenTools_Ordernumber_Model_Observer extends Mage_Core_Model_Abstract ...@@ -67,7 +67,8 @@ class OpenTools_Ordernumber_Model_Observer extends Mage_Core_Model_Abstract
} }
public function handle_new_number ($nrtype, $object, $order) { public function handle_new_number ($nrtype, $object, $order) {
$storeId = $order->getStore()->getStoreId(); $store = $order->getStore();
$storeId = $store->getStoreId();
$cfgprefix = 'ordernumber/'.$nrtype.'numbers'; $cfgprefix = 'ordernumber/'.$nrtype.'numbers';
$enabled = Mage::getStoreConfig($cfgprefix.'/active', $storeId); $enabled = Mage::getStoreConfig($cfgprefix.'/active', $storeId);
...@@ -76,34 +77,59 @@ class OpenTools_Ordernumber_Model_Observer extends Mage_Core_Model_Abstract ...@@ -76,34 +77,59 @@ class OpenTools_Ordernumber_Model_Observer extends Mage_Core_Model_Abstract
$object->setOrdernumberProcessed(true); $object->setOrdernumberProcessed(true);
$format = Mage::getStoreConfig($cfgprefix.'/format', $storeId); $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); $digits = Mage::getStoreConfig($cfgprefix.'/digits', $storeId);
$increment = Mage::getStoreConfig($cfgprefix.'/increment', $storeId);
// First, replace all variables: // First, replace all variables:
$helper = Mage::helper('ordernumber'); $helper = Mage::helper('ordernumber');
$info = array('order'=>$order, $nrtype=>$object); $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 // 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 // If a separate counter format is given after the |, use it, otherwise reuse the number format itself as counter format
$parts = explode ("|", $nr); $parts = explode ("|", $nr);
$format = $parts[0]; $format = $parts[0];
$counterfmt = ($global==1)?"":$parts[(count($parts)>1)?1:0]; $counterfmt = $parts[(count($parts)>1)?1:0];
// Now find the next counter that does not lead to duplicate // Now find the next counter that does not lead to duplicate
$newnumber = null; $newnumber = null;
$model = $this->getModel(); $model = $this->getModel();
$count = 0; $count = 0;
$created = false; $created = false;
// Make up to 150 attempts to create a number... // Make up to 150 attempts to create a number...
while (empty($newnumber) && (count<150)) { while (empty($newnumber) && (count<150)) {
$count += 1; $count += 1;
// Find the next counter value // 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); $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: // Check whether that number is already in use. If so, attempt to create the next number:
$modelname=($nrtype=='order') ? 'sales/order' : ('sales/order_'.$nrtype); $modelname=($nrtype=='order') ? 'sales/order' : ('sales/order_'.$nrtype);
$collection = Mage::getModel($modelname)->getCollection()->addFieldToFilter('increment_id', $newnumber); $collection = Mage::getModel($modelname)->getCollection()->addFieldToFilter('increment_id', $newnumber);
......
<?php <?php
class OpenTools_Ordernumber_Model_Ordernumber extends Mage_Core_Model_Abstract class OpenTools_Ordernumber_Model_Ordernumber extends Mage_Core_Model_Abstract
{ {
protected $_numberTypes = array();
public function _construct() public function _construct()
{ {
parent::_construct(); parent::_construct();
$this->_init('opentools_ordernumber/ordernumber'); $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'); $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->setNumberType($nrtype);
$this->setNumberFormat($format); $this->setNumberFormat($format);
$count = $this->getCount()+1; $count = $this->getCount() + $increment;
$this->setCount($count); $this->setCount($count);
$res = $this->save(); $res = $this->save();
return $count; 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->_afterLoad();
$this->setOrigData(); $this->setOrigData();
$this->_hasDataChanges = false; $this->_hasDataChanges = false;
...@@ -27,14 +32,20 @@ class OpenTools_Ordernumber_Model_Ordernumber extends Mage_Core_Model_Abstract ...@@ -27,14 +32,20 @@ class OpenTools_Ordernumber_Model_Ordernumber extends Mage_Core_Model_Abstract
} }
public function getNumberTypes() public function getNumberTypes()
{ {
$helper = Mage::helper('ordernumber'); if (empty($this->_numberTypes)) {
$types = array( $helper = Mage::helper('ordernumber');
'order' => $helper->__('Order number'), $this->_numberTypes = array(
'invoice' => $helper->__('Invoice'), 'order' => $helper->__('Order number'),
'shipment' => $helper->__('Shipment'), 'invoice' => $helper->__('Invoice'),
'creditmemo' => $helper->__('Credit Memo'), 'shipment' => $helper->__('Shipment'),
); 'creditmemo' => $helper->__('Credit Memo'),
return $types; );
}
return $this->_numberTypes;
}
public function readableType($type)
{
return $this->getNumberTypes()[$type];
} }
} }
\ No newline at end of file
...@@ -5,15 +5,22 @@ class OpenTools_Ordernumber_Model_Resource_Ordernumber extends Mage_Core_Model_R ...@@ -5,15 +5,22 @@ class OpenTools_Ordernumber_Model_Resource_Ordernumber extends Mage_Core_Model_R
$this->_init('opentools_ordernumber/ordernumber', 'ordernumber_id'); $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(); $read = $this->_getWriteAdapter();
if ($read && !is_null($nrtype)) { if ($read && !is_null($nrtype)) {
$typefield = $read->quoteIdentifier(sprintf('%s.%s', $this->getMainTable(), 'number_type')); $typefield = $read->quoteIdentifier(sprintf('%s.%s', $this->getMainTable(), 'number_type'));
$formatfield = $read->quoteIdentifier(sprintf('%s.%s', $this->getMainTable(), 'number_format')); $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() $select = $read->select()
->from($this->getMainTable()) ->from($this->getMainTable())
->where($typefield . '=?', $nrtype) ->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); $data = $read->fetchRow($select);
if ($data) { if ($data) {
$object->setData($data); $object->setData($data);
......
...@@ -137,32 +137,37 @@ ...@@ -137,32 +137,37 @@
<default> <default>
<ordernumber> <ordernumber>
<settings>
<active>0</active>
</settings>
<ordernumbers> <ordernumbers>
<active>0</active> <active>0</active>
<format>Order-[year]-#</format> <format>Order-[year]-#</format>
<scope>0</scope>
<reset>1</reset>
<digits>0</digits> <digits>0</digits>
<global>0</global> <increment>1</increment>
</ordernumbers> </ordernumbers>
<invoicenumbers> <invoicenumbers>
<active>0</active> <active>0</active>
<format>Invoice-[year]-#</format> <format>INV-[year]-#</format>
<scope>0</scope>
<reset>1</reset>
<digits>0</digits> <digits>0</digits>
<global>0</global> <increment>1</increment>
</invoicenumbers> </invoicenumbers>
<shipmentnumbers> <shipmentnumbers>
<active>0</active> <active>0</active>
<format>Shipment-[year]-#</format> <format>SH-[year]-#</format>
<scope>0</scope>
<reset>1</reset>
<digits>0</digits> <digits>0</digits>
<global>0</global> <increment>1</increment>
</shipmentnumbers> </shipmentnumbers>
<creditmemonumbers> <creditmemonumbers>
<active>0</active> <active>0</active>
<format>CreditMemo-[year]-#</format> <format>CM-[year]-#</format>
<scope>0</scope>
<reset>1</reset>
<digits>0</digits> <digits>0</digits>
<global>0</global> <increment>1</increment>
</creditmemonumbers> </creditmemonumbers>
</ordernumber> </ordernumber>
</default> </default>
......
...@@ -91,6 +91,7 @@ ...@@ -91,6 +91,7 @@
<show_in_default>1</show_in_default> <show_in_default>1</show_in_default>
<show_in_website>1</show_in_website> <show_in_website>1</show_in_website>
<show_in_store>1</show_in_store> <show_in_store>1</show_in_store>
<can_be_empty>0</can_be_empty>
<depends><active>1</active></depends> <depends><active>1</active></depends>
</increment> </increment>
</fields> </fields>
......
...@@ -26,7 +26,7 @@ $table = $installer->getConnection() ...@@ -26,7 +26,7 @@ $table = $installer->getConnection()
->addColumn('count', Varien_Db_Ddl_Table::TYPE_INTEGER, null, array('unsigned'=>true,'nullable'=>false), 'Counter') ->addColumn('count', Varien_Db_Ddl_Table::TYPE_INTEGER, null, array('unsigned'=>true,'nullable'=>false), 'Counter')
->addIndex($installer->getIdxName( ->addIndex($installer->getIdxName(
$installer->getTable('opentools_ordernumber/ordernumber'), $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 Varien_Db_Adapter_Interface::INDEX_TYPE_UNIQUE
), ),
array('number_type', 'number_format'), array('number_type', 'number_format'),
......
 # 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 Counter", "Neuer Zähler"
"Add New Replacement", "Neue Ersetzung" "Add New Replacement", "Neue Ersetzung"
"Counter ""Reset""", "Zähler ""zurücksetzen""" "Counter ""Reset""", "Zähler ""zurücksetzen"""
...@@ -46,6 +48,7 @@ ...@@ -46,6 +48,7 @@
"Order Number", "Auftragsnummer" "Order Number", "Auftragsnummer"
"Order Numbers", "Auftragsnummern" "Order Numbers", "Auftragsnummern"
"Order number", "Auftragsnummer" "Order number", "Auftragsnummer"
"Restore", "Wiederherstellen"
"Scope of the counter", "Gültigkeitsbereich des Zählers" "Scope of the counter", "Gültigkeitsbereich des Zählers"
"Separate counter for each Format Value", "Eigener Zähler für jeden Format-Wert" "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" "Separate counters for each Store View", "Eigene Zähler für jeden Shop-View"
......
# 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_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_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> "ORDERNUMBER_FORMAT_TOOLTIP","A string, where [...] indicates a variable and # is replaced with the counter. Possible (case-insensitive) variables are:<table>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment