2011-04-12 10 views
2

我在system.xml中为输入字段指定了frontend_model。我这样做是因为我想让字段只读。可能有更直接的方法来实现这一目标,但这正是我目前所处的位置。事情是我无法让领域显示它应该的数据。Magento配置 - 使用frontend_model时填充字段

我有一个按钮,当按下时,填充只读字段。这工作正常。但是当我点击“保存配置”时,数据从现场消失。它消失的原因是因为我无法找出我应该设置该字段的价值。下面尝试使用Varien_Data_Form_Element_Abstract的getEscapedValue()方法,但它不返回任何内容。和往常一样,Magento没有任何文件可言。

class Mypackage_MyModule_Block_Adminhtml_System_Config_DisabledText extends Mage_Adminhtml_Block_System_Config_Form_Field 
{ 
    protected function _prepareLayout() 
    { 
     parent::_prepareLayout(); 
     if (!$this->getTemplate()) { 
      $this->setTemplate('mypackage/system/config/disabled_text.phtml'); 
     } 
     return $this; 
    } 

    public function render(Varien_Data_Form_Element_Abstract $element) 
    { 
     $element->unsScope()->unsCanUseWebsiteValue()->unsCanUseDefaultValue(); 
     return parent::render($element); 
    } 

    protected function _getElementHtml(Varien_Data_Form_Element_Abstract $element) 
    { 
     $originalData = $element->getOriginalData(); 
     $this->addData(array(
      'my_value' => $element->getEscapedValue(), 
      'html_id' => $element->getHtmlId(), 
     )); 
     return $this->_toHtml(); 
    } 
} 

disabled_text.phtml包含以下内容:

<input id="<?php echo $this->getHtmlId() ?>" value="<?php echo $this->getMyValue(); ?>" class=" input-text" type="text" disabled/> 

感谢。

+0

似乎忘记为输入元素指定名称,因此当您按save config按钮时,您的字段不会发送到保存配置的控制器。 – 2011-04-12 12:17:13

+0

嗨 - 我尝试添加名称属性到html 元素,但这没有什么区别。即使这会导致控制器保存配置,当getMyValue()返回任何内容时(因为$ element-> getEscapedValue()),当然我会将html值设置为“<?php echo $ this-> getMyValue()?>” ()什么都没有返回)会重置值为空? – user649650 2011-04-12 13:51:35

回答

6

这是您需要了解Magento本身如何做类似于您想要做的事情的地方之一。如果你看一下Mage_Adminhtml_Block_System_Config_Form_Field类的_getElementHtml

protected function _getElementHtml(Varien_Data_Form_Element_Abstract $element) 
{   
    return $element->getElementHtml(); 
} 

你可以看到这个方法接受一个已经被实例化的表单元素(基于的system.xml什么),然后这个元素呈现本身getElementHtml。这意味着当Magento需要渲染(并依次获取值)时,它会从元素对象中进行渲染。一些粗俗的调试可以让我们知道在哪里getElementHtml可以位于

protected function _getElementHtml(Varien_Data_Form_Element_Abstract $element) 
{   
    var_dump(get_class($element));  
    return $element->getElementHtml(); 
} 

喜欢的东西Varien_Data_Form_Element_Text将倾到屏幕上。反过来,这种类继承的形式Varien_Data_Form_Element_Abstract,其中包含了如下定义

public function getElementHtml() 
{ 
    $html = '<input id="'.$this->getHtmlId().'" name="'.$this->getName() 
     .'" value="'.$this->getEscapedValue().'" '.$this->serialize($this->getHtmlAttributes()).'/>'."\n"; 
    $html.= $this->getAfterElementHtml(); 
    return $html; 
} 

所以,当Magento的希望得到一个系统配置字段中的值,它使用上面的PHP代码来渲染输入。所以,如果你想在你的模板中做同样的事情,我会尝试这样的事情

在类中,为整个元素指定一个块属性。实际上,从元素中抽取值的效率更高,因为所有PHP需要存储的都是对象引用。

protected function _getElementHtml(Varien_Data_Form_Element_Abstract $element) 
{ 
    $this->setMyElement($element); 
    return $this->_toHtml(); 
} 

然后,在模板中,复制从Magento的渲染代码,替换“$这个”与您保存的元素关键字

<?php $_element = $this->getMyElement(); ?> 
<!-- check the quoting/escaping on this html/php, I didn't actually run it, but the concept is sound --> 
<input disabled="disabled" id="<?php echo $_element->getHtmlId();?>" name="<?php echo $_element->getName();?>" 
     value="<?php echo $_element->getEscapedValue();?>" 
     <?php echo $_element->serialize($_element->getHtmlAttributes());?> 
/> 
<?php echo $_element->getAfterElementHtml(); ?>    

当你和Magento的合作,尝试这样想一个Magento开发者。与其说“我需要弄清楚如何让它实现X”,我认为“我需要以和我的其他队友一样的方式将该功能添加到商店中”。然后看看核心团队是如何做到的,并复制他们的实现,并根据需要进行更改。

使用系统工作得越多,它越简单!

+0

谢谢你的回复,艾伦。我认为你的建议与我的代码没有什么不同(它的行为也是一样 - 即当Save Config的值从字段中消失时)。 – user649650 2011-04-12 17:23:01

+0

谢谢你的回复,艾伦。我认为你的建议与我的代码没有什么不同(它的行为也是一样 - 即当Save Config的值从字段中消失时)。也许这与我如何填充该领域有关?该字段被禁用,并通过单击我的配置表单上其他位置的按钮来调用javascript:$('mymodule_controlinformation_myfield')= somevar;当我点击按钮时,该字段正确填充。但在保存配置后消失。不确定是否相关,但所有其他字段对他们有[STORE VIEW],除了我的字段。 – user649650 2011-04-12 17:33:35

+1

如果您确定自己的代码与Magento的核心代码的功能相同,请将问题进一步分解。 1.点击保存时,您的值是否保存在数据库中。 2.当页面加载时,您的值是否从数据库正确拉出3.您的值在窗体呈现时正确输出。这三件事之一没有正确发生。深入挖掘每一个,一旦你发现哪一个没有正确执行,你就会遇到你的问题。在一篇论坛帖子中回答这个问题太详细了。 – 2011-04-12 18:01:55