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

Add counter table (not yet fully editable, but on its way); add counter scopes

parent f45979d0
No related branches found
No related tags found
No related merge requests found
Showing
with 535 additions and 11 deletions
.buildpath
.project
.settings
<?php
class OpenTools_Ordernumber_Block_Counters extends Mage_Adminhtml_Block_System_Config_Form_Field
{
protected $_addRowButtonHtml = array();
protected $_addRowDeleteButtonHtml = array();
protected $_editRowButtonHtml = array();
protected $_removeRowButtonHtml = array();
protected $_types = null;
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;
}
public function getNumberTypes() {
if (is_null($this->_types)) {
$this->_types = $this->getModel()->getNumberTypes();
}
return $this->_types;
}
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
*
* @param Varien_Data_Form_Element_Abstract $element
* @return string
*/
public function render(Varien_Data_Form_Element_Abstract $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 .= '<table id="ordernumber_counters_template_table" style="display:none">';
$html .= $this->_getRowHtmlNew();
$html .= '</table>';
$html .= '<div class="grid"><table id="ordernumber_counters_table" class="data" style="width: 100%;">';
$html .= $this->_getRowHeader();
$collection = $this->getModel()->getCollection();
foreach ($collection as $counter) {
$html .= $this->_getRowHtml($counter);
}
$html .= '</table></div>';
return '<tr id="row_' . $element->getHtmlId() . '"><td colspan="5">' . $html . '</td></tr>';
}
/**
* Retrieve html for the table header
* @return string
*/
protected function _getRowHeader()
{
$html = '<tr class="headings">';
$html .= '<th>Counter Type</th>';
$html .= '<th>Scope</th>';
$html .= '<th>Counter Name</th>';
$html .= '<th>Counter</th>';
$html .= '<th>' . $this->_getAddRowButtonHtml('ordernumber_counters_table',
'ordernumber_counters_template_table', $this->__('Add New Counter')) . '</th>';
$html .= '</tr>';
return $html;
}
/**
* Retrieve html template for new counters
*
* @return string
*/
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->_getAddRowDeleteButtonHtml() . '</td>';
$html .= '</tr>';
return $html;
}
protected function _getNumberTypeSelect($name, $id='', $current=null)
{
$options = array();
foreach ($this->getNumberTypes() as $type=>$label) {
$options[] = array('value'=>$type, 'label'=>$label);
}
$html = $this->getLayout()->createBlock('core/html_select')
->setName($name)
->setValue($current)
->setOptions($options)
->setDisabled($this->_getDisabled)
->toHtml();
return $html;
}
protected function _getNumberScopeSelect($name, $id='', $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);
$html = $this->getLayout()->createBlock('core/html_select')
->setName($name)
->setValue($current)
->setOptions($options)
->setDisabled($this->_getDisabled)
->toHtml();
return $html;
}
/**
* Retrieve html template for setting
*
* @param int $rowIndex
* @return string
*/
protected function _getRowHtml($counter)
{
static $class='odd';
$html = '<tr class="'.$class.'">';
$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_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() . '/>' .
'</td>';
$html .= '<td>' . $this->_getEditRowButtonHtml() . $this->_getRemoveRowButtonHtml() . '</td>';
$html .= '</tr>';
return $html;
}
protected function _getDisabled()
{
return $this->getElement()->getDisabled() ? ' disabled' : '';
}
protected function _getValue($key)
{
return $this->getElement()->getData('value/' . $key);
}
protected function _getSelected($key, $value)
{
return $this->getElement()->getData('value/' . $key) == $value ? 'selected="selected"' : '';
}
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())
->setLabel($this->__($title))
->setOnClick("Element.remove($(this).up('" . $selector . "'))")
->setDisabled($this->_getDisabled())
->toHtml();
}
return $this->_addRowDeleteButtonHtml;
}
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())
->setLabel($this->__($title))
->setOnClick("Element.insert($('" . $container . "'), {bottom: $('" . $template . "').innerHTML})")
->setDisabled($this->_getDisabled())
->toHtml();
}
return $this->_addRowButtonHtml[$container];
}
protected function _getEditRowButtonHtml($selector = 'tr', $title='Edit')
{
if (!$this->_editRowButtonHtml) {
$this->_editRowButtonHtml = $this->getLayout()->createBlock('adminhtml/widget_button')
->setType('button')
->setClass('edit v-middle ' . $this->_getDisabled())
->setLabel($this->__($title))
->setOnClick("Element.toggle(Element.select($(this).up('" . $selector . "'), 'input.counter_edit'))")
->setDisabled($this->_getDisabled())
->toHtml();
}
return $this->_editRowButtonHtml;
}
protected function _getRemoveRowButtonHtml($selector = 'tr', $title = 'Delete')
{
if (!$this->_removeRowButtonHtml) {
$this->_removeRowButtonHtml = $this->getLayout()->createBlock('adminhtml/widget_button')
->setType('button')
->setClass('delete v-middle ' . $this->_getDisabled())
->setLabel($this->__($title))
->setOnClick("Element.remove($(this).up('" . $selector . "'))")
->setDisabled($this->_getDisabled())
->toHtml();
}
return $this->_removeRowButtonHtml;
}
}
\ No newline at end of file
<?php
class OpenTools_Ordernumber_Block_Replacements extends Mage_Adminhtml_Block_System_Config_Form_Field
{
protected $_addRowButtonHtml = array();
protected $_removeRowButtonHtml = array();
/**
* Returns html part of the setting
*
* @param Varien_Data_Form_Element_Abstract $element
* @return string
*/
public function render(Varien_Data_Form_Element_Abstract $element)
{
$this->setElement($element);
$html = '';
$html .= '<table id="ordernumber_replacements_template_table" style="display:none">';
$html .= $this->_getRowTemplateHtml();
$html .= '</table>';
$html .= '<table id="ordernumber_replacements_table">';
$html .= $this->_getRowHeader();
if ($this->_getValue('replacements')) {
foreach ($this->_getValue('replacements') as $i => $f) {
if ($i) {
$html .= $this->_getRowTemplateHtml($i);
}
}
}
$html .= '</table>';
return '<tr id="row_' . $element->getHtmlId() . '"><td colspan="5">' . $html . '</td></tr>';
}
/**
* Retrieve html for the table header
* @return string
*/
protected function _getRowHeader()
{
$html = '<tr>';
$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->_getAddRowButtonHtml('ordernumber_replacements_table',
'ordernumber_replacements_template_table', $this->__('Add New Replacement')) . '</th>';
$html .= '</tr>';
return $html;
}
/**
* Retrieve html template for setting
*
* @param int $rowIndex
* @return string
*/
protected function _getRowTemplateHtml($rowIndex = 0)
{
$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>';
$html .= '</tr>';
return $html;
}
protected function _getDisabled()
{
return $this->getElement()->getDisabled() ? ' disabled' : '';
}
protected function _getValue($key)
{
return $this->getElement()->getData('value/' . $key);
}
protected function _getSelected($key, $value)
{
return $this->getElement()->getData('value/' . $key) == $value ? 'selected="selected"' : '';
}
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())
->setLabel($this->__($title))
->setOnClick("Element.insert($('" . $container . "'), {bottom: $('" . $template . "').innerHTML})")
->setDisabled($this->_getDisabled())
->toHtml();
}
return $this->_addRowButtonHtml[$container];
}
protected function _getRemoveRowButtonHtml($selector = 'tr', $title = 'Delete')
{
if (!$this->_removeRowButtonHtml) {
$this->_removeRowButtonHtml = $this->getLayout()->createBlock('adminhtml/widget_button')
->setType('button')
->setClass('delete v-middle ' . $this->_getDisabled())
->setLabel($this->__($title))
->setOnClick("Element.remove($(this).up('" . $selector . "'))")
->setDisabled($this->_getDisabled())
->toHtml();
}
return $this->_removeRowButtonHtml;
}
}
\ No newline at end of file
<?php
class OpenTools_Ordernumber_Model_Backend_Counters extends Mage_Core_Model_Config_Data
{
/**
* 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
}
}
}
\ No newline at end of file
......@@ -25,4 +25,16 @@ class OpenTools_Ordernumber_Model_Ordernumber extends Mage_Core_Model_Abstract
$this->_hasDataChanges = false;
return $this;
}
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;
}
}
\ No newline at end of file
<?php
class OpenTools_Ordernumber_Model_Source_Reset
{
public function toOptionArray()
{
$reset = array(
array('value' => '0', 'label' => 'One counter without reset'),
array('value' => '[year]', 'label' => 'New counter for each year'),
array('value' => '[year]-[month]', 'label' => 'New counter for each month'),
array('value' => '[year]-[month]-[day]', 'label' => 'New counter for each day'),
array('value' => '1', 'label' => 'Separate counter for each Format Value'),
array('value' => '-1', 'label' => 'Custom counter Name'),
);
return $reset;
}
}
<?php
class OpenTools_Ordernumber_Model_Source_Scope
{
public function toOptionArray()
{
$scopes = array(
array('value' => '0', 'label' => Mage::helper('ordernumber')->__('Use all counters across all stores')),
array('value' => '1', 'label' => Mage::helper('ordernumber')->__('Separate counters for each Website')),
array('value' => '2', 'label' => Mage::helper('ordernumber')->__('Separate counters for each Store')),
array('value' => '3', 'label' => Mage::helper('ordernumber')->__('Separate counters for each Store View')),
);
return $scopes;
}
}
\ No newline at end of file
......@@ -10,7 +10,7 @@
</depends>
</OpenTools_Ordernumber>
</modules>
<global>
<models>
<opentools_ordernumber>
......@@ -49,7 +49,12 @@
</connection>
</opentools_ordernumber_read>
</resources>
<blocks>
<opentools_ordernumber>
<class>OpenTools_Ordernumber_Block</class>
</opentools_ordernumber>
</blocks>
<events>
<sales_model_service_quote_submit_before>
<observers>
......@@ -98,7 +103,7 @@
</sales_order_creditmemo_save_before>
</events>
</global>
<adminhtml>
<acl>
<resources>
......@@ -119,7 +124,17 @@
</admin>
</resources>
</acl>
<translate>
<modules>
<opentools_ordernumber>
<files>
<default>OpenTools_Ordernumber.csv</default>
</files>
</opentools_ordernumber>
</modules>
</translate>
</adminhtml>
</adminhtml>
<default>
<ordernumber>
<settings>
......
......@@ -39,26 +39,60 @@
<show_in_store>1</show_in_store>
<depends><active>1</active></depends>
</format>
<scope translate="label">
<label>Scope of the counter</label>
<tooltip>Separate counters can be used per store or per website. Alternatively, all counters can be used accoss all stores simultaneously.</tooltip>
<frontend_type>select</frontend_type>
<source_model>opentools_ordernumber/source_scope</source_model>
<sort_order>50</sort_order>
<show_in_default>1</show_in_default>
<show_in_website>1</show_in_website>
<show_in_store>1</show_in_store>
<depends><active>1</active></depends>
</scope>
<reset translate="label">
<label>Counter "Reset"</label>
<tooltip></tooltip>
<frontend_type>select</frontend_type>
<source_model>opentools_ordernumber/source_reset</source_model>
<sort_order>60</sort_order>
<show_in_default>1</show_in_default>
<show_in_website>1</show_in_website>
<show_in_store>1</show_in_store>
<depends><active>1</active></depends>
</reset>
<counterresetformat translate="label">
<label>Format for counter names</label>
<comment>Whenever any variable in this format changes, a new counter is used.</comment>
<frontend_type>text</frontend_type>
<sort_order>61</sort_order>
<show_in_default>1</show_in_default>
<show_in_website>1</show_in_website>
<show_in_store>1</show_in_store>
<depends><active>1</active><reset>-1</reset></depends>
</counterresetformat>
<digits translate="label">
<label>Number of digits for the counter</label>
<tooltip>A # will be replaced by the counter, left-padded with 0s to have at least this many digits</tooltip>
<frontend_type>text</frontend_type>
<validate>validate-not-negative-number</validate>
<sort_order>3</sort_order>
<sort_order>100</sort_order>
<show_in_default>1</show_in_default>
<show_in_website>1</show_in_website>
<show_in_store>1</show_in_store>
<depends><active>1</active></depends>
</digits>
<global translate="label">
<label>Use a global counter with no reset</label>
<frontend_type>checkbox</frontend_type>
<sort_order>4</sort_order>
<increment translate="label">
<label>Counter increment</label>
<tooltip>Increment for the counter so that your competitors cannot directly estimate your business figures.</tooltip>
<frontend_type>text</frontend_type>
<validate>validate-not-negative-number</validate>
<sort_order>105</sort_order>
<show_in_default>1</show_in_default>
<show_in_website>1</show_in_website>
<show_in_store>1</show_in_store>
<depends><active>1</active></depends>
</global>
</increment>
</fields>
</ordernumbers>
......@@ -209,6 +243,49 @@
</fields>
</creditmemonumbers>
<replacements translate="label">
<label>Variable Replacements</label>
<frontend_type>text</frontend_type>
<sort_order>100</sort_order>
<expanded>0</expanded>
<show_in_default>1</show_in_default>
<show_in_website>1</show_in_website>
<show_in_store>1</show_in_store>
<fields>
<replacements translate="label">
<label>Variable replacements</label>
<frontend_model>opentools_ordernumber/replacements</frontend_model>
<backend_model>adminhtml/system_config_backend_serialized</backend_model>
<sort_order>2</sort_order>
<show_in_default>1</show_in_default>
<show_in_website>1</show_in_website>
<show_in_store>1</show_in_store>
</replacements>
</fields>
</replacements>
<counters translate="label">
<label>Current Counter Values</label>
<comment><![CDATA[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!]]></comment>
<frontend_type>text</frontend_type>
<sort_order>200</sort_order>
<expanded>0</expanded>
<show_in_default>1</show_in_default>
<show_in_website>1</show_in_website>
<show_in_store>1</show_in_store>
<fields>
<counters translate="label">
<label>Counter Values</label>
<frontend_model>opentools_ordernumber/counters</frontend_model>
<backend_model>opentools_ordernumber/backend_counters</backend_model>
<sort_order>1</sort_order>
<show_in_default>1</show_in_default>
<show_in_website>1</show_in_website>
<show_in_store>1</show_in_store>
<can_be_empty>1</can_be_empty>
</counters>
</fields>
</counters>
</groups>
</ordernumber>
</sections>
......
......@@ -19,6 +19,9 @@ $table = $installer->getConnection()
'primary' => true,
), 'Ordernumber id')
->addColumn('number_type', Varien_Db_Ddl_Table::TYPE_TEXT, 63, array('nullable'=> false), 'Number Type')
->addColumn('website_id', Varien_Db_Ddl_Table::TYPE_SMALLINT,null, array('nullable'=> false, 'default'=>-1), 'Website ID')
->addColumn('group_id', Varien_Db_Ddl_Table::TYPE_SMALLINT,null, array('nullable'=> false, 'default'=>-1), 'Group ID')
->addColumn('store_id', Varien_Db_Ddl_Table::TYPE_SMALLINT,null, array('nullable'=> false, 'default'=>-1), 'Store ID')
->addColumn('number_format',Varien_Db_Ddl_Table::TYPE_TEXT, 255, array('nullable'=> true), 'Number Format')
->addColumn('count', Varien_Db_Ddl_Table::TYPE_INTEGER, null, array('unsigned'=>true,'nullable'=>false), 'Counter')
->addIndex($installer->getIdxName(
......
<_>
<form_key>1yggEOTnk5zBnKki</form_key>
<form_key>ZV49LPLMxTBr5Syu</form_key>
<name>OpenTools_Ordernumber</name>
<channel>community</channel>
<version_ids>
......@@ -40,7 +40,7 @@
<max/>
</max>
<files>
<files> </files>
<files> </files>
</files>
</package>
<extension>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment