【问题标题】:Adding properties to/extending Sonata Media entity添加属性到/扩展 Sonata Media 实体
【发布时间】:2016-12-02 15:22:22
【问题描述】:

我想向 Sonata Media 实体添加属性,但我无法让它工作。我正在使用 Sonata Media Bundle 2.3,并已按照手册进行安装。我还使用 Sonata Easy Extends Bundle 对其进行了扩展。

当我向Application\Sonata\MediaBundle\Entity\Media 添加一个属性时,当我运行doctrine:generate:diff 时它不会被拾取('未在您的映射信息中检测到更改。')。

覆盖config.yml 中的媒体类也不会产生影响。

这是Application\Sonata\MediaBundle\Entity\Media.php中的代码:

<?php

namespace Application\Sonata\MediaBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Sonata\MediaBundle\Entity\BaseMedia as BaseMedia;

/**
 * @ORM\Entity
 */
class Media extends BaseMedia
{
    /**
     * @var integer $id
     */
    protected $id;

    /**
     * @ORM\Column(type="string", nullable=true)
     */
    protected $test;

    /**
     * @return mixed
     */
    public function getTest()
    {
        return $this->test;
    }

    /**
     * @param mixed $test
     */
    public function setTest($test)
    {
        $this->test = $test;
    }

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

config.yml:

sonata_media:
    class:
        media: Application\Sonata\MediaBundle\Entity\Media
        gallery: Application\Sonata\MediaBundle\Entity\Gallery
        gallery_has_media: Application\Sonata\MediaBundle\Entity\GalleryHasMedia

同样,如果我将该部分注释掉,我会得到相同的结果。

更新:当我创建添加属性的自定义迁移时,当我扩展 MediaAdmin 时,当我转到图像编辑页面时,test 字段不会显示:

// Application\Sonata\MediaBundle\Admin\MediaAdmin.php
<?php
namespace Sonata\MediaBundle\Admin;

use Sonata\AdminBundle\Admin\Admin;
use Sonata\AdminBundle\Form\FormMapper;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Show\ShowMapper;

class MediaAdmin extends Admin
{
    protected function configureFormFields(FormMapper $formMapper)
    {
        $formMapper
            ->add('name', null, ['required' => false])
            ->add('enabled', null, ['required' => false])
            ->add('authorName', null, ['required' => false])
            ->add('cdnIsFlushable', null, ['required' => false])
            ->add('description', null, ['required' => false])
            ->add('copyright', null, ['required' => false])
            ->add('test', null, ['required' => false])
            ->add('binaryContent', 'file', ['required' => false]);
    }
}

因此,Sonata 似乎忽略了扩展的媒体包(事实并非如此,因为当我删除 Application\Sonata\MediaBundle\Entity\Media.php 时,我收到一个错误)。

【问题讨论】:

    标签: symfony doctrine-orm sonata-admin sonata sonata-media-bundle


    【解决方案1】:

    我需要为图像创建不同的属性,这是我使用默认原则和提供程序的解决方案。我用的是easy-extends。

    要在 Media 上添加不带注释的属性,您可以使用节点 &lt;field name="url" type="string"/&gt; 来获得类似 media.phpcr.xml 的内容:

    <?xml version="1.0" encoding="utf-8"?>
    <doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping" xsi="http://www.w3.org/2001/XMLSchema-instance" schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
        <!--
             This file has been generated by the EasyExtends bundle ( https://sonata-project.org/easy-extends )
    
             References :
                xsd                  : https://github.com/doctrine/doctrine2/blob/master/doctrine-mapping.xsd
                xml mapping          : http://www.doctrine-project.org/projects/orm/2.0/docs/reference/xml-mapping/en
                association mapping  : http://www.doctrine-project.org/projects/orm/2.0/docs/reference/association-mapping/en
        -->
        <entity
            name="Application\Sonata\MediaBundle\Entity\Media"
            table="media__media"
            >
    
            <id name="id" type="integer" column="id">
                <generator strategy="AUTO"/>
            </id>
            <field name="url" type="string"/>
    
        </entity>
    </doctrine-mapping>
    

    然后,在不使用注释的情况下,您需要添加您的扩展 Media.php

    <?php
    
    namespace Application\Sonata\MediaBundle\Entity;
    
    use Sonata\MediaBundle\Entity\BaseMedia as BaseMedia;
    
    /**
     * This file has been generated by the Sonata EasyExtends bundle.
     *
     * @link https://sonata-project.org/bundles/easy-extends
     *
     * References :
     *   working with object : http://www.doctrine-project.org/projects/orm/2.0/docs/reference/working-with-objects/en
     *
     * @author Christophe Ferreboeuf <christophe@codivores.com>
     */
    class Media extends BaseMedia
    {
        /**
         * @var int $id
         */
        protected $id;
    
        /**
         * Permits to link the image to a different location on the website
         * @var string 
         */
        protected $url;
    
        /**
         * Get id
         *
         * @return int $id
         */
        public function getId()
        {
            return $this->id;
        }
    
        /**
         * 
         * @return string
         */
        public function getUrl() {
            return $this->url;
        }
    
        /**
         * 
         * @param string $url
         * @return \Application\Sonata\MediaBundle\Entity\Media
         */
        public function setUrl($url) {
            $this->url = $url;
            return $this;
        }
    
    
    }
    

    并为 ORM media.orm.xml 声明它:

    <?xml version="1.0" encoding="utf-8"?>
    <doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping" xsi="http://www.w3.org/2001/XMLSchema-instance" schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
        <!--
             This file has been generated by the EasyExtends bundle ( https://sonata-project.org/easy-extends )
    
             References :
                xsd                  : https://github.com/doctrine/doctrine2/blob/master/doctrine-mapping.xsd
                xml mapping          : http://www.doctrine-project.org/projects/orm/2.0/docs/reference/xml-mapping/en
                association mapping  : http://www.doctrine-project.org/projects/orm/2.0/docs/reference/association-mapping/en
        -->
        <entity
            name="Application\Sonata\MediaBundle\Entity\Media"
            table="media__media"
            >
    
            <id name="id" type="integer" column="id">
                <generator strategy="AUTO"/>
            </id>
            <field name="url" column="url" type="string" nullable="true" length="255"/>
    
        </entity>
    </doctrine-mapping>
    

    要绕过管理员的问题,您需要覆盖图像的提供者:

    <?php
    namespace Application\Sonata\MediaBundle\Provider;
    
    use Sonata\MediaBundle\Provider\ImageProvider as BaseImageProvider;
    use Sonata\AdminBundle\Form\FormMapper;
    use Gaufrette\Filesystem;
    use Imagine\Image\ImagineInterface;
    use Sonata\CoreBundle\Model\Metadata;
    use Sonata\MediaBundle\CDN\CDNInterface;
    use Sonata\MediaBundle\Generator\GeneratorInterface;
    use Sonata\MediaBundle\Metadata\MetadataBuilderInterface;
    use Sonata\MediaBundle\Model\MediaInterface;
    use Sonata\MediaBundle\Thumbnail\ThumbnailInterface;
    use Symfony\Component\HttpFoundation\File\File;
    use Symfony\Component\HttpFoundation\File\UploadedFile;
    use Symfony\Component\Form\Form;
    
    /**
     * Overrides the default provider to add the url field in the admin form
     *
     * @author christophe Ferreboeuf <christophe@codivores.com>
     */
    class ImageProvider extends BaseImageProvider{
    
        /**
         * 
         * @param FormMapper $formMapper
         */
        public function buildCreateForm(FormMapper $formMapper)
        {
            $formMapper->add('binaryContent', array(), array('type' => 'string'));
        }
    
        /**
         * 
         * @param FormMapper $formMapper
         */
        public function buildEditForm(FormMapper $formMapper)
        {
            $formMapper->add('name');
            $formMapper->add('enabled');
            $formMapper->add('authorName');
            $formMapper->add('url');
            $formMapper->add('cdnIsFlushable');
            $formMapper->add('description');
            $formMapper->add('copyright');
            $formMapper->add(
                'binaryContent',
                // NEXT_MAJOR: Remove ternary and keep 'Symfony\Component\Form\Extension\Core\Type\FileType' value
                // (when requirement of Symfony is >= 2.8)
                method_exists('Symfony\Component\Form\AbstractType', 'getBlockPrefix')
                    ? 'Symfony\Component\Form\Extension\Core\Type\FileType'
                    : 'file',
                array('required' => false)
            );
        }
    }
    

    并在您的服务上声明它(我更喜欢 yml):

    sonata.media.provider.image:
         class: Application\Sonata\MediaBundle\Provider\ImageProvider
         arguments:
            - sonata.media.provider.image
            - @sonata.media.filesystem.local
            - @sonata.media.cdn.server
            - @sonata.media.generator.default
            - @sonata.media.thumbnail.format
            - []
            - []
            - @sonata.media.adapter.image.gd
            - @sonata.media.metadata.proxy
         tags:
            - { name: sonata.media.provider }
         calls:
            - [ setTemplates, [ { helper_thumbnail: SonataMediaBundle:Provider:thumbnail.html.twig, helper_view: SonataMediaBundle:Provider:view_image.html.twig } ] ]    
    

    【讨论】:

      【解决方案2】:

      好吧,看来我必须删除 Application/Sonata/MediaBundle/Resources/config/doctrine 文件夹并将媒体实体注释如下:

      <?php
      
      namespace Application\Sonata\MediaBundle\Entity;
      
      use Doctrine\ORM\Mapping as ORM;
      use Sonata\MediaBundle\Entity\BaseMedia as BaseMedia;
      
      /**
       * @ORM\Table(name="media__media")
       * @ORM\Entity
       */
      class Media extends BaseMedia
      

      最后一个简单的php app/console doctrine:schema:update --force 就成功了。希望这对遇到同样问题的人有所帮助。

      【讨论】:

        猜你喜欢
        • 2012-09-16
        • 2016-04-24
        • 2016-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多