cakePHP在视图中的label元素旁边显示验证错误

时间:2013-05-15 14:20:44

标签: validation cakephp

您好我有以下型号:

class Mymodel extends AppModel {
    public $validate = array(
        'username' => array(
            'required' => array(
                'rule' => array('notEmpty'),
                'message' => 'A username is required'
            ),
            'regexp' => array(
                'rule' => '/^[a-z0-9]{3,10}$/i',
                'message' => 'Only letters and integers, min 3, max. 10 characters'
            )
        )
    )
}

和以下视图:signup.ctp

<?php 
echo $this->Form->create("Mymodel ");  
echo $this->Form->input('username' ,array('label'=>"Username :")); 
echo $this->Form->input('password' ,array('label'=>"Password :",'type' => 'password')); 
echo $this->Form->end('signup'); 
?>

我的控制器是:

class MymodelController extends AppController
{
    public function signup()
    {}
}

cakePHP默认验证行为是在输入下面显示错误消息,所以我的问题是:如何在标签字段中显示错误,我的意思是:

用户名:(我想在此处显示错误消息)

3 个答案:

答案 0 :(得分:1)

您可以使用$this->Form->error('fieldname')在任何地方输出错误消息(为输入提供'error'=>false参数,以防止它在默认位置输出错误消息。

例如: -

$error = $this->Form->isFieldError('username') ? $this->Form->error('username') : '';
echo $this->Form->label('username', "Username : $error");
echo $this->Form->input('username' ,array('label' => false, 'error' => false));

答案 1 :(得分:1)

通过'format'选项

更改元素的顺序

如果可以在标签和输入之间放置错误消息,请通过format选项更改输入的“元素”的顺序;

// Create the form. By setting options via the
// 'inputDefaults' option, the options are
// automatically applied to all inputs.
// of course, you can also set this option
// for each input individually
echo $this->Form->create("Mymodel", array(
    'inputDefaults' => array(
        // set the order of the 'elements' inside the input-div
        'format' => array('before', 'label', 'error', 'between', 'input', 'after'),
        // puts ':' between the label and the input
        'between' => ':',
    )
));  
echo $this->Form->input('username'); 
echo $this->Form->input('password'); 
echo $this->Form->end('signup'); 

注释

我还添加了一些额外的修改;

  • 'between'选项可用于向输入添加其他内容,例如(请参阅代码)在标签和输入之间放置:。这样做,您不必设置自定义标签
  • 如果输入是针对名为'password'的字段,CakePHP将自动创建密码字段。您不必自己设置类型(除非您希望将类型覆盖为'密码'输入以外的其他类型

答案 2 :(得分:0)

表单模板位于cake核心库中,我不建议更改其中任何一个。

如果您想继续使用

 echo $this->Form->input('username' ,array('label'=>"Username :")); 

与往常一样,您不必手动添加带错误的标签,而是使用javascript进行操作 以下是jquery中的一些代码,可以实现您想要的功能

$(function() {
    $('.error-message').each( function(index) {
       var errorText = $(this).text();
       var label = $(this).siblings('label');
       label.text(label.text() + errorText);
       $(this).remove();
    });
});

一定要测试一下,以防错过了什么。根据您的需要进行修改,添加一些样式等。
如果您想要无处不在,请在布局中插入脚本,否则将其添加到您想要的视图中。