Bilder in Magento widgets
Ich entwickle eine Website für ein Mode-client in der Magento Community-version 1.4.2 und als Teil von diesem Projekt muss ich einige angepasste Homepage promotion-Blöcke verfügen über bestimmte Produkte oder Kategorien von Produkten. Für diese ich dachte, ich würde schreiben, dass meine eigenen widget und habe ziemlich gute Fortschritte in diesem mit Ausnahme des Umgangs mit Bildern. Ich brauche, um ein Bild als Teil der Förderung. In meiner widget-definition-Datei, die ich enthalten die folgenden parameter
<image>
<label>Image</label>
<description>Promotion image</description>
<visible>1</visible>
<type>image</type>
</image>
Dieser schien zunächst gut zu funktionieren und beim erstellen/Bearbeiten einer widget im admin-Backend eine Datei-upload-Feld enthalten ist, in die widget-Optionen allerdings auf die Rettung der form das Bild nicht angezeigt, hochgeladen zu werden, oder Ihre details in der Datenbank beibehalten. Hat jemand Erfahrung mit dem Einsatz von Bildern in widgets und was ich möglicherweise falsch mache?
InformationsquelleAutor NickOates | 2011-02-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es ein paar Grund, warum Sie nicht speichern/hochladen des Bildes:
enctype
werden muss "multipart/form-data
" für einen Datei-upload zu arbeitenenctype
"multipart/form-data
" Sie werden feststellen, wenn Sie überwachen die Anforderungen, die es bekommt POST wird als "application/x-www-form-urlencoded
" das ist, weil es geschieht durch ajax und ajax selbst nicht Bearbeiten eine Datei hochladen, müssen Sie Sie separat.Habe ich erfolgreich eine "Bild Einfügen" - Schaltfläche beginnt die
Media Library
Dialog, wo können Sie durchsuchen Sie Ihre server für Bilder und/oder Bilder hochladen.Sobald der Benutzer auf "Datei Einfügen" fügt er das vollständige Bild-url in einem Textfeld in der widget-es ist also vorwärts wie ein normales Feld, um Ihre Vorlage.
Dies ist, wie ich es erreicht:
In Ihrem widget.xml geben Sie einen neuen Knoten:
Den Helfer-block Typ
<type>widgets/cms_wysiwyg_images_chooser</type>
ist eine benutzerdefinierte Klasse, so können Sie es ändern, um alles, was Sie wollen, solange Sie erstellen die Klasse/Dateien korrekt.Und das ist es! Sie sollten nun ein neues Feld in den widget-Optionen namens "Image" mit einem Textfeld und eine Schaltfläche, in die Sie einfügen können die url zu einem Bild auf deinem server und zeigt Sie von Ihrer Vorlage.
Einer kurzen Erläuterung, wie es funktioniert:
Einer Schaltfläche erstellt, die eine
onclick
- Funktion, die ruft dieMedia Library
Dialog durch aufrufenMediabrowserUtility.openDialog()
die zusammen übergeben wird, werden die parametertarget_element_id
sagt, media library, was element, um den Wert, sobald Sie Benutzer klickt auf "Insert File
" also, wir übergeben Sie einfach denid
unserer textbox in der widget für Sie, um erhalten die url von dem Bild, das der Benutzer ausgewählt.Hoffe, dies hilft jemand, da ich nicht finden konnte, keine Ressourcen gibt, die erklärt, wie es zu tun, so verbrachte ich eine ganze Weile Graben durch Magento zu arbeiten Sie alle aus 🙂
Was ich gerne tun würde in der Zukunft ist, so zeigt es das Bild, nachdem Sie es ausgewählt haben, in der widget, und es speichert die url in einem hidden-Feld, aber mit einem
onchange
binden wird nicht ausgelöst, wenn der Wert eingestellt ist, um das element ausjs/mage/adminhtml/browser.js
iminsert
- Funktion, so dass ohne änderung der core-Dateien, die es viel schwerer zu tun. Ich dachte über das spielen, um mit, wenn das Formular den Fokus erhält, auch nach derMedia Library
schließt oder ein timer (ziemlich dodgey aber funktionieren würde), aber ich habe andere Dinge zu verschieben und zurück kommen können, um es später!UPDATE:
URL ' s, die
Media Library
generiert werden, etwa so:http://www.yourwebsite.com/index.php/admin/cms_wysiwyg/directive/___directive/e3ttZWRpYSB1cmw9Ind5c2l3eWcvd2lkZ2V0cy9iYW5uZXIvaG9tZXBhZ2UvZm9yZWdyb3VuZC9maXNoLXRhbmsucG5nIn19/key/e8167e3884e40b97d8985e7b84e7cbc7875f134e5f7e5946c9c2a482d0279762/
Die zwischengespeicherte Bilder und funktionieren nur, wenn der Benutzer ist ein admin. Dumm? Ja. Wenn Sie das gleiche Bild in einer CMS-Seite, wenn der html-Code wird generiert für die Ausgabe wandelt es um die original-url auf dem server zugänglich über
/media/wysiwyg/path/to/file/photo.jpg
. Wir benötigen die original-url zu zeigen, um die Anwender, also das, was wir tun können, ist der hook in der Funktion generiert die html-widget (wenn Sie auf "Widget Einfügen") und suchen für/admin/cms_wysiwyg/directive/___directive/
und ersetzen Sie es mit der original-URL auf das Bild als die CMS-Seite tut.In Ihrem
config.xml
für Ihre benutzerdefinierte widgets:Dann das Modell erstellen Widget
code\local\Stackoverflow\Widgets\Model\Widget.php
:Überschrieben
getWidgetDeclaration
Funktion, die jedesmal aufgerufen, wenn ein widget-Ausgabe erzeugt eine textarea/wysiwyg und sieht durch alle Parameter, und wenn es findet ein Bild, das verbunden ist, um die admin-cache-findet, die aus dem ursprünglichen image und überschreibt die variable im array und die ursprüngliche Funktion aufrufen mit den Parametern.Wenn das gecachte Bild nicht gefunden wird die Funktion normal arbeiten.
AKTUALISIERUNG: 13/09/2012
Als Jonathan Day wies darauf hin, Sie zu überschreiben
Mage_Widget_Model_Widget_Instance
auch, wenn Sie wollen, dass es funktioniert in einer Widget-Instanz.Hatte ich noch nicht das Bedürfnis ein Bild hinzufügen, um ein widget durch ein Widget-Instanz, bis jetzt und war verwirrt, warum meine Funktion nicht funktioniert, bis ich untersucht und realisiert die "popup" - widget-Instanzen verwenden
Mage_Widget_Model_Widget
und die widget-Instanzen, die verwendet werden auf eine Widget-Optionen-tab (kein popup)Mage_Widget_Model_Widget_Instance
und erstrecken sich nichtMage_Widget_Model_Widget
so tun, Erben nicht die Funktionalität.Hinzufügen, um die Funktionalität zu
Mage_Widget_Model_Widget_Instance
fügen Sie einfach die Zeile<widget_instance>Petbarn_Widgets_Model_Widget_Instance</widget_instance>
zu Ihremconfig.xml
so wird es Aussehen:Dann erstellen die model-Instanz
code\local\Stackoverflow\Widgets\Model\Widget\Instance.php
:Dieser Zeit verändern wir die
widget_parameters
Daten bei Beginn der_beforeSave()
- Funktion, so dass es behebt die url, bevor es spart.Haben Sie auch, um sicherzustellen, die
/js/mage/adminhtml/browser.js
javascript-Datei enthalten ist (in meinem Fall war es nicht), um dieMediabrowserUtility
Funktionalität.Um sicherzustellen, dass es enthalten ist, der einfachste Weg ist es auch für alle von admin (nicht verbringen viel Zeit habe targeting es besser).
Erstellen Sie eine
local.xml
für adminhtml layouts (wenn Sie nicht bereits eine haben):app\design\adminhtml\default\default\layout\local.xml
Damit wird Magento gehören
js/mage/adminhtml/browser.js
auf jeder Seite der admin soMediabrowserUtility
wird immer verfügbar sein.HINWEIS: ich bin mit Magento Enterprise 1.11.2.0 also ich bin mir nicht sicher, wie verhält es sich auf andere Versionen.
bitte beachten Sie, dass der Letzte Teil der Antwort funktioniert auch für Widget-Instanzen, wenn Sie umschreiben Mage_Widget_Model_Widget_Instance
es gibt ein problem mit, dass - magento erzeugt folgenden code:
{{widget type="various/lookbook_widget" lookbook_title="TEst" lookbook="category/8" image="{{media url="wysiwyg/Rio2016_logo.jpg"}}"}}
die bekommt geschraubt von wysiwyg auf den nächsten sparenIch bin mir nicht sicher, warum das passieren würde, welche version von Megento verwenden Sie? Ich bin mit der Enterprise-1.11.2.0. Auf der Grundlage, was Sie bekommen, es sieht aus wie
Mage::getModel('core/email_template_filter')->filter()
ist die Rückgabe der vollen block string und nicht nur die URL. Haben Sie versucht, die Protokollierung, was zurückgegeben wird an den verschiedenen Punkten? Ein dirty hack wäre preg_match die url-Taste, um die url oder sogar einfach nur ersetzenstr_replace(array('{{media url="','"}}'),'',$src);
die unerwünschte extra-text.CE 1.7 - Eigentlich auf den ersten einfügen, erhalten Sie ein admin-Bild-url, das spart in Ordnung und alles funktioniert. Aber wenn Sie versuchen zu speichern, bricht es im frontend. versuchen Sie, einfügen von bereitgestellten code in einem static-block und versuchen zu Holen, image-Attribut in Ihrem widget - erhalten Sie gebrochen parameter. Nicht dwelve in die Logik, Ursache war überpünktlich, aber es scheint logisch, dass magento nicht analysieren
}}"}}
InformationsquelleAutor Kus
Löste ich dieses use-case durch das erstellen einer benutzerdefinierten Feld-Typ für widgets:
Implementiert habe ich eine block
Aijko_WidgetImageChooser_Block_Chooser
löst, die den standard Magento image chooser-element.Zur Lösung des Problems mit den nicht eine eindeutige url, die image-Datei implementiert habe ich eine custom controller
Aijko_WidgetImageChooser_Adminhtml_Cms_Wysiwyg_Images_ChooserController
Griffe der Rückgabewert vom Magento standard-image-chooser.Wird der Wert Hinzugefügt, um ein Textfeld in das widget. Diese relative url zum Bild kann dann verwendet werden, um zu zeigen, das Bild im frontend.
Fühlen Sie sich frei, um zu versuchen, die Erweiterung verfügbar auf Github oder installieren Sie direkt über Magento Connect.
Ist dies basierend auf der Antwort von @Kus ?
Funktioniert das mit Magento CE 1.9 auch?
InformationsquelleAutor Gerrit
Thx krus für Sie beantworten! Ich habe festgestellt, ein schöner Weg, um das problem zu lösen mit den zwischengespeicherten Bild-URLs. Ich selbst musste dies tun, weil Ihre Lösung überschreiben Sie die Widget-Modell hat nicht die Arbeit mit Magento 1.7.0.2.
Also, was ich gemacht habe, ist das hinzufügen eines neuen GET-parameter
use_file_url
zu der URL für die Auswahl Block:Dieser gibt die GET-parameter, um den Medien-browser. Der nächste Schritt ist, übergeben Sie diesen parameter, um die
onInsertAction
desMage_Adminhtml_Cms_Wysiwyg_ImagesController
. Tun Sie dies tun, müssen Sie das überschreiben dergetOnInsertUrl()
Funktion derMage_Adminhtml_Block_Cms_Wysiwyg_Images_Content
Block:Dann müssen Sie behandeln die neuen parameter in den
Mage_Adminhtml_Cms_Wysiwyg_ImagesController
controller:Der Letzte Schritt ist das überschreiben der
Mage_Cms_Helper_Wysiwyg_Images
Helfer und fügen Sie dengetImageMediaUrl()
Funktion:Ich denke, das ist eine ganz hübsche-Ansatz, obwohl Sie zu ovverride 4 Klassen. Aber die übergabe eines GET-parameter zu sein scheint, mehr Zukunft sicher als Analyse der zwischengespeicherten URL.
InformationsquelleAutor Thomas
Magento Image benutzerdefinierte Attribute in der Regel nicht kommen auf eine Verlängerung Registerkarte, und Sie müssen gehen Sie zu Katalog>Produkte> Bilder zuordnen dieses Attribut. Aber mit einige benutzerdefinierte Programmierung Sie diese erreichen können.
InformationsquelleAutor Pratik bhatt
Es ist keine Datei-uploads für widgets. Um dieses problem zu lösen Sie können magento media-browser und wählen Sie ein Bild, wie für die wysiwyg-editor, aber es gibt andere Problem, den media-browser nicht wieder eine eindeutige url des Bildes.
InformationsquelleAutor Andrey Korolyov
Als Magento-version 1.9.2.0 müssen Sie auch fügen Sie Folgendes zu Ihrer adminhtml layout-Datei:
InformationsquelleAutor MageParts