2010-03-17 2 views
34

Я нахожу примеры и учебные пособия о моделях и о проверке. И я указываю, что валидация (или, по крайней мере, большая ее часть) должна быть в модели, с которой я согласен. Но я не могу привести примеры или учебные пособия, которые показывают, как это должно быть сделано.Kohana 3: Пример модели с проверкой

Может ли кто-нибудь помочь мне с простым примером того, как это можно сделать? Где бы у вас были правила в модели? Где будет проходить проверка? Как контроллер узнает, прошел ли проверка или не прошел проверку? Как контроллер получит сообщения об ошибках и тому подобное?

Надежда кто-то может помочь, потому что чувствую себя немного потеряли здесь: р

+0

Я нахожу это забавным, что так лучше Kohana 3 документации, чем сам проект. Спасибо за отличный Q. – Brenden

+0

Ну, код хорошо документирован на самом деле, и в паре с частью API модуля userguide я думаю, что это очень хорошо. Но может быть больше примеров, особенно в части, связанной с использованием. Много TODO и недостающих бит там тоже :) – Svish

ответ

36

Мне тоже было трудно найти примеры для Kohana3, пример bestattendance - для Kohana2.

Вот пример, который я бросил вместе в своем тестировании:

приложения/классы/модель/news.php

<?php defined('SYSPATH') OR die('No Direct Script Access'); 

Class Model_News extends Model 
{ 
    /* 
     CREATE TABLE `news_example` (
     `id` INT PRIMARY KEY AUTO_INCREMENT, 
     `title` VARCHAR(30) NOT NULL, 
     `post` TEXT NOT NULL); 
    */ 

    public function get_latest_news() { 
     $sql = 'SELECT * FROM `news_example` ORDER BY `id` DESC LIMIT 0, 10'; 
     return $this->_db->query(Database::SELECT, $sql, FALSE) 
         ->as_array(); 
    } 

    public function validate_news($arr) { 
     return Validate::factory($arr) 
      ->filter(TRUE, 'trim') 
      ->rule('title', 'not_empty') 
      ->rule('post', 'not_empty'); 
    } 
    public function add_news($d) { 
     // Create a new user record in the database 
     $insert_id = DB::insert('news_example', array('title','post')) 
      ->values(array($d['title'],$d['post'])) 
      ->execute(); 

     return $insert_id; 
    } 
} 

применение/сообщений/errors.php

<?php 
return array(
    'title' => array(
     'not_empty' => 'Title can\'t be blank.', 
    ), 
    'post' => array(
     'not_empty' => 'Post can\'t be blank.', 
    ), 
); 

применение/классы/контроллер/n ews.php

<?php defined('SYSPATH') OR die('No Direct Script Access'); 

Class Controller_News extends Controller 
{ 
    public function action_index() { 
     //setup the model and view 
     $news = Model::factory('news'); 
     $view = View::factory('news') 
      ->bind('validator', $validator) 
      ->bind('errors', $errors) 
      ->bind('recent_posts', $recent_posts); 

     if (Request::$method == "POST") { 
      //added the arr::extract() method here to pull the keys that we want 
      //to stop the user from adding their own post data 
      $validator = $news->validate_news(arr::extract($_POST,array('title','post'))); 
      if ($validator->check()) { 
       //validation passed, add to the db 
       $news->add_news($validator); 
       //clearing so it won't populate the form 
       $validator = null; 
      } else { 
       //validation failed, get errors 
       $errors = $validator->errors('errors'); 
      } 
     } 
     $recent_posts = $news->get_latest_news(); 
     $this->request->response = $view; 
    } 
} 

приложение/просмотров/news.php

<?php if ($errors): ?> 
<p>Errors:</p> 
<ul> 
<?php foreach ($errors as $error): ?> 
    <li><?php echo $error ?></li> 
<?php endforeach ?> 
</ul> 
<?php endif ?> 

<?php echo Form::open() ?> 
<dl> 
    <dt><?php echo Form::label('title', 'title') ?></dt> 
    <dd><?php echo Form::input('title', $validator['title']) ?></dd> 
    <dt><?php echo Form::label('post', 'post') ?></dt> 
    <dd><?php echo Form::input('post', $validator['post']) ?></dd> 
</dl> 
<?php echo Form::submit(NULL, 'Post') ?> 
<?php echo Form::close() ?> 
<?php if ($recent_posts): ?> 
<ul> 
<?php foreach ($recent_posts as $post): ?> 
    <li><?php echo $post['title'] . ' - ' . $post['post'];?></li> 
<?php endforeach ?> 
</ul> 
<?php endif ?> 

Чтобы получить этот код работает в установки по умолчанию, вы должны включить модуль базы данных и настроить его для проверки подлинности , Затем вы можете получить доступ к нему из index.php/news, используя конфигурацию по умолчанию.

Он протестирован в Kohana 3.0.7 и должен дать вам хорошую отправную точку в том, как вы можете выложить код. В отличие от других фреймворков, Кохана, кажется, очень открыт, когда вы ставите свою логику, так что это то, что имело для меня смысл. Если вы хотите использовать ORM вместо того, чтобы запускать собственное взаимодействие с базой данных, у него есть свой синтакт для проверки, который вы можете найти here

+1

Разве ваш код не выводит уведомления о существовании '$ validator ['title']' в представлении? – zerkms

+0

@zerkms $ validator ['title'] находится в представлении как текст по умолчанию для , если проверка не выполняется. Если он не установлен, для ввода не будет никакого значения по умолчанию. Переменная определена в bind ('validator', $ validator), поэтому нет никакой опасности ссылки на неопределенную переменную. Да, ключевой поиск выполняется с нулевым значением, но я не вижу в этом проблемы, если, возможно, вы не используете E_STRICT. – preds

+1

«нет опасности ссылки на неопределенную переменную» --- существует опасность уведомления о неопределенном индексе – zerkms

4

Вот простой пример, который работает для меня.

В моей модели (client.php):

<?php defined('SYSPATH') or die('No direct script access.'); 

class Client_Model extends Model { 

public $validation; 

// This array is needed for validation 
public $fields = array(
    'clientName' => '' 
); 

public function __construct() { 
    // load database library into $this->db (can be omitted if not required) 
    parent::__construct(); 

    $this->validation = new Validation($_POST); 
    $this->validation->pre_filter('trim','clientName'); 
    $this->validation->add_rules('clientName','required'); 
} 

public function create() { 
    return $this->validation->validate(); 
} 

// This might go in base Model class 
public function getFormValues() { 
    return arr::overwrite($this->fields, $this->validation->as_array()); 
} 

// This might go in base Model class 
public function getValidationErrors() { 
    return arr::overwrite($this->fields, $this->validation->errors('form_errors')); 
} 
} 

?> 

В мой контроллер (clients.php):

<?php defined('SYSPATH') OR die('No direct access allowed.'); 

class Clients_Controller extends Base_Controller { 

public function __construct() { 
    parent::__construct(); 
} 

public function index() { 

    $content = new View('clients/read'); 
    $content->foobar = 'bob.'; 

    $this->template->content = $content; 
    $this->template->render(TRUE); 

} 

/* A new user signs up for an account. */ 
public function signup() { 

    $content = new View('clients/create'); 
    $post = $this->input->post(); 
    $client = new Client_Model; 

    if (!empty($post) && $this->isPostRequest()) { 
     $content->message = 'You submitted the form, '.$this->input->post('clientName'); 
     $content->message .= '<br />Performing Validation<br />'; 

     if ($client->create()) { 
      // Validation passed 
      $content->message .= 'Validation passed'; 
     } else { 
      // Validation failed 
      $content->message .= 'Validation failed'; 
     } 

    } else { 
     $content->message = 'You did not submit the form.'; 
    } 

    $contnet->message .= '<br />'; 
    print_r ($client->getFormValues()); 
    print_r ($client->getValidationErrors()); 


    $this->template->content = $content; 
    $this->template->render(TRUE); 
} 

    } 
?> 

В моем файле i18n (form_errors.php):

$lang = Array (
'clientName' => Array (
'required' => 'The Client Name field is required.' 
) 
); 
+0

Ответ! Невероятный. Спасибо! Просмотрите его и посмотрите, смогу ли я что-нибудь получить от него :) – Svish

+0

@Svish Примите ответ, если это вам поможет. – alex

+1

Это для KO3 или KO2? – Svish

6

Пример проверки KO3, используемой в моделях ORM. Пример был опубликован с разрешения a1986 (blaa) в #kohana (freenode).

<?php defined('SYSPATH') or die('No direct script access.'); 

class Model_Contract extends ORM { 

    protected $_belongs_to = array('user' => array()); 

    protected $_rules = array(
    'document' => array(
     'Upload::valid'  => NULL, 
     'Upload::not_empty' => NULL, 
     'Upload::type'  => array(array('pdf', 'doc', 'odt')), 
     'Upload::size'  => array('10M') 
    ) 
); 

    protected $_ignored_columns = array('document'); 


    /** 
    * Overwriting the ORM::save() method 
    * 
    * Move the uploaded file and save it to the database in the case of success 
    * A Log message will be writed if the Upload::save fails to move the uploaded file 
    * 
    */ 
    public function save() 
    { 
    $user_id = Auth::instance()->get_user()->id; 
    $file = Upload::save($this->document, NULL, 'upload/contracts/'); 

    if (FALSE !== $file) 
    { 
     $this->sent_on = date('Y-m-d H:i:s'); 
     $this->filename = $this->document['name']; 
     $this->stored_filename = $file; 
     $this->user_id = $user_id; 
    } 
    else 
    { 
     Kohana::$log->add('error', 'Não foi possível salvar o arquivo. A gravação da linha no banco de dados foi abortada.'); 
    } 

    return parent::save(); 

    } 

    /** 
    * Overwriting the ORM::delete() method 
    * 
    * Delete the database register if the file was deleted 
    * 
    * If not, record a Log message and return FALSE 
    * 
    */ 
    public function delete($id = NULL) 
    { 

    if (unlink($this->stored_filename)) 
    { 
     return parent::delete($id); 
    } 

    Kohana::$log->add('error', 'Não foi possível deletar o arquivo do sistema. O registro foi mantido no banco de dados.'); 
    return FALSE; 
    } 
} 
0

У меня есть краткое запись с тем, как справиться с этим по ссылке ниже, так как он мне потребовалось некоторое время, чтобы понять, и я не мог найти ни одного хорошего примера.

http://www.matt-toigo.com/dev/orm_with_validation_in_kohana_3

+0

. Я бы не предоставил ссылку, которая ссылается на страницу 404. –

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