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 Map
w 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ąć.
Do mojego system.xml
pliku 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.php
zawiera 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.
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>
?
<frontend_model>
jest rzeczywiście właściwą drogą. W tym pliku powinieneś być w stanie$rendered .= '<iframe...
sort_order
twoja'Map Details'
dziedzina? Czy jest mniejszy niż20
użyty do twojego'Map Preview'
?Odpowiedzi:
Mając
Varien_Data_Form_Element_Renderer_Interface
swobodę, projektuj cały rząd, jak chcesz. Ponieważ rozszerzaszMage_Adminhtml_Block_Abstract
i zwracasz tylko iframe w jegorender()
metodzie, otrzymujesz to. Aby użyć domyślnego układu tabeli,Mage_Adminhtml_Block_Widget_Form_Renderer_Fieldset_Element
zamiast tego należy rozszerzyć i użyć jego domyślnejtoHtml()
metody po zmodyfikowaniu właściwości elementu w celu wyświetlenia elementu iframe.Obecnie
render
metoda otrzymaVarien_Data_Form_Element_Link
parametr jako, ponieważ jest to tenfrontend_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:Pamiętaj, że musisz użyć
after_element_html
i pozostawićvalue
puste, ponieważ wartość etykiety jest zawsze oznaczana znakiem ucieczki, podczas gdy zawsze możesz użyć dowolnego kodu HTML wafter_element_html
źródło
Zdefiniuj tutaj klasę CSS i usuń szerokość = "100%".
przykład:
CSS (tylko zgadywanie szerokości i marginesów)
Możesz także użyć
text
dla typu frontendu zamiastlink
.Możesz znaleźć różne typy tutaj .
źródło
<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łemsystem.xml
), a następnie<table>
jest renderowany później, z tylko jednym wierszem ...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.
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.
źródło