【问题标题】:Lack of 'required' fields in form suggests I am not correctly associating models表单中缺少“必填”字段表明我没有正确关联模型
【发布时间】:2012-07-08 14:12:00
【问题描述】:

我在验证输入表单和保存该表单中的数据时遇到问题。我怀疑也许这些都是由关联问题引起的,尽管我不确定。

我正在使用 CakePHP 2.2.0 RC2。

我有三个模型:用户、成员和地址。每个用户的帐户中可以有多个成员,每个用户可以有多个地址(它也会记住过去的地址)。

我的模特协会是:

用户模型:

class User extends AppModel {

public $name = 'User';

public $hasMany = array(
    'Member' => array(
        'className' => 'Member',
        'foreignKey' => 'user_id',
        'order' => 'Member.member ASC',
        'dependent' => true
    ),
    'Address' => array(
        'className' => 'Address',
        'foreignKey' => 'user_id',
        'order' => 'Address.address ASC',
        'dependent' => true
    )
);
...

会员模型:

class Member extends AppModel {

public $name = 'Member';

public $displayField = 'member';

public $belongsTo = array(
    'User' => array(
        'className' => 'User',
        'foreignKey' => 'user_id'
    )
);
...

地址模型:

class Address extends AppModel {

public $name = 'Address';

public $displayField = 'address';

public $belongsTo = array(
    'User' => array(
        'className' => 'User',
        'foreignKey' => 'user_id'
    )
);
...

对于我的表单创建语句,我有:

$this->Form->create( 'Member', array( 'url' => array( 'action' => 'add' ) ) );

我正在使用 Member 模型和控制器来处理表单,因为它仅提交 Member 字段或 Member 和 Address 字段,具体取决于用户是否已经有地址条目(如果用户没有,它将地址输入字段添加到表单中,否则不会)。

我没有在表单中提交任何用户字段。

现在,如果我的关联设置正确,我希望任何模型中的任何“必填”字段旁边都会有一个星号。在 Member 和 Address 模型中都设置了一些必填字段,虽然 Member 字段在表单上显示为必填项(带有星号),但 Address 字段没有。

地址模型中所需的地址字段代码示例:

public $validate = array(
    'street1' => array(
        'required' => array(
            'rule' => array( 'notEmpty' ),
            'required' => true, 'allowEmpty' => false,
            'message' => 'Please enter a street address'
        ),
....

这是我的一些视图/表单代码:

echo $this->Form->input( 'Member.firstname', array( 'label' => 'First name', 'type' => 'text' ) );
echo $this->Form->input( 'Member.middlename', array( 'label' => 'Middle name', 'type' => 'text' ) );
echo $this->Form->input( 'Member.lastname', array( 'label' => 'Last name', 'type' => 'text' ) );
echo '<p class="bold">Please enter current address details:</p>';
echo $this->Form->input( 'Address.street1', array( 'label' => 'Street address (line 1)', 'type' => 'text' ) );
echo $this->Form->input( 'Address.street2', array( 'label' => 'Street address (line 2)', 'type' => 'text' ) );
echo $this->Form->input( 'Address.suburb', array( 'label' => 'Suburb', 'type' => 'text' ) );
...

当我在表单页面上输出 $validationErrors 时(在表单提交之前),我得到了这个:

Array
(
    [Member] => Array
        (
        )

    [User] => Array
        (
        )
)

我假设那里也应该有一个 [Address] 部分。

我没有发现任何明显的东西,但我是 CakePHP 的新手(尽管我确实有 PHP 经验),所以任何想法都会受到赞赏。

谢谢! 彼得。

【问题讨论】:

  • 所以,我有一个答案,但我不确定这是一个好答案。我见过很多人说在控制器中使用 uses() 来包含额外的模型是一件坏事。但是,2.x 手册将此列为包含其他模型的方式。如果我添加“public $uses = array('Member', 'Address');”对于我的 MembersController,验证开始生效。它似乎给了我我需要的东西。如果我应该在我的模型关联中做一些“更正确”的事情,我很乐意避免使用 uses() 但谁能告诉我那可能是什么?再次感谢。
  • 这就是要走的路。您对地址的验证应该在地址模型中。然后你可以$this-&gt;Form-&gt;input('Address.title');应该 JustWork(tm)

标签: cakephp cakephp-2.2


【解决方案1】:

首先,您说您使用的是 Cake 2.2 的候选版本 (RC2)。现在有一个稳定的版本,我强烈建议您升级到那个版本。

您使用Member 模型创建表单,但它与地址没有直接关系(关联)。地址与用户相关联。如果您通过 User 模型创建表单,它应该可以正常工作。

如果这种情况 - 使用 User 模型创建表单 - 不适用于您和您的应用程序 逻辑比您的数据库模型和您的模型关联是错误的,它们不符合您的业务需求。如果是这种情况,您应该考虑更改应用程序的架构。

关于$uses 的注释:您不必在控制器的$uses 中包含Address 模型才能验证输入。 Controller::$uses 用于直接在 Controller 本身中使用模型(除了控制器自己的模型)。例如:

public $uses = array('Article', 'News');

在任何控制器中都会使所有文章和新闻模型的方法在该控制器中可用:

$this->Article->methodName();

$this->News->methodName();

【讨论】:

    猜你喜欢
    • 2019-02-24
    • 2010-11-11
    • 1970-01-01
    • 2011-12-02
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 2014-08-02
    相关资源
    最近更新 更多