Autenticación cakePHP 1

Ponemos lo siguiente en la cabecera del AppController:

 App::uses('AuthComponent', 'Controller/Component');

Y esto dentro de la clase:

  public $components = array(
 'Session',
 'Auth' => array(
 'loginRedirect' => array(
 'controller' => 'entradas',
 'action' => 'index'
 ),
 'logoutRedirect' => array(
 'controller' => 'usuarios',
 'action' => 'login'
 ),
 'authenticate' => array(
 'Form' => array('userModel' => 'Usuario', 'passwordHasher' => 'Blowfish')
 ),
 'loginAction' => array('controller' => 'usuarios', 'action' => 'login')
 )
 );

También podemos permitir ciertas acciones si ponemos lo siguiente en el beforeFilter:

   $this->Auth->allow('index');

Autenticación cakePHP 4

La vista en Usuarios:

<div class="usuarios form">
<?php echo $this->Session->flash('auth'); ?>
<?php echo $this->Form->create('Usuario'); ?>
 <fieldset>
 <legend>
 <?php echo __('Please enter your username and password'); ?>
 </legend>
 <?php echo $this->Form->input('username');
 echo $this->Form->input('password');
 ?>
 
 </fieldset>
<?php echo $this->Form->end(__('Login')); ?>
</div>

Crear cakephp rest client

Para probar si funcionan  bien los webservices creados vamos a crear una web que los ‘consuma’. En cualquier cakephp (puede ser el mismo) crearemos un controlador ClienteController:

 <?php

App::uses('AppController', 'Controller');
App::uses('HttpSocket', 'Network/Http');

class ClienteController extends AppController {

 public $components = array('Security', 'RequestHandler');
//Aquí pondréis la url de vuestra web
 public $url = "http://localhost/cakeempresa/";

 public function index() {
 
 }

 public function rest_index() {
 $link = $this->url . 'rest_productos.json';

 $data = null;
 $httpSocket = new HttpSocket();
 $response = $httpSocket->get($link, $data);
 $this->set('response_code', $response->code);
 $this->set('response_body', $response->body);

 $this->render('/Cliente/respuesta');
 }

 public function rest_view($id) {

 $link = $this->url . 'rest_productos/' . $id . '.json';

 $data = null;
 $httpSocket = new HttpSocket();
 $response = $httpSocket->get($link, $data);
 $this->set('response_code', $response->code);
 $this->set('response_body', $response->body);

 $this->render('/Cliente/respuesta');
 }

 public function rest_add() {

 $link = $this->url . "rest_productos.json";
 $data = null;
 $httpSocket = new HttpSocket();
 $data['Producto']['precio'] = 74;
 $data['Producto']['proveedor_id'] = 1;
 $data['Producto']['referencia'] = 'Extra';
 $response = $httpSocket->post($link, $data);

 $this->set('response_code', $response->code);
 $this->set('response_body', $response->body);

 $this->render('/Cliente/respuesta');
 }

 public function rest_edit($id) {

 $link = $this->url . 'rest_productos/' . $id . '.json';
 $data = null;
 $httpSocket = new HttpSocket();
 $data['Producto']['precio'] = 27;
 $data['Producto']['referencia'] = 'Actualizada referencia';
 $response = $httpSocket->put($link, $data);
 $this->set('response_code', $response->code);
 $this->set('response_body', $response->body);

 $this->render('/Cliente/respuesta');
 }

 public function rest_delete($id) {

 // remotely post the information to the server
 $link = $this->url . 'rest_productos/' . $id . '.json';
 $data = null;
 $httpSocket = new HttpSocket();
 $response = $httpSocket->delete($link, $data);
 $this->set('response_code', $response->code);
 $this->set('response_body', $response->body);

 $this->render('/Cliente/respuesta');
 }

}

Vista en View\Cliente\index.ctp:

 
<h1>Acciones</h1>
<p>
Escoja
<ul>
<li><?php echo $this->Html->link('Lista Productos', array('controller' => 'cliente', 'action' => 'rest_index')); ?></li><li><?php echo $this->Html->link('Ver producto con ID 1', array('controller' => 'cliente', 'action' => 'rest_view', 1)); ?></li>
<li><?php echo $this->Html->link('Añadir producto', array('controller' => 'cliente', 'action' => 'rest_add')); ?></li>
<li><?php echo $this->Html->link('Actualizar producto 2', array('controller' => 'cliente', 'action' => 'rest_edit', 2)); ?></li>
<li><?php echo $this->Html->link('Borrar producto 3', array('controller' => 'cliente', 'action' => 'rest_delete', 3)); ?></li></ul> </p>

Vista en View\Cliente\respuesta.ctp:

 
<h1>Código respuesta</h1>
<p><?php echo $response_code; ?></p>

<h1>Cuerpo respuesta</h1>
<p><?php echo $response_body; ?></p>

Crear Cakephp Rest

Añadimos las siguientes líneas en routes.php (antes de’ require CAKE . ‘Config’ . DS . ‘routes.php’;’):

  Router::mapResources('rest_productos');
 Router::parseExtensions();

Y añadimos el controlador restProductos:

class RestProductosController extends AppController {

 public $uses = array('Producto');
 public $components = array('RequestHandler');

 public function index() {

 $productos = $this->Producto->find('all');
 $this->set(array(
 'productos' => $productos,
 '_serialize' => array('productos')
 ));
 }

 public function add() {
 $this->Producto->create();
 if ($this->Producto->save($this->request->data)) {
 $message = 'Created';
 } else {
 $message = 'Error';
 }

 $this->set(array(
 'message' => $message,
 '_serialize' => array('message')
 ));
 }

 public function view($id) {

 $producto = $this->Producto->findById($id);
 $this->set(array(
 'producto' => $producto,
 '_serialize' => array('producto')
 ));
 }

 public function edit($id) {
 $this->Producto->id = $id;

 if ($this->Producto->save($this->request->data)) {
 $message = 'Saved';
 } else {
 $message = 'Error';
 }
 $this->set(array(
 'message' => $message,
 '_serialize' => array('message')
 ));
 }

 public function delete($id) {
 if ($this->Producto->delete($id)) {
 $message = 'Deleted';
 } else {
 $message = 'Error';
 }
 $this->set(array(
 'message' => $message,
 '_serialize' => array('message')
 ));
 }

}

Componentes en cakePHP

Los componentes son paquetes de lógica que son compartidos entre los controladores. CakePHP ya dispone de un conjunto muy útil de componentes que veremos más adelante, pero podemos crear cualquiera a medida.

Por ejemplo, si tenemos un cálculo de importe que es compartido por varios controladores lo adecuado es instalarlo en un componente y que cada controlador use el componente y acceda a la funcionalidad.

Ejemplo:

class ImportesComponent extends Component{
function calculaImporte($amount1, $amount2) {
return $amount1 + $amount2*.21;
}
}

Helpers

Para usar helpers en nuestro controlador tenemos que indicar cual vamos a usar:

<?php
class BakeriesController extends AppController {
var $helpers = array(‘Form’, ‘Html’, ‘Javascript’, ‘Time’);
}
?>

Disponemos de los siguientes helpers en el núcleo de cakePHP:

Helper de CakePHP Descripción
Ajax Usado en conjunto con Prototype Javascript Library para crear funcionalidad en las vistas. Contiene métodos rápidos para drag/drop (levantar/tirar), formularios ajax & enlaces, observadores, y más.
Cache Es usado por el núcleo (core) para almacenar el contenido de las vistas en caché.
Form Crea formularios HTML y elementos de formulario que se poblan solas y manejan problemas de validación.
Html Métodos convenientes para crear código (markup) bien formateado. Imágenes, links, tablas, tags de headers y más.
Javascript Usado para ‘escapar’ valores para usarse en JavaScript, escribir tus propios objetos JSON, y dar formato a bloques de código.
Number Formato para números y tipo de cambio.
Paginator Paginar y ordenar información de modelos.
Rss Métodos convenientes para regresar datos RSS feed XML.
Session Aceso para escribir valores de la sesión en las vistas.
Text Enlaces inteligentes, marcadores, truncado inteligente de palabras.
Time Detección de proximidad (es este siguiente año?), buen formateo de cadenas de caracteres (Hoy, 10:20 am) y conversiones de usos horarios.
Xml Métodos convenientes para crear elementos y headers XML.

Como crear/actualizar registros

Con ‘save’ podemos crear o actualizar registros. Todo depende de si el modelo tiene o no tiene id:

 function addtest($referencia){
 $this->Producto->create();
 $this->Producto->set('referencia',$referencia);
 $this->Producto->set('precio',1);
 $this->Producto->set('proveedor_id',1);
 $this->Producto->save();
 return $this->redirect(array('action' => 'index'));
 }
 function clear($id){
 $this->Producto->create();
 $this->Producto->set('id',$id);
 $this->Producto->set('referencia','vacia');
 $this->Producto->set('precio',1);
 $this->Producto->set('proveedor_id',1);
 $this->Producto->save();
 return $this->redirect(array('action' => 'index'));
 }
 function clear2($id){
 $this->Producto->read(null,$id);
 $this->Producto->set('referencia','vacia');
 $this->Producto->set('precio',1);
 $this->Producto->set('proveedor_id',1);
 $this->Producto->save();
 return $this->redirect(array('action' => 'index'));
 }

Guardar datos en CakePHP

Guardar datos es muy sencillo, basta usar el método save() utilizando el siguiente formato:

Array
(
[NombreModelo] => Array
(
[nombrecampo1] => ‘valor’
[nombrecampo2] => ‘valor’
)
)

Se ejecutan las validaciones pertinentes.

Se pueden guardar datos de tablas relacionadas de la siguiente manera:

function add() {
if (!empty($this->data)) {
// Podemos guardar los datos de Usuario
// deberían estar en: $this->data[‘Usuario’]
$this->Usuario->save($this->data);

// El ID del nuevo Usuario está ahora en $this->User->id, así que lo
// añadimos a los datos a grabar y grabamos el Perfil
$this->data[‘Perfil’][‘usuario_id’] = $this->Usuario->id;

// Como nuestro “Usuario hasOne Perfil”, podemos acceder
// al modelo Perfil a través del modelo Usuario
$this->Usuario->Perfil->save($this->data);
}
}

Un ejemplo de crear un producto y guardarlo:

 $prod=$this->Producto->create();
 $prod['Producto']['referencia']=$referencia;
 $prod['Producto']['precio']=1;
 $prod['Producto']['proveedor_id']=1;
 $this->Producto->save($prod);

Esto hace lo mismo pero con el objeto del modelo:

 $this->Producto->create();
 $this->Producto->set('referencia',$referencia);
 $this->Producto->set('precio',1);
 $this->Producto->set('proveedor_id',1);
 $this->Producto->save();

Para borrar datos usamos lo siguiente:

del

del(int $id = null, boolean $cascada = true);

 

 

Función spam en ComentariosController

  public function spam($entrada,$numero){
 $spam=array('Muy bueno','Estupenda entrada','Eres un crack','Lo mejor que he leído','Ole y ole');
 for($i=0;$i<$numero;$i++){
 $com=$spam[rand(0,count($spam)-1)];
 $new['asunto']=$com;
 $new['texto']=$com;
 $new['entrada_id']=$entrada;
 $this->Comentario->create();
 $this->Comentario->save($new);
 
 }
 return $this->redirect(array('controller'=>'Entradas','action' => 'view',$entrada));
 }