Buduję moduł CRUD dla Magento 2 przy użyciu komponentów interfejsu użytkownika do listy administracyjnej i formularza, a jedna z moich jednostek ma pole obrazu.
Ale nie mogę sprawić, żeby działało tak, jak powinno.
Oto jak powinno to działać.
W trybie dodawania lub w trybie edycji bez przesłanego obrazu powinno to wyglądać jak zwykły plik wejściowy.
Po przesłaniu plik powinien wyświetlać podgląd obrazu i pole usuwania poniżej.
Nie szukam dokładnie tego projektu. Może wyglądać inaczej, ale ma tę samą funkcjonalność.
W Magento 1 mogłem to zrobić, po prostu tworząc własny renderer bloków
class {{Namespace}}_{{Module}}_Block_Adminhtml_{{Entity}}_Helper_Image extends Varien_Data_Form_Element_Image
{
protected function _getUrl()
{
$url = false;
if ($this->getValue()) {
$url = Mage::helper('{{namespace}}_{{module}}/{{entity}}_image')->getImageBaseUrl().$this->getValue();
}
return $url;
}
}
I dodając to w moim bloku formularza
$fieldset->addType(
'image',
Mage::getConfig()->getBlockClassName('{{namespace}}_{{module}}/adminhtml_{{entity}}_helper_image')
);
Ale nie mam bloku formularza w Magento 2.
Wiem, że mogę użyć nazwy klasy dla pola formularza w pliku składników interfejsu użytkownika
<field name="image" class="Class\Name\Here">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="dataType" xsi:type="string">text</item>
<item name="label" xsi:type="string" translate="true">Resume</item>
<item name="formElement" xsi:type="string">image</item>
<item name="source" xsi:type="string">[entity]</item>
<item name="dataScope" xsi:type="string">image</item>
</item>
</argument>
</field>
Oczywiście muszę stworzyć tę klasę, ale co mam przedłużyć?
Wiem tylko, że muszę wdrożyć interfejs, Magento\Framework\View\Element\UiComponentInterface
ale nie znalazłem nic, co mógłbym rozszerzyć.
Tak więc moje prawdziwe pytanie brzmi: czy mogę rozszerzyć klasę, aby osiągnąć pożądane zachowanie? Jeśli nie, jak mogę rozpocząć tworzenie tego mechanizmu renderującego elementy?
źródło
Odpowiedzi:
Znalazłem sposób na zrobienie tego bez wymagania zajęć w terenie. Mam na myśli klasę dołączoną do elementu formularza, ale nie jako renderer.
Kolumnę należy zdefiniować następująco:
Musiałem także utworzyć plik szablonu podglądu, do którego odwołuje się
[Namespace]_[Module]/image-preview
.To
app/code/[Namespace]/[Module]/view/adminhtml/web/template/image-preview.html
wygląda tak:Ten kod wygeneruje takie pole:
Po przesłaniu obrazu (w czasie rzeczywistym) wygląda to tak:
Elementem
url
wewnątrzuploaderConfig
jest adres URL, w którym obraz jest publikowany po przesłaniu. Więc musiałem to również utworzyć:Ta klasa używa instancji
[Namespace]\[Module]\Model\ImageUploader
tego typu\Magento\Catalog\Model\ImageUploader
.To szwy do pracy. Nadal mam problemy z zapisaniem obrazu w bazie danych, ale to zupełnie inny problem.
Użyłem jako inspiracji
image
pola dla encji kategoriiźródło
Tak, klasa, którą powinieneś przedłużyć, to
\Magento\Ui\Component\Form\Element\AbstractElement
.Ta klasa implementuje to,
ElementInterface
co samo rozszerza odniesienie, oUiComponentInterface
którym mówisz.Ponadto, jeśli sprawdzisz składniki zadeklarowane pod
Magento\Ui\Component\Form\Element
, możesz zobaczyć, że wszystkie one rozszerzają tę klasę.Powodem, dla którego wybrałbym tę klasę jest to, że(W rzeczywistości jest to przypadekrender
metoda\Magento\Backend\Block\Widget\Form\Renderer\Element
akceptuje tylko taki typ klasy:Magento\Framework\Data\Form\Element\AbstractElement
zaakceptowany, nie\Magento\Ui\Component\Form\Element\AbstractElement
)źródło