문제

기본적으로 다음을 수행하기 위해 DoSave () 메소드를 우선하고 있습니다. 사용자가 선택하거나 새 옵션을 입력 할 수있는 sfwidgetformpropelchoice 필드가 있습니다. 위젯의 값을 어떻게 변경할 수 있습니까? 아니면 내가 이것에 대해 잘못된 방식으로 접근하고있을 수도 있습니다. 그래서 다음은 doSave () 메소드를 왜곡하는 방법입니다.

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);
}
도움이 되었습니까?

해결책

setDefault 또는 setDefaults를 사용한 다음 바운드 값으로 자동 인구를 사용해야합니다.

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

용법

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

다른 팁

당신은 행동에서 그것을 할 수 있습니다 :

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

그러나 나는 내 비즈니스 논리가 항상 같은 장소에 있으므로 내 동료에서 직접 제조업체와 함께하고있는 일을 선호합니다.

내 양식에 넣은 것은 주로 검증 논리입니다.

피어의 저장 방법에 넣을 내용의 예 :

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

여기서 두 가지 가정 : a) 귀하의 양식은 제조업체의 이름을 얻고 b) 귀하의 모델은 제조업체의 ID를 원합니다.

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);
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top