Jak wstawić <ramkę> w panelu administracyjnym <pole>?


13

Tworzę niestandardowy moduł, który wyświetla Mapy Google w interfejsie Magento. Aby uzyskać te mapy, administrator musiałby wprowadzić i zapisać adres URL lokalizacji mapy w panelu administracyjnym. To wszystko działa dobrze. Adres URL jest zapisywany w bazie danych, a mapy są wyświetlane w interfejsie sklepu.

Ale teraz chciałbym wyświetlić podgląd tej mapy również w panelu administracyjnym. Umożliwi to administratorowi łatwe sprawdzenie, czy prawidłowy adres URL został wprowadzony i zapisany.

Chcę wyświetlić to Preview Mapw nowym <field>(tuż pod polem, w którym należy wprowadzić adres URL) i użyć podglądu mapy <label>. Poniższa makieta pokazuje, co próbuję osiągnąć.

wprowadź opis zdjęcia tutaj

Do mojego system.xmlpliku modułów dodałem następujący kod:

<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>

A mój MyNamespace/MyModule/Block/System/Config/Map.phpzawiera następujący kod:

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>';
    }
}

To renderuje Mapę Google w panelu administracyjnym, a także renderuje się we właściwy sposób, <group>ale nie jest ładowany w żądanym przeze <field>mnie miejscu. To jest zrzut ekranu z bieżącej sytuacji.

wprowadź opis zdjęcia tutaj

Próbowałem wszystkiego <frontend_type>, co mogłem wymyślić ...

Więc moje pytanie brzmi: jak mogę wstawić do <iframe>panelu administracyjnego <field>? Czy powinienem coś dodać do swojego <frontend_model>?


Uważam, że korzystanie z twojego <frontend_model>jest rzeczywiście właściwą drogą. W tym pliku powinieneś być w stanie$rendered .= '<iframe...
Tim Hallman

Jaka jest sort_ordertwoja 'Map Details'dziedzina? Czy jest mniejszy niż 20użyty do twojego 'Map Preview'?
Tim Hallman

Odpowiedzi:


2

Mając Varien_Data_Form_Element_Renderer_Interfaceswobodę, projektuj cały rząd, jak chcesz. Ponieważ rozszerzasz Mage_Adminhtml_Block_Abstracti zwracasz tylko iframe w jego render()metodzie, otrzymujesz to. Aby użyć domyślnego układu tabeli, Mage_Adminhtml_Block_Widget_Form_Renderer_Fieldset_Elementzamiast tego należy rozszerzyć i użyć jego domyślnej toHtml()metody po zmodyfikowaniu właściwości elementu w celu wyświetlenia elementu iframe.

Obecnie rendermetoda otrzyma Varien_Data_Form_Element_Linkparametr jako, ponieważ jest to ten frontend_type, który podałeś. Ale ponieważ tak naprawdę nie chcesz pokazywać pola wejściowego, powinieneś zmienić je na typ interfejsu, w którym możesz łatwiej zastąpić renderowane dane wyjściowe arbitralnym kodem HTML.

Sugeruję użycie label, a następnie metoda renderowania wygląda następująco:

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();
}

Pamiętaj, że musisz użyć after_element_htmli pozostawić valuepuste, ponieważ wartość etykiety jest zawsze oznaczana znakiem ucieczki, podczas gdy zawsze możesz użyć dowolnego kodu HTML wafter_element_html


0

Zdefiniuj tutaj klasę CSS i usuń szerokość = "100%".

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

przykład:

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

CSS (tylko zgadywanie szerokości i marginesów)

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

Możesz także użyć textdla typu frontendu zamiast link.

Możesz znaleźć różne typy tutaj .


Dziękuję za twoje sugestie. Próbowałem ich, ale niestety mi nie pomogły. Wszystko, co robią, to zmieniają rozmiar mapy, ale nie pozycję. Jakoś <iframe>jest nadal renderowany powyżej zbioru, <fields>ale potrzebuję go do renderowania <table>w drugim rzędzie (sort_order 20). Po prostu nie rozumiem, dlaczego <iframe>najpierw jest renderowany (bez <label>i w <comment>którym zdefiniowałem system.xml), a następnie <table>jest renderowany później, z tylko jednym wierszem ...
ForMat

-1

Cóż, za to możesz napisać kod w pliku phtml w folderze projektu, którego nie potrzebujesz brać iframe jako pole. Weź pole tekstowe, oto co zrobiłem dla suwaka wideo

1.

foreach ($ collection as $ item) {

                    $ i = $ i + 1;
                     $ item-> getTitle ($ i);
                     $ item-> getUrl ($ i);
                     $ temp = $ item-> getUrl ();
                     $ ytarray = explode ("/", $ temp);
                            $ ytendstring = end ($ ytarray);
                            $ ytendarray = explode ("? v =", $ ytendstring);
                            $ ytendstring = end ($ ytendarray);
                            $ ytendarray = explode ("&", $ ytendstring);
                            $ ytcode = $ ytendarray [0]; 
                    ?> ";?>


  1. to jest mój kod blokowy
 $ fieldset-> addField ('url', 'text', array (
          „label” => Mag :: pomocnik („videoslider”) -> __ („Wprowadź adres URL wideo”),
          „klasa” => „wymagany wpis”,
          „style” => „width: 700px;”,
          „wymagane” => prawda,
          „name” => „url”,
      ));

zrób to i wszystko gotowe! wprowadź te zmiany w folderze widoku w swoim module, a także wprowadź zmiany w saveaction w kontrolerze, abyś mógł wyświetlić go również po stronie administratora.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.