2017-05-08 62 views
0

当我需要一个干净的解决方案,以从被填充后,设置数据提交页面:Silverstripe防止负载数据提交表单

$form->loadDataFrom($Page); 

有我的代码:

public function FormUpdate() { 

    $error="Required"; 

    $fields = new FieldList(
     TextField::create('Title', 'Title')->setCustomValidationMessage($error), 
     TextField::create('Description', 'Description')->setCustomValidationMessage($error), 
     TextField::create('Subject', 'Description')->setCustomValidationMessage($error), 
    ); 

    $actions = new FieldList(
     FormAction::create("FormUpdateSubmit")->setTitle('Update') 
    ); 

    $Page=Versioned::get_by_stage('Page', 'Live')->filter(array('SecureCode' => $_REQUEST['id']))->First(); 

    $fields->push(HiddenField::create('id','SecureCode', $Page->SecureCode)); 
    $fields->push(CheckboxField::create('Approbation', "Approbation")->setCustomValidationMessage($error)); ), 

    $required = new RequiredFields(array(
     'Title','Subject','Description' 
    )); 

    $form = new Form($this, 'FormModifier', $fields, $actions, $required); 

    $form->loadDataFrom($Page); 
    $form->setAttribute('novalidate', 'novalidate'); 

    return $form; 

} 

的问题。 ..如果我更改标题和说明,我空主题字段,我被重定向到表单页面与主题下方的错误消息,但是,所有字段从$form->loadDataFrom($Page);重新加载这并不好。我必须防止重新加载数据。在这种情况下,发布的数据必须替换$ Page。我缺少什么?

回答

0

将表单添加到模板中,并通过请求一次,您的表单将被调用一次。由于控制器上的所有行动获得请求的参数,你可以修改你的表单功能,像这样:

public function FormUpdate($request = null) { 

然后你的函数里面,只有填写表单,如果它不是通过请求,例如调用。

if (!$request) { 
    $form->loadDataFrom($Page); 
} 
+0

我已经尝试过,但它不工作更多... – StefGuev

+0

如果我把var_dump($ request)放在FormUpdate里面,结果总是为NULL。但是在我回到表单之前,我可以看到提交的数据。所以$请求被重定向重设,我认为 – StefGuev

1

我通常在调用窗体的动作(而不是窗体函数内部)上使用loadDataFrom。因此,例如:

... 
public function index() 
{ 
    $form =$this->Form(); 
    $form->loadDataFrom($this); 

    $this->customise(array("Form" => $form)); 

    return $this->renderWith("Page"); 
} 

...

这样的功能,只返回基本形式,并在有需要时,你改变它。