CodeIgniter: проблема с AJAX и JSON - PullRequest
0 голосов
/ 11 марта 2012

Я пытаюсь использовать AJAX и JSON внутри CodeIgniter.Я никогда раньше не использовал ни одну из этих технологий, но я начинаю понимать, как это сделать.

Вот что я пытаюсь достичь ...

На моем сайте пользователи могут"люблю" посты других пользователей на форумах.Я бы хотел, чтобы счетчик рядом со ссылкой на любовь обновлялся автоматически с использованием AJAX и JSON.

Вот соответствующий код:

ПРОСМОТР: простая ссылка HTML, используемая для добавления любви к счетчику.

<p><a href="#" class="love"><?php if ($post->love) { echo $post->love; } else { echo 0; } ?></a></p>

JQUERY: Вызывается при нажатии на ссылку выше.Он вызывает функцию / ajax / love_forum_post (код ниже) и передает некоторые данные для записи и идентификаторы активных пользователей (2 и 1, которые я жестко запрограммировал на данный момент).Затем он увеличивает счет на 1 и переключает класс.

$(document).ready(function(){

    $('.love').click(function() {

        $.ajax({

            type: 'GET',
            url: base_url + '/ajax/love_forum_post',
            data: { post_id: 2, user_id: 1, ajax: 1 },

        });

        var num = parseInt($.trim($(this).html()));
        $(this).html(++num).toggleClass('loved');

        return false;

    });

});

КОНТРОЛЛЕР: функция, вызываемая Ajax при нажатии на ссылку.

public function love_forum_post()

{

$post_id = $this->input->get('post_id');
$user_id = $this->input->get('user_id');
$is_ajax = $this->input->get('ajax');

if ($is_ajax)

{

    $this->load->model('forums_model');
    $total_loves = $this->forums_model->add_love($post_id, $user_id);
    echo json_encode($total_loves);

}

// If someone tries to access the AJAX function directly.

else

{

    redirect('', 'location');

}

МОДЕЛЬ: И, наконец, модельфункция, которая вызывается, чтобы добавить любовь к базе данных и вернуть новый счетчик, который захватывается в контроллере с помощью JSON (я думаю).

function add_love($post_id, $user_id)

{

    // Check that the user has not already loved the post.

    $this->db->select('id');
    $this->db->from('post_rating');
    $this->db->where('post_id', $post_id);
    $this->db->where('user_id', $user_id);
    $query = $this->db->get();

    // If they have not already loved the post.

    if ( ! $query->num_rows() > 0)

    {

        $data = array(
            'post_id' => $post_id,
            'user_id' => $user_id,
            'rating' => 1
        );

        // If a new love is added, return the new count.

        if ($this->db->insert('post_rating', $data))

        {

            $this->db->select('id');
            $this->db->from('post_rating');
            $this->db->where('post_id', $post_id);
            $this->db->where('user_id', $user_id);
            $query = $this->db->get();

            return $query->num_rows();

        }

    }

}

Итак ...

  1. Как мне получить этот новый счетчик любви с помощью JSON и заставить мой счетчик показывать новый итог?
  2. Есть ли в моем коде что-то еще, что следует изменить / улучшить?
  3. И, наконец,Я не могу использовать метод POST, так как у меня включена защита CSRF.Как я могу изменить свой код, чтобы позволить использовать метод POST вместо GET?Или метод GET подходит для этого?

Спасибо, я все еще очень зеленый, когда дело доходит до PHP, CodeIgniter, AJAX и jQuery.Наслаждаясь вызовом!

  • Тим.

1 Ответ

3 голосов
/ 11 марта 2012

1.Как мне получить этот новый счетчик любви с помощью JSON и заставить мой счетчик показывать новый итог?

Вы (почти) уже делаете это.Ваше возвращаемое значение json_encode() является целым числом.Попробуйте вместо этого:

<?php
//...
echo json_encode(array('total_loves' => $total_loves));
//...

Тогда, по вашему мнению ...

<?php
// Probably better to pass in these values from
// the controller, but this should work...
$CI =& get_instance();
$token = $CI->security->get_csrf_token_name();
$hash  = $CI->security->get_csrf_hash();
?>

$.ajax({
    type: 'POST',
    url: base_url + '/ajax/love_forum_post',
    data: {
        post_id: 2,
        user_id: 1,
        '<?= $token; ?>': '<?= $hash; ?>' // this takes care of the CSRF issue
    },
    dataType: 'json',
    success: function(response) {
        alert(response.total_loves); // do something with the return value...
    }
});

2.Есть ли в моем коде что-то еще, что должно быть изменено / улучшено?

Вместо того, чтобы передавать параметр "ajax", используйте класс Input, чтобы определить, является ли это запросом AJAX ...

<?php
$is_ajax = $this->input->is_ajax_request();

3.И, наконец, я не могу использовать метод POST, так как у меня включена защита CSRF.Как я могу изменить свой код, чтобы позволить использовать метод POST вместо GET?Или метод GET подходит для этого?

Я бы настоятельно рекомендовал использовать POST, а не GET, поскольку предполагается, что запросы GET не для изменения каких-либо данных.(Google «идемпотентность» для лучшего понимания этой концепции ...)

Что касается защиты от CSRF, я включил решение в ответ на ваш первый вопрос (см. Выше).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...