Magento - 添加按钮[+添加字段],在system.xml中添加/显示新的文本字段

时间:2012-07-06 23:13:20

标签: magento magento-1.5

我有一个带有可选文本字段的自定义模块(通过 system.xml 中的标准文本字段选项显示)。我想要做的是显示1个必填文本字段,并有一个类似 [+添加字段] 的按钮。按下该按钮时,会添加另一个文本字段。我想为最多 10个文本字段(最大)执行此操作。有人可以帮助我完成这项工作,还是指点一个关于如何做到这一点的好教程?

编辑7/10/12 @ 11:30 AM

我一直在研究这个问题,到目前为止,我可以让文本字段显示出来。但是我有一些问题......

  1. 按“保存配置”按钮时,这些动态创建的文本字段中输入的值均未实际保存。
  2. 有没有办法限制实际保存的文本字段数?
  3. 我不确定检索文本字段数据的正确方法。这主要是因为我无法保存这些值...(如果我需要帮助,我将在#1修复后添加另一个更新...)
  4. 我的 System.xml 文件中包含此内容(与此直接相关)..

    <labels translate="label">
        <label>This is some label</label>
        <comment>This is some comment.</comment>
        <tooltip><![CDATA[This is some tooltip]]></tooltip>
        <frontend_type>text</frontend_type>
        <frontend_model>Company_Namespace/adminhtml_textfields</frontend_model>
        <backend_model>adminhtml/system_config_backend_serialized</backend_model>
        <sort_order>50</sort_order>
        <show_in_default>1</show_in_default>
        <show_in_website>1</show_in_website>
        <show_in_store>0</show_in_store>
    </labels>
    

    我的自定义 Textfields.php (frontend_model)文件内容:

    <?php
    
    class Company_Namespace_Block_Adminhtml_Textfields extends Mage_Adminhtml_Block_System_Config_Form_Field
    {
    protected $_addRowButtonHtml = array();
    protected $_removeRowButtonHtml = array();
    
    protected function _getElementHtml(Varien_Data_Form_Element_Abstract $element)
    {
        $this->setElement($element);
    
        $html = '<div id="code_label_textfields_template" style="display:none">';
        $html .= $this->_getRowTemplateHtml();
        $html .= '</div>';
    
        $html .= '<ul id="code_label_textfields_container">';
    
        if ($this->_getValue('method')) {
            foreach ($this->_getValue('method') as $i=>$f) {
                if ($i) {
                    $html .= $this->_getRowTemplateHtml($i);
                }
            }
        }
    
        $html .= '</ul>';
    
    
        $html .= $this->_getAddRowButtonHtml('code_label_textfields_container', 'code_label_textfields_template', $this->__('Button Label Here'));
    
        return $html;
    }
    
    protected function _getRowTemplateHtml()
    {
        $html = '<li>';
    
        $html .= '<div style="margin:5px 0 10px;">';
        $html .= '<input class="input-text" name="'.$this->getElement()->getName().'" value="'.$this->_getValue('price/'.$i).'" '.$this->_getDisabled().'/> ';
    
        $html .= $this->_getRemoveRowButtonHtml();
        $html .= '</div>';
    
        $html .= '</li>';
    
        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))
                    //$this->__('Add')
                    ->setOnClick("Element.insert($('".$container."'), {bottom: $('".$template."').innerHTML})")
                    ->setDisabled($this->_getDisabled())
                    ->toHtml();
        }
        return $this->_addRowButtonHtml[$container];
    }
    
    protected function _getRemoveRowButtonHtml($selector='li', $title='Remove')
    {
        if (!$this->_removeRowButtonHtml) {
            $this->_removeRowButtonHtml = $this->getLayout()->createBlock('adminhtml/widget_button')
                    ->setType('button')
                    ->setClass('delete v-middle '.$this->_getDisabled())
                    ->setLabel($this->__($title))
                    //$this->__('Remove')
                    ->setOnClick("Element.remove($(this).up('".$selector."'))")
                    ->setDisabled($this->_getDisabled())
                    ->toHtml();
        }
        return $this->_removeRowButtonHtml;
    }
    }
    

    我缺少什么,尤其是保存价值

1 个答案:

答案 0 :(得分:1)

有关示例,请参阅system.xmlMage_GoogleCheckout_Block_Adminhtml_Shipping_Merchant块。这有点令人费解,但它确实有效。您可以在Google Checkout的商家计算设置中看到这一点。