2009-06-22 24 views
5

Tôi đang ghi đè phương thức doSave() của mình về cơ bản thực hiện các thao tác sau: Tôi có một trường sfWidgetFormPropelChoice mà người dùng có thể chọn hoặc nhập một tùy chọn mới. Làm thế nào tôi có thể thay đổi giá trị của widget? Hoặc có lẽ tôi đang tiếp cận điều này một cách sai lầm. Vì vậy, đây là cách tôi overrode các) phương pháp doSave (:Trong symfony, cách đặt giá trị của một trường biểu mẫu?

public function doSave($con = null) 
{ 
    // Save the manufacturer as either new or existing. 
    $manufacturer_obj = ManufacturerPeer::retrieveByName($this['manufacturer_id']->getValue()); 
    if (!empty($manufacturer_obj)) 
    { 
     $this->getObject()->setManufacturerId($manufacturer_obj->getId()); // NEED TO CHANGE THIS TO UPDATE WIDGET'S VALUE INSTEAD? 
    } 
    else 
    { 
     $new = new Manufacturer(); 
     $new->setName($this['manufacturer_id']->getValue()); 
     $new->save(); 
     $this->getObject()->setManufacturerId($new->getId()); // NEED TO CHANGE THIS TO UPDATE WIDGET'S VALUE INSTEAD? 
    } 

    parent::doSave($con); 
} 

Trả lời

9

Bạn nên sử dụng setDefault hoặc setDefaults và sau đó nó sẽ tự động tương thích với các giá trị bị ràng buộc.

(sfForm) setDefault ($name, $default) 
(sfForm) setDefaults ($defaults) 

sử dụng

$form->setDefault('WidgetName', 'Value'); 
$form->setDefaults(array(
    'WidgetName' => 'Value', 
)); 
2

Bạn có thể làm điều đó trong hành động:

$this->form->getObject()->setFooId($this->foo->getId()) /*Or get the manufacturer id or name from request here */ 
$this->form->save(); 

Nhưng tôi thích làm những loại công việc bạn đang làm với nhà sản xuất trực tiếp trong Peer của tôi nên logic nghiệp vụ của tôi luôn ở cùng một nơi.

Những gì tôi đưa vào biểu mẫu của tôi chủ yếu là xác thực logic.

Ví dụ về những gì để đưa vào các phương pháp tiết kiệm của Peer:

public function save(PropelPDO $con= null) 
{ 
    if ($this->isNew() && !$this->getFooId()) 
    { 
    $foo= new Foo(); 
    $foo->setBar('bar'); 
    $this->setFoo($foo); 
    } 
} 
+0

Cảm ơn phản hồi của bạn! Làm thế nào bạn sẽ đi về làm công việc đó trong đồng đẳng? Vì nó liên quan đến form, nên nó không đi vào form? Người ngang hàng không có dữ liệu biểu mẫu sẽ là ID hoặc tên mới. –

1

Hai giả thiết đây: a) Hình thức của bạn được tên của nhà sản xuất và b) mô hình của bạn muốn ID của một nhà sản xuất

public function doSave($con = null) 
{ 
    // retrieve the object from the DB or create it 
    $manufacturerName = $this->values['manufacturer_id']; 
    $manufacturer = ManufacturerPeer::retrieveByName($manufacturerName); 
    if(!$manufacturer instanceof Manufacturer) 
    { 
     $manufacturer = new Manufacturer(); 
     $manufacturer->setName($manufacturerName); 
     $manufacturer->save(); 
    } 

    // overwrite the field value and let the form do the real work 
    $this->values['manufacturer_id'] = $manufacturer->getId(); 

    parent::doSave($con); 
} 
Các vấn đề liên quan