Validación de datos
Cuando creamos un modelo tenemos la posibilidad de introducir validación de datos. Se indica con la variable $validate:
class User extends AppModel { var $name = 'User'; var $validate = array( 'login' => 'alphaNumeric', 'email' => 'email', 'born' => 'date' ); }
Las reglas de validación pueden ser complejas:
class User extends AppModel { var $name = 'User'; var $validate = array( 'login' => array( 'alphaNumeric' => array( 'rule' => 'alphaNumeric', 'required' => true, 'message' => 'Sólo letras y números' ), 'between' => array( 'rule' => array('between', 5, 15), 'message' => 'Entre 5 y 15 caracteres' ) ), 'password' => array( 'rule' => array('minLength', '8'), 'message' => 'Largo mínimo de 8 caracteres' ), 'email' => 'email', 'born' => array( 'rule' => 'date', 'message' => 'Ingrese una fecha válida', 'allowEmpty' => true ) ); }
El formato general es el siguiente:
var $validate = array( 'fieldName1' => array( 'rule' => 'ruleName', // ó: array('ruleName', 'param1', 'param2' ...) 'required' => true, 'allowEmpty' => false, 'on' => 'create', // ó: 'update' 'message' => 'Su mensaje de error' ) );
Cada campo puede tener más de una regla:
var $validate = array( 'login' => array( 'alphanumeric' => array( 'rule' => 'alphaNumeric', 'message' => 'Se permiten sólo letras y números', 'last' => true ), 'minlength' => array( 'rule' => array('minLength', '8'), 'message' => 'Largo mínimo de 8 caracteres' ), ) );
Una lista de todas las reglas incorporadas en el núcleo se puede encontrar aquí:
Tipos de Relaciones
Los cuatro tipos de relaciones en CakePHP son: hasOne, hasMany, belongsTo y hasAndBelongsToMany(HABTM), “tiene un”, “tiene muchos”, “pertenece a” y “tiene y pertenece a muchos”, respectivamente.
Relación | Tipo de Asociación | Ejemplo |
---|---|---|
uno a uno | hasOne (“tiene un”) | Una usuario tiene un perfil. |
uno a muchos | hasMany (“tiene muchos”) | Un usuario puede tener múltiples entradas. |
muchos a uno | belongsTo (“pertenece a”) | Muchas entradas pertenecen a un usuario. |
muchos a muchos | hasAndBelongsToMany (“tiene y pertenece a muchos”) | Las entradas tienen, y pertenecen a, muchas etiquetas. |
Ejemplos:
class Usuario extends AppModel { var $name = 'Usuario'; var $hasOne = 'Perfil'; }
class Perfil extends AppModel { var $name = 'Perfil'; var $belongsTo = 'Usuario'; }
Específico:
class Perfil extends AppModel { var $name = 'Perfil'; var $belongsTo = array( 'Usuario' => array( 'className' => 'Usuario', 'foreignKey' => 'usuario_id' ) ); }
class Usuario extends AppModel { var $name = 'Usuario'; var $hasMany = 'Comentario'; }
Específica:
class Usuario extends AppModel { var $name = 'Usuario'; var $hasMany = array( 'Comentario' => array( 'className' => 'Comentario', 'foreignKey' => 'usuario_id', 'conditions' => array('Comentario.estado' => '1'), 'order' => 'Comentario.created DESC', 'limit' => '5', 'dependent'=> true ) ); }
class Receta extends AppModel { var $name = 'Receta'; var $hasAndBelongsToMany = array( 'Etiqueta' => array('className' => 'Etiqueta', 'joinTable' => 'etiquetas_recetas', 'foreignKey' => 'receta_id', 'associationForeignKey' => 'etiqueta_id', 'with' => '', 'conditions' => '', 'order' => '', 'limit' => '', 'unique' => true, 'finderQuery' => '', 'deleteQuery' => '', 'insertQuery' => '' ) ); }
Examen CMS
Responde a las siguientes preguntas. Cada pregunta vale un punto.
1.- En wordpress hay dos tipos básicos de contenido ¿Cuáles son y en que se diferencian?
2.- ¿En qué apartado podemos configurar nuestro sitio para que tenga urls amigables?
3.- ¿Podemos cambiar dinámicamente la barra lateral? Explica desde donde y con qué objetos.
4.- Dentro del index.php de un tema hay las siguientes líneas:
<?php while ( have_posts() ) : the_post(); ?>
<?php get_template_part( ‘content’, get_post_format() ); ?>
<?php endwhile; ?>
¿Qué es lo que hacen?
5.- En mi carpeta de temas tengo los siguientes archivos:
content-image.php , content-video.php, content.php, content-quote.php
Suponiendo que mi index.php sea como el de la pregunta 4 ¿Para qué sirven tantos archivos?
6.- He creado un tema hijo de Twenty Fifteen y tengo esto en la cabecera del css:
/*
Theme Name: Tema hijo
Description: Tema hijo de Twenty Fifteen
Author: Aitor Tilla
Author URI: http://aitortilla.com
Version: 1.0.0
License: GNU General Public License v2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Tags: light, dark, two-columns, right-sidebar, responsive-layout, accessibility-ready
* /
¿Hay algo qué esté mal? Si es así soluciónalo
7.- He creado un plugin con las siguientes líneas:
add_filter(‘the_content’, ‘miplugin_get_button’);
function miplugin_get_button($content) {
return $content . ‘<h2>Ola k ase?</h2>’;
}
¿Qué es lo que hace?
8.- En Drupal hay una carpeta donde se guarda la configuración, lo módulos y los temas instalados. ¿Cuál es?
9.- Tengo un módulo personalizado en Drupal con el siguiente código:
function mimodulo_menu() {
$items = array();
$items[‘mimo’] = array(
‘title’ => ‘Mi módulo’,
‘page callback’ => ‘_mimodulo_page’,
‘access arguments’ => array(‘access mimoduloextra content’),
‘type’ => MENU_NORMAL_ITEM,
);
return $items;
}
function _mimodulo_page() {
$result = mimodulo_contenido();
$items = array();
foreach ($result as $node) {
$items[] = array(
‘data’ => l($node->title, ‘node/’ . $node->nid),
);
}
$page_array[‘mimodulo_arguments’] = array(
‘#title’ => t(‘Contenido mi módulo’),
‘#items’ => $items,
//Theme hook with suggestion.
‘#theme’ => ‘item_list__mimodulo’,
);
return $page_array;
}
function mimodulo_contenido(){
$max_num = variable_get(‘current_posts_max’, 3);
$query = db_select(‘node’, ‘p’)
->fields(‘p’, array(‘nid’, ‘title’, ‘created’))
->condition(‘status’, 1) //Published.
->orderBy(‘created’, ‘DESC’) //Most recent first.
->range(0,$max_num)
->execute();
return $query;
}
Si mi drupal está en localhost/drupal ¿Qué se muestra si pongo localhost/drupal/mimo?
10.- Un amigo quiere montar una tienda online para vender productos de artesanía. Tiene unos 50 productos diferentes. ¿Qué CMS le instalaríais y por qué? ¿Cuál no y por qué?
Repositorio en bickbuket
https://tortuganinja@bitbucket.org/tortuganinja/test-netmind.git
Descargar magento
Siguiente enlace:
https://www.wetransfer.com/downloads/98018c556e2859ebc860af8c72ac233c20150504103752/c21d462db42e1692507ac6d20241331e20150504103752/950fd3
Ejercicio Sala conciertos
Tendremos tres tipos de contenido:
Salas
-Nombre
-Descripción
-Logo
– Aforo
Grupos
– Nombre
– Descripción
– Fotos
– Vídeos
– Mp3 para descargar
– Estilo (Taxonomy)
Conciertos
– Nombre
– Fecha
– Precio
– Sala
– Grupo
Ejercicios PHP
Ejercicio sencillo:
Obtener un listado de la base de datos agrupado por Código postal. Ejemplo:
08001
Juan Pi Agla, 6
Eva H Agla 6
08002
Luis
Rosa
….
Ejercicio más complicado:
Añadir al mantenimiento de la entrada anterior una pantalla de login/password. Crearemos una tabla ‘acceso’ con los campos user/password. El password lo guardaremos en md5. Si el usuario no está logueado no podrá acceder a ninguna pantalla.
Ejercicio para corregir
Este ejercicio es parecido al hecho en clase, pero tiene muchos errores.
¿Eres capaz de corregirlos?
P.D. Se incluye la base de datos a la que ataca el código.
Obtener dos imágenes aleatorias
El siguiente código nos muestra dos imágenes aleatorias del media library:
$media_query = new WP_Query( array( 'post_type' => 'attachment', 'post_status' => 'inherit', 'posts_per_page' => 2, 'orderby'=>'rand' ) ); foreach ($media_query->posts as $post) { echo wp_get_attachment_image($post->ID,'thumbnail'); }