codeigniter datamapper关系验证问题

时间:2012-02-14 08:10:46

标签: codeigniter codeigniter-datamapper

我需要设置验证规则来验证特定对象上的相关项,即:用户可以拥有不超过3个与之相关的产品。

我相信DataMapper可以使用_related_max_size规则检查此验证,但我无法弄清楚如何在模型中的$ validation数组中使用它。

到目前为止,我已经在我的用户和产品模型中尝试了这个:

var $validation = array(
    'product' => array(
         'rules' => array('max_size' => 3)
    )
);

有人可以告诉我一个如何在模型,控制器和最后视图中设置它的示例吗?

编辑:我的意思是,用户有很多产品,并且可以创建一定数量的产品,假设3个产品,当达到该数量时,用户就无法再创建产品,并且此验证规则不应该允许用户创建更多产品。

这将是DB Schema:

Users table
------------------
id   |  username  |
------------------

Products table
------------------------
id  | user_id |  name   |
------------------------

此处有更多信息:http://codeigniter.com/forums/viewthread/178045/P500/

谢谢!

修改

好的,我现在全部工作了......除此之外,我需要做以下事情:

var $validation = array(
    'product' => array(
        'label' => 'productos',
        'rules' => array('required','max_size' => $products_limit)
    )
); 

$ products_limit来自用户关联的“计划”,并在用户登录时存储在会话中。当我尝试运行时,我得到:

Parse error: syntax error, unexpected T_VARIABLE in /var/www/stocker/application/models/user.php on line 11 

有没有办法让这个设置动态化?

3 个答案:

答案 0 :(得分:1)

在模型中

var $validation = array(
    array(
        'field' => 'username',
        'label' => 'Username',
        'rules' => array('required')
    )
);

在控制器中。 $ this - > $ object = new Your_model();

$object->validate();

    if ($object->valid)
    { $object->save();

        // Validation Passed
    }
    else
    { $data['error'] = $object->error;
        // Validation Failed
    }

在视野中。

echo $error->field_name

答案 1 :(得分:0)

我之前从未使用过Codeigniter,但给我一个机会来帮助你。到目前为止,我没有在Code-igniter中找到任何内置验证(如果我错了,请纠正我)。

我能想到的一个解决方法是Callback:Your own Validation Functions。下面是一个片段。请原谅我,如果它不能按你的意愿工作。

在模型中:(创建类似的东西)

function product_limit($id)
{
    $this->db->where('product_id',$id);
    $query = $this->db->get('products');
    if ($query->num_rows() > 3){
        return true;
    }
    else{
        return false;
    }
}

在控制器中:(创建类似的东西)

function productkey_limit($id)
{
    $this->product_model->product_exists($id);
}

public function index()
{
    $this->form_validation->set_rules('username', 'Username', 'callback_product_limit');
}

有关详情Please refer to the manual page,请提供更完整的信息。我也是CodeIgniter的新手。但我希望这可以帮助你,而不是让你复杂化。

答案 2 :(得分:0)

首先,在libraries/MY_Form_validation.php

中设置自定义验证规则

如果该文件不存在,请创建它。

MY_Form_validation.php的内容:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class MY_Form_validation extends CI_Form_validation
{
    function __construct($config = array())
    {   
        parent::__construct($config);
    }

    function valid_num_products()
    {
       //Perhaps it would be better to store a maxProducts column in your users table. That way, every user can have a different max products? (just a thought). For now, let's be static.
       $maxProducts = 3;

       //The $this object is not available in libraries, you must request an instance of CI then, $this will be known as $CI...Yes the ampersand is correct, you want it by reference because it's huge.
       $CI =& get_instance();

       //Assumptions: You have stored logged in user details in the global data array & You have installed DataMapper + Set up your Product and User models.
       $p = new Product();
       $count = $p->where('user_id', $CI->data['user']['id'])->count();
       if($count>=$maxProducts) return false;
       else return true;
    }
}

接下来,在config/form_validation.php中设置规则。

form_validation.php的内容

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
$config = array
(   
    'addProduct' => array
    (
        array
        (
                'field' => 'name',
                'label' => 'Product Name',
                'rules' => 'required|valid_num_products'
        )
    )
);

接下来,在language/english/form_validation_lang.php中设置错误消息。添加以下行:

$lang['valid_num_products'] = "Sorry, you have exceeded your maximum number of allowable products.";

现在在Controller中,您需要的内容如下:

class Products extends MY_In_Controller
{
    function __construct()
    {
        parent::__construct();
        $this->load->library('form_validation');
    }

    function add()
    {
        $p = $this->input->post();
        //was there even a post to the server?
        if($p){
            //yes there was a post to the server. run form validation.
            if($this->form_validation->run('addProduct')){
                //it's safe to add. grab the user, create the product and save the relationship.
                $u = new User($this->data['user']['id']);
                $x = new Product();
                $x->name = $p['name'];
                $x->save($u);
            }
            else{
                //there was an error. should print the error message we wrote above.
                echo validation_errors();
            }
        }
    }
}

最后,你可能想知道我为什么继承自MY_In_Controller。 Phil Sturgeon在他的博客上写了一篇很好的文章,名为Keeping It Dry。在帖子中,他解释了如何编写从访问控制控制器继承的控制器。通过使用此范例,可以假定从MY_In_Controller继承的控制器已登录,因此假定$this->data['user']['id']内容可用。实际上,$this->data['user']['id']中设置了MY_In_Controller。这有助于您以这样一种方式分离逻辑:您不是在控制器的构造函数中检查登录状态,或者(甚至更糟)检查它们的函数。