2016-07-28 155 views
0

我想添加属性到索纳塔媒体实体,但我无法让它工作。我正在使用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 

同样,我得到同样的结果,如果我离开那部分注释掉。

UPDATE:当我创建一个自定义的迁移,增加了属性,当我延长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时,出现错误)。

回答

1

嗯,好像我不得不删除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的伎俩。希望这有助于遇到同样问题的人。

1

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

要在媒体添加属性没有注解,你可以使用节点<field name="url" type="string"/>得到的东西像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 <[email protected]> 
*/ 
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 <[email protected]> 
*/ 
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) 
     ); 
    } 
} 

,并宣布它在你的服务(我喜欢阳明):

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 } ] ]