Magento 2: Dodanie masowej akcji do istniejącego grida
Jak będzie wyglądać dodanie masowej akcji do istniejącego grida? Bardzo podobnie jak przy dodaniu do własnego. Będziemy po prostu potrzebowali w swoim module dodać plik xml komponentu ui i go odpowiednio uzupełnić. Magento połączy poszczególne pliki konfiguracyjne w jedną konfigurację. Wystarczy, że zachowamy odpowiednio rozgałęzioną konfigurację w swojej wersji pliku xml.
Tak jak poprzednio we wpisie, dodamy kolumnę selekcyjną, zdefiniujemy przykładową akcję i dołączymy odpowiednio konfigurację dla komponentu ui. We własnym module potrzebujemy:
- Określić zależność od nadpisywanego modułu,
- W zależności od naszych preferencji możemy nadpisać istniejący routing lub użyć stworzonego w naszym module,
- Stworzyć klasę akcji do obsługi akcji masowej,
- Utworzyć pliku xml dla komponentu ui grida nadpisywanego modułu w swoim module, gdzie dodamy odpowiednią konfigurację.
Ponownie odniosę się tutaj do przykładu z modułem Anna_GuestbookAdminUI.
Określenie zależności od modułu
Tworząc nowy moduł, w tym przykładzie jest to Anna_GuestbookAdminUIMassAction, potrzebujemy najpierw określić zależność od modułu, tutaj od Anna_GuestbookAdminUI. Utworzony plik etc/module.xml jest następujący:
1 2 3 4 5 6 7 8 9 |
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd"> <module name="Anna_GuestbookAdminUIMassAction"> <sequence> <module name="Anna_GuestbookAdminUI" /> </sequence> </module> </config> |
Dodanie akcji MassUpdateVisibility
Dodajmy możliwość ustawiania widoczności wpisów, które domyślnie są niewidoczne. Utworzymy masową akcję, która zaktualizuje widoczność wpisów księgi gości.
Jako że chce dodać akcję do istniejącego kontrolera, potrzebuję stworzyć plik etc/adminhtml/routes.xml o następującej zawartości:
1 2 3 4 5 6 7 8 9 |
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd"> <router id="admin"> <route id="guestbook"> <module name="Anna_GuestbookAdminUIMassAction" /> </route> </router> </config> |
Następnie tworzę klasę akcji MassUpdateVisibility w katalogu Anna\GuestbookAdminUIMassAction\Controller\Adminhtml\Index:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
<?php declare(strict_types=1); namespace Anna\GuestbookAdminUIMassAction\Controller\Adminhtml\Index; use Anna\Guestbook\Api\Data\GuestbookInterface; use Anna\Guestbook\Api\GuestbookRepositoryInterface; use Anna\Guestbook\Model\ResourceModel\Guestbook\CollectionFactory; use Magento\Backend\App\Action; use Magento\Backend\App\Action\Context; use Magento\Backend\Model\View\Result\Redirect; use Magento\Framework\App\Action\HttpPostActionInterface; use Magento\Framework\Controller\ResultFactory; use Magento\Framework\Exception\LocalizedException; use Magento\Ui\Component\MassAction\Filter; use Psr\Log\LoggerInterface; class MassUpdateVisibility extends Action implements HttpPostActionInterface { /** * Authorization level of a basic admin session * * @see _isAllowed() */ const ADMIN_RESOURCE = 'Anna_GuestbookAdminUI::manage'; /** * Massactions filter * * @var Filter */ protected $filter; /** * @var CollectionFactory */ protected $collectionFactory; /** * @var GuestbookRepositoryInterface */ private $guestbookRepository; /** * @var LoggerInterface */ private $logger; /** * @param Context $context * @param Filter $filter * @param CollectionFactory $collectionFactory * @param GuestbookRepositoryInterface $guestbookRepository * @param LoggerInterface $logger */ public function __construct( Context $context, Filter $filter, CollectionFactory $collectionFactory, GuestbookRepositoryInterface $guestbookRepository, LoggerInterface $logger ) { $this->filter = $filter; $this->collectionFactory = $collectionFactory; $this->guestbookRepository = $guestbookRepository; $this->logger = $logger; parent::__construct($context); } /** * @throws LocalizedException */ public function execute(): Redirect { $collection = $this->filter->getCollection($this->collectionFactory->create()); $entriesUpdated = 0; try { /** @var GuestbookInterface $entry */ foreach ($collection->getItems() as $entry) { $entry->setVisible(true); $this->guestbookRepository->save($entry); $entriesUpdated++; } } catch (LocalizedException $exception) { $this->messageManager->addErrorMessage('Error: ' . $exception->getMessage()); $this->logger->error($exception->getLogMessage()); } if ($entriesUpdated) { $this->messageManager->addSuccessMessage(__('A total of %1 record(s) were updated.', $entriesUpdated)); } /** @var Redirect $resultRedirect */ $resultRedirect = $this->resultFactory->create(ResultFactory::TYPE_REDIRECT); $resultRedirect->setPath('guestbook/index/index'); return $resultRedirect; } } |
Przykład akcji masowej do usuwania listy elementów znajdziesz tutaj.
Konfiguracja pliku xml ui komponentu
W module Anna_GuestbookAdminUI plik xml dla listingu grida znajduje się w Anna/GuestbookAdminUI/view/adminhtml/ui_component/guestbook_listing.xml.
Potrzebujemy teraz w we własnym module stworzyć plik view/adminhtml/ui_component/guestbook_listing.xml. Dalszy krok, to dodanie odpowiedniego zagnieżdżenia się elementów do pliku konfiguracyjnego.
Dodanie kolumny selekcyjnej
W poprzednim wpisie pokazałam, jak we własnym gridzie dodać kolumnę selekcyjną. Możemy to również zrobić przez zewnętrzny moduł. Wystarczy, że w pliku xml komponentu ui dla grida (w tym przykładzie jest to plik guestbook_listing.xml) dodamy odpowiednio zagnieżdżające się węzły konfiguracji:
1 2 3 4 5 6 7 8 9 10 11 |
<?xml version="1.0" encoding="UTF-8"?> <listing xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd"> <columns name="guestbook_columns" class="Magento\Ui\Component\Listing\Columns"> <selectionsColumn name="ids" sortOrder="10"> <settings> <indexField>entry_id</indexField> </settings> </selectionsColumn> </columns> </listing> |
Dodanie masowej akcji
Do skonfigurowania masowej akcji dla komponentu ui grida potrzebujemy dodać następującą konfigurację:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<?xml version="1.0" encoding="UTF-8"?> <listing xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd"> <listingToolbar name="listing_top"> <massaction name="listing_massaction"> <action name="update_visibility"> <settings> <url path="guestbook/index/massUpdateVisibility"/> <type>update_visibility</type> <label translate="true">Set to show</label> </settings> </action> </massaction> </listingToolbar> <columns name="guestbook_columns" class="Magento\Ui\Component\Listing\Columns"> <selectionsColumn name="ids" sortOrder="10"> <settings> <indexField>entry_id</indexField> </settings> </selectionsColumn> </columns> </listing> |
Dla porównania możesz sprawdzić dodanie masowej akcji we własnym module.