2012-02-14 4 views
2

Мне нужно настроить правила валидации для проверки связанных элементов на конкретном объекте, то есть: пользователь может иметь не более трех связанных с ним продуктов.codeigniter проблемы с проверкой отношения к datamapper

Я считаю, что 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/

Спасибо!

EDIT:

Хорошо, я все это работает сейчас ... Кроме этого, мне нужно сделать следующее:

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

не могли бы вы объяснить это немного больше, что именно вы хотите? пример того, что пользователь будет выбирать и что вы пытаетесь проверить? – Shabib

ответ

0

Я никогда не использовал Codeigniter раньше, но дайте мне шанс помочь вам. Пока я не нашел встроенной проверки в Code-ignitter (исправьте меня, если я ошибаюсь).

Одно обходное решение, которое я мог придумать, это 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. Но я надеюсь, что это поможет вам, а не усложнит вас.

+0

Извините, я не знаком с CodeIgniter ... – Yeo

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.";

Теперь в контроллере, вы хотите что-то вдоль линий:

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. В его блоге есть замечательная статья, написанная Филом Стерджоном под названием Keeping It Dry. На этом посту он объясняет, как писать контроллеры, которые наследуются от контроллеров контроля доступа. Используя эту парадигму, можно считать, что контроллеры, которые наследуют от MY_In_Controller, регистрируются, и предполагается, что материал $this->data['user']['id'] доступен. Фактически, $this->data['user']['id'] установлен в MY_In_Controller. Это поможет вам отделить вашу логику таким образом, чтобы вы не проверяли статус входа в конструкторах ваших контроллеров или (что еще хуже) в их функциях.

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 
+0

Спасибо @Didozavar, но я пытаюсь проверить отношения, поэтому в моей модели пользователя, например, у меня есть 'var $ validation = array ('product' => 'rules' => array ('max_size' => 3)); 'И мне нужно проверить, сколько продуктов пользователь создал, прежде чем он сможет вставить другой продукт в БД. Короче говоря, я думаю, что это не работает, так как я сохраняю или проверяю отношения. – ricardocasares

+0

Прямо сейчас я получаю эту ошибку: 'Номер ошибки: 1054 Неизвестный столбец 'products.product_id' in 'where clause' SELECT COUNT (*) AS' numrows' FROM ('products') WHERE' products' .'user_id' = 1 AND 'products'.'product_id' NOT IN (307) Имя файла:/var/www/stocker/libraries/datamapper.php Номер строки: 2596' при попытке сделать это: '$ u = new User(); \t \t \t $ p = новый Продукт(); \t \t \t $ p-> name = "PEPE"; \t \t \t $ p-> существование = 2; \t \t \t $ p-> threshold = 1; \t \t \t $ p-> measure_id = 3; \t \t \t $ p-> save(); \t \t \t $ u-> где ('username', 'rcasares') -> get(); \t \t \t echo $ u-> save ($ p); ' – ricardocasares

+0

Продукт будет сохранен и' echo $ u-> save ($ p); 'возвращает TRUE, когда на самом деле у этого пользователя более 3 продуктов. – ricardocasares

Смежные вопросы