Blog Codeigneter
Blog Codeigneter
Blog Codeigneter
CI es un framework orientado a objetos, aplicando el patrón de diseño Modelo Vista Controlador. Voy a dar como supuesto que todos
manejan medianamente bien php y que, al igual que yo, jamas en su vida habían usado un framework. Empecemos descargando
codeignaiter. Descomprimanlo y subanlo a su hosting favorito (localhost). Renombren la carpeta con el nombre del proyecto que en
este caso y en honor a "Pley();" se llamara "quiero-novia" el cual sera un catalogo para una florería.
Tenemos la carpeta user_guide, system e index.php. La guía es la misma que se encuentra en su sitio oficial. El index es el mismo
que se usara en este proyecto y en system está todo lo que hará funcionar el sistema, por tanto solo nos interesan los 2 últimos.
Por ultimo, creen una base de datos para el proyecto en MySQL llamada "garageflash".
Ya todo esto listo, ¡manos a la obra! la carpeta en la cual programaremos nuestra aplicación es justamente application, alojada en la
carpeta system.
Empezaremos editando los archivos de configuración que necesitaremos para empezar a programar
database.php
Editaremos los datos para la conexión a nuestra DB favorita: garageflash en MySQL.
Código :
$db['default']['hostname'] = "localhost";
$db['default']['username'] = "garageflash";
$db['default']['password'] = "clab";
$db['default']['database'] = "garageflash";
$db['default']['dbdriver'] = "mysql";
$db['default']['dbprefix'] = "";
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = "";
$db['default']['char_set'] = "utf8";
$db['default']['dbcollat'] = "utf8_general_ci";
No me detendré a explicar que significa cada variable, por que el nombre de cada una de ellas es muy descriptivo.
config.php
Designa la ruta en la que se encuentra alojada nuestra web entre otros datos
Código :
$config['base_url'] = 'http://127.0.0.1/quiero-novia';
$config['index_page'] = 'index.php';
$config['uri_protocol'] = 'AUTO';
$config['url_suffix'] = '';
$config['language'] = 'spanish';
$config['charset'] = 'UTF-8';
Cuidado con la ruta que vayan a poner en $config['base_url'], si quieres salir a internet debiese ser tu IP publica o DNS.
routes.php
Código :
$route['default_controller'] = 'floreria';
$route['scaffolding_trigger'] = "";
El 'default_controller' se refiere a el controlador o pagina principal **cof cof clase cof cof ** en la cual programaremos nuestra
aplicación, mas adelante ahondaremos en esto.
'scafolding_trigger' sirve para usar los mentados scafolding (administración pre-fabricada), pero como no me gusta usarlos por
fundadas razones dejaremos esta opción en blanco ¿razones?:
No se me da la gana.
Son muy estáticas, difíciles de adaptar.
Inseguras, dentro de el apartado adaptar me referías integrarlas a un sistema de usuarios.
En el video tutorial (en ingles) muestran como usarlas, pero como a mi no me gustan.
function Floreria ()
{
parent::Controller();
}
function index()
{
$this->load->view('floreria');
}
}
Dentro de esta clase está la función que siempre se llamara index. En esta clase pondremos todo lo que queremos que se muestre en
la primera pantalla de nuestra clase. Si eres buen observador te darás cuenta que se esta llamando a la clase view, que es la que
usaremos para manejar nuestros templates. Como primer paso, escribiremos el titulo y encabezado en nuestro template. Este código
debe ir en un archivo nuevo en: system/aplication/views/floreria.php. Ese será nuestro template:
Código :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtm
l1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" lang="es">
<head>
<title>Quiero Novia</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<h1>Flores Para Conseguir Novia</h1>
</body>
</html>
Ahora nos toca enviar variables a nuestro template, para esto modificaremos nuestro template del siguiente modo:
Código :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtm
l1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" lang="es">
<head>
<title><?php echo $titulo ?></title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<h1><?php echo $encabezado ?></h1>
</body>
</html>
Y luego modificaremos nuestra función index() del siguiente modo para poder enviarle las variables requeridas:
Código :
class Floreria extends Controller {
function Floreria ()
{
parent::Controller();
}
function index()
{
$datos['titulo']='Quiero Novia';
$datos['encabezado']='Una Novia para Pley';
$this->load->view('floreria',$datos);
}
}
A la función view, además del nombre del template, le entregamos un array donde sus vectores serán las variables que se usaran en
dicho template. Mira el resultado en el navegador.
Para en un futuro aplicarle formato a esta cosa y mantener la misma estructura en todo el sitio, separaremos el template en 3 partes:
header
Código :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtm
l1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" lang="es">
<head>
<title><?php echo $titulo ?></title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
foot
Código :
</body>
</html>
Ahora subiremos datos a nuestro sistema, para lo cual crearemos una segunda clase llamada 'admin' en la cual administraremos el
sistema. En este paso voy a obviar el infaltable sistema de usuarios, para el cual pueden seguir esta serie de tutoriales que trata a
profundidad el tema.
Continuará.
También te interesa
HMVC: Extensión para crear módulos o plugins en Codeigniter
Crear una clase para conectar a la base de datos (IV)
Crear una clase para conectar a base de datos con PHP (II)
GET
Conclusión, podemos usarlo de la misma manera. Luego si quisiéramos estructurar los resultados
podríamos usar la función foreach de PHP. Sin embargo, hay una manera mucho más fácil
enCodeIgniter de tratar las consultas. Ellos lo llaman el Active Record Class y se emplearía,
para el ejemplo de antes, así:
[code lang="php"]
$query = $this->db->get("entradas");
// Genera: SELECT * FROM entradas;
[/code]
También en $this->db->get(); es posible usar un segundo parámetro para especificar un LIMIT:
[code lang="php"]
$query = $this->db->get("entradas", 10, 20);
// Genera: SELECT * FROM entradas LIMIT 20,10
[/code]
SELECT
También podemos especificar el SELECT con $this->db->select(); tipo:
[code lang="php"]
$query = $this->db->select("id,title,body");
$query = $this->db->get("entradas");
// Genera: SELECT id,title,body FROM entradas
[/code]
Existen algunas funciones de MySQL que tienen una propiedad de SELECT específica
en CodeIgniter, sin embargo, solo los listaré ya que no los usaremos en aplicaciones básicas:
$this->db->select_max();
$this->db->select_min();
$this->db->select_avg();
$this->db->select_sum();
JOIN
Esto nos permite unir dos tablas tal que así:
[code lang="php"]
$query = $this->db->join("comentarios", "comentarios.id = entradas.id");
$query = $this->db->get("entradas");
// Genera: SELECT * FROM entradas JOIN comentarios ON comentarios.id = entradas.id
[/code]
WHERE
[code lang="php"]
$query = $this->db->where("id","38");
$query = $this->db->get("entradas");
// Genera: SELECT * FROM entradas WHERE id = '38'
[/code]
Si quisiéramos podríamos unir varios WHERE, simplemente añadiendo otras condiciones:
[code lang="php"]
$query = $this->db->where("id","38");
$query = $this->db->where("name","Isern");
$query = $this->db->where("surname","Palaus");
$query = $this->db->get("entradas");
// Genera: SELECT * FROM entradas WHERE id = '38' AND name = 'Isern' AND surname = 'Palaus'
[/code]
Pero claro, no todo son igualdades. Quizás queremos buscar una cosa que sea más pequeña que, o
diferente, o mayor, etcétera. La forma es especificar en el primer campo, si no hay nada se
tomará =por defecto:
[code lang="php"]
$query = $this->db->where("id >","38");
$query = $this->db->where("name !=","Isern");
$query = $this->db->where("surname","Palaus");
$query = $this->db->get("entradas");
// Genera: SELECT * FROM entradas WHERE id > '38' AND name != 'Isern' AND surname = 'Palaus'
[/code]
Al igual que SELECT, hay muchas más propiedades:
$this->db->or_where();
$this->db->where_in();
$this->db->or_where_in();
$this->db->where_not_in();
$this->db->or_where_not_in();
LIKE
[code lang="php"]
$query = $this->db->like("body","sentencia");
$query = $this->db->get("entradas");
// Genera: SELECT * FROM entras LIKE body = '%sentencia%'
[/code]
Sin embargo, podría ser que no quisiéramos que las dos partes fueran aleatorias… De modo que
podemos especificar en un tercer campo el % donde debe estar. Puede ser: before, both y after.
[code lang="php"]
$query = $this->db->like("body","sentencia1","before");
$query = $this->db->like("title","sentencia2","both");
$query = $this->db->like("slug","sentencia3","after");
$query = $this->db->get("entradas");
// Genera: SELECT * FROM entradas LIKE body = '%sentencia1' AND title = '%sentencia2%' AND slug
= 'sentencia3%'
[/code]
Otros tipos de LIKE que podemos usar son:
$this->db->not_like();
$this->db->or_not_like();
$this->db->group_by();
GROUP BY
En otras versiones se conocia como $this->db->groupby(); pero ha sido eliminado.
[code lang="php"]
$query = $this->db->group_by("title");
$query = $this->db->get("entradas");
// Genera: SELECT * FROM entradas GROUP BY title
[/code]
DISTINCT
Para añadir DISTINCT a la consulta:
[code lang="php"]
$query = $this->db->distinct();
$query = $this->db->get("entradas");
// Genera: SELECT DISTINCT * FROM entradas
[/code]
HAVING
[code lang="php"]
$query = $this->db->having("uid = 32");
$query = $this->db->get("entradas");
// Genera: SELECT * FROM entradas HAVING uid = 32
[/code]
También es posible usar $this->db->or_having();
ORDER BY
$this->db->order_by(); permite ordenar un resultado en una dirección especifica. En el primer
parámetro especificamos el nombre de la columna y en el segundo la dirección. Las posibilidades
del segundo parámetro son: ASC, DESC y RANDOM.
[code lang="php"]
$query = $this->db->order_by("id","DESC");
$query = $this->db->get("entradas");
// Genera: SELECT * FROM entradas ORDER BYid DESC
[/code]
LIMIT
Permite especificar el limite de resultados que quieres que devuelva:
[code lang="php"]
$query = $this->db->limit(30);
$query = $this->db->get("entradas");
// Genera: SELECT * FROM entradas LIMIT 10
[/code]
COUNT ALL
Permite contar el numero de entradas que hay en una tabla:
[code lang="php"]
$num = $this->db->count_all("entradas");
// Genera: un numero que lo podemos tratar como una variable o escribirlo
[/code]
INSERT
Para insertar datos usando el Active Record de CodeIgniter debemos usar un array luego
insertar:
[code lang="php"]
$insert = array("title" => "Test",
"body" => "Test",
"name" => "Isern",
"surname" => "Palaus");
$this->db->insert("entradas",$insert);
// Genera: INSERT INTO entradas (title, body, name, surname) VALUES ('Test', 'Test', 'Isern',
'Palaus')
[/code]
UPDATE
Al igual que INSERT usaremos un array para insertar, sin embargo si queremos actualizar, por
ejemplo, una entrada deberemos especificar un where:
[code lang="php"]
$update = array("title" => "Test",
"body" => "Test",
"name" => "Isern",
"surname" => "Palaus");
$this->db->where("id","3");
$this->db->update("entradas",$update);
// Genera: UPDATE entradas SET title = 'Test', body = 'Test', name = 'Isern', surname = 'Palaus'
WHERE id = 3
[/code]
DELETE
Al igual que UPDATE usaremos un ID para especificar cual es la que queremos borrar:
[code lang="php"]
$this->db->where("id","3");
$this->db->delete("entradas");
// Genera: DELETE FROM entradas WHERE id = 3
[/code]
Y esto es más o menos todo lo que nos ofrece CodeIgniter para tratar nuestras bases de datos.
Espero que haya servido de ayuda a más de uno ya que muchas visitas recibidas buscaban como
usar MySQL en CodeIgniter.
".anchor("goto/".$post["url"],"#".$id)." ".
$post["title"]."
";
echo "
".$post["body"]."
";
echo "".anchor("goto/".$post["url"],"Enlace Permanente")." - ".$post["date"]."";
}
?>
pagination->create_links();?>
Page rendered in {elapsed_time} seconds
[/code]
Base de Datos
Ahora realmente empezamos a trabajar con la aplicación, lo primero que necesitaremos será una
base de datos MySQL. Para configurar los datos de la base de datos deberemos acceder
a/application/config/database.php como ya expliqué en el artículo CodeIgniter: Iniciación y
Configuración. Una vez configurado, crearemos nuestra tabla. El esquema sería el siguiente:
[code]
CREATE TABLE `posts` (
`id` int(5) NOT NULL auto_increment,
`title` varchar(64) NOT NULL,
`url_title` varchar(64) NOT NULL,
`body` text NOT NULL,
`created_on` varchar(10) default NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
[/code]
El único campo que puede confundir un poco es el campo url_title, este campo lo usaremos para
crear URI tipo: blog.iplauas.es/este-seria-el-url-title.
Controlador y vistas
Vamos a crear nuestro controlador. Los controladores los podemos dividir mediante funciones,
nosotros vamos a usar la función index() para mostrar las entradas, show() para ver una entrada en
particular (enlace permanente) y add() para añadirlas.
Lo primero que haremos en nuestra función index() va a ser la consulta a MySQL. En esta consulta,
pondremos en un array() todas las entradas que tengamos en nuestra tabla MySQL. Debería ser
algo así:
Archivo: /application/controllers/blog.php
[code lang="php"]
function index()
{
$query = $this->db->orderby("id","desc");
$query = $this->db->get("posts");
foreach ($query->result() as $row) {
$data["posts"][$row->id]["title"] = $row->title;
$data["posts"][$row->id]["url"] = $row->url_title;
$data["posts"][$row->id]["body"] = $row->body;
$data["posts"][$row->id]["date"] = $row->created_on
}
}
[/code]
Como podéis comprobar, lo primero que hacemos es ordenarlos por ID y luego almacenamos en el
array $data["posts"] el contenido de las entradas. Sin embargo, tengo planteado guardar la fecha
en timestamp de modo que necesitaremos convertirla a una fecha humana. Para esto usaremos
el helperdate de CodeIgniter. Para cargar un helper debemos usar la expresión: $this->load-
>helper();. En nuestro caso, crearemos un patrón para las fechas que lo almacenaremos en una
variable:
Archivo: /application/controllers/blog.php
[code lang="php"]
function index()
{
$query = $this->db->orderby("id","desc");
$query = $this->db->get("posts");
foreach ($query->result() as $row) {
$data["posts"][$row->id]["title"] = $row->title;
$data["posts"][$row->id]["url"] = $row->url_title;
$data["posts"][$row->id]["body"] = $row->body;
$data["posts"][$row->id]["date"] = $row->created_on
}
}
[/code]
De este modo la fecha se mostrará DD-MM-AAAA. Con esto tenemos nuestro
controlador index()listo. Solo nos falta añadir la salida, lo que llamaremos view y podemos
encontrar en/application/views/. Si accedemos al directorio veremos el
archivo welcome_message.php, le cambiaremos el nombre a blog_front.php. Lo abrimos con
nuestro editor de textos y veremos que hay establecidos unos estilos (CSS), vamos a usar los
mismos.
Lo primero que necesitamos saber es como cargar la vista desde nuestro controlador, para cargar
la vista lo haremos con $this->load->view();. Otro tema de las vistas es añadirle nuestro
contenido dinámico, para pasar el contenido tendremos que añadir una variable. Veamos como lo
haríamos en nuestro ejemplo, siendo nuestro contenido el array $data.
Archivo: /application/controllers/blog.php
[code lang="php"]
function index()
{
$query = $this->db->orderby("id","desc");
$query = $this->db->get("posts");
$this->load->helper('date');
$datestring = "%d-%m-%Y";
foreach ($query->result() as $row) {
$data["posts"][$row->id]["title"] = $row->title;
$data["posts"][$row->id]["url"] = $row->url_title;
$data["posts"][$row->id]["body"] = $row->body;
$data["posts"][$row->id]["date"] = date($datestring,$row->created_on);
}
$this->load->view("blog_front",$data);
}
[/code]
Si ejecutáis este código, funcionará al 100%. Sin embargo, en nuestra vista, no vamos a ver más
que el mensaje estático del welcome_message.php que hemos renombrado. Ahora es el momento
de empezar a crear como se verá. Vamos a hacerlo muy sencillo para que veáis como trabajar con
las variables que hemos pasado. Entre las dos etiquetas body del archivo blog_front.php, vamos a
poner este código:
[code lang="php"]
foreach ($posts as $id => $post) {
echo "
".anchor($post["url"],"#".$id)." ".
$post["title"]."
";
echo "
".$post["body"]."
";
echo "".anchor($post["url"],"Enlace Permanente")." - ".$post["date"]."";
}
?>
Pagina generada en {elapsed_time} segundos
[/code]
Como podéis recordar, nosotros teníamos una variable $data["posts"], que realmente es un
array$posts dentro del array $data. Dentro del array $posts tenemos un array para cada ID de
entrada. Para eso usamos la función foreach, para “dividir” estos arrays y generar el contenido
para cada ID. En cuanto al contenido dentro del ID podéis fijaros en la siguiente expresión:
[code lang="php"]
anchor($post["url"],"#".$id)
[/code]
anchor() es una función que forma parte del helper url que hemos usado en autoload.php. En el
primer termino de la función especificamos la dirección a donde debe apuntar el enlace y, en la
segunda, el texto a mostrar.
Con esto que tenemos ya podemos mostrar las entradas correctamente, ahora vamos a crear la
función show() en blog.php para ver una específica. Para empezar, clonaremos el blog_front.php y
lo nombraremos blog_single.php. De momento lo dejaremos así. Volveremos al
controlador blog.php y añadiremos el siguiente código:
[code lang="php"]
function show()
{
$url_title = $this->uri->segment(1, 0);
if($url_title) {
$this->load->helper('date');
$datestring = "%d-%m-%Y";
$query = $this->db->where("url_title",$url_title);
$query = $this->db->get('posts');
foreach ($query->result() as $row) {
$data["post"]["id"] = $row->id;
$data["post"]["title"] = $row->title;
$data["post"]["url"] = $row->url_title;
$data["post"]["body"] = $row->body;
$data["post"]["date"] = mdate($datestring,$row->created_on);
}
$this->load->view('blog_single',$data);
} else {
redirect();
}
}
[/code]
Podemos ver que el código es prácticamente igual al de la función index(), pero este tiene una
particularidad: muestra solo una entrada. Como podéis ver, al principio del código establecemos
el$url_title con $this->uri->segment(1, 0);. Esto nos permite recibir un segmento
determinado de la URI, en nuestro caso, el primero. Acto seguido comprobamos si existe algo
establecido y si existe empezamos a montar la estructura. Hemos añadido una cosa en la
sentencia $query, hemos usado$this->db->where(“url_title”,$url_title); para
establecer que el campo url_title de la base de datos sea igual al $url_title.
Si todo esto no se cumpliera, hay un redirect() que los envía al principio de la aplicación.
También tenemos que cambiar el código de nuestra vista, ya que solo hemos duplicado el archivo.
Entre las etiquetas y debería haber algo así:
Archivo: /application/views/blog_single.php
[code lang="php"]
-
Page rendered in {elapsed_time} seconds
[/code]
Solo nos falta un truco que hemos usado en archivo routes.php que hemos hablado antes:
Archivo: /application/config/routes.php, Línea: 46-49
[code lang="php"]
$route["blog"] = "blog";
$route["add"] = "blog/add";
$route[":any"] = "blog/show";
[/code]
session->userdata('logged_in')) {
?>
Welcome, you're already logged In.
'userlogin'));?>
Username:
Password:
Login
[/code]
Como comprobaciones en medio de la vista nos podemos dar cuenta de la siguiente:
[code lang="php"]
if($this->session->userdata('logged_in')) {
[/code]
Simplemente lo usamos para comprobar si es un usuario que ya ha logeado o si es un nuevo
usuario. Si es nuevo, esta comprobación fallará y nos mostrará el nuevo formulario de login. No
tiene ningún tipo de complicación. Lo que más puede generar dudas es el código de jQuery, que
también es muy simple y son pocas lineas:
[code lang="javascript"]
$(document).ready(
function(){
$("#userlogin").ajaxForm({
type: "POST",
url: "/user/checkLogin",
dataType: "json",
data: "username="+$("#username").val()+"&password;="+$("#password").val(),
success: updateLogin
});
}
)
[/code]
Para usar este tipo de llamada (ajaxForm) vamos a necesitar el plugin jQuery Form que podemos
descargar desde la página del autor. Como curiosidad destacar el success: updateLogin que se
encargará de actualizar nuestro formulario sin necesidad de cargar de nuevo la página. Esta es otra
función a parte que llama una vez ha ejecutado el script. El código es el siguiente:
[code lang="javascript"]
function updateLogin(data) {
$('#logged').html('');
$('#logged').hide();
$("#loginform").fadeOut("slow",
function() {
if (data.success == 'yes') {
$('#logged').html(data.welcome).fadeIn("slow");
}
if (data.success == 'no') {
$('#loginerror').html(data.message).fadeIn("slow").fadeOut("slow",
function() {
$("#loginform").fadeIn("slow");
}
);
}
}
);
}
[/code]
Dependiendo de si el script PHP ha devuelto success == yes o success == no, ejecutará y
actualizará de un modo o de otro. Los data.welcome o data.message son los mensajes que hemos
enviado usando JSON a la hora de validar el script en el controlador user.php.
Bien, espero que con esto puedan crear su primer login en AJAX usando jQuery y PHP. Pronto, más
sobre AJAX, PHP y CodeIgniter!
AJAX, ajax login, CodeIgniter, jQuery, mysql, php