简体   繁体   English

在Sonata电子商务中创建产品-没有可用的对象类型

[英]creating product in sonata e-commerce - no object types available

I have a problem with Sonata e-commerce, with creating a Product. 我对Sonata电子商务和创建产品有疑问。 I follow sonata documentation and other posts related with that and I constantly get message "No object types available" 我遵循奏鸣曲文档以及与此相关的其他文章,并且不断收到消息“没有可用的对象类型” 没有可用的对象类型

My files looks like: 我的文件如下所示:

product.yml product.yml

services:
    sonata.ecommerce_demo.product.bowl.manager:
        class: Sonata\ProductBundle\Entity\ProductManager
        arguments:
            - Application\Sonata\ProductBundle\Entity\Bowl
            - @doctrine

    sonata.ecommerce_demo.product.bowl.type:
        class: Application\Sonata\ProductBundle\Provider\BowlProductProvider
        arguments:
            - @serializer

sonata_product.yml sonata_product.yml

sonata_product:
    products:
        sonata.ecommerce_demo.product.bowl:
            provider: sonata.ecommerce_demo.product.bowl.type
            manager: sonata.ecommerce_demo.product.bowl.manager

Entity.Product.xml Entity.Product.xml

<?xml version="1.0" encoding="UTF-8"?>
<serializer>
    <!-- This file has been generated by the SonataEasyExtendsBundle: https://sonata-project.org/bundles/easy-extends -->
    <class name="Application\Sonata\ProductBundle\Entity\Product" exclusion-policy="all" xml-root-name="_product">
        <discriminator-class value="sonata.ecommerce_demo.product.bowl">Application\Sonata\ProductBundle\Entity\Bowl</discriminator-class>
        <property xml-attribute-map="true" name="id" type="integer" expose="true" since-version="1.0" groups="sonata_api_read,sonata_api_write,sonata_search"/>
    </class>
</serializer>

Bowl.php Bowl.php

<?php
/*
 * This file is part of the <name> project.
 *
 * (c) <yourname> <youremail>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Application\Sonata\ProductBundle\Entity;

//use Sonata\ProductBundle\Entity\ProductProduct;

/**
 * This file has been generated by the Sonata product generation command ( https://sonata-project.org/ )
 *
 * References :
 *   working with object : http://www.doctrine-project.org/projects/orm/2.0/docs/reference/working-with-objects/en
 *
 * @author <yourname> <youremail>
 */
class Bowl extends Product
{
    /**
     * @var integer $id
     */
    protected $id;

    /**
     * Get id
     *
     * @return integer $id
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * @param int $id
     */
    public function setId($id)
    {
        $this->id = $id;
    }
}

Product.php Product.php

<?php

namespace Application\Sonata\ProductBundle\Entity;

use Sonata\ProductBundle\Entity\BaseProduct as BaseProduct;

/**
 * This file has been generated by the SonataEasyExtendsBundle.
 *
 * @link https://sonata-project.org/easy-extends
 *
 * References:
 * @link http://www.doctrine-project.org/projects/orm/2.0/docs/reference/working-with-objects/en
 */
/**
* @ORM\DiscriminatorMap({
 *     product" = "Product"
 * })
*/
abstract class Product extends BaseProduct
{
    /**
     * @var int $id
     */
    protected $id;

    /**
     * Get id.
     *
     * @return int $id
     */
    public function getId()
    {
        return $this->id;
    }
}

composer.json composer.json

"require": {
        "php": ">=5.3.9",
        "cocur/slugify": "^2.5",
        "doctrine/doctrine-bundle": "~1.4",
        "doctrine/orm": "^2.4.8",
        "enqueue/amqp-lib": "^0.8.23",
        "friendsofsymfony/rest-bundle": "^2.3",
        "friendsofsymfony/user-bundle": "~1.3",
        "incenteev/composer-parameter-handler": "~2.0",
        "jms/serializer-bundle": "^1.5",
        "kriswallsmith/buzz": "^0.15",
        "liip/monitor-bundle": "^2.6",
        "nelmio/api-doc-bundle": "~2.0",
        "sensio/distribution-bundle": "~4.0",
        "sensio/framework-extra-bundle": "^3.0.2",
        "sonata-project/admin-bundle": "3.x-dev",
        "sonata-project/block-bundle": "^3.12",
        "sonata-project/cache": "^1.0.3",
        "sonata-project/cache-bundle": "^2.4",
        "sonata-project/classification-bundle": "^3.6",
        "sonata-project/core-bundle": "^3.9",
        "sonata-project/dashboard-bundle": "^0.2.0",
        "sonata-project/datagrid-bundle": "^2.3",
        "sonata-project/doctrine-orm-admin-bundle": "3.x-dev",
        "sonata-project/easy-extends-bundle": "^2.5",
        "sonata-project/ecommerce": "dev-master",
        "sonata-project/formatter-bundle": "^3.4",
        "sonata-project/google-authenticator": "^2.1",
        "sonata-project/media-bundle": "^3.12",
        "sonata-project/news-bundle": "^3.4",
        "sonata-project/notification-bundle": "^3.5",
        "sonata-project/page-bundle": "^3.8",
        "sonata-project/seo-bundle": "^2.5",
        "sonata-project/user-bundle": "3.x-dev",
        "symfony/monolog-bundle": "^3.0.2",
        "symfony/swiftmailer-bundle": "~2.3,>=2.3.10",
        "symfony/symfony": "2.8.*",
        "twig/twig": "^1.0||^2.0"
    },

I also check sonata sandbox on github and I can't find what I'm missing. 我还在github上检查了奏鸣曲沙箱 ,找不到我想要的东西。

I'm using symfony 2.8 and php 7.2 我正在使用symfony 2.8和php 7.2

After a lot of researches I finally found the solution. 经过大量研究,我终于找到了解决方案。 Developers of sonata ecommerce remove getClass() method from ProductAdmin.php. 奏鸣曲电子商务的开发人员从ProductAdmin.php中删除getClass()方法。 This class is only available in branch 1.x and not on the heigher branches. 此类仅在分支1.x中可用,而在heigher分支中不可用。

Original getClass() method looks like: 原始的getClass()方法如下所示:

/**
 * @return string
 */
public function getClass()
{
    if ($this->hasSubject()) {
        return get_class($this->getSubject());
    } elseif ($class = $this->getProductClass()) {
        return $class;
    }
    return parent::getClass();
}

and it causes some errors, so the solution is to add slightly modified class, without second condition. 并且会导致一些错误,因此解决方案是添加经过稍微修改的类,而没有第二个条件。 Add this to ProductAdmin.php. 将此添加到ProductAdmin.php。

/**
 * @return string
 */
public function getClass()
{
    if ($class = $this->getProductClass()) {
        return $class;
    }

    return parent::getClass();
}

I found the solution on sonata ecommerce github . 我在奏鸣曲电子商务github上找到了解决方案。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM