【问题标题】:Set form data from controller in CakePHP 3在 CakePHP 3 中从控制器设置表单数据
【发布时间】:2015-08-10 08:40:46
【问题描述】:

我的应用程序中有一个登录表单。在某些情况下,我想从控制器传递数据。

表单是这样创建的:

<?= $this->Form->create(null, ['url' => ['controller' => 'Users', 'action' => 'login']]); ?>
<?= $this->Form->input('email', ['label' => __('E-mail')]); ?>
<?= $this->Form->input('password', array('label' => __('Password'))); ?>

在控制器中,我想修复 email 字段的默认值,但在多次尝试 set 之后,request->data em>,等等...找不到怎么做。

    $this->set('email', 'whatever');
    $this->set('User.email', 'whatever');
    $this->set('user.email', 'whatever');
    $this->request->data['user']['email'] = 'whatever';
    $this->request->data['User']['email'] = 'whatever';
    $this->set('user', $this->Accounts->Users->newEntity(['email' => 'whatever']));

在 CakePHP 2 中,这只是简单地写在 $this-&gt;request-&gt;data 上;

$this->request->data['User']['email'] = 'whatever';

请注意,登录表单显示为一个元素,因此它可以在应用程序视图中的任何位置重复使用。

【问题讨论】:

  • 尝试使用$this-&gt;request-&gt;data['email'] = 'user@example.net';
  • 这可能是我唯一没有尝试过的事情 :) 效果很好!。问题。同时我在尝试不同的选项我也改变了表单,因为 CakePHP-3 表单的创建与 Cake2 有点不同。
  • 永远是你尝试的最后一件事:)

标签: forms cakephp-3.0


【解决方案1】:

您可以使用实体而不是直接访问$this-&gt;request-&gt;data 数组。

试试这个脚本:

//declare a new entity of user
$user = $this->Users->newEntity();

//set the default data
$user->email = 'whatever@domain.com';
$user->username = 'whatever name';

//set the entity to the view vars
$this->set(compact('user'));

更新:

你也可以使用这条线:$this-&gt;request-&gt;data['email'] = 'whatever';

而不是:$this-&gt;request-&gt;data['User']['email'] = 'whatever';

【讨论】:

  • 我在前面的代码中尝试过,但是当你使用带有数据数组的 newEntity 进行初始化时,它会验证它,因此它将错误传递给表单(需要密码):$this-&gt;set('user', $this-&gt;Accounts-&gt;Users-&gt;newEntity(['email' =&gt; 'whatever']));。您的解决方案对我有用,但需要创建一个新实体才能将一个数据传递给表单助手。问题是:这比使用$this-&gt;request-&gt;data 更正确吗?
  • 您可以使用实体或$this-&gt;request-&gt;data。我更新了你必须在没有'User' 键的情况下设置数据的答案
  • 我认为这完全取决于您如何在模板中声明 de form。现在我使用这个&lt;?= $this-&gt;Form-&gt;create(isset($user) ? $user : null, ['url' =&gt; ['controller' =&gt; 'Users', 'action' =&gt; 'login']]); ?&gt;你提供的两种解决方案都可以工作。请注意,我必须注意 $user 没有设置,因为登录表单是一个可以在应用程序中的任何位置的元素,并且控制器可能没有设置该变量。
  • $this-&gt;request-&gt;data['email'] = 'whatever'; 救了我的命,谢谢
【解决方案2】:

如果数据已经来自表单,并且您想在发布前修改数据。

$myData = $this->myData->newEntity();    
$this->request->data['field_name'] = "value";  
pr($this->request->getData());  // for display whole form data with changed data
$myData = $this->myData->patchEntity($myData, $this->request->getData());  
if ($this->myData->save($myData)) {  
    $this->Flash->success(__('Data has been saved.'));  
    return $this->redirect(['action' => 'index']);  
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-29
    • 2012-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多