2010-01-13 30 views
15

Làm cách nào để kiểm tra xem trường đã thay đổi chưa?Trình nghe tín hiệu - chỉ thực hiện hành động nếu một trường đã thay đổi

Tôi muốn kích hoạt một hành động trong preSave() chỉ khi trường cụ thể đã thay đổi, e.q.

public function preSave() { 
    if ($bodyBefore != $bodyNow) { 
     $this->html = $this->_htmlify($bodyNow); 
    } 
} 

Câu hỏi đặt ra là làm thế nào để có được điều này $bodyBefore$bodyNow

Trả lời

23

Vui lòng không tìm nạp lại cơ sở dữ liệu! Điều này làm việc cho Doctrine 1.2, tôi chưa thử nghiệm các phiên bản thấp hơn.

// in your model class 
public function preSave($event) { 
    if (!$this->isModified()) 
    return; 

    $modifiedFields = $this->getModified(); 
    if (array_key_exists('title', $modifiedFields)) { 
    // your code 
    } 
} 

Kiểm tra documentation, quá.

-1

Hãy thử điều này.

public function preSave($event) 
{ 
    $id = $event->getInvoker()->id; 
    $currentRecord = $this->getTable()->find($id); 

    if ($currentRecord->body != $event->getInvoker()->body) 
    { 
     $event->getEnvoker()->body = $this->_htmlify($event->getEnvoker()->body); 
    } 
} 
+0

Khi tôi thêm tham số '$ event' vào' preSave() ', phương thức này không được thực thi. – takeshin

+0

Bạn đang sử dụng phiên bản nào của Doctrine? – Travis

+0

Tôi sử dụng Doctrine 1.2.1 – takeshin

3

Câu trả lời của Travis gần như đúng, vì vấn đề là đối tượng bị ghi đè khi bạn thực hiện truy vấn Doctrine. Vì vậy, giải pháp là:

public function preSave($event) 
{ 
    // Change the attribute to not overwrite the object 
    $oDoctrineManager = Doctrine_Manager::getInstance(); 
    $oDoctrineManager->setAttribute(Doctrine::ATTR_HYDRATE_OVERWRITE, false); 

    $newRecord = $event->getInvoker(); 
    $oldRecord = $this->getTable()->find($id); 

    if ($oldRecord['title'] != $newRecord->title) 
    { 
    ... 
    } 
} 
Các vấn đề liên quan