2017-04-26 73 views
0

上我有以下形式的代码:SilverStripe:表的工作方式主页上,但不是一个子页面

ContactPage_Controller extends Page_Controller { 

    static $allowed_actions = array(
     'submit' 
    ); 

    public function Send() { 

     $contact = new Contact(); 
     $validator = new RequiredFields('Anrede', 'Vorname', 'Nachname', 'Email', 'Message'); 

     $fields = new FieldList(
      new TextField('securityidentifier', 'securityidentifier', $this->cryptTime()), 
      new DropdownField('Anrede', 'Anrede:*', $contact->dbObject('Anrede')->enumValues()), 
      new TextField('Vorname', 'Vorname:*'), 
      new TextField('Nachname', 'Nachname:*'), 
      new EmailField('Email', 'E-Mail-Adresse:*'), 
      new TextareaField('Message', 'Nachricht:*') 
     ); 

     $actions = new FieldList(
      new FormAction('submit', 'Senden') 
     ); 

     return new Form($this, 'submit', $fields, $actions, $validator); 
    } 

    // ... 
} 

如果我把它作为一个单独的页面也能正常工作。当我尝试使用它作为子页面时,表单不显示。我得到的标题,我得到的内容,但我没有得到的形式。

任何想法为什么这不能正常工作?

+0

“subpage”是什么意思? – bummzack

+0

子页面是否也是联系页面? – wmk

+0

@bummzack与子页面我的意思是childpage。 –

回答

4

您的表单在ContactPage_Controller上定义。如果您试图渲染它的子页面不是ContactPage的后代,那么该方法通过继承是不可见的。有几个选项。

1)将表格放入Page_Controller。通常,所有的页面都是从这个页面继承的,所以他们可以访问表单。虽然不是很好的做法。尽量保持Page课程的精益。

2)创建一个将表单工厂方法和处理程序注入控制器的扩展。这更多的是“横向”的方式,而不是垂直的继承方式,并且趋向于更好地扩展。

3)沿着同样的路线,创造一个做同样事情的特质。可能是更好的选择,因为扩展是特殊的,并且可能会在某个时候被弃用。

相关问题