Comment insérer un <iframe> dans un <field> du panneau d'administration?

13

Je crée un module personnalisé qui affiche Google Maps dans le frontend de Magento. Pour obtenir ces cartes, l'administrateur doit saisir et enregistrer l'URL de l'emplacement de la carte dans le panneau d'administration. Tout fonctionne bien. L'URL est enregistrée dans la base de données et les cartes sont affichées dans le frontend du magasin.

Mais maintenant, je voudrais également afficher un aperçu de cette carte dans le panneau d'administration. Cela permettra à l'administrateur de vérifier facilement si l'URL correcte est entrée et enregistrée.

Je veux afficher cela Preview Mapdans un nouveau <field>(juste en dessous du champ où l'URL doit être entrée) et utiliser un aperçu de la carte <label>. La maquette ci-dessous affiche ce que j'essaie de réaliser.

entrez la description de l'image ici

À mon system.xmlfichier de modules , j'ai ajouté le code suivant:

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

Et mon MyNamespace/MyModule/Block/System/Config/Map.phpcontient le code suivant:

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

Cela rend la carte Google dans le panneau d'administration et le rend également correctement, <group>mais il n'est pas chargé dans le fichier <field>que je veux. Il s'agit d'une capture d'écran réelle de la situation actuelle.

entrez la description de l'image ici

J'ai essayé tout <frontend_type>ce à quoi je peux penser ...

Ma question est donc: comment puis-je insérer un <iframe>dans un panneau d'administration <field>? Dois-je ajouter quelque chose à mon <frontend_model>?

Format
la source
Je crois que <frontend_model>c'est vraiment la voie à suivre. Dans ce fichier, vous devriez pouvoir$rendered .= '<iframe...
Tim Hallman
Quel est sort_orderton 'Map Details'domaine? Est-ce moins que celui 20utilisé pour votre 'Map Preview'?
Tim Hallman

Réponses:

2

Avec Varien_Data_Form_Element_Renderer_Interfacevous avez la liberté de concevoir toute la ligne comme vous le souhaitez. Puisque vous étendez Mage_Adminhtml_Block_Abstractet renvoyez uniquement l'iframe dans sa render()méthode, c'est ce que vous obtenez. Pour utiliser la disposition de table par défaut, étendez-la à la Mage_Adminhtml_Block_Widget_Form_Renderer_Fieldset_Elementplace et utilisez sa toHtml()méthode par défaut après avoir modifié la propriété de l' élément pour afficher l'iframe.

Actuellement, la renderméthode recevra un Varien_Data_Form_Element_Linkparamètre as car c'est le frontend_type, que vous avez spécifié. Mais comme vous ne voulez pas afficher réellement un champ d'entrée, vous devez le changer en un type frontal où vous pouvez plus facilement remplacer la sortie rendue en HTML arbitraire.

Je suggère d'utiliser label, alors la méthode de rendu ressemble à ceci:

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

Notez que vous devez utiliser after_element_htmlet laisser valuevide, car la valeur d'une étiquette est toujours échappée, tandis que vous pouvez toujours utiliser du HTML arbitraire dansafter_element_html

Fabian Schmengler
la source
0

Définissez une classe CSS ici et supprimez la largeur = "100%".

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

exemple:

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

CSS (juste deviner la largeur et les marges)

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

Vous pouvez également vouloir utiliser textpour le type frontal au lieu de link.

Vous pouvez trouver les différents types ici .

B00MER
la source
Merci pour vos suggestions. Je les ai essayés, mais malheureusement ils ne m'ont pas aidé. Tout ce qu'ils font, c'est changer la taille de la carte, mais pas la position. D'une manière ou d'une autre, le <iframe>rendu est toujours au-dessus de l'ensemble de <fields>mais j'ai besoin qu'il soit rendu à l'intérieur <table>de la deuxième ligne (sort_order 20). Je ne comprends tout simplement pas pourquoi le <iframe>premier est rendu (sans le <label>et <comment>que j'ai défini dans system.xml) puis le <table>est ensuite, avec une seule ligne ...
ForMat
-1

Eh bien, pour cela, vous pouvez coder dans un fichier phtml dans le dossier de conception, vous n'avez pas besoin de prendre iframe comme champ, prendre textfield, voici ce que j'ai fait pour le curseur vidéo

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. c'est mon code bloc
 $ fieldset-> addField ('url', 'text', array (
          'label' => Mage :: helper ('videoslider') -> __ ('Enter Video URL'),
          'class' => 'required-entry',
          'style' => 'width: 700px;',
          'required' => vrai,
          'name' => 'url',
      ));

faites-le et vous êtes prêt! effectuez ces modifications dans le dossier de vue de votre module et effectuez également des modifications dans la sauvegarde dans le contrôleur afin que vous puissiez également l'afficher dans le côté administrateur.

RUSHABH SHAH
la source