2014-10-17 4 views
6

Я только что установил расширения доктрины для использования Sluggable.Symfony 2 - Создание слизней с Gedmo Slug

Я делаю это:

composer.json

"stof/doctrine-extensions-bundle": "1.2.*@dev" 

AppKernel.php

new Stof\DoctrineExtensionsBundle\StofDoctrineExtensionsBundle(), 

приложение/Config/config.yml

stof_doctrine_extensions: 
    orm: 
     default: 
      sluggable: true 

Djoo \ AppliBundle \ Entity \ Nomenclature.php

namespace Djoo\AppliBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Doctrine\DBAL\Types\SmallIntType; 
use Gedmo\Mapping\Annotation as Gedmo; 

/** 
* Nomenclature 
* 
* 
* @ORM\Table(name="app_nomenclature") 
* @ORM\Entity 
*/ 
class Nomenclature 
{ 
    ..... 
    /** 
    * @var string 
    * 
    * @ORM\Column(name="titre", type="string", length=200, nullable=false) 
    */ 
    private $titre; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="finess", type="string", length=10, nullable=true) 
    */ 
    private $finess; 

    /** 
    * @Gedmo\Slug(fields={"titre","finess"},suffix=".html") 
    * @ORM\Column(length=128, unique=true,nullable=true) 
    */ 
    private $slug; 

    public function getSlug() { 
     return $this->slug; 
    } 

    public function setSlug($slug){ 
     $this->slug = $slug; 
     return $this; 
    } 

} 

В моем контроллере я сделать это, чтобы генерировать слизняк для старых значений в моем DataTable:

$filterBuilder = $this->get('doctrine.orm.entity_manager')>getRepository('DjooAppliBundle:Nomenclature')->createQueryBuilder('e')->orderBy('e.titre', 'asc'); 
$query = $filterBuilder->getQuery(); 
$nomenclatures = $query->getResult(); 

foreach($nomenclatures as $nomenclaturee){ 
    $nomenclature->setSlug(null); 
    $this->get('doctrine.orm.entity_manager')->persist($nomenclature); 
    $this->get('doctrine.orm.entity_manager')->flush(); 
} 

У меня нет ошибки, но мои старых значения нулевого слизняка. Я пытаюсь создать новый элемент, и у меня хороший слизень. У вас есть идея?

Thanks

+1

Я думаю, что слизень генерируется только для вновь сохраненных объектов. – fejese

ответ

7

Для изменения пули необходимо изменить соответствующее свойство. Вы можете добавить пробел в конец $titre, сохранить его, изменить его и снова сохранить. Это будет смывать слизняки.

+1

Yeaaaa, спасибо $ entity = $ em-> getRepository ($ entityName) -> find ($ id); \t \t $ titre = $ entity-> getTitre(); \t \t $ entity -> setSlug (null); \t \t $ entity -> setTitre ($ titre. ""); \t \t $ em -> flush(); – Johann

+1

Так как v2.3.8 setSlug (null) будет делать трюк. – 10us

+0

Это не сработало для меня. Мне пришлось повторно генерировать пулю вручную в соответствии с http://stackoverflow.com/a/18672588/1179841 – Sithu

2
$uow = $em->getUnitOfWork();  
$uow->propertyChanged($entity, 'slug', NULL, NULL);  
$uow->scheduleForUpdate($entity);  
$em->flush(); 
+0

Это работает для меня, и я задаюсь вопросом, почему у него было -1 ????. Я добавил +1. Также имейте в виду, что вам может понадобиться набрать «ObjectManager» в «EntityManager», чтобы вы могли получить завершение кода для 'getUnitOfWork()': '/ ** @var ObjectManager | EntityManager $ em * /' –

2

В sluggable documentation гласит следующее:

В случае, если вы хотите слизняк самовосстанавливаться на основе Sluggable полей, установите пробку на нуль.

<?php 
$entity = $em->find('Entity\Something', $id); 
$entity->setSlug(null); 

$em->persist($entity); 
$em->flush(); 

Это делает работу для меня.

+0

не работает для меня. Полевые аннотации похожи на это '@ORM \ Column (name =" slug ", unique = true, nullable = true)' '@Gedmo \ Slug (поля = {" name "," city "}, updatable = true)' –

2

Почему это не работает для OP, но работал для других (. Например @gregor):

При создании слизняка, ваш первый инстинкт, чтобы создать пробкового свойство этой конфигурации колонки:

..  

@ORM\Column(unique=true, nullable=false) 
private $slug; 
.. 

app/console doctrine:schema:update при запуске и это приведет к 2 заявлению SQL:

ALTER TABLE ... ADD slug ... NOT NULL 
CREATE UNIQUE INDEX...`. 

по умолчанию колонки slug будет заполнен значением '' (пустая строка), которая приведет к ошибке 2-го оператора с ошибкой (Duplicate entry ''). Теперь у вас есть два варианта:

Выбор A: Игнорировать отказ 2-го заявления

Если вы игнорируете ошибку, а затем попытаться генерировать слизень вручную, используя документированный метод $entity->setSlug(null) все будет работать.Это сработает, потому что, используя $entity->setSlug(null), вы позволите Doctrine узнать, что свойство slug было изменено (от '' до null), и это, в свою очередь, вызовет внутренне $uow->propertyChanged() и $uow->scheduleForUpdate() (спасибо @Sebastian Radu за его пример). Расширение Sluggable также заметит это изменение и будет регенерировать слизню. Теперь, когда все слизняки уникальны, в следующий раз при запуске app/console doc:schema:update ему удастся создать индекс на slug, и ваша схема будет полностью синхронизирована.

Выбор B: Изменение slug поля, чтобы быть nullable Заметив ошибку вашего инстинкта будет отмечать slug поля nullable, так что создание индекса успешно:

..  

@ORM\Column(unique=true, nullable=true) 
private $slug; 
.. 

Это приведет к slug столбику NULL как значение по умолчанию. Теперь, когда вы пытаетесь использовать задокументированный подход $entity->setSlug(null), он не будет работать (точно так же, как OP опубликовал). Это происходит потому, что когда $entity->slug недвижимости уже NULL. Таким образом, когда вы используете $entity->setSlug(null), Doctrine не обнаруживает никаких изменений, и поэтому Sluggable поведение восстановления никогда не срабатывает. Для того, чтобы вызвать изменения было два ответа:

  • хак с добавлением пространства к свойствам исходных пробкового $entity -> setTitre($titre." "); (но это приведет к дополнительному пространству вам придется обрезать после)

  • подхода @Sebastian Radu, где он показывает, как сказать Учение непосредственно, что поле было изменено (я лично предпочитаю эту и удивляюсь, почему это было несправедливо downvoted)

Надеется, что это поможет вам понять немного лучше внутреннюю работу Доктрины и расширения.

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