Search code examples
phpsymfonysonata-adminsonata

creating product in sonata e-commerce - no object types available


I have a problem with Sonata e-commerce, with creating a Product. I follow sonata documentation and other posts related with that and I constantly get message "No object types available" No object types available

My files looks like:

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:
    products:
        sonata.ecommerce_demo.product.bowl:
            provider: sonata.ecommerce_demo.product.bowl.type
            manager: sonata.ecommerce_demo.product.bowl.manager

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

<?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

<?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

"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.

I'm using symfony 2.8 and php 7.2


Solution

  • After a lot of researches I finally found the solution. Developers of sonata ecommerce remove getClass() method from ProductAdmin.php. This class is only available in branch 1.x and not on the heigher branches.

    Original getClass() method looks like:

    /**
     * @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.

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

    I found the solution on sonata ecommerce github.