2015-03-07 2 views
4

Я пытаюсь интегрировать пакет Sonata Media Bundle в свой проект. Проблема в том, что я не понимаю, как работает пакет.Symfony Sonata Media Bundle Добавить изображения/видео пользователю

Он создал класс Media, Gallery и GalleryHasMedia в разделе «Приложение». Для чего они? Как я могу добавить поле изображений и поле видео в свой пользовательский объект? (Как множественное число)

С уважением, нова

ответ

16

Media является объект, который сохраняет все свойства вашего видео/изображения: ширина/высота/путь к файлу ...

Платформа Entity Gallery полезно, если вы хотите связать несколько носителей вместе (галерея видео/фотографии об одном и том же предмете).

Сущность GalleryHasMedia - это объект, который связывает галерею и медиа.

SonataMedia установлен в приложении Bundle, поэтому вы можете легко и легко расширять и изменять код в соответствии с вашими потребностями.

Если вы хотите добавить медиа или галерею для пользователей, вы просто должны сделать:

class UserEntity 
{ 
    /** 
    * @var Media 
    * 
    * @ORM\ManyToOne(targetEntity="Application\Sonata\MediaBundle\Entity\Media") 
    * @ORM\JoinColumns({ 
    *  @ORM\JoinColumn(name="picture", referencedColumnName="id") 
    * }) 
    */ 
    private $picture; 

    /** 
    * @var Gallery 
    * 
    * @ORM\ManyToOne(targetEntity="Application\Sonata\MediaBundle\Entity\Gallery") 
    * @ORM\JoinColumns({ 
    *  @ORM\JoinColumn(name="gallery", referencedColumnName="id") 
    * }) 
    */ 
    private $gallery; 
} 

сгенерируйте добытчик и сеттер с консолью:

php app/console doctrine:generate:entities TestBundle:User 

И вы установлены использовать SonataMedia в вашем пользователе.

UPDATE

Если вы хотите управлять несколько изображений для пользователя, вы должны сделать:

UserEntity

class UserEntity 
{ 
    /** 
    * @var Media 
    * 
    * @ORM\OneToMany(targetEntity="Application\Sonata\MediaBundle\Entity\Media", mappedBy="user") 
    * @ORM\JoinColumns({ 
    * @ORM\JoinColumn(name="images", referencedColumnName="id") 
    * }) 
    */ 
    private $images; 
} 

Application \ соната \ MediaBundle \ Entity \ СМИ

class Media 
{ 
    /** 
     * @var User 
     * 
     * @ORM\ManyToOne(targetEntity="UserEntity", inversedBy="images") 
     * @ORM\JoinColumns({ 
     *  @ORM\JoinColumn(name="user", referencedColumnName="id") 
     * }) 
     */ 
    private $user; 
} 

UserAdmin

class UserAdmin 
{ 
    public function configureFormFields(FormMapper $formMapper) 
    { 
     $formMapper->add('images', 'sonata_type_collection', array(), array(
      'edit' => 'inline', 
      'inline' => 'table', 
      'link_parameters' => array(
       'context' => 'images', 
       'provider' => 'sonata.media.provider.image' 
      ) 
     )) 
    } 
} 

Вы можете изменить отображение путем изменения редактирования и встроенные свойства, link_parameters задает свойства доверенными для формы: context and provider

UPDATE 2

Вопрос 2

Если вам нужно несколько галерей для пользователя, вам просто нужно сделать тот же процесс, который я объяснил в своем предыдущем обновлении, единственное различие заключается в том, что вы должны создать новое свойство, например: private $ imageGalleries с галереей targetEntity, добавить inversedBy в галерее Entity of Sonata и добавьте в свой класс SonataAdmin новое свойство, только изменив изображения имен полей на imageGalleries.

Вопрос 3

Вне Sonata, вы должны использовать форму sonata_media_type для обработки мультимедиа. http://sonata-project.org/bundles/media/2-0/doc/reference/form.html Поскольку у вас есть отношения oneToMany, это будет коллекция sonata_media_type.

Существует нет формы для обработки Галереи, которые я знаю.

+0

Я не понимаю ваших сопоставлений. Сначала вы говорите: «У многих пользователей есть одно изображение», но я хотел, чтобы «у одного пользователя было много изображений». А для галереи сопоставление вашего кода будет означать «Одна галерея для многих пользователей», но я думаю, что «Многие галереи одному пользователю» будут иметь больше смысла. Я понимаю, когда я делаю отношение ManyToOne, потому что мне нужна только аннотация в одном классе. Но что, когда у меня есть OneToMany? Там мне нужны аннотации в обоих классах ..? Можете ли вы уточнить свой ответ для отношения OneToMany, пожалуйста :) –

+0

Я имею в виду, что у одного пользователя должно быть больше галерей, потому что у пользователя должна быть галерея изображений, галерея видео и т. Д. галерея документов. Или я создаю поэтому разные поля, которые я сопоставляю с медиа-объектом? Как это делается? –

+0

Вы должны создать 3 разных свойства, используя галерею объектов или носители с типом OnetoMany. Выбор между Gallery и Media зависит от вашего проекта, если Medias независимы или нет. Удачи ! – HypeR

0

Из документации:

«Примечание

Команда будет генерировать объекты домена в пространстве имен приложения Таким образом, вы можете указать ассоциации сущностей к. глобальное и общее пространство имен, что значительно упростит обмен объектами, так как ваши модели позволят указать на глобальное пространство имен. Например, медиа будет Application \ Sonata \ MediaBundle \ Entity \ Media. " http://sonata-project.org/bundles/media/2-2/doc/reference/installation.html

Довольно много того, что вы получаете, когда используете простой комплект.

Вы используете их точно так же, как и любой объект, просто из другого пространства имен в свои существующие сущности.

Как использовать их в другом типе формы, просто встроить медиа-тип формы в пользовательском типе формы: http://sonata-project.org/bundles/media/2-2/doc/reference/form.html

Для добавления поля к другому объекту вы просто добавить свойство с добытчиками и сеттеров и (мы всегда используйте аннотации доктрины, а не yaml) добавьте аннотацию для медиа-объекта в качестве целевого объекта с именем столбца для типа отношения (1: 1,1: M, M: M и т. д.) обычным способом symfony.

+0

Думаю, мне нужно прояснить себя. Я хочу добавить видео и изображения в свой пользовательский объект. Для этого мне нужен пример кода. Я знаю, как добавить отношения OneToOne между User и Media, но теперь мне нужно добавить новый класс «Изображение» и «Видео» в пространстве имен Application/Sonata/Entity и сопоставить эти классы с полями в моей пользовательской сущности (i не нужен один большой медиа-класс для всех медиа, я хочу разделить изображения, видео и файлы)? Как мне теперь нужно создать тип формы? Пожалуйста, поделитесь с нами некоторым примером кода :) Кроме того, я не понимаю, что такое класс «Галерея» ..? –

Смежные вопросы