SonataProductBundle(symfony 2.8)而不是显示产品创建表单,而是出现“没有可用的对象类型”按钮

Posted

技术标签:

【中文标题】SonataProductBundle(symfony 2.8)而不是显示产品创建表单,而是出现“没有可用的对象类型”按钮【英文标题】:SonataProductBundle (symfony 2.8) instead of showing product create form there is "No object types available" button appearing 【发布时间】:2018-06-11 11:44:15 【问题描述】:

有启用 SonataProductBundle 的 Sonata Admin。 根据文档配置的产品实体。 但是,在尝试在管理面板中创建新的“产品”时, “没有可用的对象类型”按钮出现,而不是编辑表单。

以下是配置:

config.yml

imports:
    -  resource: parameters.yml 
    -  resource: security.yml 
    -  resource: services.yml 
    -  resource: sonata/sonata_product.yml 
    -  resource: '@ApplicationSonataProductBundle/Resources/config/product.yml' 
parameters:
    locale: en
framework:
    esi:             ~
    translator:       fallbacks: ["%locale%"] 
    secret:          "%secret%"
    router:
        resource: "%kernel.root_dir%/config/routing.yml"
        strict_requirements: ~
    form:            ~
    csrf_protection: ~
    validation:       enable_annotations: true 
    serializer:       enable_annotations: true 
    templating:
        engines: ['twig']
        #assets_version: SomeVersionScheme
    default_locale:  "%locale%"
    trusted_hosts:   ~
    trusted_proxies: ~
    session:
        # handler_id set to null will use default session handler from php.ini
        handler_id:  ~
    fragments:       ~
    http_method_override: true

树枝配置

twig:
    debug:            "%kernel.debug%"
    strict_variables: "%kernel.debug%"
    form:
       resources:
           - 'SonataFormatterBundle:Form:formatter.html.twig'

学说配置

doctrine:
    dbal:
        driver:   pdo_mysql
        host:     "%database_host%"
        port:     "%database_port%"
        dbname:   "%database_name%"
        user:     "%database_user%"
        password: "%database_password%"
        charset:  UTF8
        types:
            json: Sonata\Doctrine\Types\JsonType
            currency: Sonata\Component\Currency\CurrencyDoctrineType
    orm:
        auto_generate_proxy_classes: "%kernel.debug%"
        entity_managers:
            default:
            naming_strategy: doctrine.orm.naming_strategy.underscore
                auto_mapping: true
                mappings:
                    FOSUserBundle: ~
                    ApplicationSonataUserBundle: ~
                    SonataUserBundle: ~
                    SonataMediaBundle: ~
                    ApplicationSonataMediaBundle: ~
                    SonataNotificationBundle: ~
                    ApplicationSonataNotificationBundle: ~
                    SonataClassificationBundle: ~
                    ApplicationSonataClassificationBundle: ~
                    SonataClassificationBundle: ~
                    ApplicationSonataCustomerBundle: ~
                    SonataCustomerBundle: ~
                    ApplicationSonataProductBundle: ~
                    SonataProductBundle: ~
                    ApplicationSonataPageBundle: ~ 
                    SonataPageBundle: ~

Swiftmailer 配置

swiftmailer:
    transport: "%mailer_transport%"
    host:      "%mailer_host%"
    username:  "%mailer_user%"
    password:  "%mailer_password%"
    spool:      type: memory 
sonata_block:
    default_contexts: [cms]
    blocks:
        # enable the SonataAdminBundle block
        sonata.admin.block.admin_list:
            contexts: [admin]
        # ...
        sonata.user.block.menu:    # used to display the menu in profile pages
        sonata.user.block.account: # used to display menu option (login option)
        sonata.block.service.text:
        sonata.order.block.recent_orders:
    context_manager: sonata.page.block.context_manager
sonata_admin:
    title:      IASP
    title_logo: /bundles/sonataadmin/logo_title.png   
    options:
        html5_validate:    true     # enable or disable html5 form validation
        confirm_exit:      true     # enable or disable a confirmation before navigating away
        use_select2:       true     # enable or disable usage of the Select2 jQuery library
        use_icheck:        true     # enable or disable usage of the iCheck library
        use_bootlint:      false    # enable or disable usage of Bootlint
        use_stickyforms:   true     # enable or disable the floating buttons
        form_type:         standard # can also be 'horizontal'

    templates:
        dashboard: SonataAdminBundle:Core:dashboard.html.twig
        edit:              SonataAdminBundle:CRUD:edit.html.twig
        tab_menu_template:         SonataAdminBundle:Core:tab_menu_template.html.twig

fos_user:
    db_driver:        orm # can be orm or mongodb (support is also available within FOSUser for couchdb, propel but none is given for SonataUserBundle)
    firewall_name:    main
    user_class:       Application\Sonata\UserBundle\Entity\User

    group:
        group_class:  Application\Sonata\UserBundle\Entity\Group

    profile:
        # Authentication Form
        form:
            type:               fos_user_profile
            handler:            fos_user.profile.form.handler.default
            name:               fos_user_profile_form
            validation_groups:  [Authentication] # Please note : this is not the default value

sonata_user:
    security_acl:           false

    manager_type: orm # Can be orm for mongodb

    table:
        user_group: "my_custom_user_group_association_table_name"

    impersonating:
        route:                page_slug
        parameters:            path: / 

    class:                  # Entity Classes
        user:               Application\Sonata\UserBundle\Entity\User
        group:              Application\Sonata\UserBundle\Entity\Group

    admin:                  # Admin Classes
        user:
            class:          Sonata\UserBundle\Admin\Entity\UserAdmin
            controller:     SonataAdminBundle:CRUD
            translation:    SonataUserBundle

        group:
            class:          Sonata\UserBundle\Admin\Entity\GroupAdmin
            controller:     SonataAdminBundle:CRUD
            translation:    SonataUserBundle
    profile:
        form:
            type:               sonata_user_profile
            handler:            sonata.user.profile.form.handler.default
            name:               sonata_user_profile_form
            validation_groups:  [Profile]
        # Profile show page is a dashboard as in SonataAdminBundle
        dashboard:
            blocks:
                -  position: left, type: sonata.block.service.text, settings:  content: "<h2>Welcome!</h2> This is a sample user profile dashboard, feel free to override it in the configuration! Want to make this text dynamic? For instance display the user's name? Create a dedicated block and edit the configuration!" 
                -  position: left, type: sonata.order.block.recent_orders, settings:  title: Recent Orders, number: 5, mode: public 
                #-  position: right, type: sonata.timeline.block.timeline, settings:  max_per_page: 15 
                #-  position: right, type: sonata.news.block.recent_posts, settings:  title: Recent Posts, number: 5, mode: public 
                #-  position: right, type: sonata.news.block.recent_comments, settings:  title: Recent Comments, number: 5, mode: public 
        # Customize user portal menu by setting links
        menu:
            -  route: 'sonata_user_profile_show', label: 'sonata_profile_title', domain: 'SonataUserBundle'
            -  route: 'sonata_user_profile_edit', label: 'link_edit_profile', domain: 'SonataUserBundle'
            -  route: 'sonata_customer_addresses', label: 'link_list_addresses', domain: 'SonataCustomerBundle'
            -  route: 'sonata_user_profile_edit_authentication', label: 'link_edit_authentication', domain: 'SonataUserBundle'
            -  route: 'sonata_order_index', label: 'order_list', domain: 'SonataOrderBundle'
sonata_delivery:
    services:
        free_address_required:
            name: Free
            priority: 1
            code: free
    selector: sonata.delivery.selector.default

sonata_media:
    class:
        media: Application\Sonata\MediaBundle\Entity\Media
        gallery: Application\Sonata\MediaBundle\Entity\Gallery
        gallery_has_media: Application\Sonata\MediaBundle\Entity\GalleryHasMedia
        category:  Application\Sonata\ClassificationBundle\Entity\Categor
    default_context: default
    db_driver: doctrine_orm # or doctrine_mongodb, doctrine_phpcr
    contexts:
        default:  # the default context is mandatory
            providers:
                - sonata.media.provider.dailymotion
                - sonata.media.provider.youtube
                - sonata.media.provider.image
                - sonata.media.provider.file
                - sonata.media.provider.vimeo

            formats:
                small:  width: 100 , quality: 70
                big:    width: 500 , quality: 70
    cdn:
        server:
            path: /uploads/media # http://media.sonata-project.org/

    filesystem:
        local:
            directory:  "%kernel.root_dir%/../web/uploads/media"
            create:     false
    providers:
        image:
            thumbnail:  sonata.media.thumbnail.consumer.format
        vimeo:
            thumbnail:  sonata.media.thumbnail.consumer.format
        youtube:
            thumbnail:  sonata.media.thumbnail.consumer.format
        dailymotion:
            thumbnail:  sonata.media.thumbnail.consumer.format
        file:
            allowed_extensions: ['mp4', 'flv']
            allowed_mime_types: ['video/mp4', 'video/x-flv']
            thumbnail:  sonata.media.thumbnail.consumer.format
        image:
            resizer: sonata.media.resizer.square
sonata_payment:
    services:
        pass:
            name:    Pass
            code:    pass
            browser: sonata.payment.browser.curl

            transformers:
                basket: sonata.payment.transformer.basket
                order:  sonata.payment.transformer.order

            options:
                shop_secret_key: assdsds
                url_callback:    sonata_payment_callback
                url_return_ko:   sonata_payment_error
                url_return_ok:   sonata_payment_confirmation
    transformers:
        order:  sonata.payment.transformer.order
        basket: sonata.payment.transformer.basket

sonata_price:
    currency: EUR
sonata_customer:
    class:
        customer:           Application\Sonata\CustomerBundle\Entity\Customer
        address:              Application\Sonata\CustomerBundle\Entity\Address
        order:                Application\Sonata\OrderBundle\Entity\Order
        user:                 Application\Sonata\UserBundle\Entity\User

        # You can also implement custom components classes
        customer_selector:    Sonata\Component\Customer\CustomerSelector

sonata_notification:
    backend: sonata.notification.backend.runtime
    admin:
        enabled: false
sonata_classification:
    class:
        tag:          Application\Sonata\ClassificationBundle\Entity\Tag
        category:     Application\Sonata\ClassificationBundle\Entity\Category
        collection:   Application\Sonata\ClassificationBundle\Entity\Collection
        media:        Application\Sonata\MediaBundle\Entity\Media
        context:      Application\Sonata\ClassificationBundle\Entity\Context

    admin:
        tag:
            class:        Sonata\ClassificationBundle\Admin\TagAdmin
            controller:   SonataAdminBundle:CRUD
            translation:  SonataClassificationBundle
        category:
            class:        Sonata\ClassificationBundle\Admin\CategoryAdmin
            controller:   SonataClassificationBundle:CategoryAdmin
            translation:  SonataClassificationBundle
        collection:
            class:        Sonata\ClassificationBundle\Admin\CollectionAdmin
            controller:   SonataAdminBundle:CRUD
            translation:  SonataClassificationBundle
        context:
            class:        Sonata\ClassificationBundle\Admin\ContextAdmin
            controller:   SonataAdminBundle:CRUD
            translation:  SonataClassificationBundle  
jms_serializer:
    enable_short_alias: true

sonata_formatter:
    default_formatter: text
    formatters:
        markdown:
            service: sonata.formatter.text.markdown
            extensions:
                - sonata.formatter.twig.control_flow
                - sonata.formatter.twig.gist
        #        - sonata.media.formatter.twig


        text:
            service: sonata.formatter.text.text
            extensions:
                - sonata.formatter.twig.control_flow
                - sonata.formatter.twig.gist
        #        - sonata.media.formatter.twig


        rawhtml:
            service: sonata.formatter.text.raw
            extensions:
                - sonata.formatter.twig.control_flow
                - sonata.formatter.twig.gist
        #        - sonata.media.formatter.twig


        richhtml:
            service: sonata.formatter.text.raw
            extensions:
                - sonata.formatter.twig.control_flow
                - sonata.formatter.twig.gist
        #        - sonata.media.formatter.twig


        twig:
            service: sonata.formatter.text.twigengine
            extensions: [] # Twig formatter cannot have extensions


sonata_product:
    class:
        product:              Application\Sonata\ProductBundle\Entity\Product
        package:              Application\Sonata\ProductBundle\Entity\Package
        product_category:     Application\Sonata\ProductBundle\Entity\ProductCategory
        product_collection:   Application\Sonata\ProductBundle\Entity\ProductCollection
        category:             Application\Sonata\ClassificationBundle\Entity\Category
        collection:           Application\Sonata\ClassificationBundle\Entity\Collection
        delivery:             Application\Sonata\ProductBundle\Entity\Delivery
        gallery:              Application\Sonata\MediaBundle\Entity\Gallery
sonata_page:

    slugify_service:   sonata.core.slugify.cocur # old BC value is sonata.core.slugify.native
    multisite:        host_by_locale
    default_template: default # template key from templates section, used as default for new pages
    templates:
        default:   path: 'SonataPageBundle::layout.html.twig',          name: 'default' 
        2columns:  path: 'SonataPageBundle::2columns_layout.html.twig', name: '2 columns layout' 

    # Generates a snapshot when a page is saved (from the admin)
    direct_publication: false # or %kernel.debug% if you want to publish in dev mode (but not in prod)
    use_streamed_response: false # set the value to false in debug mode or if the reverse proxy does not handle streamed response
    ignore_route_patterns:
        - ^(.*)admin(.*)   # ignore admin route, ie route containing 'admin'
        - ^_(.*)          # ignore symfony routes

    ignore_routes:
        - sonata_page_cache_esi
        - sonata_page_cache_ssi
        - sonata_page_js_sync_cache
        - sonata_page_js_async_cache
        - sonata_cache_esi
        - sonata_cache_ssi
        - sonata_cache_js_async
        - sonata_cache_js_sync
        - sonata_cache_apc

    ignore_uri_patterns:
        - ^/admin\/   # ignore admin route, ie route containing 'admin'

    page_defaults:
        homepage: decorate: false, enabled: true # disable decoration for homepage, key - is a page route

    # manage the http errors
    catch_exceptions:
        not_found: [404]    # render 404 page with "not_found" key (name generated: _page_internal_error_key)
        fatal:     [500]    # so you can use the same page for different http errors or specify specific page for each error
    cache_invalidation:
        service:  sonata.page.cache.invalidation.simple
        recorder: sonata.page.cache.recorder
        classes:
            "Application\Sonata\PageBundle\Entity\Block": getId
cmf_routing:
    chain:
        routers_by_id:
            # enable the DynamicRouter with high priority to allow overwriting configured routes with content
            #cmf_routing.dynamic_router: 200
            # enable the symfony default router with a lower priority
            sonata.page.router: 150
            router.default: 100

composer.json

    
        "name": "dmlabs-5/iasp_new",
        "license": "proprietary",
        "type": "project",
        "autoload": 
            "psr-4": 
                " \\": "src",
                "AppBundle\\": "src/AppBundle",
                "Application\\": "src/Application",
                "ApplicationSonataMediaBundle\\": "src/Application/Sonata/MediaBundle",
                "ApplicationSonataNotificationBundle\\": "src/Application/Sonata/NotificationBundle",
                 "ApplicationSonataCustomerBundle\\":"src/Application/Sonata/CustomerBundle",
            "ApplicationSonataDeliveryBundle\\":"src/Application/Sonata/DeliveryBundle",
            "ApplicationSonataClassificationBundle\\":"src/Application/Sonata/ClassificationBundle"
            ,
            "classmap": [
                "app/AppKernel.php",
                "app/AppCache.php"
            ]
        ,
        "require": 
            "php": ">=5.3.9",
            "symfony/symfony": "2.8.*",
            "doctrine/orm": "^2.4.8",
            "doctrine/doctrine-bundle": "~1.4",
            "ocramius/proxy-manager": "^1.0",
            "symfony/swiftmailer-bundle": "~2.3",
            "symfony/monolog-bundle": "~2.4",
            "sensio/distribution-bundle": "~5.0",
            "sensio/framework-extra-bundle": "^3.0.2",
            "incenteev/composer-parameter-handler": "~2.0",
            "sonata-project/admin-bundle": "3.x-dev",
            "sonata-project/doctrine-orm-admin-bundle": "3.x-dev",
            "sonata-project/easy-extends-bundle": "^2.3",
            "sonata-project/user-bundle": "3.x-dev",
            "doctrine/doctrine-migrations-bundle": "^1.0",
            "sonata-project/classification-bundle": "^3.0",
            "sonata-project/cache-bundle": "^2.3",
            "sonata-project/seo-bundle": "^2.1",
            "sonata-project/notification-bundle": "^3.1",
            "sonata-project/page-bundle": "^3.4",
            "sonata-project/media-bundle": "^3.5",
            "sonata-project/ecommerce": "3.x-dev",
            "sonata-project/intl-bundle": "2.x-dev",
            "sonata-project/formatter-bundle": "^3.1",
            "jms/serializer-bundle": "^1.0",
            "twig/twig": "^1.34",
            "sonata-project/translation-bundle": "2.0.2"
        ,  
        "require-dev": 
            "sensio/generator-bundle": "~3.0",
            "symfony/phpunit-bridge": "~2.7"
        ,
        "scripts": 
            "post-install-cmd": [
            "Incenteev\\ParameterHandler\\ScriptHandler::buildParameters",
            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::buildBootstrap",
            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::clearCache",
            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installAssets",
            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installRequirementsFile",
            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::prepareDeploymentTarget"
            ],
            "post-update-cmd": [
            "Incenteev\\ParameterHandler\\ScriptHandler::buildParameters",
            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::buildBootstrap",
            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::clearCache",
            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installAssets",
            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installRequirementsFile",
            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::prepareDeploymentTarget"
            ]
        ,
        "config": 
            "bin-dir": "bin"
        ,
        "extra": 
            "symfony-app-dir": "app",
            "symfony-web-dir": "web",
            "symfony-assets-install": "relative",
            "incenteev-parameters": 
                "file": "app/config/parameters.yml"
            ,
            "branch-alias": null
        
    

有谁知道,为什么会出现这个按钮?是不是配置错了?

【问题讨论】:

问题已解决。我们需要从 Application/sonata/ProductBundle/entity/Blow 类中移除 abstract 关键字。 【参考方案1】:

你得到同样的错误是因为你可能做同样的错误?查看您的简单实体并注意继承的 Product 类...您将 Product 类定义为抽象类...但是您的 Product 类正在扩展 BaseProduct 类,该类未在您的帖子中显示...

这个继承链对我来说看起来很奇怪。你能检查一下,你的 BaseProduct 也不是抽象的吗?

【讨论】:

以上是关于SonataProductBundle(symfony 2.8)而不是显示产品创建表单,而是出现“没有可用的对象类型”按钮的主要内容,如果未能解决你的问题,请参考以下文章

提交表单时捕获 onClick 事件

如何在 Symfony 中增加会话超时

弃用服务的公共使用

通过单元测试访问 Symfony 2 容器?

《深入解剖Yii2框架》前言

如何在 LoginListener 中的 onSecurityInteractiveLogin 方法中重定向 - Symfony2