Ver Mensaje Individual
  #11 (permalink)  
Antiguo 24/07/2013, 13:01
Avatar de metacortex
metacortex
Viejo demente
 
Fecha de Ingreso: junio-2004
Ubicación: Caracas - Venezuela
Mensajes: 9.027
Antigüedad: 19 años, 11 meses
Puntos: 832
Respuesta: Sacar un array desde un bucle

Disculpen la tardanza amigos. A continuación explico cómo se resolvió el problema:

1) Tal como lo mencioné al principio, necesitaba una referencia para poder enganchar el bucle y, en consecuencia, hacer una iteración que a) formara un array por sí misma y b) englobara los $_POST de cada conjunto de formularios dentro de la nueva clave. La respuesta de Triby -aunque propone un método distinto al que necesitaba- me dio una idea que resultó esencial para lograrlo: se me ocurrió incluir un input type=hidden estático con valor de "1" en el bloque:

Código PHP:
Ver original
  1. function rc_submodelos($c = '0') {
  2.     $html ='
  3.     <fieldset id="bloque-1">
  4.         <input type="hidden" name="rc_referencia_datos[]" value="1" />
  5.         <p><input type="text" name="nombre_'. $c .'" value="" /></p>
  6.         <p><input type="text" name="descripcion_'. $c .'" value="" /></p>
  7.         <p><input type="text" name="precio_'. $c .'" value="" /></p>
  8.     </fieldset>';
  9.  
  10. return $html;
  11. }

2) Luego fue cuestión de lógica en base a lo dicho: hacer una primera iteración "madre" que englobara a las "hijas", devolviendo tantos bloques como existan en la BD (o uno vacío si no hay nada). Como la cosa fue hecha en WordPress, agrego unos comentarios para que no se pierdan de nada:

Código PHP:
Ver original
  1. /*
  2. $datos es un array general que controla todo. Puedo agregar
  3. y quitar elementos sin problemas ni trabajo redundante.
  4. Además los nombres de las claves en la BD salen de aquí
  5. */
  6. $datos = array('nombre' , 'descripcion' , 'precio');
  7.  
  8. /*
  9. get_post_meta() es una función de WordPress equivalente al
  10. que devuelve un array de datos de la misma forma que un SELECT
  11. los parámetros son: ('ID de la entrada' , 'campo a modificar' , 'return = true')
  12. */
  13. $postmeta = get_post_meta($post->ID , '_rc_postmeta' , true);
  14.  
  15. if($postmeta) {
  16.     foreach($postmeta as $k => $v)
  17.         $html .= rc_submodelos('c='. $k);
  18. else
  19.     $html .= rc_submodelos();

3) Para guardar los datos usé esta función. El mismo método del doble bucle:

Código PHP:
Ver original
  1. function rc_guardar_producto() {
  2.     global $post, $datos;
  3.  
  4.     $postmeta = get_post_meta($post->ID , '_rc_postmeta' , true);
  5.  
  6.     $datos_form = array();
  7.  
  8.     foreach($_POST['rc_referencia_datos'] as $clave => $valor) {
  9.         $datos_form[$clave] = array();
  10.  
  11.         foreach($datos_editor as $c => $v)
  12.             $datos_form[$clave][$v] = isset($_POST['rc_datos_'. $v .'_'. $clave]) ? $_POST['rc_datos_'. $v .'_'. $clave] : null;
  13.     }
  14.  
  15.     /*
  16.     update_post_meta() es una versión de WordPress
  17.     que abrevia el INSERT e incluye todos los dispositivos
  18.     de seguridad. Una delicia.
  19.     */
  20.     update_post_meta( $post->ID, '_rc_postmeta', $datos_form );
  21.  
  22. die(); // Requerido por WordPress para ingresar datos vía Ajax
  23. }

4) El resultado fue el esperado. Los datos se ingresan en la BD así:

Código PHP:
Array
(
    [
0] => Array        // Bloque 1
        
(
            [
nombre] => Producto X
            
[descripcion] => Descripción X
            
[precio] => 100
        
)

    [
1] => Array        // Bloque 2
        
(
            [
nombre] => Producto Y
            
[descripcion] => Descripción Y
            
[precio] => 50
        
)

    [
2] => Array       // Bloque 3
        
(
            [
nombre] => Producto Z
            
[descripcion] => Descripción Z
            
[precio] => 50
        
)

Como dice mi abuela, "muerto el perro se acabó la rabia". Finalmente les doy 1000 gracias por la ayuda prestada muchachos. Aunque el código trabaja bien, estaré pendiente de cualquier observación a lo mencionado.

---

PD - Importante: Anímense a entrar de lleno con WordPress, cuyo núcleo ofrece tantos recursos que resulta 100% válido usarlo como un framework () y, en consecuencia, realizar proyectos de cualquier nivel y de cualquier tipo en 1/3 del tiempo, manteniendo el mismo control sobre éste como si se tratase de un desarrollo propio. Cero obstáculos. Esta aplicación se aleja años luz de los CMS tradicionales (que no hacen más que limitar el trabajo del programador). En el foro de WordPress estamos a la orden para cualquier duda. Un saludo.

Última edición por metacortex; 24/07/2013 a las 13:07