【问题标题】:Silverstripe populate form based on urlSilverstripe 基于 url 填充表单
【发布时间】:2015-09-23 03:35:50
【问题描述】:

我有 TeamsPage 类和 Team 类。我试图弄清楚如何根据在 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
    );
  }
}

团队:

<?php
class Team extends DataObject {
  private static $db = array(
    'TeamCaptain' => 'Int',
    'TeamName' => 'Varchar',
    'TeamDescription' => 'Text'
  );
  private static $has_one = array (
    'Photo' => 'Image',
    'TeamsPage' => 'TeamsPage'
  );
  private static $summary_fields = array (
    'GridThumbnail' => '',
    'TeamCaptain' => 'Team Captain',
    'TeamName' => 'TeamName',
    'TeamDescription' => 'Team Description',
  );
  public function getGridThumbnail() {
    if($this->Photo()->exists()) {
        return $this->Photo()->SetWidth(100);
    }
    return '(no image)';
  }
  public function getCMSFields() {
    $fields = FieldList::create(
        TextField::create('TeamCaptain'),
        TextField::create('TeamName'),
        TextareaField::create('TeamDescription'),
        $uploader = UploadField::create('Photo')
    );
    $uploader->setFolderName('teams-photos');
    $uploader->getValidator()->setAllowedExtensions(array(
        'png','gif','jpeg','jpg'
    ));
    return $fields;
  }

  public function Link() {
    return $this->TeamsPage()->Link('show/'.$this->ID);
  }
}

TeamsPage_edit.ss

<% if GetMember() %>
  Welcome $getMember.FirstName<br />
  $EditTeamForm($ID)
  <a href="home">Back to Home</a>
<% else %>
  $GoToLogin()
<% end_if %>

【问题讨论】:

    标签: forms silverstripe


    【解决方案1】:

    在我看来,您从模板向 EditTeamForm 传递了错误的 ID。除非有我没有看到的 声明,否则我认为您想调用:

    $EditTeamForm($Team.ID)
    

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

    【讨论】:

    • 是的,有效。我试图将 $Team 作为对象传递,但这不起作用。有没有办法让我通过整个团队,这样我就不用查询两次了?
    • 我认为模板系统中没有办法。仅给出上面的代码,我看不出有任何理由将团队对象作为成员变量存储在控制器上并直接在 EditTeamForm 中使用。不这样做的唯一原因是您需要在其他地方重复使用它。
    • 我一直试图理解这一点,但我无法理解它。我的编辑方法假设返回一个基于 ID 预填充的表单。有一个更好的方法吗?我已将您的问题标记为正确,因为它回答了我最初的问题。我还提出了另一个跟进此问题的问题。如果您知道答案,我将非常感谢您的帮助!链接是stackoverflow.com/questions/32742165/…
    猜你喜欢
    • 1970-01-01
    • 2015-12-07
    • 1970-01-01
    • 2016-07-03
    • 2017-03-28
    • 2012-03-26
    • 1970-01-01
    • 1970-01-01
    • 2020-12-07
    相关资源
    最近更新 更多