За последние 24 часа нас посетили 31370 программистов и 1821 робот. Сейчас ищут 974 программиста ...

Обновление оценки на странице без перезагрузки

Тема в разделе "JavaScript и AJAX", создана пользователем zevilz, 18 май 2012.

  1. zevilz

    zevilz Активный пользователь

    С нами с:
    14 июн 2010
    Сообщения:
    182
    Симпатии:
    0
    Сейчас у меня оценка контента реализована вот так:
    Форма оценки контента:
    Код (Text):
    1. <form id="vote_video" action="vote_res_video.php" method="post" name="vv">
    2.     <span class="vote_1"><input name="score" type="radio" value="1"></span>
    3.     <span class="vote_2"><input name="score" type="radio" value="2"></span>
    4.     <span class="vote_3"><input name="score" type="radio" value="3"></span>
    5.     <span class="vote_4"><input name="score" type="radio" value="4"></span>
    6.     <span class="vote_5"><input name="score" type="radio" value="5" checked></span>
    7.     <input name="submit" type="submit" value="Оценить">
    8.     <input name="id" type="hidden" value="<?php echo "$id";?>"></form>
    vote_res_video.php:
    Код (Text):
    1.  
    2. if (isset ($_POST['score'])) {$score = $_POST['score'];}
    3. if (isset ($_POST['id'])) {$id = $_POST['id'];}
    4. $result = mysql_query ("SELECT rating,q_vote FROM videos WHERE id='$id'",$db);
    5. $myrow = mysql_fetch_array ($result);
    6. $new_rating = $myrow['rating'] + $score; /*Новое значение rating*/
    7. $new_q_vote = $myrow['q_vote'] + 1; /*Новое значение q_vote*/
    8.     /*Обновление рейтинга в базе*/
    9. $update = mysql_query ("UPDATE videos SET rating = '$new_rating', q_vote = '$new_q_vote' WHERE id='$id' ",$db);
    10. if ($update) /*Если обновление произошло, то...*/
    11. {
    12.     /*Возврат на страницу контента*/
    13. echo "<html><head>
    14. <meta http-equiv='Refresh' content='0; URL=view_video.php?id=$id'>
    15. </head></html>";
    16. exit ();}
    Вывод общей оценки:
    Код (Text):
    1.     <?$r = $myrow_video["rating"]/$myrow_video["q_vote"]; /*Вычисление среднего рейтинга*/
    2.     $r = intval ($r); /*Приведение среднего рейтинга к целому числу*/?>
    3. <p>Оценка: <?php echo ("<img src='img/rate/$r.png'>");?> (Голосов: <?php echo $myrow_video["q_vote"];?>)</p>
    Как сделать, чтобы это происходило без перезагрузки страницы?
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    в jQuery метод load — самое оно.
    я бы оставил существующий код как есть, чтобы работало при отключенном js + добавил бы навешивание события под jQuery
     
  3. zevilz

    zevilz Активный пользователь

    С нами с:
    14 июн 2010
    Сообщения:
    182
    Симпатии:
    0
    Если не сложно, подскажите, пожалуйста, порядок моих действий, а то я и понятия не имею, как это сделать. Читал про load, вот только ничего полезного для моих целей не нашел.
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    даже не знаю что тут подсказывать. там примеры помоему все описывают лучше некуда
     
  5. zevilz

    zevilz Активный пользователь

    С нами с:
    14 июн 2010
    Сообщения:
    182
    Симпатии:
    0
    необходимо через скрипт передать данные обработчику vote_res_video.php
    Код (Text):
    1. $("#submit").load("vote_res_video.php", { 'choices[]': ["score", "id"] } );
    и затем вывести $new_rating, полученный обработчиком, на странице?
    я правильно понял?
    или нужно перехватить скриптом передаваемые данные обработчику, обработать их, занести в базу и вывести результат на страницу?
     
  6. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    боже мой! надо хоть немного уметь читать
    обработкой занимается сам load. тебе нужно только правильно указать элемент куда должен быть вставлен ответ серверного скрипта. ответ это буквально текст HTML

    если не силен в английском, яндекс найдет тебе массу русских примеров "jQuery load"
     
  7. zevilz

    zevilz Активный пользователь

    С нами с:
    14 июн 2010
    Сообщения:
    182
    Симпатии:
    0
    Не силен в jQuery)
    Код (Text):
    1.            $("#vote_form").ajaxForm(function() {
    2. //Обрабатываем данные формы и заносим в базу
    3. //Выводим результат на странице в контейнере #new_rating
    4.                $("#result").load("view_video.php #new_rating");
    5.        });
    Примерно так?
     
  8. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а ты попробуй =)
     
  9. zevilz

    zevilz Активный пользователь

    С нами с:
    14 июн 2010
    Сообщения:
    182
    Симпатии:
    0
    Если load сам занимается обработкой, то какой же url надо указать в load?

    Добавлено спустя 5 минут 58 секунд:
    я пробовал ajaxForm, но он мне ничего не возвращает от скрипта обработчика. Хотя если отключить jquery.form.js, то выдает то что нужно в vote_res_video.php:
    Код (Text):
    1. <div id="newww">test</div>
    js:
    Код (Text):
    1.     $(document).ready(function(){
    2.     $("#vote_form").ajaxForm(function() {
    3.                $("#new_rating").load("vote_res_video.php #newww");
    4.       });
    5.     });
    php:
    Код (Text):
    1. <div id="new_rating"></div>
    обработчик (при успешном обновлении оценки в базе):
    Код (Text):
    1. echo '<div id="newww">test</div>';
     
  10. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    чувак, ты усложняешь.

    глянь в доки и не парься
     
  11. zevilz

    zevilz Активный пользователь

    С нами с:
    14 июн 2010
    Сообщения:
    182
    Симпатии:
    0
    Уже глядел... Только нифига не понятно.
    Проверил работу .load таким образом:
    Отправил с помощью скрипта данные в обработчик, обработчик обновил оценку в базе. Далее скрипт при помощи .load в контейнер #new_rating поместил контейнер со средней оценкой #333. В результате при помощи скрипта при нажатии на кнопку "оценить" без перезагрузки на странице видеоурока под контейнером со средней оценкой добавляется тот же самый контейнер, но уже с учетом новой оценки.
    Код (Text):
    1. $(document).ready(function(){
    2.     $("#vote_form").ajaxForm(function() {
    3.               $("#new_rating").load("view_video.php?id=14 #333");
    4.         });
    5. });
    [​IMG]
    По идее при помощи скрипта нужно удалить контейнер со старой оценкой, форму и вывести сообщение, что уже поставлена оценка. В принципе можно сделать и так, но столкнулся с проблемой формирования url в .load. Я тестил на странице с id=14. Но у меня ведь много страниц и с разными id, и я не в курсе, как в url воткнуть айдишник видеоурока, который передается через форму как переменная $id. Вроде разобрался как работает .load, но как понял по вашим постам иду не в том направлении и еще использую дополнительный скрипт jquery.form.js. В каком направлении вообще двигаться, если для всего этого использовать только 1 скрипт?
    Судя по документации .load должен содержать аргумент url. Этим url должен являться та же самая страница с формой или каким то способом добавленная временная страница при помощи этого скрипта (везде в документации грузятся данные с других страниц)? Если та же страница, то как воткнуть переменную id в url load'а (гуглеж не помог)? Как лучше перехватить нажатие кнопки submit, click'ом или другим образом?
     
  12. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Передавай значение текущего id из php-скрипта в JavaScript - а там уже подставляй в url.

    Код (PHP):
    1. <script type="text/javascript">
    2.     var id = <?php echo($id); ?>;
    3. </script>
     
  13. zevilz

    zevilz Активный пользователь

    С нами с:
    14 июн 2010
    Сообщения:
    182
    Симпатии:
    0
    А ответьте на тупой вопрос, как теперь вставить id в url?)))
    Сейчас делаю вот так:
    Код (Text):
    1.     $(document).ready(function(){
    2.     $("#vote_form").ajaxForm(function() {
    3.     var id = <?php echo ($id); ?>;
    4.         $("#new_rating").load("view_video.php?id="+id+" #333");
    5.       });
    6.     });
    Добавлено спустя 46 минут 11 секунд:
    Оказалось даже проще, чем я думал)) url я вообще заменил пробелом и заработало
    Код (Text):
    1. $(document).ready(function(){
    2.     $("#vote_form").ajaxForm(function() {
    3.         $("#new_rating").load(" #333");
    4.       });
    5. });
     
  14. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
  15. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    эм

    разве то что идет после # передается на сервер????
     
  16. zevilz

    zevilz Активный пользователь

    С нами с:
    14 июн 2010
    Сообщения:
    182
    Симпатии:
    0
    Короче, переделал код. Сейчас при нажатии на кнопку "оценить" при помощи скрипта jquery.form отправляются данные в обработчик, обработчик обновляет инфу о новой оценке в базе. Затем при помощи .load контейнер с обновленной оценкой #average_rate загружается в контейнер #new_rating и при помощи .remove удаляется исходный контейнер #average_rate. В результате контейнер со средней оценкой при голосовании обновляется без перезагрузки. Далее у меня есть еще один контейнер. Если пользователь не авторизирован, выдается соответствующее сообщение. Если пользователь авторизирован и не ставил оценку за видеоурок, то выводится форма оценки. Если пользователь уже голосовал, то выводится соответствующее сообщение с поставленной оценкой. Решил сделать здесь подобно средней оценке: При нажатии на сабмите при помощи .load загружается контейнер #your_rate в пустой контейнер #your_new_rate. Исходный контейнер содержал в себе форму, а при том условии что если пользователь уже проголосовал, выводится соответствующее сообщение. Вроде бы работает. Но в отличии от средней оценки контейнер исходный контейнер с формой #your_rate не хочет удаляться при помощи .remove. Иногда скрипт просто не работает, и оценка обновляется уже как было до этого с перезагрузкой страницы. Так и не пойму, что я упустил. Может Вы что подскажете?
    Исходная страница:
    [​IMG]
    Поставлена оценка:
    [​IMG]
    php файл:
    Код (Text):
    1. <div class="adds_container"><div class="view_adds"><p>Просмотров: <?php echo $myrow_video["view"];?></p><p id="average_rate">Оценка: <?php echo ("<img src='img/rate/$r.png'>");?> (Голосов: <?php echo $myrow_video["q_vote"];?>)</p><div id="new_rating"></div>
    2. </div><div class="clear"></div>
    3.  
    4. <div id="uuu" class="div_video_vote">
    5. <div id="your_rate">
    6. <?php
    7. $result_vote = mysql_query ("SELECT id,value FROM vote WHERE user_id=$forum_user[id] AND video_id=$id",$db);
    8. $myrow_vote = mysql_fetch_array ($result_vote);
    9. if (!$forum_user['is_guest']) {
    10. if (mysql_num_rows($result_vote) > 0) {
    11.  echo '<p align="center">Вы оценили этот видеоурок на<img src="img/rate/value_'.$myrow_vote["value"].'.png"></p>';
    12. }
    13. else {
    14.     echo '
    15. <form id="vote_form" action="vote_res_video.php" method="post" name="vv">
    16.     <div class="div_stars">
    17.         <label id="vote_1" class="vote_1" for="score-1"></label><input id="score-1" name="score" type="radio" value="1">
    18.         <label id="vote_2" class="vote_2" for="score-2"></label><input id="score-2" name="score" type="radio" value="2">
    19.         <label id="vote_3" class="vote_3" for="score-3"></label><input id="score-3" name="score" type="radio" value="3">
    20.         <label id="vote_4" class="vote_4" for="score-4"></label><input id="score-4" name="score" type="radio" value="4">
    21.         <label id="vote_5" class="vote_5" for="score-5"></label><input id="score-5" name="score" type="radio" value="5">
    22.     <div class="clear"></div></div><div class="clear"></div>
    23.     <input id="submit_vote" name="submit" type="submit" value="Оценить">
    24.     <input name="id" type="hidden" value="'.$id.'">
    25.     <input name="user_id" type="hidden" value="'.$forum_user["id"].'">
    26. </form>
    27.  
    28.     ';}
    29. }
    30. else {
    31. echo '<p class="login_required" align="center">Для добавления оценки Вам необходимо <a class="open_top_panel" href="#">Войти</a> или <a href="register.php">Зарегистрироваться</a></p>';
    32. }
    33. ?></div><div id="your_new_rate"></div></div>
    34. </div><div class="clear"></div>
    js:
    Код (Text):
    1.     $("#vote_form").ajaxForm(function() {
    2.         $("#new_rating").load(" #average_rate");
    3.         $("#your_new_rate").load(" #your_rate");
    4.     });
    5.    
    6.     $("#submit_vote").click(function() {
    7.         $("p").remove("#average_rate");
    8.         $("div").remove("#your_rate");
    9.     });
     
  17. zevilz

    zevilz Активный пользователь

    С нами с:
    14 июн 2010
    Сообщения:
    182
    Симпатии:
    0
    Разместил блок #your_new_rate выше #your_rate и прописал к стилю adds_container, где они оба находятся, фиксированную высоту и overflow:hidden. Сейчас исходный блок прячется за пределами блока. Хотя может и не правильно, но работает))

    Добавлено спустя 17 минут 10 секунд:
    заметил только один косяк. Если клавишей tab расположить курсор на кнопке оценить, то можно поставить еще сколько угодно оценок, т.к. формы будет просто не видно, а фокус на кнопке остается