проблемы проверки правильности отношений - PullRequest
2 голосов
/ 14 февраля 2012

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

Я считаю, что DataMapper может проверить эту проверку с помощью правила _related_max_size, но я не могу понять, как использовать его в массиве $ validation в модели.

До сих пор я пробовал это как для моих пользователей, так и для моделей продуктов:

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

Может кто-нибудь показать мне пример того, как настроить это на модели, контроллере и, наконец, на виде?

Edit: я имею в виду, что у пользователя есть много продуктов, и он может создать определенное количество, скажем, 3 продукта, когда это количество достигнуто, пользователь больше не может создавать продукты, и это правило проверки не должно разрешить пользователю создавать больше продуктов.

Это будет схема БД:

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 

Есть ли способ сделать этот параметр динамическим?

Ответы [ 3 ]

1 голос
/ 23 февраля 2012

в модели

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 голосов
/ 21 февраля 2012

Сначала настройте пользовательское правило проверки в 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.Это помогает вам отделить вашу логику таким образом, чтобы вы не проверяли состояние входа в систему в конструкторах ваших контроллеров или (что еще хуже) в их функциях.

0 голосов
/ 19 февраля 2012

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

Один из обходных путей, о котором я мог бы подумать, - это Обратный вызов: ваши собственные функции проверки . Ниже приведен фрагмент. Извините, если это не сработало, как вы хотите.

В модели: (создать что-то вроде)

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');
}

Для получения дополнительной информации Пожалуйста, обратитесь к руководству , которое дает более полную информацию. Я также новичок в CodeIgniter. Но я надеюсь, что это поможет вам, а не усложнит вам.

...