Foros del Web » Programando para Internet » PHP »

ayuda sobre asignar orden de productos

Estas en el tema de ayuda sobre asignar orden de productos en el foro de PHP en Foros del Web. buenas tardes. escribo este tema para que me ayuden y me orienten de un problema sobre asignar el orden de los productos. hice un proyecto ...
  #1 (permalink)  
Antiguo 08/01/2011, 14:57
(Desactivado)
 
Fecha de Ingreso: abril-2008
Mensajes: 787
Antigüedad: 16 años
Puntos: 7
ayuda sobre asignar orden de productos

buenas tardes. escribo este tema para que me ayuden y me orienten de un problema sobre asignar el orden de los productos.

hice un proyecto de una venta de muebles. los productos estan clasificados por categorias. las categorias son accesories, dining, living y bedroom.

cada categoria tiene su respectivo producto y estan paginados.

en accesories yo registro productos como muebles, sillas y otros accesorios. estos productos yo los debo agrupar por el orden que debo aisgnarles.

un grupo para sillas, un grupo para muebles y asi.

pero que pasaria si el grupo de sillas que he registrado esta en la pagina 2 ó 3 y yo registro una nueva silla que en este caso perteneceria al grupo de sillas. asi debo agrupar y ordenar en las demas categorias cuando registro nuevos productos.

lo unico que hice es ordenarlos en forma ascendente.

este es mi codigo que ordeno los productos en forma ascendente (por ahora).

Código SQL:
Ver original
  1. $resultado_muebles    = "SELECT gi.idmueble, gi.idcategoria, gi.nombre_mueble, gi.imagen_mueble, gi.imagen_mueble_thb, c.idcategoria, c.url_categoria FROM kh_galeria_imagenes gi, kh_categorias c
  2. WHERE gi.idcategoria = c.idcategoria
  3. AND c.url_categoria = '".$url_categoria."'
  4. ORDER BY gi.idmueble ASC";
  5.                            
  6. $rs_resultado_muebles = mysql_query($resultado_muebles,$cn) OR die(mysql_error());
  7. $num_productos        = mysql_num_rows($rs_resultado_muebles);

mi pregunta es la siguiente:

en mi tabla productos, debo crear un campo orden para asi asignarlos al orden que pertenece o en mi tabla categorias deberia crear el campo.

y como haria para ordenar los productos.

esta es la estructura de mi bd.



por favor solicito su ayuda.

saludos.

Última edición por esaenz22; 08/01/2011 a las 15:06 Razón: correccion.
  #2 (permalink)  
Antiguo 09/01/2011, 04:30
Avatar de repara2  
Fecha de Ingreso: septiembre-2010
Ubicación: München
Mensajes: 2.445
Antigüedad: 13 años, 7 meses
Puntos: 331
Respuesta: ayuda sobre asignar orden de productos

Si lo que quieres es ordenar los productos, entonces el campo va en la tabla de productos.
Lo que comentas sobre la paginación y demás no es un tema de base de datos sino de programación, en principio no tiene que afectarte. Intenta solucionar el diseño de tablas primera.
Tal y como lo planteas, te debería bastar un campo "orden" en la tabla de productos, luego haces order by orden.
Espero que te sirva, saludos
  #3 (permalink)  
Antiguo 09/01/2011, 10:19
(Desactivado)
 
Fecha de Ingreso: abril-2008
Mensajes: 787
Antigüedad: 16 años
Puntos: 7
Respuesta: ayuda sobre asignar orden de productos

gracias por la respuesta repara2. he creado el campo orden en la tabla productos y los he ordenado colocando la clausula ORDER BY gi.orden ASC.

pero ahora se me presento una duda. como dije antes, que pasaria si el grupo de sillas que he registrado esta en la pagina 2 ó 3 y yo registro una nueva silla que en este caso perteneceria al grupo de sillas. asi debo agrupar y ordenar en las demas categorias cuando registro nuevos productos.

en este caso, deberia crear un campo subcategoria en la tabla categorias indicando a que categoria y subcategoria del producto va a pertenecer y el orden claro ?.

lo que mencionaste sobre la estructura de mis tablas. esta mal entonces ?.

que solucion me plantea repara2 ?.

saludos.

Última edición por esaenz22; 09/01/2011 a las 10:20 Razón: correccion.
  #4 (permalink)  
Antiguo 10/01/2011, 04:02
Avatar de repara2  
Fecha de Ingreso: septiembre-2010
Ubicación: München
Mensajes: 2.445
Antigüedad: 13 años, 7 meses
Puntos: 331
Respuesta: ayuda sobre asignar orden de productos

En principio te estás liando con el tema paginación, la paginación es una forma de desplegar los resultados pero esto no tiene nada que ver con las tablas o su estructura.
Tal y como lo planteas, te faltaría al menos una tabla, sería algo así:

Código:
CREATE DATABASE /*!32312 IF NOT EXISTS*/`muebles` /*!40100 DEFAULT CHARACTER SET latin1 */;

USE `muebles`;

/*Table structure for table `categorias` */

DROP TABLE IF EXISTS `categorias`;

CREATE TABLE `categorias` (
  `id_categoria` INT(11) NOT NULL AUTO_INCREMENT,
  `categoria_nombre` VARCHAR(128) DEFAULT NULL,
  PRIMARY KEY (`id_categoria`)
) ENGINE=INNODB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;

/*Data for the table `categorias` */

INSERT  INTO `categorias`(`id_categoria`,`categoria_nombre`) VALUES (1,'Cocina'),(2,'Living'),(3,'Baño');

/*Table structure for table `grupos` */

DROP TABLE IF EXISTS `grupos`;

CREATE TABLE `grupos` (
  `id_grupo` INT(11) NOT NULL AUTO_INCREMENT,
  `id_categoria` INT(11) DEFAULT NULL,
  `grupo_nombre` VARCHAR(128) DEFAULT NULL,
  PRIMARY KEY (`id_grupo`),
  KEY `FK_grupos` (`id_categoria`),
  CONSTRAINT `FK_grupos` FOREIGN KEY (`id_categoria`) REFERENCES `categorias` (`id_categoria`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=INNODB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1;

/*Data for the table `grupos` */

INSERT  INTO `grupos`(`id_grupo`,`id_categoria`,`grupo_nombre`) VALUES (1,1,'Sillas'),(2,1,'Mesas'),(3,2,'Sofas'),(4,3,'Cristalería'),(5,3,'Mesas');

/*Table structure for table `productos` */

DROP TABLE IF EXISTS `productos`;

CREATE TABLE `productos` (
  `id_producto` INT(11) NOT NULL AUTO_INCREMENT,
  `id_grupo` INT(11) DEFAULT NULL,
  `producto_orden` INT(11) DEFAULT NULL,
  `producto_nombre` VARCHAR(128) DEFAULT NULL,
  PRIMARY KEY (`id_producto`),
  KEY `FK_productos` (`id_grupo`),
  KEY `Orden` (`producto_orden`),
  CONSTRAINT `FK_productos` FOREIGN KEY (`id_grupo`) REFERENCES `grupos` (`id_grupo`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=INNODB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;

/*Data for the table `productos` */

INSERT  INTO `productos`(`id_producto`,`id_grupo`,`producto_orden`,`producto_nombre`) VALUES (1,1,1,'Silla cocina rojo standard'),(2,1,2,'Silla cocina verde'),(3,2,3,'Mesa madera');

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
Esta estructura parece más adecuada a lo que planteas.
Cada producto pertenece a un grupo Sillas, Mesas, Accesorios, etc, y tiene un orden dentro de su grupo, lo cual te permite ordenar como quieras. Cada grupo pertenece a una categoría. Así, hay 2 niveles de agrupación / clasificación. Si insertas un producto con orden 5 y el orden 5 ya existe, entonces tienes que reindexar toda la tabla para mover todos los ordenes según corresponda. Esto se hace por código, por PHP no por MySQL.
Claro que esta es mi versión, no conozco el proyecto completo. A ver qué sale, 1 saludo
  #5 (permalink)  
Antiguo 10/01/2011, 10:26
(Desactivado)
 
Fecha de Ingreso: abril-2008
Mensajes: 787
Antigüedad: 16 años
Puntos: 7
Respuesta: ayuda sobre asignar orden de productos

gracias por tu respuesta repara2. como ya no dispongo de tiempo, lo unico que hice es crearel campo orden de mi tabla productos.

en la categoria accesories les he asignado el orden a 1,2,3.. etc. pero me doy con la sorpresa que habia agregado antes un nuevo producto que deberia ir al grupo de muebles, me muestra al ultimo. le puse como primero y aun asi no me aparece primero.

esta es mi consulta que he modificado.

Código PHP:
Ver original
  1. SELECT gi.idmueble, gi.orden, gi.idcategoria, gi.nombre_mueble, gi.imagen_mueble, gi.imagen_mueble_thb, c.idcategoria, c.url_categoria FROM kh_galeria_imagenes gi, kh_categorias c
  2. WHERE gi.idcategoria = c.idcategoria
  3. AND c.url_categoria = 'accsesories'
  4. ORDER BY gi.orden ASC
  #6 (permalink)  
Antiguo 10/01/2011, 15:13
Avatar de repara2  
Fecha de Ingreso: septiembre-2010
Ubicación: München
Mensajes: 2.445
Antigüedad: 13 años, 7 meses
Puntos: 331
Respuesta: ayuda sobre asignar orden de productos

Asegurate que el campo orden es de tipo INT. También es buena idea indexar la tabla por ese campo. Si aún así no aparece en su sitio tendrías que postear la estructura de tabla y algunos datos para poder ayudarte. 1 saludo
  #7 (permalink)  
Antiguo 10/01/2011, 15:53
(Desactivado)
 
Fecha de Ingreso: abril-2008
Mensajes: 787
Antigüedad: 16 años
Puntos: 7
Respuesta: ayuda sobre asignar orden de productos

gracias por la respuesta repara2. anteriormente mi campo orden estaba como tipo char. como lo he cambiado a tipo entero ahora si me ordena los productos en forma ascendente.

y como haria para indexar mi campo en mi tabla productos ?.

ah por cierto, usted tiene un modulo de como asignar orden a los registros en php, asi como joomla que tiene un reporte de articulos y lo ordena de arriba y abajo.

pero en este caso alli tendria que agrupar los productos por categorias.

cuando registre un nuevo producto en la categoria dining donde se agrupan las mesas y sillas, mi pregunta es tendria que modificar la estructura de mi tabla y adaptarla al ejemplo que usted me dio. porque si hago de la manera que usted me dice, me tomaria mas tiempo y elproyecto ya esta avanzado al 95%.

esta es la estructura de mi tabla.



saludos.

Última edición por esaenz22; 10/01/2011 a las 16:06 Razón: correccion.
  #8 (permalink)  
Antiguo 11/01/2011, 02:20
Avatar de repara2  
Fecha de Ingreso: septiembre-2010
Ubicación: München
Mensajes: 2.445
Antigüedad: 13 años, 7 meses
Puntos: 331
Respuesta: ayuda sobre asignar orden de productos

Hola esaenz22, si el proyecto está tan avanzado yo no haría más cambios en las tablas en esta etapa. Parece que lo único que falta es solucionar el re-ordenamiento de productos. No tengo un algoritmo ya hecho para esto pero te puedo hacer alguno con un poco de tiempo. La forma simple de hacer esto sería así:

1. Seleccionar todos los productos
2. Guararlos en un array
3. En la posición X agregar el nuevo producto
4. Guardar en nuevo array

Si puedo te paso un ejemplo más tarde,
saludos
  #9 (permalink)  
Antiguo 11/01/2011, 09:15
(Desactivado)
 
Fecha de Ingreso: abril-2008
Mensajes: 787
Antigüedad: 16 años
Puntos: 7
Respuesta: ayuda sobre asignar orden de productos

gracias por la respuesta repara2. yo esperare.

saludos.
  #10 (permalink)  
Antiguo 12/01/2011, 02:22
Avatar de repara2  
Fecha de Ingreso: septiembre-2010
Ubicación: München
Mensajes: 2.445
Antigüedad: 13 años, 7 meses
Puntos: 331
Respuesta: ayuda sobre asignar orden de productos

Te mando una preliminar que puedes adaptar a tu proyecto. Se trata de leer la tabla origen, guardar los datos, insertar el elemento nuevo, borrar la tabla y reinsertar los elementos ordenador.
<<<<<<<<<<<<<<<<<<< TRABAJA SOBRE UNA TABLA DE PRUEBAS ANTES DE PONERLO EN PRODUCCION <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

Modifica a gusto, espero que te sirva:

Código PHP:
<?php

/**
 * CREAR LA TABLA DE PRUEBAS
 * CREATE TABLE `temp` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `descripcion` VARCHAR(8) DEFAULT NULL,
  `dependencia` CHAR(1) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1;


INSERT  INTO `temp`(`id`,`descripcion`,`dependencia`) VALUES (1,'A','0'),(2,'B','1'),(3,'C','1'),(4,'D','1'),(5,'E','2'),(6,'F','1'),(7,'G','2'),(8,'H','1'),(9,'I','2');
 */

error_reporting(E_ALL);
ini_set("display_errors"1);
mysql_connect("localhost","USER","PASS");
mysql_select_db("bd217754");

/**
 * Inserta un elemento en la posición $xElement y reordena la tabla
 *
 * @param int $xElement
 * @return array
 * @author barcoavenus.blog.com
 */

function reOrder($xElement$xData){


    
$xResponse = array();

    
/**
     * Selecciono todos los elementos de la tabla ordenador por el campo orden
     */
    
$sql "SELECT * FROM temp ORDER BY id;";
    if(!
$query mysql_query($sql)) $xResponse = array("Error en la select: ".mysql_error());

    
/**
     * Agrego el elemento nuevo en la posición correcta
     */
    
foreach ($xData as $key => $value)
    
$xResponse[$xElement][$key] = $value;



    while(
$fetch mysql_fetch_assoc($query)){

        if(
$fetch['id'] == $xElement//Si estamos en el orden que nos interesa
        
{
            
//Insertamos en el elemento actual en la siguiente posición, es decir, desplazado hacia abajo
            
foreach ($fetch as $key => $value)
            
$xResponse[$fetch['id']+1][$key] = ($key=='id'?$fetch['id']+1:$value);
        }
        else { 
//de lo contrario lo dejamos como estaba
            
foreach ($fetch as $key => $value)
            
$xResponse[$fetch['id']][$key] = ($key=='id'?$fetch['id']:$value);
        }

    }
    
/**
     * Ahora $xResponse contiene todos los elementos de la tabla y además en la posición $xElement el elemento indicado
     */

    
mysql_free_result($query);
    
asort($xResponse);

    
/**
     * Borramos la tabla y la regeneramos, utilizo transacciones para evitar perdida de datos
     */
    
mysql_query("BEGIN;");
    if(!
mysql_query("TRUNCATE TABLE temp;")) {echo "Imposible limpiar tabla!: ".mysql_error(); mysql_query("ROLLBACK;"); return false;};
    
$xInsert "";
    
//Generar la sentencia insert
    
foreach ($xResponse as $xInfo){
        
$xSql "INSERT INTO temp (";
        foreach (
$xInfo as $key => $value)
        
$xSql .= "".$key.",";

        
$xSql substr($xSql0, -1); //Quito la coma final
        
$xSql.= ") VALUES (";

        foreach (
$xInfo as $key => $value)
        
$xSql .= "'".$value."',";

        
$xSql substr($xSql0, -1); //Quito la coma final
        
$xSql.= ");";

        
$xInsert .= $xSql;

        if(!
$insert mysql_query($xSql)) {echo mysql_errno().": Imposible insertar filas!: ".mysql_error(); mysql_query("ROLLBACK;"); return false;};
    }

    if(!
mysql_query("COMMIT;")) {echo mysql_errno().": Imposible hacer commit!: ".mysql_error(); mysql_query("ROLLBACK;"); return false;};
    return 
true;
}

/**
 * tabla antes:
 *     id  descripcion  dependencia
------  -----------  -----------
     1  A            0          
     2  B            1          
     3  C            1          
     4  D            1          
     5  E            2          
     6  F            1          
     7  G            2          
     8  H            1          
     9  I            2    
 */

$xData = array(
'id' => '7',
'descripcion' => 'X',
'dependencia' => '2');

if(!
reOrder(7$xData)) die("<h1>No he podido reordenar la tabla!</h1>");
die(
"<h1>Tabla reordenada!</h1>");

/**
 * Tabla después
 *     id  descripcion  dependencia
------  -----------  -----------
     1  A            0          
     2  B            1          
     3  C            1          
     4  D            1          
     5  E            2          
     6  F            1          
     7  X            2          
     8  H            1          
     9  I            2  
     
 */



?>

Etiquetas: asignar, orden, productos
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 18:20.