2012-06-12 4 views
0

У меня есть функция php, которая возвращает JSON в ответ на запрос ajax для платежей за доставку. Вот функция PHP:PHP и прототип AJAX

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())); 
} 

Вот мой Javascript (с помощью прототипа), чтобы отправить результаты на сервер и использовать ответ для создания радио-кнопки:

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); 
     } 

    }); 

}); 

} 

Если я просто обновить с результаты JSON (для почтовых индексов ab31 2aS), я получаю следующее:

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"}]

Однако, если я обновлю с варом опционов, я получаю «неопределенный», где текст ярлыка и значения переключателя. Он встроен в цикл for в функции onSuccess. Есть идеи?

Редактировать

Я добавил следующий код перед цикл, потому что я пытался использовать JSON строки в качестве объектов вместо объектов:

NVPResponse = JSON.parse(NVPResponse); 

ответ

1

Я не большой специалист по прототипу, но мне кажется, что ваш NVPResponse - это строка, не переведенная на объект javascript. (см. документацию прототипа для AJAX (в частности, оценку ответа JavaScript) и JSON).

Также есть некоторые проблемы с вашим кодом.

В коде PHP:

if($weight == 0) 
    { 

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

    } 

вы возвращает массив без JSONing его, это намеренно?

Кроме того, там, кажется, логическая ошибка:

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

запросов для dm_id = 3, независимо от любых предыдущих «где», что вы установили, так что

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

будет игнорироваться если dm_id = 3 (или любой другой или, где, конечно). Решение может быть что-то вроде этого:

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

редактировать:

В этом случае запрос Вы писали произведения прекрасно, но вы должны заметить, что Codeigniter не ставит скобки или аргументы в ее запросов, поэтому объединение OR и AND в одном и том же запросе может быть ошибочным. так, как вы написали код запроса будет выглядеть примерно так (который прекрасно работает):

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

писать один и тот же запрос в другом порядке (или иногда при написании сложных запросов) может дать вам совершенно другой результат :

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

после нескольких серьезных ошибок, которые я научился быть осторожным с «or_where» :)

+0

Но мои запросы к базе данных вытягивать правильные результаты? : S Спасибо за первый массив, хотя :) –

+0

Мой плохой. CI не помещает круглые скобки вокруг инструкций OR, поэтому они, как правило, ошибочны. Я отредактировал ответ, чтобы отразить это. – Elad

Смежные вопросы