Искать  
 
   
 
Rating + AJAX
Отправлено: 11 Февраль 2010 06:17 P.M.   [ Игнорировать ]
Sr. Member
RankRankRankRank
Всего сообщений:  987
Зарегистрирован  2008-09-27

Помогите пожалуйста подружить сей модуль с jquery. давно поднималась тема, но она была на prototype.

Профиль
 
 
Отправлено: 12 Февраль 2010 10:02 P.M.   [ Игнорировать ]   [ # 1 ]
Member
RankRankRank
Всего сообщений:  191
Зарегистрирован  2009-03-17

А какой Rating используешь? solspace?

Профиль
 
 
Отправлено: 13 Февраль 2010 01:16 A.M.   [ Игнорировать ]   [ # 2 ]
Sr. Member
RankRankRankRank
Всего сообщений:  987
Зарегистрирован  2008-09-27

Да, он самый

Профиль
 
 
Отправлено: 13 Февраль 2010 06:09 P.M.   [ Игнорировать ]   [ # 3 ]
Member
RankRankRank
Всего сообщений:  191
Зарегистрирован  2009-03-17

А какая задача стоит? плюс голос - минус голос? или именно выставление оценок? я пробовал - как раз делал ajax - но видимо что-то перемудрил - сайт падал постоянно.
за пару дней конкурса 5600 записей в базу рейтинга
посещаемость за день: 1 390 Посещения,  16 046 Просмотры страниц.
и 193 SQL запроса на странице с 14 работами

Профиль
 
 
Отправлено: 13 Февраль 2010 07:40 P.M.   [ Игнорировать ]   [ # 4 ]
Sr. Member
RankRankRankRank
Всего сообщений:  987
Зарегистрирован  2008-09-27

Может выкладывай - посомтрим.

Профиль
 
 
Отправлено: 13 Февраль 2010 08:07 P.M.   [ Игнорировать ]   [ # 5 ]
Member
RankRankRank
Всего сообщений:  191
Зарегистрирован  2009-03-17

Шаблон с голосованиями

{exp:weblog:entries...}
    {exp
:rating:form form_name="Gallery Ratings" required="rating" require_membership="no" anonymous="yes" allow_duplicates="no" entry_id="{entry_id}" return="/{my_weblog}/{segment_2}" template="{my_template_group}/rating_ajax_submit_result" class="rating-form"}
                        
<input type="hidden" name="entry_url_title" value="{entry_id}" />
                        <
input type="hidden" name="rating" id="rating_inpt_id{entry_id}" value="" />
                        <
input type="hidden" name="submit" />
                        
                        
{if not_duplicate}
                            
<class="not_duplicate"></b>
                        
{if:elseif duplicate}
                            
<class="duplicate"></b>
                        
{/if}
    {
/exp:rating:form}
                
    
<div id="rating{entry_id}" class="stars">            
        
{exp:rating:stats entry_id="{entry_id}" theme="default"}
            
<b>{stars_overall_avg}</b>
            <
span>{overall_count} {exp:plural_forms  digit="{overall_count}" words="голос|голоса|голосов" onlyword="true"}</span>
        
{/exp:rating:stats}
        
        
        {exp
:rating:count entry_id="{entry_id}"}
            {if rating_count
==0}
                
<b><img class="rating_star" src="/themes/rating_themes/default/images/star-0.gif"/><img class="rating_star" src="/themes/rating_themes/default/images/star-0.gif"/><img class="rating_star" src="/themes/rating_themes/default/images/star-0.gif"/><img class="rating_star" src="/themes/rating_themes/default/images/star-0.gif"/><img class="rating_star" src="/themes/rating_themes/default/images/star-0.gif"/></b>
                <
span>{rating_count}{exp:plural_forms  digit="{rating_count}" words="голос|голоса|голосов" onlyword="true"}</span>
            
{/if}    
        {
/exp:rating:count}
    
</div>
{/exp:weblog:entries} 


Шаблон rating_ajax_submit_result

{if success}OK{/if}{if failure}{message}{/if} 


Шаблон rating_ajax_return_value

{exp:weblog:entries weblog="{my_weblog}" limit="1"}
  {exp
:rating:stats entry_id="{entry_id}" theme="default"}
    {stars_overall_avg}
    
<span>{overall_count} {exp:plural_forms  digit="{overall_count}" words="голос|голоса|голосов" onlyword="true"}</span>
  
{/exp:rating:stats} 
{
/exp:weblog:entries} 

JS (из библиотек понадобится jquery, плагин jquery forms и плагин jgrowl) код написан под структуру html выше

$(document).ready(function() 
    
$(".rating-form").submit(function() 
        
if($("b",this).attr('class')=='not_duplicate'){
             
var id = $("input[name=entry_url_title]",this).val();
             $(
"#rating"+id+" span").html('<img src="/images/loading.gif" width="16" height="16">');
             $(
this).ajaxSubmit({
                success
: function(responseTextstatusText){
                    
var url "/rating_ajax_return_value/" id;
                    if(
responseText == "OK"){
                        
$.get(url, function(data){
                            
$("#rating"+id).fadeOut("normal", function(){
                                
$(this).empty().append(data).fadeIn();
                                
});
                        
});
                    
else {
                        
$.jGrowl(responseText{
                            life 
:5000
                        }
);
                        $.
get(url, function(data){
                            
$("#rating"+id).empty().append(data);
                        
});
                    
}
                }
            }
)
        
}
        
return false
    
}); 
        
    
//css
    
$("div.stars").prev('.rating-form').children('b.duplicate').parent('.rating-form').next("div.stars").children('b').children('img').css('cursor','default');
    
    
// rolls
    
$("div.stars b img").hover(function() {
        
var id=$(this).parent('b').children('img').index(this)+1;
        var 
entry_id=$(this).parent('b').parent('.stars').attr('id').replace(/rating(.+)$/i"$1");
        if($(
"b",$('#rating_form'+entry_id)).attr('class')=='not_duplicate'){
            
var = $(this).parent('b').children('img:lt('+id+')');
            
o.attr("src"o.attr("rel").replace(/-[0-9]+\.(.+)$/i".$1"));
        
}
    }
, function() {
        
$(this).parent('b').children('img').each(function (i$(this).attr('src',$(this).attr("rel")); });
    
}).each(function (i{
        
$(this).attr('rel',$(this).attr("src"));
    
}).click(function(){
        
var id=$(this).parent('b').children('img').index(this)+1;
        var 
entry_id=$(this).parent('b').parent('.stars').attr('id').replace(/rating(.+)$/i"$1");
        $(
'#rating_inpt_id'+entry_id).val(id);
        $(
'#rating_form'+entry_id).submit();
    
});
}); 
Профиль
 
 
Отправлено: 14 Февраль 2010 09:25 P.M.   [ Игнорировать ]   [ # 6 ]
Sr. Member
Avatar
RankRankRankRank
Всего сообщений:  463
Зарегистрирован  2009-08-07

Простите за глупый, возможно, вопрос, а что это такое за плагин

{exp:plural_forms  digit="{overall_count}" words="голос|голоса|голосов" onlyword="true"
 Подпись 

Ум - как бюст: надо иметь, но выпячивать не стоит
SSD Cloud Hosting

Профиль
 
 
Отправлено: 15 Февраль 2010 07:47 A.M.   [ Игнорировать ]   [ # 7 ]
Member
RankRankRank
Всего сообщений:  191
Зарегистрирован  2009-03-17

...а что это такое за плагин plural_forms…

воспользуемся поиском...

Профиль
 
 
Отправлено: 18 Февраль 2010 01:53 P.M.   [ Игнорировать ]   [ # 8 ]
Sr. Member
Avatar
RankRankRankRank
Всего сообщений:  463
Зарегистрирован  2009-08-07

Сделал в точности как описано выше.. но вместо ответа OK

if(responseText == "OK").... 

загружается страница с сообщением

Success

Your rating has been successfully submitted
.

Если автоматическая ... 

2. Обязательно ли в этом случае использовать return=”....”

{exp:rating:form form_name="Gallery Ratings" required="rating" require_membership="no" anonymous="yes" allow_duplicates="no" entry_id="{entry_id}" return="/{my_weblog}/{segment_2}" template="{my_template_group}/rating_ajax_submit_result" class="rating-form"
 Подпись 

Ум - как бюст: надо иметь, но выпячивать не стоит
SSD Cloud Hosting

Профиль
 
 
Отправлено: 18 Февраль 2010 02:36 P.M.   [ Игнорировать ]   [ # 9 ]
Member
RankRankRank
Всего сообщений:  191
Зарегистрирован  2009-03-17

1. шаблон rating_ajax_submit_result содержит {if success}OK{/if}{if failure}{message}{/if}  ?
2. уже не помню, вроде обязательно. есть где посмотреть вживую?

Профиль
 
 
Отправлено: 18 Февраль 2010 04:02 P.M.   [ Игнорировать ]   [ # 10 ]
Sr. Member
Avatar
RankRankRankRank
Всего сообщений:  463
Зарегистрирован  2009-08-07
Nik - 18 Февраль 2010 02:36 P.M.

1. шаблон rating_ajax_submit_result содержит {if success}OK{/if}{if failure}{message}{/if}  ?

точно так!

Nik - 18 Февраль 2010 02:36 P.M.

2. уже не помню, вроде обязательно. есть где посмотреть вживую?

пока нету.. делаю на локали ..

 Подпись 

Ум - как бюст: надо иметь, но выпячивать не стоит
SSD Cloud Hosting

Профиль
 
 
Отправлено: 18 Февраль 2010 04:57 P.M.   [ Игнорировать ]   [ # 11 ]
Sr. Member
Avatar
RankRankRankRank
Всего сообщений:  463
Зарегистрирован  2009-08-07

Вопрос вдогонку.. я так понимаю возможность голосовать тока один раз пользователю задается параметром allow_duplicates=“no”, и это отслеживается кукисами.. ?
Если так, то как мне разрешить голосовать 1 раз в день ?

 Подпись 

Ум - как бюст: надо иметь, но выпячивать не стоит
SSD Cloud Hosting

Профиль
 
 
Отправлено: 19 Февраль 2010 07:05 P.M.   [ Игнорировать ]   [ # 12 ]
Member
RankRankRank
Всего сообщений:  191
Зарегистрирован  2009-03-17

как мне разрешить голосовать 1 раз в день

не нашел такого там

Профиль
 
 
Отправлено: 22 Февраль 2010 10:49 A.M.   [ Игнорировать ]   [ # 13 ]
Sr. Member
Avatar
RankRankRankRank
Всего сообщений:  463
Зарегистрирован  2009-08-07

И все же.. поможете разобраться с

шаблон rating_ajax_submit_result содержит {if success}OK{/if}{if failure}{message}{/if}

Может у кого есть готовый пример показать ?

 Подпись 

Ум - как бюст: надо иметь, но выпячивать не стоит
SSD Cloud Hosting

Профиль
 
 
Отправлено: 15 Март 2010 02:42 P.M.   [ Игнорировать ]   [ # 14 ]
Sr. Member
RankRankRankRank
Всего сообщений:  987
Зарегистрирован  2008-09-27

На нулледе нашел решение, может кто-то уже и знаком с ним. Вот мое решение на его основе:
Между тэгами <header></header> подключаем эти библиотеки:

http://jquery.com/
http://www.malsup.com/jquery/form/#download

В шаблоне вывода записи между {exp:weblog:entries}{/exp:weblog:entries} вставляем:

{embed="embed/.rating" entry_id="{entry_id}" url_title="{url_title}"

embed/.rating

script type="text/javascript">
  var 
loading "<img src='/images/ajax-loader-2.gif' height='18' width='18'>";
  var 
url "/service/ratings_return_value/{embed:url_title}/";

  $(
document).ready(function() {
      
$('[name=rating]').change(function(){
          
$(".profile-rating-form").submit();
      
});

      $(
".profile-rating-form").live("submit", function() {
          
$("#Rating").css("display","none");
          $(
"#rateshow").html(loading);
          var 
options { successshowResponse};
          $(
this).ajaxSubmit(options);
          return 
false;
      
});
  
});
  function 
showResponse(responseTextstatusText{
      alert(
'IE!');
      if(
statusText == "success"){
          
$.get(url, function(data){
              
$("#rateshow").html(data);

          
});
  
}
 }
< /script>
                                <
div class="golos">
                                    <
span class="rate" id="rateshow">
                                    
{exp:rating:stats entry_id="{embed:entry_id}" theme="default"}
                                    
<div class="stars" title="Голосов: {overall_count} | Средний балл: {overall_avg}">
                                        <
div class="or" style="width: {exp:simple_math calculate="107 {overall_avg}" parse_global="true"}px;"></div>
                                    </
div>
                                    
{/exp:rating:stats}
                                    
</span>
                                    <
div id="Rating" style="display:block;">
                                    
{exp:rating:form entry_id="{embed:entry_id}" form_id ="profile-rating-{entry_id}" class="profile-rating-form" form_name="profiles" template="ratings/thankyou"}
                                        
<div class="radio">
                                            <
input type="radio" name="rating" value="1" /><br/>+1
                                        
</div>
                                        <
div class="radio">
                                            <
input type="radio" name="rating" value="2" /><br/>+2
                                        
</div>
                                        <
div class="radio">
                                            <
input type="radio" name="rating" value="3" /><br/>+3
                                        
</div>
                                        <
div class="radio">
                                            <
input type="radio" name="rating" value="4" /><br/>+4
                                        
</div>
                                        <
div class="radio">
                                            <
input type="radio" name="rating" value="5" /><br/>+5
                                        
</div>
                                        <
input type="hidden" name="name" value="{screen_name}" />
                                        <
input type="hidden" name="email" value="{email}" />
                                    
{/exp:rating:form}
                                    
</div>
                                </
div

service/ratings_return_value

{exp:weblog:entries limit="1"}
                                    {exp
:rating:stats entry_id="{entry_id}" theme="default"}
                                    
<div class="stars" title="Голосов: {overall_count} | Средний балл: {overall_avg}">
                                        <
div class="or" style="width: {exp:simple_math calculate="107 {overall_avg}" parse_global="true" parse="inward"}px;"></div>
                                    </
div>
                                    
{/exp:rating:stats}
{
/exp:weblog:entries} 

service/ratings_thankyou

{if success}success{/if}
{if failure}failure{
/if}
{message} 

Только пробелы поубирайте в тэгах < script>
И в IE пока не могу заставить работать..=(

Профиль
 
 
Отправлено: 16 Март 2010 09:25 A.M.   [ Игнорировать ]   [ # 15 ]
Sr. Member
Avatar
RankRankRankRank
Всего сообщений:  463
Зарегистрирован  2009-08-07

спасибо.. положил в копилку smile

 Подпись 

Ум - как бюст: надо иметь, но выпячивать не стоит
SSD Cloud Hosting

Профиль