我想扩展/覆盖CMS页面和块的API以添加自定义字段(例如,store_ids数组,以允许在具有webapi调用的不同商店上创建CMS块,它是' s我的主要目标)。
我尝试了很多东西,但这看起来并不干净,符合标准。我的印象是重载整个模块CMS(数据接口,存储库接口,模型,存储库工厂等)只是为了在webapi中添加新字段。
我将解释我现在所做的事情:
1 /我写了一个新的数据api \ BlockInterface,它扩展了核心接口以添加我的新字段(store_id)并声明他的getter和setter方法。
namespace Reflet\CmsExtension\Api\Data;
interface BlockInterface extends \Magento\Cms\Api\Data\BlockInterface
{
/**
* New fields
*/
const STORE_ID = 'store_id';
/**
* Get Store Ids
*
* @return array
*/
public function getStoreId();
/**
* Set Store Ids
*
* @param array $storeIds
* @return \Reflet\CmsExtension\Api\Data\BlockInterface
*/
public function setStoreId($storeIds);
}
2 /我在新的\ Block模型对象中实现了数据接口。 3 /在di.xml文件中有很多,我覆盖块模型类型。 4 /我重新实现api \ BlockRepositoryInterface和webapi.xml文件以更改存储库中使用的数据类型。 5 /我使用简单的存储库调用和webapi测试块#1的getById()和save()方法。
这是我的结果:
1 /如果我使用存储库获取块#1,则store_id将加载到结果对象中。
array (size=12)
'row_id' => string '1' (length=1)
'block_id' => string '1' (length=1)
'created_in' => string '1' (length=1)
'updated_in' => string '2147483647' (length=10)
'title' => string 'Catalog Events Lister' (length=21)
'identifier' => string 'catalog_events_lister' (length=21)
'content' => string '{{block class="Magento\\CatalogEvent\\Block\\Event\\Lister" name="catalog.event.lister" template="lister.phtml"}}' (length=113)
'creation_time' => string '2017-02-14 14:33:20' (length=19)
'update_time' => string '2017-02-14 14:33:20' (length=19)
'is_active' => string '1' (length=1)
'store_id' =>
array (size=1)
0 => string '0' (length=1)
'stores' =>
array (size=1)
0 => string '0' (length=1)
2 /如果我使用WebAPI获取块#1,则store_id也会加载到结果对象中。
public 'store_id' =>
array (size=1)
0 => string '0' (length=1)
public 'id' => int 1
public 'identifier' => string 'catalog_events_lister' (length=21)
public 'title' => string 'Catalog Events Lister' (length=21)
public 'content' => string '{{block class="Magento\\CatalogEvent\\Block\\Event\\Lister" name="catalog.event.lister" template="lister.phtml"}}' (length=113)
public 'creation_time' => string '2017-02-14 14:33:20' (length=19)
public 'update_time' => string '2017-02-14 14:33:20' (length=19)
public 'active' => boolean true
3 /如果我用WebAPI保存块#1,则发生错误,他加载了错误的BlockInterface。我需要重新实现BlockRepository吗?我不认为这是一种好的,更清洁的方法(...)?
public 'message' => string 'Property "StoreId" does not have corresponding setter in class "Magento\Cms\Api\Data\BlockInterface".' (length=101)
public 'trace' => string '#0 /var/www/vhosts/reflet.com/storemanager/vendor/magento/framework/Reflection/NameFinder.php(59): Magento\Framework\Reflection\NameFinder->findAccessorMethodName(Object(Zend\Code\Reflection\ClassReflection), 'StoreId', 'getStoreId', 'isStoreId')
#1 /var/www/vhosts/reflet.com/storemanager/vendor/magento/framework/Webapi/ServiceInputProcessor.php(158): Magento\Framework\Reflection\NameFinder->getGetterMethodName(Object(Zend\Code\Reflection\ClassReflection), 'StoreId')
#2 /var/www/vhosts/reflet.com/storemanag'... (length=2239)
对于此示例,我使用' store_id'只是,但在将来,它必须适用于Page或Block对象中的所有自定义字段。
您如何建议此修改尽可能干净并在将来限制冲突?你有一个例子吗?
如果你想测试,你可以在这个档案中找到我目前的两个Magento模块(Reflet_Api是一个简单的适配器来调用REST WebApi和Reflet_CmsExtension来覆盖CMS块):https://drive.google.com/file/d/0B12trf96j0ALSjhZdmJPTzBPT0U/view
感谢您的回答。
最好的问候。
乔纳森