19/04/2008
Tanto como no se debe de usar un Model dentro de un Component, tampoco se debe de usar un Element dentro de un Helper, aun así, si tienes una situación especial donde debes de hacerlo, lo puedes lograr de la siguiente manera.
1
2
| $vista = ClassRegistry::getObject('view');
$vista->renderElement('nombre_elemento'); |
CakePHP te pone las reglas (y para tu propia sanidad, deberías de seguirlas), pero no te limita a ellas.
1/04/2008
En CakePHP, una situación muy común es que se te vaya una linea en blanco después de que haz cerrado los tags de PHP en prácticamente cualquier archivo que este incluido en el framework, ya sea un helper, view, controller, component.. lo que sea.
Normalmente esto no trae problemas, pero cuando necesitas que lo que imprimes en pantalla sea absolutamente lo primero, como las declaraciones de un feed XML o un header para imprimir una imagen, si que afecta y es un dolor de cabeza buscar de archivo por archivo donde esta el espacio en blanco si tu proyecto a crecido demasiado.
Por ahi en la lista de cake, alguien público una expresión regular con sed que recursivamente busca por cualquier archivo de PHP con lineas vacías al final y las elimina:
find -name “*.php” | xargs sed -i -e :a -e ‘/^\n*$/{$d;N;ba’ -e ‘}’
Recomendaría que solo la utilizaras si tu código esta en un repositorio, para que te des cuenta de cuales archivos a modificado y donde exactamente.
11/03/2008
Algo que me atraso en la madrugada era que CakePHP escapa todas las condicionales que le mandas en una consulta SQL, y si la condicional de casualidad esta formada con una funcion de MySQL, esta obviamente no se ejecuta.
Por ejemplo, esto no funcionara: (busca que el campo created sea mas reciente que hace 1 día)
1
2
3
4
5
| $conditions = array
(
"created" => "> date_sub( curdate(), interval 1 day)"
);
$this->Model->findAll( $conditions, null, "depart_date ASC"); |
Para evitar esto CakePHP implementa un operador mágico “-!” que le indica no escapar esa sentencia y nuestra consulta se ejecute como pretendemos.
1
2
3
4
5
| $conditions = array
(
"created" => "> -!date_sub( curdate(), interval 1 day)"
);
$this->Model->findAll( $conditions, null, "depart_date ASC"); |
Voilà!
9/08/2007
Esto es cochino, sucio y hay 99% de posibilidad de que si necesitas hacer esto, estes en un error de conceptos y lo que intentes hacer se pueda hacer mejor de otra forma.
Los Helpers fueron pensados para ser usados dentro de las Vistas. Punto.
Aún asi no deja de ser interesante el saber como utilizarlos dentro de un Controller, quien sabe, talvez algún día te saque de algún apuro.
1
2
3
4
5
6
7
| class UsersController extends AppController {
function index() {
loadHelper('Html');
$html = new HtmlHelper();
debug($html->link('Un buen link', 'http://cakephp.org'));
}
} |
Vía | CakeBaker
15/06/2007
Brandon Parise, creó un diagrama donde podemos apreciar el ciclo de vida del script al hacer una petición a CakePHP. (clic en la imagén para verlo completo)

En la página de Brandon se ira actualizando el diagrama.
Vía | Cakebaker
28/05/2007
Un componente muy útil desarrollado Eelco Wiersma en base al paquete de PEAR Service_JSON.
Su uso es muy simple, agregar el componente en tu controlador y esta listo para encoding y decoding en JSON.
1
2
3
4
5
6
7
8
| var $components = array('json');
$valor = array('uno', 'dos', 'tres', array('arreglo', 'multiple'));
//convertimos el arreglo a json y lo guardamos en $resultado
$resultado = $this->json->encode($valor);
//ahora al revez.. lo pasamos de json a un objeto
$resultado = $this->json->decode($resultado); |
Bajalo en CakeForge
Actualización
Las funciones de JSON también estan disponibles como extensiones de PECL para PHP y a partir de PHP 5.2 son incluidas en los binarios por default.
25/05/2007
Ahora que esta tan de ‘moda’ la utilización de frameworks para programar cualquier cosa, y siendo PHP tan usado, mas de alguno seguro se ha topado con CakePHP.
Desde hace algunos meses sucede una extraña situación con el proyecto; esta a punto de salir una nueva versión (1.2.x.x) que sustituira a la actual (1.1.x.x) haciendo varios cambios significativos en el funcionamiento del framework, el gran problema es que esta versión como bien puede salir en dias, tambien puede salir en semanas o hasta en meses.
Asi que si estas indeciso sobre que versión utilizar, aqui van unos pros y contras, cortesía de CakeBaker
CakePHP 1.1.x.x
Pros:
- Estable
- Documentación abundante con manuales y tutoriales
Contras:
- No se sacan mejoras para esta versión, solo se corriguen bugs
CakePHP 1.2.x.x
Pros:
- Muchas funcionalidades nuevas
- El futuro de Cake
Contras:
- Sin documentación (casi)
- Es una versión Alpha, asi que puede cambiar y algunas funciones pueden no estar terminadas
En lo personal, pienso que es simple, los que ya tienen experiencia con Cake, deberían de usar la versión 1.2.x.x y no tendran ningún problema al adaptarse (y si lo tienen hay muchas personas a quien preguntarles en IRC o listas de correo).
Las personas que no lo conocen aún, deberían de usar la versión que esta documentada, que es la 1.1.x.x.
Una experiencia con un modelo del que estas aprendiendo y que no tiene documentación, puede ser frustrante.
22/05/2007
Una característica extraña (util?) de CakePHP es que guarda el indice de el ultimo registro guardado automaticamente en $this->Model->id y como bien sabemos, cuando insertas algo en un modelo, que trae seteada una id que ya existe, actualiza los datos en lugar de insertar unos nuevos.
Es muy comodo en realidad, pero en este caso en particular que tengo varias filas a insertar, no lo es.
1
2
3
4
5
6
| $datos = array('primero', 'segundo', 'tercero');
foreach ($datos as $dato) {
$this->data['Modelo']['dato'] = $dato;
$this->Modelo->save($this->data);
} |
Esto resultara en que solo se va a crear una fila nueva que se ira actualizando constantemente segun tratamos de insertar y quedara con el valor de ‘tercero’ porque es el último dato.
Para solucionar esto hay que destruir el índice que crea despues de cada inserción.
1
2
3
4
5
6
7
| $datos = array('primero', 'segundo', 'tercero');
foreach ($datos as $dato) {
$this->data['Modelo']['dato'] = $dato;
$this->Modelo->save($this->data);
$this->Modelo->id = false;
} |
Voilá!