Necesitamos, por descontado, tener la base de datos y configurada y la tabla posts.
public function edit($id = null) { //Parte donde se recuperan los datos enviados por la vista y se guardan en la BD if ($this->request->is(array('post', 'put'))) { if ($this->Post->save($this->request->data)) { $this->Flash->success(__('Post actualizado.')); return $this->redirect(array('action' => 'index')); } $this->Flash->error(__('Unable to update your post.')); } else { //Parte donde se recupera el Post y se manda a la vista if (!$id) { throw new NotFoundException(__('Invalid post')); } $post = $this->Post->findById($id); if (!$post) { throw new NotFoundException(__('Invalid post')); } if (!$this->request->data) { $this->request->data = $post; } } }
<h1>Edit Post</h1> <?php echo $this->Form->create('Post'); echo $this->Form->input('title'); echo $this->Form->input('body', array('rows' => '3')); echo $this->Form->input('id', array('type' => 'hidden')); echo $this->Form->end('Save Post'); ?>
Aquí tenemos la lista de convenciones de nombres:
Convenciones de nombres en cakephp
Hay un problema. CakePHP cambia del plural al singular en controladores/modelos, y si tenemos una tabla como ‘Autores’ nos generará un modelo llamado ‘Autore’. Esto tiene dos soluciones, usar en estos casos un plural inglés en las tablas (autors) o añadir un par de líneas en /app/Config/bootstrap.php:
Inflector::rules(
'singular'
,
array
(
'rules'
=>
array
(
'/(.*)res$/i'
=>
'\1r'
,
'/(.*)nes$/i'
=>
'\1n'
,
'/(.*)des$/i'
=>
'\1d'
,
'/(.*)ses$/i'
=>
'\1s'
),
'irregular'
=>
array
(),
'uninflected'
=>
array
()));
Inflector::rules(
'plural'
,
array
(
'rules'
=>
array
(
'/(.*)r$/i'
=>
'\1res'
,
'/(.*)n$/i'
=>
'\1nes'
,
'/(.*)d$/i'
=>
'\1des'
,
'/(.*)s$/i'
=>
'\1ses'
),
'irregular'
=>
array
(),
'uninflected'
=>
array
() ) );
Las rutas en cakephp tienen un formato definido:
http://example.com/controlador/accion/param1/param2/param3
Aunque también se pueden usar parámetros con nombres:
Ejemplos de todo:
URL: /monos/saltar Dirige a: MonosController->saltar(); URL: /productos Dirige a: ProductosController->index(); URL: /tareas/ver/45 Dirige a: TareasController->ver(45); URL: /donaciones/ver/recientes/2001 Dirige a: DonacionesController->ver('recientes', '2001'); URL: /contenidos/ver/capitulo:modelos/seccion:asociaciones Dirige a: ContenidosController->ver(); $this->passedArgs['capitulo'] = 'modelos'; $this->passedArgs['seccion'] = 'asociaciones';
En cakePHP se busca por defecto para cada acción la vista que tenga su nombre. Pero podemos indicar que use una vista concreta. Por ejemplo podemos tener lo siguiente en el controlador:
public function suma($a,$b){ $this->set('resultado',$a+$b); $this->render('/Prueba/resultado'); } public function mayor($a,$b){ if ($a<$b) $a=$b; $this->set('resultado',$a); $this->render('/Prueba/resultado'); }
Y la siguiente vista:
// archivo \Prueba\resultado.ctp <h2>El resultado es <?=$resultado?></h2>
Creamos el controlador Prueba:
App::uses('AppController', 'Controller'); /** * CakePHP PruebaController * @author a4alumno */ class PruebaController extends AppController { public function index() { die("Hasta aquí hemos legado"); } public function saludo($nombre,$apellidos="") { $this->set('nombre',$nombre); $this->set('apellidos',$apellidos); $this->set('nombrecompleto',$apellidos.", ".$nombre); } public function suma($a,$b){ $this->set('suma',$a+$b); } public function mayor($a,$b){ if ($a<$b) $a=$b; $this->set('mayor',$a); } }
En el ejemplo anterior tenemos las acciones: saludo, suma y mayor. Necesitaríamos una vista para cada una de ellas:
//archivo en View\Prueba\saludo.ctp <h2><?=$nombrecompleto?></h2> <h1>Hola que tal?</h1> <?php echo $nombre." ".$apellidos;
//archivo en View\Prueba\suma.ctp <h2>La suma es <?=$suma?></h2>
//archivo en View\Prueba\mayor.ctp <h2>El mayor es <?=$mayor?></h2>
Web oficial:
Tutoriales: