2016-07-28 158 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 } ] ]