如何正确扩展Cms页面和阻止WebAPI

时间:2017-04-13 10:00:06

标签: php magento asp.net-web-api magento2 magento-2.0

我想扩展/覆盖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

感谢您的回答。

最好的问候。

乔纳森

0 个答案:

没有答案