Forms Silverstripe基于url填充表单

Forms Silverstripe基于url填充表单,forms,silverstripe,Forms,Silverstripe,我有团队课和团队课。我试图找出如何根据URL中传递的ID,使用数据库中的数据预填充表单。下面是我尝试的代码,我试图通过模板传递ID,但没有成功。除此之外,我还可以如何做到这一点?我更希望有一种方法可以将团队作为我已经在编辑功能中拥有的对象传递,这样我就不必两次访问数据库了。有办法做到这一点吗 团队空间: <?php class TeamsPage extends Page { private static $has_many = array ( 'Teams' => 'T

我有团队课和团队课。我试图找出如何根据URL中传递的ID,使用数据库中的数据预填充表单。下面是我尝试的代码,我试图通过模板传递ID,但没有成功。除此之外,我还可以如何做到这一点?我更希望有一种方法可以将团队作为我已经在编辑功能中拥有的对象传递,这样我就不必两次访问数据库了。有办法做到这一点吗

团队空间:

<?php
class TeamsPage extends Page {
  private static $has_many = array (
    'Teams' => 'Team',
  );
  public function getCMSFields() {
    $fields = parent::getCMSFields();
    $fields->addFieldToTab('Root.Teams', GridField::create(
        'Teams',
        'Teams on this page',
        $this->Teams(),
        GridFieldConfig_RecordEditor::create()
    ));
    return $fields;
  }
}
class TeamsPage_Controller extends Page_Controller {
  private static $allowed_actions = array (
    'show', 'edit', 'EditTeamForm'
  );

  public function EditTeamForm($teamId){
    $fields = new FieldList(
        new TextField('TeamName'),
        new TextareaField('TeamDescription')
    );
    $actions = new FieldList(
        new FormAction('EditTeam', 'Save Changes')
    );
    $requiredFields = new RequiredFields(array('TeamName','TeamDescription'));
    $form = new Form($this, 'EditTeamForm', $fields, $actions, $requiredFields);
    $form->setFormMethod('POST', true);

    $data = Session::get("FormData.{$form->getName()}.data");
    $team = Team::get()->byID($teamId);
    return $data ? $form->loadDataFrom($data) : $form->loadDataFrom($team);
  }

  public function show(SS_HTTPRequest $request) {
    $team = Team::get()->byID($request->param('ID'));

    if(!$team) {
        return $this->httpError(404,'That team could not be found');
    }

    return array (
        'Team' => $team
    );
  }

  public function edit(SS_HTTPRequest $request){
    $team = Team::get()->byID($request->param('ID'));

    if(!$team) {
        return $this->httpError(404,'That team could not be found');
    }

    return array (
        'Team' => $team
    );
  }
}

在我看来,您从模板向EditTeamForm传递了错误的ID。除非有我看不到的声明,否则我认为你想打电话:

$EditTeamForm($Team.ID)

其他一切在我看来都很好。

是的,这很有效。我试图将$Team作为对象传入,但这不起作用。有没有办法让我通过整个团队,这样我就不必再查询两次了?我认为在模板系统中没有办法。仅给出上面的代码,我看不出有任何理由只将团队对象作为成员变量存储在控制器上,并在EditTeamForm中直接使用它。不这样做的唯一原因是如果你需要在其他地方重复使用它。我一直试图理解这一点很长一段时间了,我只是无法理解它。我的编辑方法应该返回一个基于ID预先填充的表单。有更好的方法吗?我已将你的问题标记为正确,因为它已回答了我最初的问题。我还提出了另一个问题,即这一问题的后续行动。如果你知道答案,我将非常感谢你的帮助!链接是
<% if GetMember() %>
  Welcome $getMember.FirstName<br />
  $EditTeamForm($ID)
  <a href="home">Back to Home</a>
<% else %>
  $GoToLogin()
<% end_if %>
$EditTeamForm($Team.ID)