sonata-project / SonataMediaBundle

Symfony SonataMediaBundle
https://docs.sonata-project.org/projects/SonataMediaBundle
MIT License
449 stars 496 forks source link

Sonata\DoctrineORMAdminBundle\FieldDescription\FieldDescription has no association admin #2213

Closed byhaskell closed 2 years ago

byhaskell commented 2 years ago

Environment

Sonata packages

show

``` sonata-project/admin-bundle 4.2.2 4.2.2 sonata-project/block-bundle 4.8.0 4.8.0 sonata-project/cache 2.2.0 2.2.0 sonata-project/doctrine-extensions 1.15.0 1.15.0 sonata-project/doctrine-orm-admin-bundle 4.1.0 4.1.0 sonata-project/exporter 2.9.1 2.9.1 sonata-project/form-extensions 1.12.1 1.12.1 sonata-project/media-bundle 4.0.0-alpha1 4.0.0-alpha1 sonata-project/twig-extensions 1.9.0 1.9.0 ```

Symfony packages

show

``` symfony/asset v5.3.4 v5.3.4 Manages URL generation a... symfony/browser-kit v5.3.4 v5.3.4 Simulates the behavior o... symfony/cache v5.3.10 v5.3.10 Provides an extended PSR... symfony/cache-contracts v2.4.0 v2.4.0 Generic abstractions rel... symfony/config v5.3.10 v5.3.10 Helps you find, load, co... symfony/console v5.3.10 v5.3.10 Eases the creation of be... symfony/css-selector v5.3.4 v5.3.4 Converts CSS selectors t... symfony/debug-bundle v5.3.4 v5.3.4 Provides a tight integra... symfony/dependency-injection v5.3.10 v5.3.10 Allows you to standardiz... symfony/deprecation-contracts v2.4.0 v2.4.0 A generic function and c... symfony/doctrine-bridge v5.3.8 v5.3.8 Provides integration for... symfony/dom-crawler v5.3.7 v5.3.7 Eases DOM navigation for... symfony/dotenv v5.3.10 v5.3.10 Registers environment va... symfony/error-handler v5.3.7 v5.3.7 Provides tools to manage... symfony/event-dispatcher v5.3.7 v5.3.7 Provides tools that allo... symfony/event-dispatcher-contracts v2.4.0 v2.4.0 Generic abstractions rel... symfony/expression-language v5.3.7 v5.3.7 Provides an engine that ... symfony/filesystem v5.3.4 v5.3.4 Provides basic utilities... symfony/finder v5.3.7 v5.3.7 Finds files and director... symfony/flex v1.17.2 v1.17.2 Composer plugin for Symfony symfony/form v5.3.10 v5.3.10 Allows to easily create,... symfony/framework-bundle v5.3.10 v5.3.10 Provides a tight integra... symfony/http-client v5.3.10 v5.3.10 Provides powerful method... symfony/http-client-contracts v2.4.0 v2.4.0 Generic abstractions rel... symfony/http-foundation v5.3.10 v5.3.10 Defines an object-orient... symfony/http-kernel v5.3.10 v5.3.10 Provides a structured pr... symfony/intl v5.3.8 v5.3.8 Provides a PHP replaceme... symfony/mailer v5.3.9 v5.3.9 Helps sending emails symfony/maker-bundle v1.35.0 v1.35.0 Symfony Maker helps you ... symfony/mime v5.3.8 v5.3.8 Allows manipulating MIME... symfony/monolog-bridge v5.3.7 v5.3.7 Provides integration for... symfony/monolog-bundle v3.7.1 v3.7.1 Symfony MonologBundle symfony/notifier v5.3.9 v5.3.9 Sends notifications via ... symfony/options-resolver v5.3.7 v5.3.7 Provides an improved rep... symfony/password-hasher v5.3.8 v5.3.8 Provides password hashin... symfony/phpunit-bridge v5.3.10 v5.3.10 Provides utilities for P... symfony/polyfill-intl-grapheme v1.23.1 v1.23.1 Symfony polyfill for int... symfony/polyfill-intl-icu v1.23.0 v1.23.0 Symfony polyfill for int... symfony/polyfill-intl-idn v1.23.0 v1.23.0 Symfony polyfill for int... symfony/polyfill-intl-normalizer v1.23.0 v1.23.0 Symfony polyfill for int... symfony/polyfill-mbstring v1.23.1 v1.23.1 Symfony polyfill for the... symfony/polyfill-php73 v1.23.0 v1.23.0 Symfony polyfill backpor... symfony/polyfill-php80 v1.23.1 v1.23.1 Symfony polyfill backpor... symfony/polyfill-php81 v1.23.0 v1.23.0 Symfony polyfill backpor... symfony/process v5.3.7 v5.3.7 Executes commands in sub... symfony/property-access v5.3.8 v5.3.8 Provides functions to re... symfony/property-info v5.3.8 v5.3.8 Extracts information abo... symfony/proxy-manager-bridge v5.3.4 v5.3.4 Provides integration for... symfony/routing v5.3.7 v5.3.7 Maps an HTTP request to ... symfony/runtime v5.3.10 v5.3.10 Enables decoupling PHP a... symfony/security-acl v3.2.0 v3.2.0 Symfony Security Compone... symfony/security-bundle v5.3.8 v5.3.8 Provides a tight integra... symfony/security-core v5.3.10 v5.3.10 Symfony Security Compone... symfony/security-csrf v5.3.4 v5.3.4 Symfony Security Compone... symfony/security-guard v5.3.7 v5.3.7 Symfony Security Compone... symfony/security-http v5.3.10 v5.3.10 Symfony Security Compone... symfony/serializer v5.3.10 v5.3.10 Handles serializing and ... symfony/service-contracts v2.4.0 v2.4.0 Generic abstractions rel... symfony/stopwatch v5.3.4 v5.3.4 Provides a way to profil... symfony/string v5.3.10 v5.3.10 Provides an object-orien... symfony/translation v5.3.10 v5.3.10 Provides tools to intern... symfony/translation-contracts v2.4.0 v2.4.0 Generic abstractions rel... symfony/twig-bridge v5.3.7 v5.3.7 Provides integration for... symfony/twig-bundle v5.3.10 v5.3.10 Provides a tight integra... symfony/validator v5.3.10 v5.3.10 Provides tools to valida... symfony/var-dumper v5.3.10 v5.3.10 Provides mechanisms for ... symfony/var-exporter v5.3.8 v5.3.8 Allows exporting any ser... symfony/web-link v5.3.4 v5.3.4 Manages links between re... symfony/web-profiler-bundle v5.3.8 v5.3.8 Provides a development t... symfony/yaml v5.3.6 v5.3.6 Loads and dumps YAML files ```

PHP version

PHP 7.4.21 (cli) (built: Jun 29 2021 18:06:27) ( ZTS Visual C++ 2017 x64 )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies

Subject

Hello. Thank you for your work, it is unrealistically in demand now.

The problem is that there is a Product entity, and you need to add a lot of pictures to it. I successfully did this in various ways on symphony 4.4, but now only version 4.0.0-alpha1 works under 5.3.

The connection with the SonataMediaMedia OneToMany entity - did not earn, so I decided to make a separate ProductPicture entity, in which there is a relationship with the ManyToOne with SonataMediaMedia. However, this resulted in an error that has no description.

Steps to reproduce

Show class Product

class Product
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    private ?int $id;

    /**
     * @ORM\Column(type="string", length=255, nullable=true)
     */
    private ?string $name;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\ProductPicture", mappedBy="product", cascade={"persist"}, orphanRemoval=true)
     * @ORM\JoinColumn(name="pictures", nullable=true, referencedColumnName="id", onDelete="SET NULL")
     */
    private $pictures;

}

Show class ProductPicture

final class ProductPicture
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    private ?int $id;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Product", inversedBy="pictures", fetch="EAGER")
     * @ORM\JoinColumn(name="product", nullable=true, referencedColumnName="id")
     */
    private ?Product $product;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\SonataMediaMedia", inversedBy="product", cascade={"persist"}, fetch="LAZY")
     * @ORM\JoinColumn(name="image", nullable=true, referencedColumnName="id")
     */
    private $image;

}

Show class SonataMediaMedia

use Sonata\MediaBundle\Entity\BaseMedia;

/**
 * @ORM\Entity
 * @ORM\Table(name="media__media")
 */
class SonataMediaMedia extends BaseMedia
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    protected $id;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\ProductPicture", mappedBy="image", cascade={"persist"})
     * @ORM\JoinColumn(name="product", nullable=true, referencedColumnName="id", onDelete="SET NULL")
     */
    private $product;

}

Show class ProductAdmin

final class ProductAdmin extends AbstractAdmin
{
    protected function configureFormFields(FormMapper $form): void
    {
        $form
            ->add('name', TextType::class)
            ->add('pictures', CollectionType::class, ['by_reference' => false, 'required' => true], ['edit' => 'inline', 'inline' => 'table', 'admin_code' => 'admin.product_picture'])
        ;
    }

Show services.yaml

admin.product_picture:
        class: App\Admin\ProductPictureAdmin
        arguments:
            - ~
            - App\Entity\ProductPicture
            - ~
        tags:
            - { name: sonata.admin, manager_type: orm, label: ProductPicture, show_in_dashboard: false }
        public: true

Show children class ProductPictureAdmin

class ProductPictureAdmin extends AbstractAdmin
{
    protected $baseRouteName = 'admin_page_product_picture';

    protected $baseRoutePattern = 'site-product-picture';

    protected function configureFormFields(FormMapper $formMapper) :void
    {
        $formMapper
            ->add('image', ModelListType::class, array('required' => false), array( 'link_parameters' => array( 'context' => 'product' ) ) )
        ;
    }

}

Expected results

I expect to see a familiar form with a preview, buttons for deleting and adding a new image instead of the existing one.

Actual results

Show Stack Traces

Twig\Error\RuntimeError: An exception has been thrown during the rendering of a template ("Sonata\DoctrineORMAdminBundle\FieldDescription\FieldDescription has no association admin."). at \project\vendor\sonata-project\admin-bundle\src\Resources\views\Form\form_admin_fields.html.twig:548 at Twig\Template->displayBlock() (\project\vendor\symfony\twig-bridge\Form\TwigRendererEngine.php:58) at Symfony\Bridge\Twig\Form\TwigRendererEngine->renderBlock() (\project\vendor\symfony\form\FormRenderer.php:258) at Symfony\Component\Form\FormRenderer->searchAndRenderBlock() (\project\var\cache\dev\twig\d6\d64f75d93179cc747bb564d9aa209b243d91f350d65d10d6fce1af23ad274c7d.php:153) at __TwigTemplate_457a88c2e8bc8131ae8b05b2963ed60605086bdcf3c765e93419dbe7122066b4->doDisplay() (\project\vendor\twig\twig\src\Template.php:394) at Twig\Template->displayWithErrorHandling() (\project\vendor\twig\twig\src\Template.php:367) at Twig\Template->display() (\project\var\cache\dev\twig\c3\c3a7e5c56581f726c005d72d7314e29d40dda6a511c591816ff77eaa4e0092f2.php:80) at __TwigTemplate_b4830b996c4526802dfc08f7b770669756b4103336c4d465790c6d689836289a->doDisplay() (\project\vendor\twig\twig\src\Template.php:394) at Twig\Template->displayWithErrorHandling() (\project\vendor\twig\twig\src\Template.php:367) at Twig\Template->display() (\project\var\cache\dev\twig\d2\d2890795b498a040fb218600b1e20be190d6e773ced404a8719b8037ed4c8dd6.php:138) at __TwigTemplate_82fd2de3f8011604457f6dec1a91ad66b15aa5a161e1d793460e2ecd89f4e976->block_sonata_admin_orm_one_to_many_widget() (\project\vendor\twig\twig\src\Template.php:171) at Twig\Template->displayBlock() (\project\var\cache\dev\twig\d2\d2890795b498a040fb218600b1e20be190d6e773ced404a8719b8037ed4c8dd6.php:288) at __TwigTemplate_82fd2de3f8011604457f6dec1a91ad66b15aa5a161e1d793460e2ecd89f4e976->block_sonata_type_collection_widget() (\project\vendor\twig\twig\src\Template.php:171) at Twig\Template->displayBlock() (\project\vendor\symfony\twig-bridge\Form\TwigRendererEngine.php:58) at Symfony\Bridge\Twig\Form\TwigRendererEngine->renderBlock() (\project\vendor\symfony\form\FormRenderer.php:258) at Symfony\Component\Form\FormRenderer->searchAndRenderBlock() (\project\var\cache\dev\twig\e4\e4a770a4492512aa1ccde5151bb95316e20b16ea9fc926512c9137cdf7de3b6e.php:1221) at __TwigTemplate_f6e696f280e228102a8a77eb87893cff2632d3cdaebf53fa774797c40e9a0905->block_form_row() (\project\vendor\twig\twig\src\Template.php:171) at Twig\Template->displayBlock() (\project\vendor\symfony\twig-bridge\Form\TwigRendererEngine.php:58) at Symfony\Bridge\Twig\Form\TwigRendererEngine->renderBlock() (\project\vendor\symfony\form\FormRenderer.php:258) at Symfony\Component\Form\FormRenderer->searchAndRenderBlock() (\project\var\cache\dev\twig\c3\c303e7606188e03d4908747195c26ad2566b4d31601de7c80c9c6527f120d3ad.php:146) at __TwigTemplate_fd381f4b2c438fb18fe471430bd4a33f48ed1c6a8f6c13716b39aa6d8f25984f->macro_render_groups() (\project\vendor\twig\twig\src\Extension\CoreExtension.php:1147) at twig_call_macro() (\project\var\cache\dev\twig\b3\b34a32dc82b057acd42365af3a4b84a32ba8a01f7fc59d1761058a2919d23352.php:430) at __TwigTemplate_ddd0918b5b980e2c095c76e6a6477aab990ecc1bd3dd73030ab4152aa96ca47d->block_sonata_tab_content() (\project\vendor\twig\twig\src\Template.php:171) at Twig\Template->displayBlock() (\project\var\cache\dev\twig\b3\b34a32dc82b057acd42365af3a4b84a32ba8a01f7fc59d1761058a2919d23352.php:143) at __TwigTemplate_ddd0918b5b980e2c095c76e6a6477aab990ecc1bd3dd73030ab4152aa96ca47d->block_form() (\project\vendor\twig\twig\src\Template.php:171) at Twig\Template->displayBlock() (\project\var\cache\dev\twig\b1\b10e0bec5ecd9a968c02c5bef4d919feb081259934928ce1eb3cae71275cd49a.php:196) at __TwigTemplate_dfbada18069452f6282155e46683d94076fd058a34e3b1f17405f1aca2593be2->block_form() (\project\vendor\twig\twig\src\Template.php:171) at Twig\Template->displayBlock() (\project\vendor\twig\twig\src\Template.php:243) at Twig\Template->renderBlock() (\project\var\cache\dev\twig\8e\8e8d4a7d3b2d8734c65fc53c467c27bbeef5248629bdcea80be95fd94066e94c.php:78) at __TwigTemplate_37e3e53f52b8fb89a905605023c5bf0953db4595db4c4fb2b36ae7680e2b000f->doDisplay() (\project\vendor\twig\twig\src\Template.php:394) at Twig\Template->displayWithErrorHandling() (\project\vendor\twig\twig\src\Template.php:367) at Twig\Template->display() (\project\var\cache\dev\twig\b1\b10e0bec5ecd9a968c02c5bef4d919feb081259934928ce1eb3cae71275cd49a.php:69) at __TwigTemplate_dfbada18069452f6282155e46683d94076fd058a34e3b1f17405f1aca2593be2->doDisplay() (\project\vendor\twig\twig\src\Template.php:394) at Twig\Template->displayWithErrorHandling() (\project\vendor\twig\twig\src\Template.php:367) at Twig\Template->display() (\project\var\cache\dev\twig\0c\0ce6a21c61b5f5d35b76f3962e833f5418b31ab2c409abaec67f90bf94c95e15.php:47) at __TwigTemplate_e4cadeb8f628c8034f57287d8141cc677833749c34c5386724760651fd9c7be4->doDisplay() (\project\vendor\twig\twig\src\Template.php:394) at Twig\Template->displayWithErrorHandling() (\project\vendor\twig\twig\src\Template.php:367) at Twig\Template->display() (\project\vendor\twig\twig\src\Template.php:379) at Twig\Template->render() (\project\vendor\twig\twig\src\TemplateWrapper.php:40) at Twig\TemplateWrapper->render() (\project\vendor\twig\twig\src\Environment.php:277) at Twig\Environment->render() (\project\vendor\symfony\framework-bundle\Controller\AbstractController.php:251) at Symfony\Bundle\FrameworkBundle\Controller\AbstractController->renderView() (\project\vendor\symfony\framework-bundle\Controller\AbstractController.php:259) at Symfony\Bundle\FrameworkBundle\Controller\AbstractController->render() (\project\vendor\sonata-project\admin-bundle\src\Controller\CRUDController.php:924) at Sonata\AdminBundle\Controller\CRUDController->renderWithExtraParams() (\project\vendor\sonata-project\admin-bundle\src\Controller\CRUDController.php:348) at Sonata\AdminBundle\Controller\CRUDController->editAction() (\project\vendor\symfony\http-kernel\HttpKernel.php:156) at Symfony\Component\HttpKernel\HttpKernel->handleRaw() (\project\vendor\symfony\http-kernel\HttpKernel.php:78) at Symfony\Component\HttpKernel\HttpKernel->handle() (\project\vendor\symfony\http-kernel\Kernel.php:199) at Symfony\Component\HttpKernel\Kernel->handle() (\project\vendor\symfony\runtime\Runner\Symfony\HttpKernelRunner.php:37) at Symfony\Component\Runtime\Runner\Symfony\HttpKernelRunner->run() (\project\vendor\autoload_runtime.php:35) at require_once('C:\\OSP\\domains\\ppweb-symfony\\vendor\\autoload_runtime.php') (\project\public\index.php:5)

jordisala1991 commented 2 years ago

To me this does looks related to the orm or the admin, not for any specific of the media bundle. Do you know what could cause the issue @VincentLanglet ?

byhaskell commented 2 years ago

@jordisala1991 Greetings. This problem is only with Model types (ModelType, ModelListType). I started using the MediaType, and everything worked (with some other changes to be made). The only thing is that the view that this type gives seems to be rather outdated than ModelListType which, if I'm not mistaken, worked well in this case and was nice and easy to administer in previous versions. I would mark the question as resolved, but I'm wondering why the types of models do not work, because they are practically invented for this. OneToMany also does not work out in any way, perhaps with the transfer of media entities from the usual Application \ Sonata \ MediaBundle something broke .. guess. The child entity just looks like a bad decision in this case. Thank you for your attention to my problem.

jordisala1991 commented 2 years ago

After an initial test I couldn't reproduce the problem you mentioned. I have opened draft PR on my side to show what I tried, just to see if it is the same setup. https://github.com/Runroom/archetype-symfony/pull/2161

Maybe it would be nice if you can share a minimal repository that can reproduce your issue.

byhaskell commented 2 years ago

@jordisala1991 Thank you, I will try to look at your repository in the near future. So far, I just noticed that you are using version 4.0.0@devб but for me 4.0.0-alpha1 can switch to 4.0.0 dev and it will be a solution, I'll check. I'll unsubscribe later. thanks

jordisala1991 commented 2 years ago

I didnt had time to switch to alpha yet, but it should work the same, there are no big changes between those two afaik.

byhaskell commented 2 years ago

Got it, thanks, I'll try to check and unsubscribe today or tomorrow. Thanks again for the feedback, it is very important to me.

VincentLanglet commented 2 years ago

According to the code

So something like an ImageAdmin is required.

If not having an association admin is something making sens for a model list, then the form_admin_fields.html.twig file need to add some hasAssociationAdmin checks.

byhaskell commented 2 years ago

Incredibly, I changed the type to ModelListType and everything worked, I just can't track the changes I made by the code provided @jordisala1991, but I started to undo them and everything works anyway. Inexplicable but the fact. I will study, perhaps I will find reasons for this and write it down here. Thank you all for the feedback.