Symfony에서 양식 필드의 값을 설정하는 방법은 무엇입니까?
문제
기본적으로 다음을 수행하기 위해 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);
}
제휴하지 않습니다 StackOverflow