Tôi cần xóa tất cả các trang CMS.
Đây là mã:
không gian tên Soon \ Core \ Setup;
sử dụng Magento \ Cms \ Api \ PageRep repositoryInterface;
sử dụng Magento \ Framework \ Api \ SearchCriteriaInterface;
lớp Cms
{
/ **
* @var SearchCriteriaInterface
* /
riêng tư $ searchCriteria;
/ **
* @var PageRep repositoryInterface
* /
riêng tư $ cmsPageRep repository;
/ **
* Cms xây dựng.
* @param SearchCriteriaInterface $ searchCriteria
* @param PageRep repositoryInterface $ cmsPageRep repository
* /
chức năng công cộng __construct (
SearchCriteriaInterface $ searchCriteria,
PageRep repositoryInterface $ cmsPageRep repository
)
{
$ this-> searchCriteria = $ searchCriteria;
$ this-> cmsPageRep repository = $ cmsPageRep repository;
}
/ **
* Xóa tất cả các trang CMS hiện có
* /
chức năng công cộng CleanCmsPages ()
{
$ cmsPageCollection = $ this-> cmsPageRep repository
-> getList ($ this-> searchCriteria)
-> getItems ();
foreach ($ cmsPageCollection là $ cmsPage) {
$ this-> cmsPageRep repository-> xóa ($ cmsPage);
}
}
}
Vì vậy, gọi \Soon\Core\Setup\Cms::cleanCmsPagesnên xóa tất cả các trang CMS.
Nhưng khi làm như vậy, tôi gặp lỗi này:
Argument 1 passed to Magento\Cms\Model\PageRepository::delete() must implement interface Magento\Cms\Api\Data\PageInterface, array given
Vì vậy, tôi đã bỏ đi cái $cmsPageđược sử dụng trong tôi foreach ($cmsPageCollection as $cmsPage)và có vẻ như, thực sự, $cmsPagelà một mảng.
Tôi đào sâu vào mã:
\Magento\Cms\Api\PageRepositoryInterface::getListđược thực hiện bởi \Magento\Cms\Model\PageRepository::getList.
Sau đó \Magento\Cms\Model\PageRepository::getList, chúng ta có thể thấy đoạn mã này:
$ page [] = $ this-> dataObjectProcessor-> buildOutputDataArray (
$ trangData,
'Magento \ Cms \ Api \ Data \ PageInterface'
);
}
$ searchResults-> setItems ($ page);
Nếu tôi đúng, mã này tạo ra một mảng cư trú trong $pagesmảng. Vì vậy, mã này có thể giải thích tại sao $cmsPagelà một mảng!
NHƯNG...
Bằng cách đọc @returntuyên bố của \Magento\Cms\Api\PageRepositoryInterface::getList, chúng ta có thể thấy @return \Magento\Cms\Api\Data\PageSearchResultsInterface.
Và, sau đó bằng cách đọc @returntuyên bố từ \Magento\Cms\Api\Data\PageSearchResultsInterface::getItems, chúng ta có thể thấy \Magento\Cms\Api\Data\PageInterface[]!
Vì vậy, $cmsPagetrong foreachvòng lặp của tôi nên là một triển khai \Magento\Cms\Api\Data\PageInterfacemà sau đó có thể được chuyển đúng \Magento\Cms\Api\PageRepositoryInterface::delete.
Ai sai
- Tôi là người không thể đọc / hiểu bình luận @api và mã đúng
- Magento, người không đưa ra nhận xét đúng trong các lớp @api của họ ... hoặc không thực hiện giao diện như bình thường.
Phân tích này dành cho API trang CMS nhưng cũng áp dụng cho API khối CMS .