سؤال

وأنا تجاوز لي طريقة 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);
   } 
}

واثنين من الافتراض هنا: أ) يحصل على النموذج الخاص بك واسم الشركة المصنعة وب) النموذج الخاص بك يريد معرف الصانع

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