Foros del Web » Programando para Internet » PHP »

crear select con programacion orientado a objetos

Estas en el tema de crear select con programacion orientado a objetos en el foro de PHP en Foros del Web. Hola amigos nuevamente, tengo este codigo lo e recontra revisado pero hasta el momento no veo cual es el error weno lo que imprime es ...
  #1 (permalink)  
Antiguo 01/03/2011, 00:38
 
Fecha de Ingreso: octubre-2009
Mensajes: 21
Antigüedad: 14 años, 7 meses
Puntos: 0
crear select con programacion orientado a objetos

Hola amigos nuevamente, tengo este codigo lo e recontra revisado pero hasta el momento no veo cual es el error weno lo que imprime es frutas:y un combo vacio nada mas, realmente me gustaria que me ayudaran a vieran donde esta este error.

<?php //archivo se llama clases.php

class Select extends Element{
protected $options;

public function _construct(){
parent::_construct();
$this->options=array();
}

public function creaOption($option){
$this->options[]=$option;
}

private function traeOptions(){
return (array)$this->options;
}

public function render(){
echo $this->traeLabel().":<br/>\n";
echo "<select name=\"".$this->traeName()."\">\n";
foreach ($this->traeOptions() as $opt){
echo $opt->render();
//echo $this->traeOptions();
}
echo "</select>";
}
}

class Option extends Element{

public function _construct($value,$label){
parent::_construct();
$this->creaValue($value);
$this->creaLabel($label);
}

public function render(){

echo "<option value=\"".$this->traeValue()."\">".$this->traeLabel()."</option>\n";
}
}

class Element{
private $name;
private $value;
private $label;

public function _construct(){ }

public function creaName($name){
$this->name=$name;
}

public function traeName(){
return $this->name;
}

public function creaValue($value){
$this->value=$value;
}

public function traeValue(){
return $this->value;
}

public function creaLabel($label){
$this->label=$label;
}

public function traeLabel(){
return $this->label;
}

}
?>

<?php

include ('clases.php');

$frutas=new Select();
$frutas->creaLabel('Frutas');
$frutas->creaName('frut_sel');
$frutas->creaOption(new Option('Naranjas','Naranjas'));
$frutas->creaOption(new Option('Fresas','Fresas'));
$frutas->creaOption(new Option('Piñas','Piñas'));
$frutas->creaOption(new Option('Plátanos','Plátanos'));
$frutas->creaOption(new Option('Manzanas','Manzanas'));
$frutas->render();

?>


ojala que me ayuden con esto.
  #2 (permalink)  
Antiguo 01/03/2011, 01:14
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: crear select con programacion orientado a objetos

Hay varias cosas a corregir, algunas conceptuales y otras de codigo.

Dentro de las conceptuales: Estas creando una clase que solamente te permitira agregar un elemento por cada instancia. No tiene mucha utilidad, tal vez estas practicando o haciendo una tarea, pero ni como ejercicio lo veo viable.

De codigo (y tambien conceptual):
Código PHP:
Ver original
  1. // El metodo admite solo un parametro:
  2. public function creaOption($option){
  3. $this->options[]=$option;
  4. }
  5.  
  6. // Sin embargo, al agregar una nueva opcion, creas otro objeto... con que objeto?
  7. $frutas->creaOption(new Option('Naranjas','Naranjas'));

Tal vez seria mas conveniente algo como:
Código PHP:
Ver original
  1. public function creaOption($index, $caption){
  2.     $this->options[$index]=$caption;
  3. }
  4.  
  5. // Y al crear cada opcion:
  6. $frutas->creaOption('naranjas','Naranjas');
  7.  
  8. // Despues, al mostrarlas:
  9. foreach($this->options as $index => $caption) {
  10.     echo "<option value=\"$index\">$caption</option>\n";
  11. }

Finalmente, dentro del metodo render, haces:
echo $opt->render();

Creo que esto terminaria en un ciclo infinito.
__________________
- León, Guanajuato
- GV-Foto
  #3 (permalink)  
Antiguo 01/03/2011, 09:58
 
Fecha de Ingreso: octubre-2009
Mensajes: 21
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: crear select con programacion orientado a objetos

gracias por el codigo.. pero no entiendo unas cosas en q parte va el foreach en q clase o q se estaria modificando... y tambien la parte de $opt->render(); en q parte lo pongo o q parte es la q se tiene q modificar .
  #4 (permalink)  
Antiguo 01/03/2011, 17:12
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: crear select con programacion orientado a objetos

En realidad lo que esta mal es que te falta un "_" en los constructores, tenes _construct cuando deberia ser __construct.
Y tendrias que revisar varias cosas pero te sugiero que no hagas echo's, simplemente en render concatena y retorna la cadena, para imprimir llama a render en el __toString, algo asi:
Código PHP:
Ver original
  1. abstract class Element
  2. {
  3.     ...
  4.     abstract public function render();
  5.  
  6.     public function __toString()
  7.     {
  8.         return $this->render();
  9.     }
  10. }
  11.  
  12. class Select extends Element
  13. {
  14.     ...
  15.     public function render()
  16.     {
  17.         $html  = $this->traeLabel();
  18.         $html .= "<select name=" . $this->traeName() . ">";
  19.         foreach ($this->traeOptions() as $opt) {
  20.             $html .= $opt->render();
  21.         }
  22.         $html .= "</select>";
  23.         return $html;
  24.     }
  25. }

obviamente el render de option no imprime sino que retorna el string concatenado, luego para utilizar:

Código PHP:
Ver original
  1. $frutas= new Select();
  2. $frutas->creaLabel('Frutas');
  3. $frutas->creaName('frut_sel');
  4. $frutas->creaOption(new Option('Naranjas','Naranjas'));
  5. $frutas->creaOption(new Option('Fresas','Fresas'));
  6. echo $frutas;

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)

Etiquetas: objetos, orientado, programacion, select
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 10:30.