Конфигурация Magento — заполняющее поле при использовании frontend_model

#configuration #magento

#конфигурация #magento

Вопрос:

Я указал frontend_model в system.xml для поля ввода. Я сделал это, потому что хотел сделать поле доступным только для чтения. Возможно, был более простой способ добиться этого, но именно там я нахожусь в данный момент. Дело в том, что я не могу заставить поле отображать данные, которые оно должно.

У меня есть кнопка, которая при нажатии заполняет поле, доступное только для чтения. Это работает нормально. Но когда я нажимаю «Сохранить конфигурацию», данные исчезают из поля. Причина, по которой оно исчезает, заключается в том, что я не могу выяснить, какое значение я должен установить для поля. Ниже предпринята попытка использования метода getEscapedValue() Varien_Data_Form_Element_Abstract, но он ничего не возвращает. И, как обычно в 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/>
  

Спасибо.

Комментарии:

1. Кажется, вы забыли указать имя для вашего элемента ввода, поэтому, когда вы нажимаете кнопку сохранить конфигурацию, ваше поле не отправляется контроллеру, который сохраняет конфигурацию.

2. Привет — Я попытался добавить атрибут name к элементу html <input>, но это ничего не изменило. Даже если это приведет к тому, что контроллер сохранит конфигурацию, наверняка, если я установлю для атрибута значения html <input> значение «<?php echo $this-> getMyValue() ?>», когда getMyValue() ничего не возвращает (потому что $element-> getEscapedValue() ничего не вернул), значение в любом случае будет пустым?

Ответ №1:

Это одно из тех мест, где вам нужно посмотреть, как сам 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 . В свою очередь, этот класс наследует form 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-код для отображения входных данных. Итак, если вы хотите сделать то же самое в своем шаблоне, я бы попробовал что-то вроде этого

Вверху в классе назначьте свойство block для всего элемента. На самом деле это более эффективно, чем извлекать значения из элементов, поскольку все, что 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», подумайте «Мне нужно добавить эту функцию в хранилище таким же образом, как и у остальных моих товарищей по команде». Затем посмотрите, как это сделала основная команда, и скопируйте их реализацию, изменив так мало, как вам нужно.

Это действительно становится проще, чем больше вы работаете с системой!

Комментарии:

1. Спасибо за твой ответ, Алан. Я думаю, что то, что вы предлагаете, ничем не отличается от моего кода (хотя он ведет себя так же — т. Е. при сохранении конфигурации значение исчезает из поля).

2. Спасибо за твой ответ, Алан. Я думаю, что то, что вы предлагаете, ничем не отличается от моего кода (хотя он ведет себя так же — т. Е. при сохранении конфигурации значение исчезает из поля). Может быть, это как-то связано с тем, как я заполняю поле? Поле отключено и заполняется с помощью javascript, вызываемого нажатием кнопки в другом месте моей формы конфигурации: $(‘mymodule_controlinformation_myfield’) = somevar; Когда я нажимаю кнопку, поле заполняется правильно. Но затем исчезает после сохранения конфигурации. Не уверен, что это уместно, но для всех других полей, кроме моего поля, указано [ПРОСМОТР ХРАНИЛИЩА].

3. Если вы уверены, что ваш код выполняет то же самое, что и основной код Magento, разберите проблему подробнее. 1. Сохраняется ли ваше значение в базе данных при нажатии кнопки Сохранить. 2. Правильно ли извлекается ваше значение из базы данных при загрузке страницы 3. Правильно ли выводится ваше значение при рендеринге формы. Одна из этих трех вещей происходит неправильно. Изучите каждое из них, и как только вы выясните, какое из них выполняется неправильно, у вас возникнет проблема. Это слишком подробная проблема, чтобы отвечать на нее в одном сообщении на форуме.

4. Оказывается, причина поведения, которое я наблюдал, заключается в том, что Magento пропускает отключенные поля при сохранении конфигурации. Я изменил поле на доступное только для чтения, и значение было сохранено. Я не думаю, что у вас есть какие-либо идеи, почему в моем поле нет [ПРОСМОТР ХРАНИЛИЩА] рядом с ним? И если это проблема? Спасибо.

5. Есть ли способ получить имя расширения / модуля, к которому принадлежит этот элемент, как показано в system.xml файл, если вы посмотрите на разделы, а затем module=»[extensionname]»? Извините, idk, если я правильно говорю…