0

Ich möchte der Sonata Media-Entität Eigenschaften hinzufügen, aber ich kann sie einfach nicht zum Laufen bringen. Ich verwende das Sonata Media Bundle 2.3 und habe es gemäß dem Handbuch installiert. Ich habe es auch mit dem Sonata Easy Extends Bundle erweitert.Hinzufügen von Eigenschaften zu/Erweitern von Sonata Media entity

Wenn ich eine Eigenschaft zu Application\Sonata\MediaBundle\Entity\Media hinzufüge, wird es einfach nicht abgeholt, wenn ich doctrine:generate:diff ausführen ('Keine Änderungen in Ihrer Mapping-Information gefunden.').

Das Überschreiben der Medienklasse in wird auch keinen Unterschied machen.

Dies ist der Code in 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; 
    } 
} 

Und in 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 

Noch einmal, ich das gleiche Ergebnis, wenn ich diesen Abschnitt kommentiert auslassen.

UPDATE: Wenn ich eine benutzerdefinierte Migration erstellen, die die Eigenschaft hinzufügt, wenn ich die MediaAdmin verlängern, wird das test Feld nicht angezeigt, wenn ich auf das Bild bearbeiten Seite: So

// 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]); 
    } 
} 

es scheint, dass Sonata das erweiterte Medienpaket ignoriert (was nicht der Fall ist, denn wenn ich Application\Sonata\MediaBundle\Entity\Media.php entferne, erhalte ich einen Fehler).

Antwort

1

Nun scheint es, wie ich die Application/Sonata/MediaBundle/Resources/config/doctrine Ordner entfernen musste und die Medieneinheiten wie folgt beschriften:

<?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 

Ein einfaches php app/console doctrine:schema:update --force am Ende den Trick. Hoffe, das hilft denen, die das gleiche Problem haben.

1

Ich musste die Erstellung verschiedener Eigenschaften für das Bild durchlaufen und hier ist meine Lösung mit der Standard-Doktrin und dem Anbieter. Ich habe easy-extends benutzt.

Um eine Eigenschaft auf Medien ohne Anmerkung hinzufügen, können Sie den Knoten <field name="url" type="string"/> etwas zu bekommen, wie in media.phpcr.xml verwenden können:

<?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> 

Und dann, ohne Anmerkung zu verwenden, müssen Sie Media.php in Ihrem erweitert hinzuzufügen:

<?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; 
    } 


} 

Und erklären es für 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> 

durch, um das Problem mit Admin übergeben, müssen Sie den Anbieter für Bild außer Kraft zu setzen:

<?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) 
     ); 
    } 
} 

Und erklären Sie es auf Ihrem Service (ich ziehe 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 } ] ]  
Verwandte Themen