2013-04-19 2 views
7

У меня есть объект product, и у него есть поле images, в котором хранятся имена изображений из продукта, но имена изображений зависят от поля part_number, которое уникально, поэтому, если пользователь допустил ошибку в шифре, и он хочет, чтобы изменить его, то я должен изменить имена изображенийПолучить старые данные в preUpdate Sonata Admin Bundle

Я пробовал это, но это не работает:

// class ProductsAdmin extends Admin 

public function preUpdate($product) { 

    $old_product = $this->getSubject(); 

    if ($old_product->getPartNumber() != $product->getPartNumber) 
    { 
     // change file names 
    } 

    $this->saveFile($product); 
} 

Как получить оригинальные строки в preUpdate() функции ?

ответ

13

По теме, взятой из официального форума SonataAdmin Google: https://groups.google.com/forum/#!topic/sonata-devs/0zML6N13i3U вам нужно использовать класс UnitOfWork: http://www.doctrine-project.org/api/orm/2.3/class-Doctrine.ORM.UnitOfWork.html

ли так:

public function preUpdate($object) 
{ 
    $em = $this->getModelManager()->getEntityManager($this->getClass()); 
    $original = $em->getUnitOfWork()->getOriginalDocumentData($object); 
} 

Таким образом, вы получить массив значений вашего объекта базы данных. например: чтобы получить доступ к паролю значение вашего лица делать:

$password = $original['password']; 

Вот и все. Наслаждайтесь :)

+11

Помните, что для MongoDB вы будете использовать «getOriginalDocumentData» в качестве метода на UnitOfWork но для MySQL вы необходимо будет использовать 'getOriginalEntityData'. –

0

Если вы просто выполняете запрос доктрины в функции preUpdate, чтобы получить продукт из базы данных, у вас будет старый объект. Затем сделайте сравнение, и вы хорошо пойдете.

+0

Герт Wille, ваше решение не будет работать –

+0

он будет, но ваше решение лучше один ... –