set_combo_dynamic

edited septiembre 2008 in Principiantes
Estoy siguiendo el libro y no me funciona el set_combo_dynamic.

tengo:

en mysql:
-- phpMyAdmin SQL Dump
-- version 2.9.1.1-Debian-2ubuntu1.1
-- <!-- m --><a class="postlink" href="http://www.phpmyadmin.net">http://www.phpmyadmin.net</a><!-- m -->
--
-- Servidor: localhost
-- Tiempo de generación: 26-01-2008 a las 20:40:39
-- Versión del servidor: 5.0.38
-- Versión de PHP: 5.2.1
--
-- Base de datos: `EjemplosK`
--

--

--
-- Estructura de tabla para la tabla `ciudad`
--

CREATE TABLE `ciudad` (
`id` int(11) NOT NULL auto_increment,
`nombre_ciudad` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;

--
-- Volcar la base de datos para la tabla `ciudad`
--

INSERT INTO `ciudad` (`id`, `nombre_ciudad`) VALUES
(1, 'montevideo'),
(2, 'canelones'),
(3, 'maldonado'),
(4, 'rocha');

--

--
-- Estructura de tabla para la tabla `clientes`
--

CREATE TABLE `clientes` (
`id` int(11) NOT NULL auto_increment,
`nombre` varchar(50) NOT NULL,
`idciudad` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;


En Kumbia:

/var/www/kumbia/models/clientes.php:
<?php
class Clientes extends ActiveRecord {
}
?>

/var/www/kumbia/models/ciudad.php:
<?php
class Ciudad extends ActiveRecord {
}

?>

/var/www/kumbia/controllers/clientescontroller.php:
<?php
class ClientesController extends StandardForm {
public $scaffold = true;
public function __construct(){
$this->set_combo_dynamic('idciudad','ciudad','nombre_ciudad');
}
}
?>

/var/www/kumbia/controllers/ciudadcontroller.php:
?php
class CiudadController extends StandardForm {
}
?>

Cuando en el navegador konqueror o firefox ejecuto:
<!-- m --><a class="postlink" href="http://localhost/kumbia/clientes">http://localhost/kumbia/clientes</a><!-- m -->

obtengo:

KumbiaDBException: Unknown column 'ciudad.idciudad' in 'field list' al ejecutar 'select ciudad.idciudad, nombre_ciudad from ciudad order by idciudad'
Error Code: 1054
En el archivo /var/www/kumbia/forms/db/adapters/mysql.php en la línea: 135
#0 /var/www/kumbia/forms/generator/components.php(287): db->query('select ciudad.i...')
#1 /var/www/kumbia/forms/generator/standard.build.php(161): Component::build_standard_combo(Array, 'idciudad')
#2 /var/www/kumbia/forms/generator/main.php(643): Standard_Generator::build_form_standard(Array)
#3 /var/www/kumbia/forms/controller/standard_form_controller.php(822): Generator::build_form(Array, true)
#4 [internal function]: StandardForm->index()
#5 /var/www/kumbia/kumbia.php(201): call_user_func_array(Array, Array)
#6 /var/www/kumbia/public/index.php(76): Kumbia::main()
#7 {main}

Estoy escribiendo exactamente lo que dice el libro y no obtengo el resultado esperado. Alguien puede darme una mano?

Hasta el use_helper venia bien.

Comentarios

  • para que te funcione las claves foraneas kumbia tiene su convencion especificamente ActiveRecord y es id_nombreTable y tu tienes idnombreTable por eso no la encuentra el deber ser es que tu modelo clientes este asi:

    id_ciudad en vez de idciudad
  • edited 1:48
    la convención es nombretabla_id debería ser ciudad_id.

    O también se puede de las dos formas ???
  • Disculpa me equivoque tienes razón la convención es

    tabla_id
    ciudad_id
  • edited 1:48
    Pues yo tengo el mismo problema... ¿a que debe ser debido?

    he intentado hacerlo cambiando idciudad por ciudad_id tanto en tablas como en use_combo_dynamic y no me funciona tampoco... sigue dando el error:
    Unknown column 'ciudad_id' in 'field list' al ejecutar 'select ciudad.nombre_ciudad, ciudad_id from ciudad order by nombre_ciudad'

    creo que el error está en que ese sql no tiene mucho sentido (ciudad_id pertenece a clientes y no a ciudad...) aunque yo no se demasiado de sql...

    ¿como se añade entonces un combo dinamico?, lo digo por que tampoco he conseguido hacerlo funcionar como viene en el screencast de tienda1...

    una ayuda?
  • Hola si estan inscritos en el grupo de Google hace tiempo publique un ejemplo de como utilizar ajax con unos combos anidados puedes servirle, para descargar el how to ingresa al grupo (debes estar registrado) y reliza una busqueda y colocas exactamente esto " Combos-Dinamicos AJAX" ahi esta el archivo comprimido con el código...

    Éxitos...
  • edited 1:48
    Acabo de ver el ejemplo y tiene muy buena pinta. Lo malo es que si lo hago de esa forma, utilizando
    <? foreach($Reg as $Reg): ?>
    <option value='<?= $Reg->id ?>'><?= $Reg->nombre?>
    <? endforeach; ?>
    para el registro que relaciona mis dos tablas en las vistas, no puedo usar el generador de formularios para el resto de campos, y para que me genere los actualizar, buscar, borrar y demás. Por lo que tendría que hacer a mano todo eso, ¿verdad?

    En el screencast tienda aparece que directamente genera estos formularios con combo y todo, pero no he conseguido hacerlo funcionar de una forma tan facil como ahí aparece... eso es para cuando se acabe la version 0.5? o es que estoy haciendo algo mal? (yo ahora estoy usando 0.47)

    Muchas gracias por la ayuda!
  • Si deseas hacer eso como los screencast no te van a filtrar la info como lo hace el ejemplo que yo realice debes entender los formulario standardForm hacen un trabajo pero no lo hacen todo, ello generan combos que hacen referencia a otras tablas pero estos combos no filtran al momento de seleccionar alguna de sus opciones, si te sirve asi eso esta documentado en el libro...

    Éxitos...
  • edited 1:48
    Deivinson, estoy poniendo exactamente lo que dice el libro, en el ejemplo que da para el set_combo_dynamic.
    No se si te estas confundiendo con los helpers, ya que no se esta viloando ninguna convencion como asi lo indica el libro: "Con esta función podremos crear dinamicamente (sin seguir la convención campo_id del StandardForm) lo mismo que use_helper($campo)".

    En definitiva: ¿esta bien o no el ejemplo del libro?

    Seria bueno para aclarar un poco mas la cosa, se pusiera un ejemplo donde se usara el cuarto parametro column_relation.

    Saludos y gracias

    Daniel
  • edited 1:48
    Hola, no se si llego muchos meses tarde, je je, pues el ejemplo del libro no me funciona, la única forma en la qué sí he podido hacer el combo es poniendo como llave primaria de cada tabla idtabla, al relacionarla con la llave foránea lo logro poniendo el campo de la tabla que voy a relacionar idtabla

    así textualmente por lo que me funciona en el momento de llamarla con
    $this-&gt;set_combo_dynamic($idtabla,$tabla,$campodetalle);
    

    por otra parte no me funciona en absoluto usar el parámetro para column_relation, bueno, no sé si está arreglado en la versión 0.5, por ahora estoy en 0.47

    el ejemplo lo modificaría así:
    create table ciudad (
     idciudad integer not null,
     nombre_ciudad varchar(50) not null,
     primary key(idciudad)
    );
    
    
    create table clientes (
     idclientes integer not null,
     nombre varchar(50) not null,
     idciudad integer not null,
     primary key(idclientes)
    );
    

    ya con eso me funciona ok

    $this->set_combo_dynamic("idciudad","ciudad","nombre_ciudad");
  • bueno esto para las próximas generaciones...

    las tablas en mysql:
    -- 
    -- Estructura para la tabla `grupos_usuarios`
    -- 
    
    CREATE TABLE `grupos_usuarios` (
      `id` smallint(6) NOT NULL auto_increment,
      `nombre` char(15) NOT NULL,
      `notas` tinytext,
      PRIMARY KEY  (`id`),
      UNIQUE KEY `nombre` (`nombre`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;
    
    
    
    -- 
    -- Estructura para la tabla `usuarios`
    -- 
    
    CREATE TABLE `usuarios` (
      `id` smallint(6) NOT NULL auto_increment,
      `nombre` varchar(100) NOT NULL,
      `login` char(8) NOT NULL,
      `password` char(8) NOT NULL,
      `grupos_usuarios_id` smallint(6) NOT NULL,
      `notas` tinytext,
      `estado` enum('ACT','DES') NOT NULL,
      PRIMARY KEY  (`id`),
      UNIQUE KEY `nombre` (`nombre`),
      UNIQUE KEY `login` (`login`),
      KEY `grupos_usuarios_id` (`grupos_usuarios_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;
    
    
    -- 
    -- Filtros para la tabla `usuarios`
    -- 
    ALTER TABLE `usuarios`
      ADD CONSTRAINT `usuarios_ibfk_1` FOREIGN KEY (`grupos_usuarios_id`) REFERENCES `grupos_usuarios` (`id`) ON UPDATE CASCADE;
    

    y la instruccion al detalle...

    //set_combo_dynamic($campo, $tabla, $campoDetalle, “column_relation:$campo”)
    $this-&gt;set_combo_dynamic('grupos_usuarios_id', 'grupos_usuarios', 'nombre','column_relation&#58; id' );
    

    Con esto se crea una lista con los nombres guardados en Grupos de usuario (registros) y los refencia por id para que se puedan guardar la tabla Usuarios

    todo funciona bien, excepto por una cosa. <!-- s:roll: --><img src="{SMILIES_PATH}/icon_rolleyes.gif" alt=":roll:" title="Rolling Eyes" /><!-- s:roll: --> .cuando se solicita un reporte y no se selecciona ningun campo para ordenar por el por defecto asume que es id..pero como se manejan dos tablas implicitas entonces se crea una ambigüedad


    tengo claro que toca revisar el archivo \forms\report\functions.php

    pero todavia no visto la forma de hacerlo correctamente...espero cachaarlo mas tarde....de todos una manita no me caeria mal... <!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D -->

    ...espero qeu les pueda servir a unos cuantos....un abrazo desde la frontera <!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D -->
  • ya lo resolvi editando el archivo en cuestion... voy a reportar el bug y la solucion propuesta...

    Primero que todo el problema se debia que tenia el campo id como oculto en el formulario y por tanto no lo tomaba entonces hice la modificacion en la linea 149 de /forms/report/functions.php


    antes
    if($com&#91;'type'&#93;!='hidden' ){
    

    despues
    if($com&#91;'type'&#93;!='hidden' || $name=='id'){
    

    cuando les pase se deran cuenta de la nota!!!!

    suerte a todos
  • Gracias subiré el cambio al SVN pero para la versión 0.5 la idea es que utilicen esta versión ya la Docs esta casi lista falta unas cositas que deben estar lista hoy mismo pero la idea es utilizar la 0.5 ya que el soporte sera mínimo...
  • bueno esto para las próximas generaciones...

    las tablas en mysql:
    -- 
    -- Estructura para la tabla `grupos_usuarios`
    -- 
    
    CREATE TABLE `grupos_usuarios` (
      `id` smallint(6) NOT NULL auto_increment,
      `nombre` char(15) NOT NULL,
      `notas` tinytext,
      PRIMARY KEY  (`id`),
      UNIQUE KEY `nombre` (`nombre`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;
    
    
    
    -- 
    -- Estructura para la tabla `usuarios`
    -- 
    
    CREATE TABLE `usuarios` (
      `id` smallint(6) NOT NULL auto_increment,
      `nombre` varchar(100) NOT NULL,
      `login` char(8) NOT NULL,
      `password` char(8) NOT NULL,
      `grupos_usuarios_id` smallint(6) NOT NULL,
      `notas` tinytext,
      `estado` enum('ACT','DES') NOT NULL,
      PRIMARY KEY  (`id`),
      UNIQUE KEY `nombre` (`nombre`),
      UNIQUE KEY `login` (`login`),
      KEY `grupos_usuarios_id` (`grupos_usuarios_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;
    
    
    -- 
    -- Filtros para la tabla `usuarios`
    -- 
    ALTER TABLE `usuarios`
      ADD CONSTRAINT `usuarios_ibfk_1` FOREIGN KEY (`grupos_usuarios_id`) REFERENCES `grupos_usuarios` (`id`) ON UPDATE CASCADE;
    

    y la instruccion al detalle...

    //set_combo_dynamic($campo, $tabla, $campoDetalle, “column_relation:$campo”)
    $this-&gt;set_combo_dynamic('grupos_usuarios_id', 'grupos_usuarios', 'nombre','column_relation&#58; id' );
    

    Con esto se crea una lista con los nombres guardados en Grupos de usuario (registros) y los refencia por id para que se puedan guardar la tabla Usuarios

    todo funciona bien, excepto por una cosa. <!-- s:roll: --><img src="{SMILIES_PATH}/icon_rolleyes.gif" alt=":roll:" title="Rolling Eyes" /><!-- s:roll: --> .cuando se solicita un reporte y no se selecciona ningun campo para ordenar por el por defecto asume que es id..pero como se manejan dos tablas implicitas entonces se crea una ambigüedad


    tengo claro que toca revisar el archivo \forms\report\functions.php

    pero todavia no visto la forma de hacerlo correctamente...espero cachaarlo mas tarde....de todos una manita no me caeria mal... <!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D -->

    ...espero qeu les pueda servir a unos cuantos....un abrazo desde la frontera <!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D -->

    Esto sera incluido en la nueva Docs de la versión 0.5 asi que la recomendación es que hagan uso de esta versión! que esta prevista ser publicada esta misma semana o bueno lo que queda de semana

    Gracias!
Sign In or Register to comment.