我需要设置验证规则来验证特定对象上的相关项,即:用户可以拥有不超过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
有没有办法让这个设置动态化?
答案 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
。这有助于您以这样一种方式分离逻辑:您不是在控制器的构造函数中检查登录状态,或者(甚至更糟)检查它们的函数。