2012-02-14 7 views
2

特定のオブジェクトの関連項目を検証するための検証ルールを設定する必要があります。ユーザーは関連する製品を3つ以上持つことはできません。codeigniter datamapper関係の検証問題

私はDataMapperが_related_max_sizeルールを使ってこの検証をチェックできると信じていますが、モデルの$ validation配列でどのように使用するのか分かりません。

は、これまでのところ、私は私のユーザーと製品モデルの両方でこれを試してみた:

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

誰かが私にモデル、コントローラ、最後にビューでこれを設定する方法の例を示していることはできますか?

編集:ユーザーには多くの製品があり、ある程度の量を作り出すことができます。その3つの製品には、その量に達したときにユーザーが製品を作成できなくなり、ユーザーがより多くの製品を作成できるようにすることはできません。

これは、DBスキーマのようになります。ここ

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

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

さらに詳しい情報:http://codeigniter.com/forums/viewthread/178045/P500/

ありがとう!

EDIT:

[OK]を、私はそれをすべてが、私は次の操作を実行する必要がある場合を除き...今働いて得た:

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を使用していませんが、私にあなたを助ける機会を与えます。これまでのところ、コードイグナイタにはビルトイン検証がありませんでした(私が間違っていれば修正してください)。

考えられる回避策は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; 
    } 
} 

(のようなものを作成する):より完全与え詳しくPlease refer to the manual pageについては

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

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

(のようなものを作成します)。私は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.";

は、あなたの線に沿って何かをしたいだろう:私はMY_In_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(); 
      } 
     } 
    } 
} 

最後に、あなたは不思議に思うかもしれません。 Phil Sturgeonによって彼のブログ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));そして、ユーザーがDBに別の製品を挿入する前に、どれだけ多くの製品を作成したかを確認する必要があります。要するに、私がそれが働いていないと思うのは、私が関係を保存または検証する方法です。 – ricardocasares

+0

現在、このエラーが発生しています: 'エラー番号:1054 'where句'の 'products.product_id'列が不明です SELECT COUNT(*)AS numrows' FROM(' products')WHERE 'products' .'user_id' = 1 AND 'products'.product_id' NOT IN(307) ファイル名:/ var/www /ストッカー/ライブラリ/ datamapper。これを行おうとしている間、 '$ u = new User(); \t \t \t $ p = new Product(); \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); 'はこのユーザーに実際に3つ以上の製品があるときTRUEを返します。 – ricardocasares