2013-04-19 25 views
7

Tôi có một đối tượng product và nó có trường images lưu trữ tên hình ảnh từ sản phẩm nhưng tên hình ảnh phụ thuộc vào trường part_number là duy nhất, vì vậy nếu người dùng nhầm lẫn trong số phần và ông muốn chỉnh sửa nó sau đó tôi cũng phải thay đổi tên hình ảnhLấy dữ liệu cũ trong PreUpdate Sonata Admin Bundle

tôi đã cố gắng này, nhưng nó không hoạt động:

// class ProductsAdmin extends Admin 

public function preUpdate($product) { 

    $old_product = $this->getSubject(); 

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

    $this->saveFile($product); 
} 

Làm thế nào tôi nhận được hàng gốc trong preUpdate() chức năng ?

Trả lời

13

Theo chủ đề lấy từ diễn đàn SonataAdmin google chính thức: https://groups.google.com/forum/#!topic/sonata-devs/0zML6N13i3U bạn cần phải tận dụng các UnitOfWork lớp: http://www.doctrine-project.org/api/orm/2.3/class-Doctrine.ORM.UnitOfWork.html

làm theo cách này:

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

Vì vậy bạn nhận được một mảng các giá trị của thực thể cơ sở dữ liệu của bạn. ví dụ: để có được quyền truy cập vào mật khẩu giá trị của tổ chức của bạn làm:

$password = $original['password']; 

Đó là tất cả. Enjoy :)

+11

Hãy nhớ rằng cho MongoDB bạn sẽ sử dụng 'getOriginalDocumentData' như một phương pháp trên unitOfWork nhưng đối với mysql bạn sẽ cần sử dụng 'getOriginalEntityData'. –

0

Nếu bạn chỉ cần thực hiện truy vấn học thuyết trong hàm preUpdate để lấy sản phẩm từ cơ sở dữ liệu, bạn sẽ có đối tượng cũ. Sau đó, làm so sánh và bạn tốt để đi.

+0

Geert Wille, giải pháp của bạn sẽ không hoạt động –

+0

Nó sẽ nhưng giải pháp của bạn là một tốt hơn một ... –

Các vấn đề liên quan