Gestor de noticias (Tercera parte): Vistas y bases de datos
Bueno seguiremos un poco más con nuestro taller del “Gestor de Noticias” en CodeIgniter.
Retomando el código del taller anterior, donde hicimos nuestro primer “Hola Mundo”, haremos que se cargue ese controlador juntamente con las vistas que generamos en el primer taller (en el que partimos nuestro diseño en una cabecera y un pie de página). Ya de paso crearemos un archivo en la carpeta views/ que será nuestra vista para la función “leer” de nuestro controlador “noticias”, y ahí pondremos nuestro “Hola mundo”, ya que la gracia de todo esto es dividir nuestra aplicación en modelos, vistas y controladores, por lo que cualquier salida de texto por pantalla debería estar en una vista y no en un controlador. La cosa quedaría así:
views/noticias/leer.php
Hola mundo numero <?=$numero?>
controllers/noticias.php
<?php
class Noticias extends Controller
{
function Noticias()
{
parent::Controller();
}
function leer()
{
$this->load->view('cabecera');
$variables['numero'] = $this->uri->segment(3);
$this->load->view('noticias/leer', $variables);
$this->load->view('pie');
}
}
?>
Iremos por partes, <?=$numero> es lo mismo que hacer <?php echo $numero; ?>, no está en todos los servidores la opción de “short tags” así que si os diese error escribirlo de la manera larga.
Desde un controlador podemos pasar variables a una vista, como segundo parámetro de la función load->view. Estas variables se pasarán en un array donde el nombre de la clave será el que posteriormente tendrá la variable en nuestra vista.
La función load->view lo que hace es cargarnos una vista que estará en nuestra carpeta application/views, no es necesario poner el .php. Es casi idéntico de un include de toda la vida.
Bueno dejando de lado la función anterior, pasaremos a crear nuestra base de datos para las noticias, yo os propongo una pero si realmente vais a usar estos talleres para una aplicación real, seguramente deberíais añadir algunos campos más ;)
CREATE TABLE `noticias` ( `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , `titulo` VARCHAR( 255 ) NOT NULL , `cuerpo` TEXT NOT NULL ) ENGINE = MYISAM
Una vez creada la tabla en nuestra base de datos tendremos que configurar el archivo database.php en la carpeta config/ para que todo funcione correctamente.
Para poder hacer pruebas fácilmente usaremos el “scaffolding” de CodeIgniter para rellenar y administrar nuestras tablas de la base de datos. Para activar el scaffolding iremos al archivo config/routes.php y definiremos un nombre al controlador de scaffolding, como por ejemplo:
$route['scaffolding_trigger'] = "scaf_noticias";
Luego en el constructor del controlador añadiremos la línea para generar dicho scaffolding, como parámetro le pasaremos el nombre de la tabla que queremos administrar:
function Noticias()
{
parent::Controller();
$this->load->scaffolding('noticias');
}
Cómo podéis ver ya se nos crea automáticamente una interfaz para poder añadir, editar y borrar registros. Ahora crearemos unas cuantas entradas para probar nuestro sistema.
A continuación crearemos la función index que será la que por defecto nos mostrara todas las noticias de nuestro sistema, será un simple bucle a través de todos los registros que tengamos en nuestra base de datos. La cosa quedará así:
function index()
{
$this->load->view('cabecera');
$variables['query'] = $this->db->get('noticias');
$this->load->view('noticias/index', $variables);
$this->load->view('pie');
}
Como novedad, introducimos las funciones de bases de datos. CodeIgniter tiene una clase muy extensa de bases de datos con muchísimas funciones interesantes y con soporte con muchas tipos de bases de datos.
Con $variables['query'] = $this->db->get(‘noticias’); lo que haremos es generar una consulta a la tabla noticias de nuestra base de datos, el objeto que obtenemos lo tendremos que tratar posteriormente, pero lo haremos en el view. Esto sería equivalente a un “SELECT * FROM noticias“.
Luego crearemos en views/noticias/index.php el siguiente código:
<?php if($query->num_rows()>0): ?> <?php foreach($query->result() as $row): ?> <h2><?=$row->titulo?></h2> <p><?=$row->cuerpo?></p> <hr /> <?php endforeach; ?> <?php endif; ?>
Es tan fácil como un bucle a través de los resultados.
En la primera linea (<?php if($query->num_rows()>0): ?>) lo que haremos es mirar que tengamos algún resultado, porque si la tabla estuviese vacía, nos daría un error al intentar tratar un “objeto” vacío.
El bucle (<?php foreach($query->result() as $row): ?>) simplemente nos irá generando en cada interacción un objeto llamado $row, que contendrá como propiedades todas las columnas con sus valores respectivos.
Podéis bajaros el código aquí.
Os espero en la siguiente clase!

Hola, tu blog es genial, pero tengo una duda, en la que ojala me puedas ayudar.
estoy poniendo un swf en una vista usando el ACRunActiveContent.js y todo vamuy bien cuando abro el directorio raiz, pero apenas voy a un enlace de la web, el swf desaparece como si no se hallara el archivo. Tendra algo que ver que en la ruta aparezca el index.php?, porque cuando este no sale el swf se ve bien..
saludos y felicitaciones por tu blog
Quizá es por la ruta, es decir CodeIgniter te genera url de este tipo “index.php/controlador/funcion/variable”.
Si tu en una vista cargada con esa url añades una imagen o un flash así:
Lo que hará es buscar en una carpeta “imagenes” en “index.php/controlador/funcion/variable/imagenes/imagen.jpg”, que por supuesto no existirá.
Para evitar esto, ponemos una etiqueta en el head que tendrá como valor nuestra ruta base:
Con esto puesto ya te buscaría la carpeta en “http://www.tudominio.com/imagenes/” y todo funcionaría correctamente (puedes usar la función base_url que te genera lo de la ruta base.
No se si es eso lo que falla en tu script, sino me comentas, un saludo :)
Hola Lagarto, he seguido tus sugerencias y logre resolver el problema.
Resulta que tuve que colocar la ruta absoluta al swf con la funcion “base_url” no solo para el parametro “src”, sino que tambien para el parametro “movie” en mi javascript (ACRunActiveContent.js) , me quedo:
…
’src’, ‘img/banner’,
…
‘movie’, ‘img/banner’,
…
donde img/banner era la carpeta que contenia y archivo swf, y asi se resolvio todo.
Muchas gracias por tu ayuda.
Ups…
el codigo salio distinto, quize decir:
…
’src’, ‘ {base_url()} img/banner’,
…
‘movie’, ‘ {base_url()} img/banner’,
…
obviamente reemplazando los {} por las etiquetas de php,
gracias otra vez
hola
lagarto , disculpe que lo moleste. se me presento un problemita con el scaffolding, me muestra el interface, pero no me funciona el editar el borrar,view record, create new record, me muestra un error cuando entro y es el siguiente
Warning: require_once(../../ci_161/system/codeigniter/CodeIgniter.php) [function.require-once]: failed to open stream: No such file or directory in C:\AppServ\www\CodeIgniter\index.php on line 115
Fatal error: require_once() [function.require]: Failed opening required ‘../../ci_161/system/codeigniter/CodeIgniter.php’ (include_path=’.;C:\php5\pear’) in C:\AppServ\www\CodeIgniter\index.php on line 115
Porque e seguido paso a paso el blog pero no se si hay que configurar algo mas, de antemano le agradesco su colaboración.
Eso es que simplemente no encuentra el fichero, como tienes colocados todos los ficheros y demás? Supongo que estaras trabajando dentro de la carpeta de codeigniter en /system/application
Hola Lagarto,
El tutorial es genial, gracias!
Tengo un problema, y es que al crear el scaffolding, me da un 404 al intentar acceder al mismo. ¿Qué me está sucediendo?
Gracias!
hola!!! en la seccion siguiente comente pero ya resolvi ese detalle, solo tenia q cambiar la config del route je.. pero me da un error y tiene q ver con esta seccion, me dice lo siguiente:
A PHP Error was encountered
Severity: Notice
Message: Undefined property: Noticias::$db
Filename: controllers/noticias.php
Line Number: 14
fatal error………..\system\application\controllers\noticias.php on line 14
no entiendo mucho sobre el tema asi que estoy pagando novatadas como dicen por alli je.. ojala puedas ayudarme felicitaciones x tu blog esta excelente!!!
xoxo
@xoxo00
Hola yo tambien apenas estoy aprendiendo y me han salido muchos errores, pero el error que comentas tambien me salio y encontre la solucion en un foro basicamente lo que hay que hacer es lo siguiente
ir a la carpeta system/application/config
ahi abrir el archivo autoload.php
y buscar esta linea
$autoload['libraries'] = array();
lo unico que debes de hacer es agregar la palabra database al array asi
$autoload['libraries'] = array(‘database’);
y con eso ya funcionara
a mi me sale ese error al querer meter mas datos a la base de datos, osea igual los guarda pero me sale ese error
alguien sabe que es?’
A PHP Error was encountered
Severity: Warning
Message: Cannot modify header information – headers already sent by (output started at D:\Archivos de Portables\xampp\xampplite\htdocs\CodeIgniter\application\controllers\noticias.php:46)
Filename: scaffolding/Scaffolding.php
Line Number: 284
ya lo arregle, era un pedazo de codigo q tenia en noticias.php que no quedo bien cerrado XD