1

我有一个带有可选文本字段的自定义模块(通过system.xml中的标准文本字段选项显示)。我想做的是显示 1 个强制性文本字段,并有一个按钮,上面写着[+ Add Field]。按下该按钮时,会添加另一个文本字段。我想对最多10 个文本字段(最大)执行此操作。有人可以帮我完成这个任务,或者给我一个关于如何做到这一点的好教程吗?

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

我一直在努力,到目前为止,我可以让文本字段显示出来。不过我有几个问题...

  1. 当按下“保存配置”按钮时,在这些动态创建的文本字段中输入的值都不会实际保存。
  2. 有没有办法限制实际保存的文本字段数量?
  3. 我不确定检索文本字段数据的正确方法。这主要是因为我无法保存这些值......(如果我需要帮助,我将在 #1 修复后添加另一个更新......)

我的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;
}
}

我错过了什么,特别是为了保存价值???

4

1 回答 1

1

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

于 2012-07-07T02:53:38.290 回答