Ver Mensaje Individual
  #12 (permalink)  
Antiguo 24/07/2013, 15:19
Avatar de HackmanC
HackmanC
 
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: Sacar un array desde un bucle

Hola,

Cita:
Iniciado por metacortex Ver Mensaje
Aunque el código trabaja bien, estaré pendiente de cualquier observación a lo mencionado.
No miraba la necesidad de insertar un campo que solamente te va a traer un indice secuencial, es decir, rc_referencia_datos, lo estas usando como un contador, y sabiendo con anterioridad que es un contador no vi que fuera necesario agregarlo.

Cita:
Iniciado por metacortex Ver Mensaje
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. }
Quitando la referencia a esa variable quedaba algo así:

Código PHP:
function rc_submodelos($c '0') {
    
$html ='
    <fieldset id="bloque-' 
$c '">
        <p><input type="text" name="nombre_'
$c .'" value="" /></p>
        <p><input type="text" name="descripcion_'
$c .'" value="" /></p>
        <p><input type="text" name="precio_'
$c .'" value="" /></p>
    </fieldset>'
;
    return 
$html;

Y en este momento solamente necesitas saber cual es el último campo:

Cita:
Iniciado por metacortex Ver Mensaje
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();
Por lo que solamente era necesario llevar un contador,

Código PHP:
$datos = array('nombre' 'descripcion' 'precio');
 
$postmeta get_post_meta($post->ID '_rc_postmeta' true);
 
if(
$postmeta) {
    
$i 1;
    while (isset(
$postmeta["nombre_$i"])) {
            
$html .= rc_submodelos($i++);
    }
else
    
$html .= rc_submodelos(); 
Cuando recoges los campos es muy parecido:

Cita:
Iniciado por metacortex Ver Mensaje
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. }
Solamente usando el mismo contador, que había propuesto en el post anterior:

Código PHP:
function rc_guardar_producto() {
    global 
$post$datos;
 
    
$postmeta get_post_meta($post->ID '_rc_postmeta' true);
 
    
$datos_form = array();
 
    
$i 1;
    while (isset(
$postmeta["nombre_$i"])) {
        
$temp = array();
        foreach (
$datos as $dato) {
            
$temp[$dato] = isset($_POST["rc_datos_$dato_$i"]) ? $_POST["rc_datos_$dato_$i"] : null;;
        }
        
$datos_form[] = $temp;
        
$i++;
    }
 
    
update_post_meta$post->ID'_rc_postmeta'$datos_form );
die(); 
// Requerido por WordPress para ingresar datos vía Ajax

Aunque no lo probé, porque no tengo wordpress a la mano, tendría que dar el mismo resultado, creo que solamente sería otra forma de hacer lo mismo. Algunos dicen que si ya te funciona no lo toques mas, así que solo lo escribí como referencia adicional.

Saludos,