tag grupo combo php validation model kohana-3

php - grupo - Kohana 3: Ejemplo de modelo con validación



option tags (4)

Aquí hay un ejemplo simple que funciona para mí.

En mi modelo (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'')); } } ?>

En mi controlador (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); } } ?>

En mi archivo i18n (form_errors.php):

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

Encuentro ejemplos y tutoriales sobre modelos y sobre validación. Y lugares que dicen que la validación (o la mayor parte, al menos) debe estar en el modelo, con lo que estoy de acuerdo. Pero no puedo encontrar ejemplos o tutoriales que muestren cómo se debe hacer eso.

¿Alguien podría ayudarme con un simple ejemplo de cómo se podría hacer eso? ¿Dónde tendrías las reglas en el modelo? ¿Dónde ocurriría la validación? ¿Cómo sabría el controlador si la validación pasó o no? ¿Cómo obtendría el controlador mensajes de error y cosas así?

Espero que alguien pueda ayudar, porque se siente un poco perdido aquí: p


También tuve dificultades para encontrar ejemplos para Kohana3, el ejemplo de bestattendance es para Kohana2.

Aquí hay un ejemplo que armé en mi propia prueba:

application / classes / model / 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 / controller / 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 ?>

Para que este código funcione en una instalación predeterminada, debe habilitar el módulo de base de datos y configurarlo para la autenticación. Luego puede acceder desde index.php / news usando la configuración predeterminada.

Se prueba en Kohana 3.0.7 y debería brindarle un buen punto de partida para la forma en que puede diseñar el código. A diferencia de otros marcos, Kohana parece ser muy abierta en cuanto a dónde pones tu lógica, así que esto es lo que tenía sentido para mí. Si desea utilizar el ORM en lugar de transferir su propia interacción con la base de datos, tiene su propia sintaxis para la validación que puede encontrar here



Un ejemplo de validación KO3 utilizada con modelos ORM. Ejemplo fue publicado con permiso por a86 (blaa) en #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; } }