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

CodeIgniter. Mostrar valor de un array dentro de un modelo

Estas en el tema de CodeIgniter. Mostrar valor de un array dentro de un modelo en el foro de CodeIgniter en Foros del Web. Hola nuevamente.. He creado un modelo para enviar mensajes de Notice , osea, que cuando se envíe un formulario, el usuario vea en pantalla un ...
  #1 (permalink)  
Antiguo 12/10/2010, 11:15
Avatar de rogertm
Mod->Cuba
 
Fecha de Ingreso: julio-2005
Ubicación: /home/Cuba/Habana/rogertm/
Mensajes: 2.922
Antigüedad: 18 años, 9 meses
Puntos: 638
Pregunta CodeIgniter. Mostrar valor de un array dentro de un modelo

Hola nuevamente.. He creado un modelo para enviar mensajes de Notice, osea, que cuando se envíe un formulario, el usuario vea en pantalla un mensaje que diga que el formulario ha sido enviado, y como puede que cada formulario tenga un mensaje diferente, esto es lo que he hecho:

En el modelo:
Código PHP:
Ver original
  1. class Output_msg extends Model{
  2.    
  3.     function Output_msg()
  4.     {
  5.         parent::Model();
  6.     }
  7.    
  8.     function output_msg_notice()
  9.     {
  10.         // Creamos un array que contenga los mensajes de Notice
  11.         $msg_notice = array(
  12.                     'formulario_enviado'    => 'El formulario ha sido enviado',
  13.                     'formulario_otro'        => 'El formulario "otro" ha sido enviado');
  14.        
  15.         return $msg_notice;
  16.     }
  17.    
  18. }
En el controlador tengo lo siguiente:
Código PHP:
Ver original
  1. // Mostramos el mensaje de Formulario Enviado...
  2. $this->load->model('/cpanel/Output_msg');
  3. $msg['msg_form'] = $this->Output_msg->output_msg_notice();
  4. $this->load->view('/cpanel/msg', $msg);
Y en la vista:
Código PHP:
Ver original
  1. <div class='msg'><?php echo $msg_form['formulario_enviado']; ?></div>
Y es aquí donde me enredé, pues pensé que con un simple switch resolvería mi problema, pero me di cuenta de que no tengo hasta ahora, manera de decirle al supuesto bucle switch qué mensaje mostrar dependiendo de lo que yo quiera.

Creo que lo que tengo que hacer es desde el controlador, pasar el valor del array que quiero mostrar en la vista... Ya he intentado varias cosas, pero no me sale nada bien...

Para que se entienda, en la vista debería finalmente tener algo así:
Código PHP:
Ver original
  1. <div class='msg'><?php echo $msg_form['$mensage_a_mostrar']; ?></div>

Saludos y gracias de antemano...
__________________
Friki y Blogger por Cuenta Propia:213
Twenty'em: Theming is Prose
  #2 (permalink)  
Antiguo 12/10/2010, 13:04
Avatar de maturano  
Fecha de Ingreso: enero-2010
Ubicación: /home/
Mensajes: 537
Antigüedad: 14 años, 3 meses
Puntos: 36
Respuesta: CodeIgniter. Mostrar valor de un array dentro de un modelo

... comenzar por mencionar que no he usado CI más que una mirada por encima. Esto porque ahora no me queda claro el cómo es que las variables de la vista son pasadas desde el controlador.

Sin embargo, entendiendo que solo preguntas cómo controlar el mensaje a regresar, que quieres pasar un parámetro desde el controlador ... pues tal como lo dices, podría ser:
Código PHP:
Ver original
  1. class Output_msg extends Model{
  2.    
  3.     function Output_msg()
  4.     {
  5.         parent::Model();
  6.     }
  7.    
  8.     function output_msg_notice($tipo)
  9.     {
  10.         // Creamos un array que contenga los mensajes de Notice
  11.         $msg_notice = array(
  12.                     'formulario_enviado'    => 'El formulario ha sido enviado',
  13.                     'formulario_otro'        => 'El formulario "otro" ha sido enviado');
  14.        
  15.         return $msg_notice[$tipo];
  16.     }
  17.    
  18. }

Código PHP:
Ver original
  1. // Mostramos el mensaje de Formulario Enviado...
  2. $this->load->model('/cpanel/Output_msg');
  3. $msg['msg_form'] = $this->Output_msg->output_msg_notice('formulario_enviado');
  4. $this->load->view('/cpanel/msg', $msg);

Que deberías mostrar que dices que haz intentado, porque esto debió de estar dentro de ello. Igual habrá cosas que no muestras como dicho formulario que debería regresar de algún modo el tipo de mensaje a mostrar.


... Sin embargo , eso solo para hablar de que es posible, pero el planteamiento de tus clases pintan, a mi parecer, mal.

Si bien el modelo podría tener una vista, sería de la representación del propio objeto, no "mensajes hacia el usuario"; en el momento en que piensas así definitivamente no pinta nada bien, es trabajo más de un helper, auxiliar o de controlarlo directamente en la vista. Cuidado con ello.
__________________
I ♥ The Music!
  #3 (permalink)  
Antiguo 12/10/2010, 13:29
Avatar de rogertm
Mod->Cuba
 
Fecha de Ingreso: julio-2005
Ubicación: /home/Cuba/Habana/rogertm/
Mensajes: 2.922
Antigüedad: 18 años, 9 meses
Puntos: 638
Respuesta: CodeIgniter. Mostrar valor de un array dentro de un modelo

Opss... tal vez no me expresé bien al decir mensajes de Notice , pero lo que quería era mostrar un mensaje cada vez que se haya enviado un formulario de inserción de datos a la BD... Y para no crear una vista para cada tipo de mensaje, pues pensé que esta era la mejor forma, y en efecto así lo sigo creyendo...

Gracias maturano, funciona perfectamente de la manera que me has propuesto...

La vista la he terminado así:
Código PHP:
Ver original
  1. <div class='msg'>
  2.     <?php echo $msg_form; ?>
  3.     <?php echo anchor(current_url(), 'Regresar...') ?>
  4. </div>
__________________
Friki y Blogger por Cuenta Propia:213
Twenty'em: Theming is Prose
  #4 (permalink)  
Antiguo 12/10/2010, 15:24
Avatar de maturano  
Fecha de Ingreso: enero-2010
Ubicación: /home/
Mensajes: 537
Antigüedad: 14 años, 3 meses
Puntos: 36
Respuesta: CodeIgniter. Mostrar valor de un array dentro de un modelo

Cita:
Iniciado por rogertm Ver Mensaje
mostrar un mensaje cada vez que se haya enviado un formulario de inserción de datos a la BD...
Y, tal cual tus palabras, esa no debería ser una responsabilidad del modelo. Mostrar un mensaje dependiendo de un evento, ¿no por suena a una actividad de la vista y/o del controlador?.


Cita:
Iniciado por rogertm Ver Mensaje
Y para no crear una vista para cada tipo de mensaje, pues pensé que esta era la mejor forma, y en efecto así lo sigo creyendo...
Y no lo dudo, y funciona, y si te di respuesta --que que bueno que te sirvió-- es porque técnicamente es posible, pero va en contra del patrón MVC.

Como mencioné, solo di una mirada a CI y me pareció, más que un framework, una colección de clases precisamente por ello te lo venden como un framework flexible. Igual no es por echarle la culpa al framework ... con los conceptos bien definidos ...

Como sea, a lo que voy es que CI debería tener helpers, plugins ... o la definición de funciones y/o métodos en la clase. Ya habrá que leer la documentación para entender su arquitectura, pero esto que haces, no me parece adecuado. En todo caso, ¿no puedes declarar un método privado en un controlador?. Algo como:

Código PHP:
Ver original
  1. class Controller
  2. {
  3.     public function action()
  4.     {
  5.         $model = new Model();
  6.         // ...
  7.  
  8.         // .. o try {} catch() {}
  9.         if ($model->save()) {
  10.             $var['msg_result'] = $this->_resultMsg('success');
  11.  
  12.         } else {
  13.             $var['msg_result'] = $this->_resultMsg('fail');
  14.         }
  15.  
  16.         $this->load->view('vista', $var);
  17.     }
  18.  
  19.     private function _resultMsg($event)
  20.     {
  21.         $msgs = array(
  22.             'success' => 'El formulario ha sido enviado',
  23.             'fail'   => 'Hubo un error en el envío del formulario',
  24.         );
  25.  
  26.         return $msgs[$event];
  27.     }
  28. }

Código quizá sin sentido y con el que tampoco estaría de acuerdo, pero creo es mejor alternativa que colocar esta lógica en el Modelo. Incluso, ¿qué no puedes hacer una simple bifurcación en tu vista?; ahora que veo manejas código PHP directo... ¿qué te impide hacer algo como ...

Código PHP:
Ver original
  1. <div class='msg'>
  2.           <?php
  3. if ($form_result) {
  4.     echo'El formulario se ha enviado con éxito';
  5. } else {
  6.     echo 'Error al enviar el formulario';
  7. }
  8.           ?>
  9.           <?php echo anchor(current_url(), 'Regresar...') ?>
  10.       </div>

Y así queda en la vista lo que es de la vista . No sé, repito que, como framework, CI debería tener su "guía de buenas prácticas", pero mientras te enteras y lees sobre el patrón MVC, estas alternativas me parecen, en mi muy humilde opinión, mejor a lo que ahora pretendes.

Mis 2 centavos :-/.
__________________
I ♥ The Music!
  #5 (permalink)  
Antiguo 13/10/2010, 13:20
Avatar de rogertm
Mod->Cuba
 
Fecha de Ingreso: julio-2005
Ubicación: /home/Cuba/Habana/rogertm/
Mensajes: 2.922
Antigüedad: 18 años, 9 meses
Puntos: 638
Respuesta: CodeIgniter. Mostrar valor de un array dentro de un modelo

Primero, nunca había trabajado POO, ni MVC ni Framework alguno... todo esto es nuevito para mi

Cita:
Iniciado por maturano Ver Mensaje
Y, tal cual tus palabras, esa no debería ser una responsabilidad del modelo. Mostrar un mensaje dependiendo de un evento, ¿no por suena a una actividad de la vista y/o del controlador?.
Bueno, según entiendo, el modelo es donde tengo mis datos, ya sea en consultas a la BD o lo que sea... Entonces en este modelo almaceno en un array las posibles respuestas para cada formulario (como si las almacenara en una BD, ¿no?) y las muestro dependiendo de lo que desee o donde necesite. A ver si me puedo explicar mejor, tengo un formulario de inserción de usuario (registros) en la BD, cuando ese formulario es enviado con éxito, muestro un mensaje que dice: El usuario ha sido insertado correctamente. pero puedo tener otro formulario que es para ingresar documentos y en este mostraría uno que diga: El documento ha sido guardado correctamente.

Lo que persigo es personalizar un poco el asunto, pues todo esto es para un sistema de gestión de documentos que tengo que hacer en mi trabajo, y todos estos formularios son parte de un back-end que lo usarían las personas encargadas de llenar la BD para que los usuarios finales (público en general) accedan a ellos en el front-end...

Cita:
Iniciado por maturano Ver Mensaje
Como sea, a lo que voy es que CI debería tener helpers, plugins ... o la definición de funciones y/o métodos en la clase. Ya habrá que leer la documentación para entender su arquitectura, pero esto que haces, no me parece adecuado. En todo caso, ¿no puedes declarar un método privado en un controlador?. Algo como:

Código PHP:
Ver original
  1. class Controller
  2. {
  3.     public function action()
  4.     {
  5.         $model = new Model();
  6.         // ...
  7.  
  8.         // .. o try {} catch() {}
  9.         if ($model->save()) {
  10.             $var['msg_result'] = $this->_resultMsg('success');
  11.  
  12.         } else {
  13.             $var['msg_result'] = $this->_resultMsg('fail');
  14.         }
  15.  
  16.         $this->load->view('vista', $var);
  17.     }
  18.  
  19.     private function _resultMsg($event)
  20.     {
  21.         $msgs = array(
  22.             'success' => 'El formulario ha sido enviado',
  23.             'fail'   => 'Hubo un error en el envío del formulario',
  24.         );
  25.  
  26.         return $msgs[$event];
  27.     }
  28. }
Yep... me toca leer a profundidad la documentación, pero como te he dicho, esta es mi primera vez y no lo puedo aprender todo el mismo día...

En cuanto a crear un método en el controlador, lo pensé, pero me di cuenta que voy a necesitar de estos mensajes en varios formularios o lo que es igual, en varios controladores, es por eso que decidí usar un modelo y acceder a él cada vez que lo necesite, no sé si me captas la idea ahora

Cita:
Iniciado por maturano Ver Mensaje
Código quizá sin sentido y con el que tampoco estaría de acuerdo, pero creo es mejor alternativa que colocar esta lógica en el Modelo. Incluso, ¿qué no puedes hacer una simple bifurcación en tu vista?; ahora que veo manejas código PHP directo... ¿qué te impide hacer algo como ...

Código PHP:
Ver original
  1. <div class='msg'>
  2.           <?php
  3. if ($form_result) {
  4.     echo'El formulario se ha enviado con éxito';
  5. } else {
  6.     echo 'Error al enviar el formulario';
  7. }
  8.           ?>
  9.           <?php echo anchor(current_url(), 'Regresar...') ?>
  10.       </div>
Y es justo eso lo que no quiero, hacer una vista para cada mensaje de formulario enviado con éxito, lo guardo todo en el modelo, lo manejo con el controlador (individual para cada formulario) y lo muestro siempre usando una sola vista... ¿O no?

Cita:
Iniciado por maturano Ver Mensaje
Mis 2 centavos :-/.
Ya no puedo karmarte más

Gracias por todo...
__________________
Friki y Blogger por Cuenta Propia:213
Twenty'em: Theming is Prose
  #6 (permalink)  
Antiguo 14/10/2010, 20:20
Avatar de maturano  
Fecha de Ingreso: enero-2010
Ubicación: /home/
Mensajes: 537
Antigüedad: 14 años, 3 meses
Puntos: 36
Respuesta: CodeIgniter. Mostrar valor de un array dentro de un modelo

Cita:
Iniciado por rogertm Ver Mensaje
Bueno, según entiendo, el modelo es donde tengo mis datos, ya sea en consultas a la BD o lo que sea... Entonces en este modelo almaceno en un array las posibles respuestas para cada formulario (como si las almacenara en una BD, ¿no?)
Muchos limitan el modelo a eso, pero no es así.

Un modelo es una entidad para tu aplicación, un concepto, un objeto que deberás tratar. Dices estás desarrollando un sistema de gestión de documentos, entonces un "documento" será un model, un "usuario" que creará ese documento será otro modelo, un "almacen" quizá podría ser otro modelo; entidades para tu aplicación. Un "mensaje" no es un modelo, para la solución de un problema en tu aplicación no es significativo, no es una entidad.

La parte de la persistencia --el acceso a una base de datos-- es independiente. Aunque lo común es que la información vaya a una BD no debes pensar que es así; la utilización de tu modelo debe ser transparente del medio de almacenamiento, que igual puede ser archivos planos, XML, JSON, etc. La persistencia es asunto aparte, no por ir a parar la información a una BD tiene que ser un modelo.



Cita:
Iniciado por rogertm Ver Mensaje
tengo un formulario de inserción de usuario (registros) en la BD, cuando ese formulario es enviado con éxito, muestro un mensaje que dice: El usuario ha sido insertado correctamente. pero puedo tener otro formulario que es para ingresar documentos y en este mostraría uno que diga: El documento ha sido guardado correctamente.
Primero, del trato de formulario dependen de el framework que utilices, pero sí pueden ser considerados "algo especial". Básicamente son parte de la vista, son elementos HTML al fin y al cabo que deben ser presentados en pantalla, pero por otro lado igual podría tener información relacionada con el modelo por crear campos dependientes de sus atributos y que pueden contener responsabilidades como la validación de información.

Sin embargo, el formulario como tal NO ES el encargado de guardar la información y, en todo caso el formulario podría estar relacionado con el modelo. Lo que tu planteaste inicialmente es crear un modelo para manejar los mensajes; es a eso lo que digo no creo sea buena práctica.


Cita:
Iniciado por rogertm Ver Mensaje
En cuanto a crear un método en el controlador, lo pensé, pero me di cuenta que voy a necesitar de estos mensajes en varios formularios o lo que es igual, en varios controladores, es por eso que decidí usar un modelo y acceder a él cada vez que lo necesite, no sé si me captas la idea ahora
La idea la entiendo y no duplicar código es bueno y es una objetivo de la orientación a objetos. Yo solo te digo que no por ello debes crear un modelo; habrá otras maneras de evitar la duplicación de código. Por lo que te leo me suena a que es información más relacionada al formulario que al modelo, y así sin más te diría que puedes crear constantes dentro de tu formulario. Si conociera CI quizá podría decirte más ... y sí, leer leer y leer es lo que hace falta .. a ambos .

__________________
I ♥ The Music!

Etiquetas: modelo, php
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 01:47.