Это одно из тех мест, где вам нужно посмотреть, как сам 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 нужно визуализировать (и, в свою очередь, получить значение), он делает это из объекта element. Некоторая грубая отладка даст нам знать, где можно найти 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, заменив ключевое слово «$ this» сохраненным элементом
<?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», подумайте: «Мне нужно добавить эту функцию в магазин так же, как это делают остальные мои товарищи по команде». Затем посмотрите, как это сделала основная команда, и скопируйте их реализацию, меняя ее так мало, как вам нужно.
Чем проще вы работаете с системой, тем легче!