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::cleanCmsPages
nê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ự, $cmsPage
là 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 $pages
mảng. Vì vậy, mã này có thể giải thích tại sao $cmsPage
là một mảng!
NHƯNG...
Bằng cách đọc @return
tuyê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 @return
tuyên bố từ \Magento\Cms\Api\Data\PageSearchResultsInterface::getItems
, chúng ta có thể thấy \Magento\Cms\Api\Data\PageInterface[]
!
Vì vậy, $cmsPage
trong foreach
vòng lặp của tôi nên là một triển khai \Magento\Cms\Api\Data\PageInterface
mà 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 .