Introducción a MVC con PHP y CodeIgniter

HoTiTo

#30 Mira a ver si es problema de rutas. Yo me volví un poco loco al principio con los archivos .js, .css y de imágenes.

El path a la hora de llamar a un archivo empieza desde el directorio base de CI. O sea, si tienes un archivo metido en el directorio de views sería algo así como "./application/views/archivo.bla" si quieres llamarlo desde un archivo dentro de ese directorio y no simplemente "archivo.bla" como se supondría que tendría que ser.

1 respuesta
BLZKZ

#31 son simplemente funciones propias (en php) que necesito en varias secciones (controladores) y miré esto -> http://codeigniter.com/user_guide/general/creating_libraries.html

Pero o soy muy melón o en CI 2.0 no va xD y prefiero usarlo asi a hacer un include del php

xCoNDoR

Oye #1 a que te refieres con: · Crear bucles dentro de tus vistas, por ejemplo, mostrar 5 usuarios en una tabla

Podrias explicarlo un poco por encima a ver si es lo que estoy pensando ? Creo que me interesa

2 respuestas
BLZKZ

#33 por ejemplo si haces un

<table>
  <tr>
    <th>Nombre</th>
    <th>Email</th>
  </tr>
<?php
foreach ($query->all as $row)
{
  echo '<tr>';
    echo '<td>'.$row->name.'</td>';
    echo '<td>'.$tow->email.'</td>';
  echo '</tr>';
}?>
</table>

Listarías todos los que tengas en $query (pero creo que he usado datamapper para ayudarme, por lo de ->all, pero en esencia es un bucle de esa forma)
Lo he hecho al vuelo si hay algun fallo pues... sorry xD pero tengo sueño y me voy a echar la siesta

1 respuesta
xCoNDoR

#34 si, he entendido lo que has querido decirme, conozco el foreach y todo su uso, jeje, llevo tiempo ya con CI, si es a eso a lo que se refería piradoiv, que supongo que si, lo había entendido mal :)

Gracias

PiradoIV

#33 Pues no te voy a mentir, no me acuerdo xD, supongo que sería lo que comenta BLZKZ =)

1 año después
Zuki

Quiero empezar con el CI pero no acabo de entender el concepto de MVC o igual si.

La vista es la parte del diseño de la pagina y donde ponemos los resultados obtenidos del Controlador, ¿cierto?

El controlador contiene todo el codigo de operaciones y tratamiento de la informacion, ¿cierto?

El modelo, ¿que hace exactamente?

1 respuesta
PiradoIV

#37 El modelo se encarga de interactuar con la base de datos, el controlador hace las operaciones necesarias y le pasa los resultados a la vista para que los muestre.

1 respuesta
Zuki

#38 Vaaaaaleeeee, creo que ya lo tengo :D Gracias

MTX_Anubis

Realmente el modelo también tiene la lógica que tenga que ver con el modelo xD. La idea es que los controladores queden muy pequeños y se encarguen de ser el "puente" entre el cliente y el servidor, autorizaciones (aunque se podría discutir esto), validaciones de datos, seguridad, etc.

El resto lo pasas al modelo o a otras capas dependiendo de los frameworks/patrones que uses pero hacer contenedores de datos con los modelos no suele ser buena idea a no ser que tu aplicación no requiera de nada más claro xD

1 respuesta
Soltrac

#40 Si estás metiendo mucha lógica en el modelo es que lo estás haciendo mal.

1 respuesta
MTX_Anubis

#41 Por eso incluyo otras capas xD. De hecho el rails, por ejemplo, es común cometer el error de inflar los modelos.

Luego esta el contrario que es usar tu modelo como contenedor de datos y ya, Anemic Domain Model.

10 meses después
Sirius_spa

A ver si me podeis ayudar.

Es mi primer trabajo en codeigniter y de momento bien, hasta que he subido la web al servidor.

Tengo el controlador que llama a un modelo:


 //compruebo que el user existe
$this->load->model('user_model');
$userData = $this->user_model->getUser(strtolower($user),$pass);
          
if(count($userData) == 0){ //Fallo }else{ //Acierto }

y el modelo es este:

public function getUser($user,$pass){

    $query =  $this->db->select('idUsuarios,user,admin')
        -> from('Usuarios')
        -> where('user',$user)
        -> where('pass',$pass)
        -> where('activo',1)
        -> where('pass !=',"")
        -> limit(1)
        -> get()
        -> row();

    return $query;
}

Bueno, pues en localhost me ha funcionado todo sin problemas, pero en cuanto lo he subido al servidor, me salta este fallo:

Fatal error: Call to a member function row() on a non-object in....

No me pilla el método row() del modelo

Y si, tengo el database en el autoload, asi que no se de que puede ser...

Sólo me explico que los datos de la base de datos los haya puesto mal...pero los he mirado y requetemirado y estan bien

Lo tengo en 000webhost porque es para uso de 4 amigos y de momento prefiero tenerlo asi. Puede venir por ser una mierda de servidor?

1 respuesta
Gantorys

#43 diría que no encuentra ningún resultado al hacer la consulta. Recibirías un NULL o lo que sea y estás intentando llamar al método "row" de algo que no es un objeto.

2 respuestas
Tunnecino

Si, tiene sentido lo que dice #44

Comprueba antes si hay resultados, y luego ya haces el get();

1 respuesta
Sirius_spa

#44 #45 Que va, la base de datos tiene datos.Hago la consulta en el phpMyAdmin del servidor y me devuelve resultados sin problemas.

He estado mirando ahora por la mañana, y el get() en vez de devolverme un array con lo que sea me devuelve false O_o
Tengo que mirar más a ver si la he cagado en alguna configuración de la base de datos

eXtreM3

Buenas, me ha tocado hacer unos retoques / modificaciones / nuevas funcionalidades en un proyecto que está desarrollado bajo CI. Después de leer documentación y demás, me he puesto manos a la obra con el código.

Para empezar necesito hacer una consulta sencilla (mi primera consulta a la base de datos usando CI), sé que me va a devolver sólo un registro. A ver, he hecho esto:

  • En el modelo he declarado una función pública (getAliasInUse) que ejecuta la consulta y me devuelve los datos con un foreach, tal que:
//get the alias
$this->db->select('alias');
$this->db->from('monuments');
$this->db->where('monumentId', $monumentId);
$query = $this->db->get();

foreach ($query->result() as $row)
{
      return $row->alias;
}
  • En el controlador tengo esto
//The alias
$query1 = $this->mMonuments->getAliasInUse($monumentId);
$data['aliasInUse'] = $query1;
  • En la vista muestro así el resultado:
<?php echo $aliasInUse; ?>

Vale, mis dos preguntas son:

1) Esto que he hecho es alguna burrada? El dato lo devuelve correctamente, pero quiero saber si me he columpiado muchísimo a la hora de extraerlo.

2) Si sé que la consulta sólo devuelve un registro, es correcto hacer un foreach para recorrer los resultados o se puede hacer algo con la función result() ?

2 respuestas
Sirius_spa

Arreglado. Era el driver de la base de datos

Cambiando en database.php:
$db['default']['dbdriver'] = 'mysql';

por:
$db['default']['dbdriver'] = 'mysqli';

y arreglado

#47 Poner el return en un foreach....te funciona bien porque sólo hay 1 fila. en el momento que tengas más de 1 para devolver, al hacer el primer return, se acaba la funcionalidad del modelo y sólo te va a sacar el primer registro.

Si sabes que sólo va a devolver 1 fila yo optaria por esto

//Sacar 1 alias
$this->db->select('alias');
$this->db->from('monuments');
$this->db->where('monumentId', $monumentId);
$query = $this->db->get()->row();

return $query;

Si en el futuro vas a devolver más registros haria esto:

//Sacar todos los alias
$this->db->select('alias');
$this->db->from('monuments');
$query = $this->db->get()->result_array();

return $query;

Esto de devuelve un array con las filas que te ha devuelto la query. En el controlador las recorres y a correr

1 respuesta
eXtreM3

#48 al hacer eso supongo que cambia la forma en la que tengo que pintar el resultado, porque me está tirando este error en la vista

Message:  Object of class stdClass could not be converted to string
1 respuesta
Sirius_spa

#49

Si lo haces con row(), para sacar lo que hay dentro es as:

Controlador.php

$fila = $this->modelo->metodo(....);

echo $fila->columna1;
echo $fila->columna2;
echo $fila->columna3;


echo $fila->columnaN;

Si usas el result_array:

Controlador.php

$fila = $this->modelo->metodo(....);

foreach($fila as $row){
  echo $row->columna1;
  echo $row->columna2;
  echo $row->columna3;


  echo $row->columnaN;
}

Yo es el método que uso porque me parece más cómodo

2 respuestas
eXtreM3

#50 funciona perfecto, obviamente me he llevado el echo a la vista, por lo demás ok ;) Gracias.

1
HaxeR

#50 eso te deberia de dar un error :P

Si usas result_array() se supone que es porque quieres recibir los resultados como un array, y luego en el foreach estas tratandolos como si fueran un objeto.

Con result():

foreach($fila as $row){
  echo $row->columna1;
  echo $row->columna2;
  echo $row->columna3;


  echo $row->columnaN;
}

Con result_array():

foreach($fila as $row){
  echo $row['columna1'];
  echo $row['columna2'];
  echo $row['columna3'];


  echo $row['columnaN'];
}

Es una tonteria , supongo que ya lo sabrias y se te ha colao :buitre:

1 respuesta
DarkSoldier

#47 y no se si te será mas comódo pero puedes ir anidando los métodos de la consulta

$this->db->from()
               ->where()
               ->get();

eso junto con el alignment de sublime.. <3

Sirius_spa

#52 Correcto, se me ha ido la olla

eZpit

Muy interesante! Hace muy poquito que he empezado a mirarme tema WebApps, concretamente con un pequeño MOOC de Ruby on Rails.

Llevo días vacilando sobre si seguir con RoR o mirarme alguno de los frameworks PHP MVC, porque teniendo en cuenta que no se ni ruby ni php, no se muy bien que me sale más a cuenta aprender xD

Aprovecharé este topic para pegarle un vistazo a CI a ver que tal !

1 respuesta
N

#55 name that mooc

1 respuesta
eZpit

#56 Es muy sencillo y está ya acabando: https://class.coursera.org/webapplications-001

Sin embargo, acaba de empezar uno que he leido que es bastante jodido y exigente, seguramente lo haga también:
https://www.edx.org/course/uc-berkeleyx/uc-berkeleyx-cs169-1x-engineering-1377#.U1FP6-aSyPJ

Y tiene una segunda parte:
https://www.edx.org/course/uc-berkeleyx/uc-berkeleyx-cs169-2x-engineering-1379#.U17czq2SyPI

PD: Se que se va un poco del hilo, pero en los cursos se toca bastante la arquitectura MVC y teoría general que vale igual para una cosa que para otra.

PinVa

Una pregunta de noob, ¿Que se diferencia las librerías de los Helpers?.

Estoy con un pequeño proyecto en PHP y quiero hacer el patrón de diseño DAO y no se en la estructura de codeigniter donde poner las clases del DAO si en el modelo en libraries o ni idea.

Y si la pongo en libraries como puedo llamar a una clase que esta en libraries también? Si esta en la misma carpeta no hace falta hacer nada solo el new OtherClass() etc?

Perdón por el retraso.

1 respuesta
smintcs

#58

Yo lo que hago es tener una carpeta dentro de /application en la que voy metiendo mis clases y mis cosas, dentro de esta carpeta tengo la estructura que yo quiera y luego en el controller o model o lo que sea hago un include, es muy posible que no sea la mejor manera o que sea hasta mala pero tampoco tengo mucha idea de php

Me queda asi:
igual que /application/controllers tengo /application/misCosas
ahi tengo mapache.php

y desde un controller de los de codeigniter pongo arriba

require_once (APPPATH . 'misCosas/mapache.php');

lo de appPath es una variable global de codeigniter, igual hay que añadir la libreria URL pero esa la tengo puesta en el autoload

Mi otra duda es si hay alguna convencion para los nombres, porque es un follon tener login.php 3 veces para cada uno, lo suyo es ponerle C_login.php M_login.php y V_login.php pero no lo veo por ahi en los ejemplos

Ahora vendra alguien a ilustrarnos y concretar.

8 días después
eXtreM3

Entro, me cago en CodeIgniter, digo que un desarrollo desde cero le da mil vueltras a un framework, y me voy.

3 respuestas