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

consulta con zendframework sin "models"

Estas en el tema de consulta con zendframework sin "models" en el foro de Zend en Foros del Web. Por empezar decir que soy muy novato, y acabo de empezar con el zend. buenas me gustaria saber como hacer consultas, sin tener que utilizar ...
  #1 (permalink)  
Antiguo 02/05/2009, 04:50
 
Fecha de Ingreso: abril-2008
Mensajes: 144
Antigüedad: 15 años, 11 meses
Puntos: 1
Pregunta consulta con zendframework sin "models"

Por empezar decir que soy muy novato, y acabo de empezar con el zend.
buenas me gustaria saber como hacer consultas, sin tener que utilizar la clase models, ahora lo hago con el siguiente ejemplo y me gustaria poder hacer y manejar los querys, y passar variables en las consultas.

mi ejemplo:
estamos en el indexcontroller, con la funcion suma,que quiero hacer una consultas a la bD
por lo tanto mi direcion public/index/suma

mi duda:
tengo esta funcion que muestra todos los artistas de la base dedatos, ahora esta comentado lo que si me funciona. El album.php que esta en la carpeta models, me gustaria no usarlo, y hacerlo con la funcion de más abajo"load_all_artist", como lo haria? y como la llamo desde la funcion sumaAction? luego para recojerlo en suma.phtml.... pongo mas abajo nose si estaria bien, gracias

Código PHP:
function sumaAction()
    {
    $this->view->title = "Suma actions: consulta BD";

        /*en lugar de usar esta clase que tengo en models"album.php",
         usar la funcion de más abajo,load_all_artist()
         _______________________
          "album.php" ......
            <?php
            
class Album extends Zend_Db_Table
                    
{
                    protected 
$_name 'album';
                    }
        
_______________________
        
        $this
->view->title "My Albums";
        
$album = new Album();
        
$this->view->albums $album->fetchAll();
        */
    
//aqui llamariamos a la funcion load_all_artist
    //$this->view->load_all_artist();



    
$this->render();

    }
    private function 
load_all_artist() {
            
$query  "SELECT * FROM Album ";
            
$query .= " WHERE active='1' ";

            
$result mysql_query($query);
            if (!
$result) {
                
error_log("Loading All Category: " mysql_error());
            } else {
                
$results = array();
                while (
$row mysql_fetch_assoc($result)) {
                    
$line = array();
                    
$line['title'] = $row['title'];
                    
$line['artist'] = $row['artist'];
                    
$line['actiu'] = $row['active'];
                    
//$line['link'] = '/browse/category/?id=' . $row['id'];

                    
$results[] = $line;
                }
            }

            return 
$results;
        }


mi suma.phtml

Código PHP:

<?php echo $this->render('header.phtml'); ?>
<h1><?php echo $this->escape($this->title); ?></h1>
<p><a href="<?php echo $this->baseUrl?>/index/add">Add new album</a></p>
<p><a href="<?php echo $this->baseUrl?>/index/delete">Delete album</a></p>
<p><a href="<?php echo $this->baseUrl?>/index/edit">Edit new album</a></p>
<p><a href="<?php echo $this->baseUrl?>/index/suma">PaginaprovaBD</a></p>
<table>
<tr>
<th>Title</th>
<th>Artist</th>
<th>active</th>
<th>&nbsp;</th>
</tr>
<?php foreach($this->albums as $album) : ?>
<tr>
<td><?php echo $this->escape($album->title);?></td>
<td><?php echo $this->escape($album->artist);?></td>
<td><?php echo $this->escape($album->active);?></td>
<td>
<a href="<?php echo $this->baseUrl?>/index/edit/id/<?php
echo $album->id;?>">Edit</a>
<a href="<?php echo $this->baseUrl?>/index/delete/id/<?php
echo $album->id;?>">Delete</a>
</td>
</tr>
<?php endforeach; ?>
</table>
<?php echo $this->render('footer.phtml'); ?>
muchas gracias!

Última edición por bellleti; 02/05/2009 a las 04:54 Razón: falta de cosillass
  #2 (permalink)  
Antiguo 02/05/2009, 07:13
Avatar de Covids0020  
Fecha de Ingreso: septiembre-2003
Ubicación: España
Mensajes: 217
Antigüedad: 20 años, 5 meses
Puntos: 1
Respuesta: consulta con zendframework sin "models"

Perdona... no he entendido del todo porqué quieres hacer esto pero bueno. No es una solución pero si estás haciendo esto:

Código PHP:
$this->view->load_all_artist(); 
No puede funcionar ya que es un método del controlador $this-> no de la vista $this->view, a no ser que lo hayas asignado antes así.
Es decir, sería:
Código PHP:
$this->load_all_artist(); 
Y, por cierto, solo una recomendación de acuerdo a los estándares de Zend, deberías anteponer a los atributos y métodos el guión bajo si son restringidos: protected o private. Son buenas costumbres eh? ;)
Código PHP:
private function _load_all_artist() {} $this->_load_all_artist(); 
Más cosas
No sé si has cogido el modelo de datos de algún lado... pero oye, los modelos de datos, bueno la lógica de negocio dicen, se supone que te los debes de crear tú.
Es decir, en models se usan objetos que represntan los datos, ya sean DB, tablas, etc... esto lo provee Zend y es... bufff, no usarlo es bastante ilógico pero bueno. En cualquier caso representan o suelen representar los datos en bruto.

En tu lógica de negocio, coges estos objetos y obtienes de ellos lo que te interese. Normalmente, si usas una DB puedes usar también los propios de Zend pero vamos.... que puedes crear 20.000 tipos de consultas diferentes en tu lógica. Simplemente se trata de usar la interfaz que Zend ya incorpora y que te ahorra, además de trabajo, disgustos y demás.

Es decir:
Este método, debería estar en tu lógica de negocio aplicada a los autores:

Código PHP:
Ver original
  1. // Autors.php
  2. // class Model_Albums {}
  3. public function load_all_artist() {
  4. /**
  5.  * Aquí deberías usar la propia interfaz de Zend pero como digo
  6.  * yo aún no la he usado y no pongo nada.
  7.  * Por ejemplo:
  8.  * $query  = "SELECT * FROM Album ";
  9.  * Esto ya lo hace Zend con... un $this->_tabla
  10.  * (que debería ser el objeto que representa tu tabla)
  11.  * $this->_table->select();
  12.  * Y así el resto. Repito que no sé, aún no lo he usado.
  13.  */
  14.             $query  = "SELECT * FROM Album ";
  15.             $query .= " WHERE active='1' ";
  16.  
  17.             $result = mysql_query($query);
  18.             if (!$result) {
  19.                 error_log("Loading All Category: " . mysql_error());
  20.             } else {
  21.                 $results = array();
  22.                 while ($row = mysql_fetch_assoc($result)) {
  23.                     $line = array();
  24.                     $line['title'] = $row['title'];
  25.                     $line['artist'] = $row['artist'];
  26.                     $line['actiu'] = $row['active'];
  27.                     //$line['link'] = '/browse/category/?id=' . $row['id'];
  28.  
  29.                     $results[] = $line;
  30.                 }
  31.             }
  32.  
  33.             return $results;
  34.         }

Y luego simplemente:
Código PHP:
Ver original
  1. $this->_model = new Model_Albums();
  2. $this->view->albums = $this->_model->load_all_artist();

Pero vamos... fetchAll() no hace precisamente eso???
Es que aún no he usado Zend_DB, uso XML actualmente, pero imagino que retorna todas las filas igual que haces tú.
Luego al resultado ya le aplicas el formateo que prefieras.... ¿no?


¿...o hay algún otro extraño motivo para no usar los modelos? oO
__________________
"La sabiduría comienza donde acaba el conocimiento". Yaris.
http://www.culturadigital.org

Última edición por Covids0020; 02/05/2009 a las 07:36
  #3 (permalink)  
Antiguo 02/05/2009, 07:58
 
Fecha de Ingreso: abril-2008
Mensajes: 144
Antigüedad: 15 años, 11 meses
Puntos: 1
Desacuerdo Respuesta: consulta con zendframework sin "models"

buenas Covids y muchas gracias!!! la question es que pronto tengo que actualizar una nueva aplicacion que no usa la estructura de "models" y usa funciones muy parecidas a la que he puesto de "load_all_Artist". por eso nose como lo hace... :(

ahora mismo tengo

Código PHP:
function sumaAction()
    {
    
$this->view->title "Suma actions: consulta BD";

        
$this->view->title "My Albums";

        
$album = new Album();
        
$this->_load_all_artist();
        
$this->view->albums _load_all_artist();

    
$this->render();

    }
    private function 
_load_all_artist() {
            
$query  "SELECT * FROM Album ";
            
$query .= " WHERE active='1' ";

            
$result mysql_query($query);
            if (!
$result) {
                
error_log("Loading All Category: " mysql_error());
            } else {
                
$results = array();
                while (
$row mysql_fetch_assoc($result)) {
                    
$line = array();
                    
$line['title'] = $row['title'];
                    
$line['artist'] = $row['artist'];
                    
$line['actiu'] = $row['active'];
                    
//$line['link'] = '/browse/category/?id=' . $row['id'];

                    
$results[] = $line;
                }
            }

            return 
$results;
        } 
y me aparecen los siguentes errores:

Warning: mysql_query() [function.mysql-query]: Access denied for user 'ODBC'@'localhost' (using password: NO) in C:\wamp\www\ZendFrame\application\controllers\Inde xController.php on line 134

Warning: mysql_query() [function.mysql-query]: A link to the server could not be established in C:\wamp\www\ZendFrame\application\controllers\Inde xController.php on line 134

Notice: Undefined variable: results in C:\wamp\www\ZendFrame\application\controllers\Inde xController.php on line 150

Fatal error: Call to undefined function _load_all_artist() in C:\wamp\www\ZendFrame\application\controllers\Inde xController.php on line 125

en mi index. tengo el archivo de configuracion config.ini
Zend_Loader::loadClass('Zend_Registry');
Zend_Loader::loadClass('Zend_Db');
Zend_Loader::loadClass('Zend_Db_Table');
// load configuration
$config = new Zend_Config_Ini('../application/config.ini', 'general');
$registry = Zend_Registry::getInstance();
$registry->set('config', $config);
// setup database
$db = Zend_Db::factory($config->db->adapter,$config->db->config->toArray());
Zend_Db_Table::setDefaultAdapter($db);



PD: cuando dices esto : Y, por cierto, solo una recomendación de acuerdo a los estándares de Zend, deberías anteponer a los atributos y métodos el guión bajo si son restringidos: protected o private. Son buenas costumbres eh? ;)
- perdon mi ignorancia, pero lo desconocia...

oye y gracias por echarme un cable!! :)
  #4 (permalink)  
Antiguo 02/05/2009, 08:27
Avatar de Covids0020  
Fecha de Ingreso: septiembre-2003
Ubicación: España
Mensajes: 217
Antigüedad: 20 años, 5 meses
Puntos: 1
Respuesta: consulta con zendframework sin "models"

Uf... a ver, vamos por partes:

Primero de todo: Creo que aunque no tengas la misma estructura de una aplicación Zend, digamos estándar, igualmente puedes aplicar el patrón MVC. La forma en que cargues tus modelos supongo que da un poco igual.

---
Esto está mal y te está dando errores:
Código PHP:
$album = new Album();
$this->_load_all_artist();
$this->view->albums _load_all_artist(); 
Sería:

Código PHP:
$album = new Album();
$this->view->albums $this->_load_all_artist(); 
Es el método de alguna instancia, en este caso esta misma, el controlador.
$this->_load_all_artist(); sin asignar solo produciría lo que retornara, en el mismo controlador. Y no entiendo para que sirve la instancia de Album();
_load_all_artist(); no es nada, si estás diseñando en POO, tienes pensar en Objetos, con atributos y métodos.

Si por el contrario estás usando dicha instancia y load_all_artist es un método de Album(), deberías hacerlo así:
Código PHP:
$album = new Album();
$this->view->albums $album->_load_all_artist(); 
No puedes hacer esto sin haberte conectado:
Código PHP:
$query  "SELECT * FROM Album ";
$query .= " WHERE active='1' ";
$result mysql_query($query); 
que es lo que te está diciendo en los errores del IndexController de las líneas 134.

Por eso, ...por estas cosas hay que ser coherente sobre si usas un sistema, un framework o no. Es decir, si no vas a usar Zend_DB usa tu propio sistema que te garantice una conexión, una selección no errónea, una gestión de errores... que es lo que hace Zend.
Pero usar todo esto mezclado ggg, bufff, es que es un pollo tío.

¿Porqué no pones el IndexController al completo?

Por cierto, no me mola echar un cable a usuarios Windows :P
__________________
"La sabiduría comienza donde acaba el conocimiento". Yaris.
http://www.culturadigital.org
  #5 (permalink)  
Antiguo 03/05/2009, 17:04
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: consulta con zendframework sin "models"

Tema trasladado desde PHP
  #6 (permalink)  
Antiguo 05/05/2009, 03:26
 
Fecha de Ingreso: abril-2008
Mensajes: 144
Antigüedad: 15 años, 11 meses
Puntos: 1
Pregunta Respuesta: consulta con zendframework sin "models"

buenas GatorV, nose si me puedes ayudar con este tema, ya que he visto que has contestado muchas respuestas de zendframework.

como puedo aplicar esta funcion?"function _load_all_artist()" sin usar Zend_tables ni nada de eso ("models). te paso la funcion, y mi estructura ok? a ver que opinas, ya que hace dias que me estoy peleando y no me sale :(. ( novato novato )

la funcion: quiero llamar a "private function _load_all_artist()" desde sumaAction()--) una funcion dentro de mi indexcontroller.php

Código PHP:
function sumaAction()
    {
    
$this->view->title "Suma actions: consulta BD";

        
$this->view->title "My Albums";

      
//  $album = new Album();
     //   $this->_load_all_artist();
       // $this->view->albums = _load_all_artist();

    
$this->render();

    }
    private function 
_load_all_artist() {
            
$query  "SELECT * FROM Album ";
            
$query .= " WHERE active='1' ";

            
$result mysql_query($query);
            if (!
$result) {
                
error_log("Loading All Category: " mysql_error());
            } else {
                
$results = array();
                while (
$row mysql_fetch_assoc($result)) {
                    
$line = array();
                    
$line['title'] = $row['title'];
                    
$line['artist'] = $row['artist'];
                    
$line['actiu'] = $row['active'];
                    
//$line['link'] = '/browse/category/?id=' . $row['id'];

                    
$results[] = $line;
                }
            }

            return 
$results;
        } 
y luego nose el suma.phtml como tendria que quedar... el que tengo ahora era usando Zend_tables
suma.phtml--)dentro de views/scripts/index/suma.phtml

Código PHP:

<?php echo $this->render('header.phtml'); ?>
<h1><?php echo $this->escape($this->title); ?></h1>
<p><a href="<?php echo $this->baseUrl?>/index/add">Add new album</a></p>
<p><a href="<?php echo $this->baseUrl?>/index/delete">Delete album</a></p>
<p><a href="<?php echo $this->baseUrl?>/index/edit">Edit new album</a></p>
<p><a href="<?php echo $this->baseUrl?>/index/suma">PaginaprovaBD</a></p>
<table>
<tr>
<th>Title</th>
<th>Artist</th>
<th>active</th>
<th>&nbsp;</th>
</tr>
<?php foreach($this->albums as $album) : ?>
<tr>
<td><?php echo $this->escape($album->title);?></td>
<td><?php echo $this->escape($album->artist);?></td>
<td><?php echo $this->escape($album->active);?></td>
<td>
<a href="<?php echo $this->baseUrl?>/index/edit/id/<?php
echo $album->id;?>">Edit</a>
<a href="<?php echo $this->baseUrl?>/index/delete/id/<?php
echo $album->id;?>">Delete</a>
</td>
</tr>
<?php endforeach; ?>
</table>
<?php echo $this->render('footer.phtml'); ?>
te paso mi index.php por si quieres ver que falta algun modulo.los parametros de la BD lo hago con el config.ini (application/config.ini', 'general')

index.php
dentro de public.

Código PHP:
<?php
error_reporting
(E_ALL|E_STRICT);
date_default_timezone_set('Europe/London');
set_include_path('.' PATH_SEPARATOR '../library'
PATH_SEPARATOR '../application/models/'
PATH_SEPARATOR get_include_path());
include 
"../library/Zend/Loader.php";
Zend_Loader::loadClass('Zend_Controller_Front');

//El uso de Zend_Config es muy sencillo:
//$config = new Zend_Config_Ini('config.ini', 'section');
//controlaldors addicons per la BD config.ini arciu creat
Zend_Loader::loadClass('Zend_Config_Ini');
Zend_Loader::loadClass('Zend_Registry');
Zend_Loader::loadClass('Zend_Db');
Zend_Loader::loadClass('Zend_Db_Table');


// load configuration
$config = new Zend_Config_Ini('../application/config.ini''general');
$registry Zend_Registry::getInstance();
$registry->set('config'$config);



// setup controller
$frontController Zend_Controller_Front::getInstance();
$frontController->throwExceptions(true);
$frontController->setBaseUrl('/ZendFrame/public');
$frontController->setControllerDirectory('../application/controllers');

// setup database
$db Zend_Db::factory($config->db->adapter,$config->db->config->toArray());
Zend_Db_Table::setDefaultAdapter($db);

// run!
$frontController->dispatch();
muchas gracias! a quien me pueda ayudar :p

Última edición por bellleti; 05/05/2009 a las 03:30 Razón: falta de cositas
  #7 (permalink)  
Antiguo 05/05/2009, 07:43
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: consulta con zendframework sin "models"

Pues tal cual lo tienes solo descomenta la linea: $this->view->albums = $this->_load_all_artist();

Saludos.
  #8 (permalink)  
Antiguo 05/05/2009, 10:51
 
Fecha de Ingreso: abril-2008
Mensajes: 144
Antigüedad: 15 años, 11 meses
Puntos: 1
Respuesta: consulta con zendframework sin "models"

Cita:
Iniciado por GatorV Ver Mensaje
Pues tal cual lo tienes solo descomenta la linea: $this->view->albums = $this->_load_all_artist();

Saludos.
gracias por tu respuesta gatorV!!

me da este error...

Warning: Invalid argument supplied for foreach() in C:\wamp\www\ZendFrame\application\views\scripts\in dex\suma.phtml on line 14
Title Artist active

Warning: mysql_query() [function.mysql-query]: Access denied for user 'ODBC'@'localhost' (using password: NO) in C:\wamp\www\ZendFrame\application\controllers\Inde xController.php on line 133

Warning: mysql_query() [function.mysql-query]: A link to the server could not be established in C:\wamp\www\ZendFrame\application\controllers\Inde xController.php on line 133

Notice: Undefined variable: results in C:\wamp\www\ZendFrame\application\controllers\Inde xController.php on line 149

esto es porque no me carga bien el config.ini?? y no se conecta bien?




saludos! y mil gracias! me lleva dolor de cabeza esta tonteria

Última edición por bellleti; 05/05/2009 a las 10:58
  #9 (permalink)  
Antiguo 05/05/2009, 11:15
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: consulta con zendframework sin "models"

Estos son tus problemas:

Warning: mysql_query() [function.mysql-query]: Access denied for user 'ODBC'@'localhost' (using password: NO) in C:\wamp\www\ZendFrame\application\controllers\Inde xController.php on line 133

Warning: mysql_query() [function.mysql-query]: A link to the server could not be established in C:\wamp\www\ZendFrame\application\controllers\Inde xController.php on line 133

Te esta diciendo que no se pudo conectar al servidor de MySQL, revisa que estes usando los datos correctos para conectarte con el servidor.

Saludos.
  #10 (permalink)  
Antiguo 05/05/2009, 11:35
 
Fecha de Ingreso: abril-2008
Mensajes: 144
Antigüedad: 15 años, 11 meses
Puntos: 1
Respuesta: consulta con zendframework sin "models"

Cita:
Iniciado por GatorV Ver Mensaje
Estos son tus problemas:

Warning: mysql_query() [function.mysql-query]: Access denied for user 'ODBC'@'localhost' (using password: NO) in C:\wamp\www\ZendFrame\application\controllers\Inde xController.php on line 133

Warning: mysql_query() [function.mysql-query]: A link to the server could not be established in C:\wamp\www\ZendFrame\application\controllers\Inde xController.php on line 133

Te esta diciendo que no se pudo conectar al servidor de MySQL, revisa que estes usando los datos correctos para conectarte con el servidor.

Saludos.
los parametros son correctos porque me funcionan con la forma antigua.. eston son los parametros de mi config.ini
esto en index.php
// load configuration
$config = new Zend_Config_Ini('../application/config.ini', 'general');
$registry = Zend_Registry::getInstance();
$registry->set('config', $config);

i esto dentro config.ini

[general]
db.adapter = PDO_MYSQL
db.config.host = localhost
db.config.username = albert
db.config.password = 130383
db.config.dbname = zend

puedo introducir cosas i borrar cosas con el metodo antiguo pero no con este... sera que la conexion se tiene que realizar de otra forma'??
  #11 (permalink)  
Antiguo 05/05/2009, 11: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: consulta con zendframework sin "models"

Si pero mysql_query no detecta esos parametros, ya que esos estan en el config, al tu hacerlo de la forma "antigua" tienes que usar mysql_connect() y manualmente pasarle los datos necesarios.

Saludos.
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 19:56.