Как вставить <iframe> в административную панель <field>?

13

Я создаю пользовательский модуль, который отображает Google Maps в интерфейсе Magento. Чтобы получить эти карты, администратор должен будет ввести и сохранить URL-адрес местоположения карты в панели администратора. Это все отлично работает. URL сохраняется в базе данных, а карты отображаются во внешнем интерфейсе магазина.

Но теперь я хотел бы также просмотреть предварительный просмотр этой карты в панели администратора. Это позволит администратору легко проверить, правильно ли введен и сохранен URL-адрес.

Я хочу отобразить это Preview Mapв новом <field>(чуть ниже поля, где должен быть введен URL) и использовать предварительный просмотр карты <label>. Макет ниже показывает, чего я пытаюсь достичь.

введите описание изображения здесь

К моему system.xmlфайлу модулей я добавил следующий код:

<fields>
    ....
    <preview translate="label comment">
        <label>Map Preview</label>
        <frontend_type>link</frontend_type>
        <frontend_model>mymodule/system_config_map</frontend_model>
        <comment>Preview of your map</comment>
        <sort_order>20</sort_order>
        <show_in_default>1</show_in_default>
        <show_in_website>1</show_in_website>
        <show_in_store>1</show_in_store>
    </preview>
</fields>

И мой MyNamespace/MyModule/Block/System/Config/Map.phpсодержит следующий код:

class MyNamespace_MyModule_Block_System_Config_Map extends Mage_Adminhtml_Block_Abstract implements Varien_Data_Form_Element_Renderer_Interface
{
    public function render(Varien_Data_Form_Element_Abstract $element) {

    $url = Mage::helper('mymodule')->getMapUrl($store = null);

    return '<iframe style="border: 0;" src="'.$url.'" frameborder="0" width="100%" height="270"></iframe>';
    }
}

Это делает карту Google в панели администратора, а также отображает в <group> но она не загружена в то, <field>что я хочу. Это фактический снимок экрана с текущей ситуацией.

введите описание изображения здесь

Я перепробовал все, <frontend_type>что мог придумать ....

Итак, мой вопрос: как я могу вставить <iframe>в панель администратора <field>? Должен ли я что-то добавить к своему <frontend_model>?

Формат
источник
Я верю, что использование твоего <frontend_model>действительно путь. В этом файле вы должны быть в состоянии$rendered .= '<iframe...
Тим Холлман
Какова sort_orderваша 'Map Details'область? Это меньше, чем 20используется для вашего 'Map Preview'?
Тим Холлман

Ответы:

2

Со Varien_Data_Form_Element_Renderer_Interfaceсвободой делайте дизайн целого ряда, как хотите. Поскольку вы расширяете Mage_Adminhtml_Block_Abstractи возвращаете только iframe в его render()методе, это то, что вы получаете. Чтобы использовать макет таблицы по умолчанию, расширьте его Mage_Adminhtml_Block_Widget_Form_Renderer_Fieldset_Elementи используйте toHtml()метод по умолчанию после изменения свойства элемента для отображения iframe.

В настоящее время renderметод получитVarien_Data_Form_Element_Link параметр as, потому что это то frontend_type, что вы указали. Но так как вы не хотите фактически отображать поле ввода, вы должны изменить его на тип внешнего интерфейса, где вы можете легче заменить отображаемый вывод на произвольный HTML.

Я предлагаю использовать label, тогда метод рендеринга выглядит так:

public function render(Varien_Data_Form_Element_Abstract $element) {

    $url = Mage::helper('mymodule')->getMapUrl($store = null);

    $element->setData('value', '');
    $element->setData('after_element_html', '<iframe style="border: 0;" src="'.$url.'" frameborder="0" width="100%" height="270"></iframe>');

    return $this->toHtml();
}

Обратите внимание, что вы должны использовать after_element_htmlи оставить valueпустым, потому что значение метки всегда экранируется, в то время как вы всегда можете использовать произвольный HTML вafter_element_html

Фабиан Шменглер
источник
0

Определите класс CSS здесь и удалите width = "100%".

return '<iframe style="border: 0;" src="'.$url.'" frameborder="0"'
    . ' width="100%" height="270"></iframe>'
;

пример:

return '<iframe class="adminmap" style="border: 0;" src="' . $url
    . '" frameborder="0" width="270" height="270"></iframe>'
;

CSS (только гадание по ширине и полям)

.adminmap { 
    width: 270px !important; 
    margin-left: 50px; 
}

Вы также можете использовать textдля внешнего интерфейса вместо link.

Вы можете найти различные типы здесь .

B00MER
источник
Спасибо за ваши предложения. Я попробовал их, но, к сожалению, они мне не помогли. Все, что они делают, это изменяют размер карты, но не положение. Каким-то образом он по- <iframe>прежнему отображается выше набора, <fields>но мне нужно, чтобы он отображался <table>во втором ряду (sort_order 20). Я просто не понимаю, почему <iframe>рендерится сначала (без <label>и, <comment>который я определил в system.xml), а затем <table>рендерится потом, только с одной строкой ...
ForMat
-1

Хорошо, для этого вы можете написать код в файле phtml в папке с дизайном, вам не нужно брать iframe в качестве поля, взять текстовое поле. Вот что я сделал для видео слайдера.

1.

foreach ($ collection as $ item) {

                    $ i = $ i + 1;
                     $ Item-> GetTitle ($ I);
                     $ Item-> GetURL ($ I);
                     $ temp = $ item-> getUrl ();
                     $ ytarray = explode ("/", $ temp);
                            $ Ytendstring = конец ($ ytarray);
                            $ ytendarray = explode ("? v =", $ ytendstring);
                            $ Ytendstring = конец ($ ytendarray);
                            $ ytendarray = explode ("&", $ ytendstring);
                            $ Ytcode = $ ytendarray [0]; 
                    ?> "?>


  1. это мой код блока
 $ fieldset-> addField ('url', 'text', array (
          'label' => Mage :: helper ('videoslider') -> __ ('Введите URL видео'),
          'class' => 'required-entry',
          'style' => 'width: 700px;',
          'required' => true,
          'name' => 'url',
      ));

сделай это и все готово! внесите эти изменения в папку просмотра в вашем модуле, а также внесите изменения в saveaction в контроллере, чтобы вы могли отображать их и на стороне администратора.

РУШАБХ ШАХ
источник