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í:

Data validation in cakephp

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é?

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.

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