Foros del Web » Programando para Internet » PHP » Zend »

Empezando con Zend Framework 1.9.2

Estas en el tema de Empezando con Zend Framework 1.9.2 en el foro de Zend en Foros del Web. Hola amig@s, Recién estoy empezando con Zend Framework y lo que deseo hacer como ejercicio es cargar un array con datos (por ejemplo Cliente: nombre ...
  #1 (permalink)  
Antiguo 11/09/2009, 11:05
Avatar de gabyweb  
Fecha de Ingreso: enero-2002
Ubicación: Lima
Mensajes: 364
Antigüedad: 22 años, 3 meses
Puntos: 0
Pregunta Empezando con Zend Framework 1.9.2

Hola amig@s,

Recién estoy empezando con Zend Framework y lo que deseo hacer como ejercicio es cargar un array con datos (por ejemplo Cliente: nombre y apellidos) para luego mostrar la data en una lista.

Los pasos que estoy siguiendo son:

1. En el index.php principal he puesto lo siguiente:

Código PHP:
<?php
error_reporting
(E_ALL E_STRICT);

$rootPath dirname(dirname(__FILE__));

set_include_path(get_include_path() . PATH_SEPARATOR .
                 
$rootPath '/application/models' PATH_SEPARATOR .
                 
$rootPath '/library' PATH_SEPARATOR);

require_once 
'Zend/Controller/Front.php';

Zend_Controller_Front::run('../application/controllers');
2. En la capa Model he creado la Clase Cliente con sus respectivos atributos y ahí mismo he creado un método cargarData() en donde añado a un ArrayObject 5 registros.

3. En el IndexController, en el método init() deseo ejecutar la carga de data y he escrito lo siguiente:

Código PHP:
class IndexController extends Zend_Controller_Action
{

    public function 
init()
    {
        
$this->initView();
        
        
$clientes = new Cliente();
        
        
$listarClientes $clientes->cargarDatos();
        
       return 
$listarClientes;
    }

Cuando lo pruebo en el navegador me aparece el siguiente mensaje:

Fatal error: Class 'Cliente' not found in X:\www\test\application\controllers\IndexControlle r.php on line 10

¿Qué es lo que estoy haciendo mal?, en todo caso podrían indicarme qué pasos debo seguir?

Espero su ayuda, gracias
__________________
Gaby :adios:

Última edición por gabyweb; 11/09/2009 a las 11:12
  #2 (permalink)  
Antiguo 11/09/2009, 15:19
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Empezando con Zend Framework 1.9.2

Si te dice que no la encuentra es porque tu manualmente debes de cargarla usando require() o include().

Saludos.
  #3 (permalink)  
Antiguo 12/09/2009, 09:36
Avatar de gabyweb  
Fecha de Ingreso: enero-2002
Ubicación: Lima
Mensajes: 364
Antigüedad: 22 años, 3 meses
Puntos: 0
Respuesta: Empezando con Zend Framework 1.9.2

Sí GatorV faltaba en require gracias, ahora tengo otra consulta.

El método CargarDatos lo estoy haciendo así:

$listaCli = new ArrayObject();
$listaCli->append(new Cliente(1, "Cliente", "Apellido"));
...etc

echo $listaCli->count(); //me sale que tiene 5 elementos

Cómo hago para mostrar en la vista el contenido de $listaCli?

He estado probando con:

$this->view->cliente= $listaCli; y cuando lo llamo desde la vista con un foreach me aparece este mensaje:

Fatal error: Cannot use object of type Cliente as array in ...

Tendrá un tratamiento especial el ArrayObject?
__________________
Gaby :adios:
  #4 (permalink)  
Antiguo 12/09/2009, 13:36
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Empezando con Zend Framework 1.9.2

Como haces el foreach?

Saludos.
  #5 (permalink)  
Antiguo 12/09/2009, 16:02
Avatar de Webstudio
Colaborador
 
Fecha de Ingreso: noviembre-2001
Ubicación: 127.0.0.1
Mensajes: 3.499
Antigüedad: 22 años, 5 meses
Puntos: 69
Respuesta: Empezando con Zend Framework 1.9.2

gabyweb, te diría una cosa... Se ve que no estás utilizando un tutorial muy actualizado. Te recomendaría que leas algo más orientado al Zend Framework 1.8 o superior, porque la manera de crear el index y de determinar un directorio por defecto para los modelos, es totalmente distinto.

Si pudieras leer el QuickStart que hay en http://framework.zend.com sería ideal.

Suerte.
__________________
Tutoriales Photoshop | Web-Studio.com.ar
Artículos PHP | ZonaPHP.com
  #6 (permalink)  
Antiguo 13/09/2009, 12:34
Avatar de gabyweb  
Fecha de Ingreso: enero-2002
Ubicación: Lima
Mensajes: 364
Antigüedad: 22 años, 3 meses
Puntos: 0
Respuesta: Empezando con Zend Framework 1.9.2

El foreach lo tengo así

<?php foreach ($this->usuarios as $key => $valor): ?>
<tr>
<td><?php echo $this->escape($valor['id']) ?></td>
<td><?php echo $this->escape($valor['nombre']) ?></td>
<td><?php echo $this->escape($valor['apellido']) ?></td>
<td><a href="index.php?controller=index&action=ver&id=<?p hp echo $valor['id']?>">Ver</a></td>
</tr>
<?php endforeach; ?>
__________________
Gaby :adios:
  #7 (permalink)  
Antiguo 13/09/2009, 13:23
 
Fecha de Ingreso: junio-2009
Mensajes: 156
Antigüedad: 14 años, 10 meses
Puntos: 3
Respuesta: Empezando con Zend Framework 1.9.2

Cita:
porque la manera de crear el index y de determinar un directorio por defecto para los modelos, es totalmente distinto.
Lo del index lo tengo claro, pero podrian explicar un poco mejor lo de los modelos.
(te refieres al DataMapper? Tengo entendido que su uso es opcional).

Saludos.
  #8 (permalink)  
Antiguo 13/09/2009, 15:05
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Empezando con Zend Framework 1.9.2

Estas asignando a clientes, en tu view, al hacer el foreach lo estas haciendo bien pero al leer las propiedades las lees de tu clase Cliente, usando get o dependiendo de como la hayas implementado.

Saludos.
  #9 (permalink)  
Antiguo 13/09/2009, 17:41
Avatar de gabyweb  
Fecha de Ingreso: enero-2002
Ubicación: Lima
Mensajes: 364
Antigüedad: 22 años, 3 meses
Puntos: 0
Respuesta: Empezando con Zend Framework 1.9.2

GatorV, disculpa pero no entendí bien qué es lo que debo hacer
__________________
Gaby :adios:
  #10 (permalink)  
Antiguo 13/09/2009, 21:18
Avatar de zfStuden  
Fecha de Ingreso: abril-2009
Mensajes: 109
Antigüedad: 15 años
Puntos: 0
Respuesta: Empezando con Zend Framework 1.9.2

debes tener un metodo que se llame asi en el modelo fijate este ejemplo

Código PHP:
class GuestbookController extends Zend_Controller_Action
{
    
/**
     * The index, or landing, action will be concerned with listing the entries 
     * that already exist.
     *
     * Assuming the default route and default router, this action is dispatched 
     * via the following urls:
     * - /guestbook/
     * - /guestbook/index
     *
     * @return void
     */
    
public function indexAction()
    {
        
$guestbook = new Default_Model_Guestbook();
        
$this->view->entries $guestbook->fetchAll();//puff este es el metodo lo sacas del modelo muy importante 
    
}






}

si te fijas
Código PHP:
$guestbook->fetchAll(); 
donde guestbook es el modelo y donde ->fetchAll() es el metodo que lo sacas por un maper o por una clase zend_db_table_abstrac o zend_db_table o lo que sea que se llame, luego de eso te lanzas a la vista osea la carpeta view luego vas a scripts y creas la carpeta del controllador si su controlador se llama indexControllder deberias tener una carpeta que se llame index, entoces
la estructura es esta

-application
-controllers (aca los controladores )
IndexController.php (controlador por lo tanto los controladores tienen acciones, las acciones tienen por nombre nombreaccionAction )
-view (aca las vistas)
-scripts
-index (carpeta del controlador index)
- index.phtml( hola soy una accion y soy la vista de de dicha accion)
- holasoyotraaccion.phtml ( y mi nombre accion en el controlador es holasoyotraaccionAction )
-models(carpetas de modelo)
holasoyunmodelo(en otras palabras represento una tabla de una base de datos y que te parece una de mis funciones es impedir el sql injection)



viendo esta estructura haora te queda cargar el modelo para eso que me imagino debes saber,tambien debes saber los eventos del front controller, metodos o mejor dicho sobre escribir algunos metodos _init como por ejemplo el que sale en el quickstart


Código PHP:
 protected function _initAutoload()
    {
        
$autoloader = new Zend_Application_Module_Autoloader(array(
            
'namespace' => 'Default',// este espacio es default osea depende
 
de que carpeta quieres guardar el modelo por ejemplo supogamos 
una carpeta que se llame tercerosmodelitos entoces cambias el value donde
 dice 
Default por  tercerosmodelitos
            
'basePath'  => dirname(__FILE__),//este se deja igual a menos que estes trabajando por modulos 
        
));
        return 
$autoloader;//esto se queda igual 
    

luego te vas al mapper o mejor dicho modelo o la clase que tienes guardada en la
carpeta models que ojo tambien puedes derivar de zend db table
abstracs y se te acorta mucho el trabajo de mapeo que tambien
simplemente la usas como lo hacen en symfony que para
escribir metodos de consulta abstractos.

ademas es recomendable usar las clases que hereden
de zend_db_table_abstrac o zend_db_table como
clases abstracts solo para consulta, pero claro eso depende del programador....

ok haora te vas al modelo te has fijado que cuando creas un mapper o un modelo

Código PHP:

class Default_Models_Personasnatural extends Zend_Db_Table
/{

/*es algo asi, fijate en la parte que dice default esa parte la pusist 
en la clase del front controller, en el metodo __initautoloa...... 
en la parte de 'namespace'=>"Default", 
osea que esto es una regla para cuando vallas a helpers 
y formularios ojo no se usa el mismo metodo que usaste para 
cargar el modelo para form y helpers es otro.


Por otra parte fijate el lado que dice Models esto se refiere a la carpeta models 
asi que esto tambien se aplica cuando vallas a crear formularios y helpers 
por ejemplo en este caso es la carpeta models, pero si fuera helpers 
seria Helpers porque la carpeta no se llama helper sino Helpers ojo
 con eso "case sensitive en todos lados"  
*/

en el caso de ser un mapper debes ponerlo asi por ejemplo
Código PHP:
class Default_Model_GuestbookMapper{


ojo no es lo mismo un mapper a esto


Código PHP:
class Default_Model_Guestbook{



porque esta te hace los setters y los guetters como lo hace symfony
y la anterior a esa tiene los metodos de guardado,borrado,consulta, edicion y busqueda, lo cierto es que una no puede vivir si la otra

espero que me hayas entendido esta locura lo demas te lo dejo a tu imaginacion
  #11 (permalink)  
Antiguo 14/09/2009, 08:16
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Empezando con Zend Framework 1.9.2

Me refiero a que tu en el foreach tratas de leer la clase clientes como si fuera un array, y esta no lo es, si pudieras publicar el código de tu clase Cliente para ver como lo tienes implementada te podría decir como leer sus valores.

Saludos.,
  #12 (permalink)  
Antiguo 22/09/2009, 21:11
 
Fecha de Ingreso: febrero-2009
Mensajes: 5
Antigüedad: 15 años, 2 meses
Puntos: 0
Respuesta: Empezando con Zend Framework 1.9.2

hola gabyweb, como bien dice GatorV cada elemento de tu array es un objeto cliente, por lo que no deberias accederlos como array, sino llamando a sus métodos (los que hayas definido en la clase Cliente), en la vista debería quedarte algo asi

<?php foreach ($this->clientes as $cliente): ?>
<tr>
<td><?php echo $this->escape($cliente->getId()) ?></td>
<td><?php echo $this->escape($cliente->getNombre()) ?></td>
<td><?php echo $this->escape($cliente->getApellido()) ?></td>
<td><a href="index.php?controller=index&action=ver&id=<?p hp echo $cliente->getId()?>">Ver</a></td>
</tr>
<?php endforeach; ?>
  #13 (permalink)  
Antiguo 28/09/2009, 13:05
Avatar de gabyweb  
Fecha de Ingreso: enero-2002
Ubicación: Lima
Mensajes: 364
Antigüedad: 22 años, 3 meses
Puntos: 0
Respuesta: Empezando con Zend Framework 1.9.2

Gracias Sergabrod, así funcionó!! mil gracias
__________________
Gaby :adios:
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:51.