34 votes

Kohana 3: Exemple de modèle avec validation

- Je trouver des exemples et des tutoriels sur les modèles et sur la validation. Et j'lieux que dire de la validation (ou la plus grande partie au moins) doit être dans le modèle, que je suis d'accord avec. Mais je ne peux pas les exemples ou des tutoriels pour montrer comment cela devrait être fait.

Quelqu'un pourrait-il m'aider avec un exemple simple sur la façon dont cela pourrait être fait? Où avez-vous les règles dans le modèle? Où serait la validation se produire? Comment le contrôleur de savoir si la validation réussi ou échoué? Comment le contrôleur obtenez des messages d'erreur et des choses comme ça?

J'espère que quelqu'un peut aider, causer de se sentir un peu perdu ici :p

36voto

preds Points 578

Moi aussi j'avais de la difficulté à trouver des exemples pour Kohana3, bestattendance l'exemple est pour Kohana2.

Voici un exemple que j'ai jeté dans mes propres tests:

application / classes / modèle / 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;
    }
}

application / messages / errors.php

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

application / classes / contrôleur / news.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;
    }
}

application / views / 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 ?>

Pour obtenir ce code de travail dans une installation par défaut, vous devrez activer le module de base de données et le configurer pour l'authentification. Ensuite, vous pouvez y accéder à partir de l'index.php/news à l'aide de la configuration par défaut.

Il est testé dans Kohana 3.0.7 et devrait vous donner un bon point de départ de la façon dont vous pourriez disposer de code. Contrairement à d'autres cadres, Kohana semble être très ouverte, comme à l'endroit où vous mettez votre logique donc, c'est juste ce qui fait sens pour moi. Si vous souhaitez utiliser l'ORM au lieu de rouler votre propre base de données de l'interaction, il a sa propre syntaxe pour la validation que vous pouvez trouver ici

6voto

John Himmelman Points 6672

Un exemple de validation KO3 utilisé avec les modèles ORM. L'exemple a été posté avec la permission de a1986 (blaa) dans #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;
  }
}
 

4voto

bestattendance Points 2424

Voici un exemple simple qui fonctionne pour moi.

Dans mon modèle (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'));
}
}

?>
 

Dans mon contrôleur (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);
}

   }
?>
 

Dans mon fichier i18n (form_errors.php):

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

0voto

Matt Toigo Points 26

J'ai un bref exposé sur la façon de gérer cela sur le lien ci-dessous, car il m'a fallu un certain temps pour comprendre et je ne pouvais pas trouver un seul bon exemple.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X