2014-10-17 31 views
6

Sluggable'ı kullanmak için doktrin uzantılarını yeni yükledim.Symfony 2 - Gedmo Slug ile Slugs Oluşturun

Bunu yapmak:

composer.json

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

AppKernel.php

new Stof\DoctrineExtensionsBundle\StofDoctrineExtensionsBundle(), 

app/config/config.yml

stof_doctrine_extensions: 
    orm: 
     default: 
      sluggable: true 

Djoo \ AppliBundle \ Varlık \ Nomenclature.phpHiç hata var

$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(); 
} 

ama benim eski değerler boş sümüklüböcek şunlardır: benim denetleyicisi olarak

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

} 
ben bu benim datatable eski değerler için kurşunu oluşturmak için yapın. Yeni bir eleman yaratmaya çalışıyorum ve iyi bir sümüklübüm var. Sen ve fikrin var mı?

Teşekkürler

+1

Bence sümük sadece yeni kalıcı nesneler için üretilir. – fejese

cevap

7

Sülük değiştirmek için ilgili özelliği değiştirmeniz gerekir. $titre'un sonuna bir boşluk ekleyebilir, kaydedebilir, değiştirebilir ve tekrar kaydedebilirsiniz. Bu sümüklü böcekleri temizleyecektir. Aşağıdaki

+1

Yeaaaa, teşekkürler $ entity = $ em-> getRepository ($ entityName) -> bulun ($ id); \t \t $ titre = $ entity-> getTitre(); \t \t $ varlık -> setSlug (boş); \t \t $ varlık -> setTitre ($ titre. ""); \t \t $ em -> flush(); – Johann

+1

v2.3.8 setSlug (null) hile yapacaktır. – 10us

+0

Benim için çalışmadı. Ben slug el ile yeniden üretmek zorunda kaldı http://stackoverflow.com/a/18672588/1179841 – Sithu

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

Bu benim için çalışıyor ve neden -1 var mı merak ediyorum ????. Az önce +1 ekledim. Ayrıca, "ObjectManager" öğesini "EntityManager" a ayarlamak isteyebilirsiniz, böylece getUnitOfWork() için kod tamamlama yapabilirsiniz:):/** @var ObjectManager | EntityManager $ em */' –

2

sluggable documentation devletler:

Eğer salyangozdur sluggable alanlara göre kendini yenilemesi null kurşunu ayarlamak isterseniz.

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

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

Benim için çalışır. o OP için çalışır, ancak diğerleri için çalıştı vermedi Neden

+0

çalışmıyor benim için. Alan ek açıklamaları şu şekildedir: @ORM \ Column (name = "slug", benzersiz = true, nullable = true) '' @Gedmo \ Slug (alanlar = {"name", "city"}, updatable = true) –

2

(. örn @gregor):

..  

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

sümüklü böcek yaratma, ilk içgüdüsü bu sütun yapılandırma ile sülük özelliği yaratmaktır

app/console doctrine:schema:update çalıştırırken ve bu 2 sql tablolara neden olacaktır: varsayılan sütununun slug By

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

değerdolacak(boş dize), (Duplicate entry '') hatası ile 2. ifadesinin başarısız olmasını sağlar.

Seçim Bir: Şimdi iki seçeneğiniz var çalışacak belgelenmiş yöntem $entity->setSlug(null) her şeyi kullanarak elle sümüklü böcek oluşturmayı deneyin sonra hatayı görmezden gelirsek 2 açıklamada

başarısızlığını yok sayın ve.Çünkü sen Doktrin mülkiyet slug ('' den null kadar) değiştirilmiştir ve bu da (onun örneğin Radu @Sebastian sayesinde) dahili olarak $uow->propertyChanged() ve $uow->scheduleForUpdate() tetikleyecek bildirmek istiyorum $entity->setSlug(null) kullanarak çalışacak. Sluggable uzantısı, bu değişikliği de fark edecek ve sümüklüleri yeniden üretecektir. Artık tüm sümüklü böcekler benzersiz olduğu için, bir sonraki sefer app/console doc:schema:update'u çalıştırdığınızda, slug'da dizin oluşturmayı başaracak ve şemanız tamamen senkronize olacaktır. Bu sahip slug sütunda neden olacaktır

..  

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

:

Choice B: O indeks oluşturma başarılı böylece, İçgüdün nullable olarak slug alanını işaretlemek olacaktır Hatayı fark ettikten sonra nullable olmak slug alanını değiştirin Varsayılan değer olarak NULL. Şimdi belgelenmiş $entity->setSlug(null) yaklaşımını kullanmayı denediğinizde işe yaramayacaktır (OP'nin gönderdiği gibi). Bu, $entity->slug özelliği zaten NULL olduğu için olur. Böylece, $entity->setSlug(null)'u kullandığınızda, Doctrine tarafından herhangi bir değişiklik algılanmaz ve dolayısıyla Sluggable yenileme davranışı asla tetiklenmez. (Ama bu ekstra alan neden olacaktır Peşinde Döşeme olurdu)

  • yaklaşım ile sülük kaynak özelliklerine $entity -> setTitre($titre." "); alan ekleme ile

    • kesmek: Değişiklikleri tetiklemek amacıyla iki cevabı vardı o alan değiştirildi doğrudan o Doctrine söylemek gösterir @Sebastian Radu,

    Umut bu biraz daha iyi iç işi anlamamıza yardımcı olur (Ben şahsen bu bir tercih ve haksız downvoted neden acaba) Doktrini ve uzantıları.