PHP y AJAX de prototipos

Tengo una función php que devuelve JSON en respuesta a una solicitud ajax de gastos de envío. Aquí está la función php:

public function getDeliveryOptions($weight, $postcode)
{

    if($weight == 0)
    {

        return array(array("name" => "Non-Deliverable", "value" => "0.00"));

    }

    $this->db->where('dmc_lower_boundary <=', $weight);
    $this->db->where('dmc_upper_boundary >=', $weight);

    if(preg_match("([aA][bB](3[1-8]|4[1-5]|5[1-6])\s?[1-9][a-zA-Z]{2}|[fF][kK](19|20|21)\s?[1-9][a-zA-Z]{2}|[hH][sS][1-9]\s?[1-9][a-zA-Z]{2}|[iI][vV][1-9]{1,2}\s?[1-9][a-zA-Z]{2}|[kK][aA](27|28)\s?[1-9][a-zA-Z]{2}|[kK][wW][1-9]{1,2}?\s?[1-9][a-zA-Z]{2}|[pP][aA][2-8][0-9]\s?[1-9][a-zA-Z]{2}|[pP][hH]([156789]|1[056789]|[2-5][0-9]){1,2}\s?[1-9][a-zA-Z]{2}|[zZ][eE][1-9]\s?[1-9][a-zA-Z]{2})", $postcode))
    {

        $this->db->where("dm_id = ", 1);
        $this->db->or_where("dm_id =", 3);

    }
    elseif(preg_match("/([bB][tT][1-9]{1,2}\s?[1-9][a-zA-Z]{2}|[iI][mM][1-9]{1,2}\s?[1-9][a-zA-Z]{2}|[tT][rR](21|22|23|24|25)\s?[1-9][a-zA-Z]{2})/", $postcode))
    {

        $this->db->where("dm_id =", 1);
        $this->db->or_where("dm_id =", 4);

    }
    elseif(preg_match("/([gG][yY][1-9]\s?[1-9][a-zA-Z]{2}|[jJ][eE][1-4]\s?[1-9][a-zA-Z]{2})/", $postcode))
    {

        $this->db->where("dm_id =", 1);
        $this->db->or_where("dm_id =", 5);

    }
    else
    {

        $this->db->where("dm_id =", 1);
        $this->db->or_where("dm_id =", 2);

    }

    $this->db->group_by("dm_id");
    $query = $this->db->get("delivery_method_option_views");
    //print_r($query->result());
    //print_r(json_encode($query->result()));
    return(json_encode($query->result()));
}

Aquí está mi javascript (usando prototipo) para enviar los resultados al servidor y usar la respuesta para crear botones de opción:

function updateDelivery()
{
if($('deliveryUpdate') == null)
{

    return false;

}

// This 'observes' our form submit - sort of like onsubmit
$('deliveryUpdate').observe('submit', function(evt) {

    // Stop the actual event from happening
    evt.stop();

    // This is the url we submit to - change it as needed
    var url = '/checkout/updateDelivery';

    //This will be the form and div we update
    var containerForm = $('deliveryUpdate');
    var optionsDisplay = $('deliveryOptions');

    // Grab all the info in the form
    var form_data = containerForm.serialize();
    var form = containerForm.innerHTML;

    // Here we make the request
    new Ajax.Request(url, {
        method: 'post',
        parameters: form_data,
        onCreate: function() {
            form = containerForm.innerHTML;
            containerForm.update(form+'<img src="/images/loader.gif" alt="loading..." class="loader" />');
        },
        onSuccess: function(transport) {
            containerForm.update(form);
            NVPResponse = transport.responseText;

            if(NVPResponse !== '[object Array]')
            {

                NVPResponse = new Array(NVPResponse);

            }
            alert(NVPResponse);
            options = "";
            for(i=0; i<NVPResponse.length; ++i)

            {

                options += '<label for="delivery">'+NVPResponse[i].dm_name+'</label><input type="radio" name="delivery" value="'+NVPResponse[i].dmc_price+'" />';

            }

            //optionsDisplay.update(NVPResponse);
            optionsDisplay.update(options);
        }

    });

});

}

Si solo actualizo con los resultados de JSON (para el código postal ab31 2as), obtengo lo siguiente:

Calculate Delivery Costs[{"dm_id":"1","dm_name":"Royal Mail","dm_admin_name":"Royal Mail","dmc_lower_boundary":"101","dmc_upper_boundary":"250","dmc_price":"3.65"},{"dm_id":"3","dm_name":"Courier","dm_admin_name":"Fed Ex Zone 4","dmc_lower_boundary":"101","dmc_upper_boundary":"250","dmc_price":"4.50"}]

Sin embargo, si actualizo con las opciones var, obtengo "indefinido" donde van el texto de la etiqueta y los valores del botón de opción. Esto está integrado en el bucle for de la función onSuccess. ¿Algunas ideas?

Editar

Agregué el siguiente código antes del ciclo for porque estaba tratando de usar cadenas JSON como objetos en lugar de objetos:

NVPResponse = JSON.parse(NVPResponse);

preguntado el 12 de junio de 12 a las 16:06

1 Respuestas

No soy un gran experto en prototipos, pero me parece que su NVPResponse es una cadena, no traducida a un objeto javascript. (consulte la documentación del prototipo para AJAX (específicamente Evaluar una respuesta de JavaScript) y JSON).

También parece haber otros problemas con su código.

En el código PHP:

if($weight == 0)
    {

        return array(array("name" => "Non-Deliverable", "value" => "0.00"));

    }

devuelve una matriz sin JSONing, ¿es intencional?

Además, parece haber un error lógico:

$this->db->or_where("dm_id =", 3);

Consultas para dm_id = 3 independientemente de cualquier "dónde" anterior que establezca, de modo que

$this->db->where('dmc_lower_boundary <=', $weight);
$this->db->where('dmc_upper_boundary >=', $weight);

se ignorará si dm_id = 3 (o cualquiera de los otros or_where, por supuesto). La solución puede ser algo como esto:

$this->db->where_in("dm_id", array(1,3));

editar:

En este caso, la consulta que escribió funciona perfectamente bien, pero debe notar que Codeigniter no pone paréntesis alrededor de los argumentos OR en sus consultas, por lo tanto, combinar OR y AND en la misma consulta puede tener errores. de la forma en que escribió el código, la consulta se verá así (que funciona bien):

SELECT * FROM (`t_name`) 
WHERE `dmc_lower_boundary` <= $weight AND `dm_id` = 1 OR `dm_id` = 3

escribir la misma consulta en un orden diferente (o, a veces, al escribir consultas complejas) puede darte un resultado muy diferente:

SELECT * FROM (`t_name`) 
WHERE `dm_id` = 1 OR `dm_id` = 3 AND `dmc_lower_boundary` <= $weight

después de algunos errores graves, aprendí a tener cuidado con "o_dónde" :)

Respondido el 13 de junio de 12 a las 14:06

¿Pero mis consultas a la base de datos arrojan los resultados correctos? :S Sin embargo, gracias por la primera matriz :) - phil joven

Mi error. CI no pone paréntesis alrededor de las declaraciones OR, por lo que tienden a tener errores. Edité la respuesta para reflejar esto. - Estás vivo

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.