11 Dec 2013

Целта е да създадем система за ревюта/гласуване с няколко оси, например Цена, Качество, Вкус и една ос в която да се съхранява средно-аритметичната стойност на потребителските гласове.

Инструкциите са за Друпал 7

Първо трябва да инсталирате модула Fivestar и VotingAPI.
От неговите настройки (намират се на адрес admin/config/content/fivestar) задайте толкова оси, колкото са ви необходими. В конкретния случай са 4 (3+1): vote,quality,price,taste

След това в типа съдържание, за който искате да направите рейтинг системата трябва да добавите 4 полета от тип fivestar:
field_rating (за средноаритметичния сбор) избирате voting tag: vote
field_rating_quality (за качество) избирате voting tag: quality
field_rating_price (за цена) избирате voting tag: price
field_rating_taste (за вкус) избирате voting tag: taste

Важно е и четирите полета да бъдат : Stars (rated while viewing).

След това отивате на Manage Display и на всяко от четирите полета махате отметката на Expose this Fivestar field for voting on the @type type. - Това е важно, за да не могат потребителите да гласуват при прегледа на съдържанието, идеята е да се гласува само като се остави коментар.

Следващата стъпка е да отидете на Comment Fields.
Там добавете четирите полета от списъка на вече съществуващите полета. Този път променете полетата на Stars (rated while editing). А в самите настройки на Voting target задайте Parent Node (така гласовете от всеки потребител ще се натрупват на основният нод).

До тук е стандартното ползване на коментарната система и fivestar.

Следващите стъпки са за направата на средно-аритметичната стойност на трите полета (цена,вкус,качество).

Първо зададохме полето field_rating в коментарите да е Stars (rated while editing). Но целта на това поле е да събира средната стойност от другите 3 полета. Тук е първият проблем който трябва да решим. Когато е зададено така полето, то когато се добавя коментар ще е показано и може да се гласува на него, а ние не искаме това. Затова, чрез CSS код ще го скрием:
.comment-form .field-name-field-rating{display:none;}

Следващата стъпка е да създадем собствен модул, който да изчислява средно-аритметичната стойност и да я прибавя към това поле. Ето кода на модула:

<?php
/**
* Implements hook_form_alter().
*
* Hide average fivestar field from review edit/create form.
*/
function fivestar_multiaxis_overall_form_alter(&$form, &$form_state, $form_id) {
  if (
$form_id == 'comment_node_review_form') {
   
// Hide average field, this field is calculated upon node_presave.
   
$form['field_rating']['#access'] = FALSE;
  }
}
/**
* Implements hook_comment_presave().
*
* Calculates average vote rating.
*/
function fivestar_multiaxis_overall_comment_presave($comment) {
 
$parent_node = node_load($comment->nid);
  if (
$parent_node->type == 'review') {
   
// Get values from 3 axis.
   
$vote_axis_one      = entity_metadata_wrapper('comment', $comment)->field_ratring_quality->value();
   
$vote_axis_two      = entity_metadata_wrapper('comment', $comment)->field_rating_taste->value();
   
$vote_axis_three    = entity_metadata_wrapper('comment', $comment)->field_rating_price->value();
   
// Calculate and set average axe.
   
$votes_average      = ($vote_axis_one + $vote_axis_two + $vote_axis_three) / 3;
   
// @info: Can't use entity_metadata_wrapper, because '->set' not supported on this field.
    //entity_metadata_wrapper('node', $node)->field_review_votes_average->set($votes_average);
   
$comment->field_rating['und'][0]['rating'] = $votes_average;
  }
}
?>

Зависи от вашият тип съдържание, ще трябва да промените 'comment_node_review_form' и type == 'review' с вашите. Например ако ползвате типа съдържание Article, то заменете review с article - 'comment_node_article_form' и type == 'article'

Тази система е тествана и работи, може да я видите в Онлайн Магазина за Хранителни Добавки, отидете на произволен продукт и разгледайте.

Ако не знаете как да си направите собствен модул, можете да свалите моя.

Category: 

Contact

Contact with me

You can use contact form or skype:irgnet.

Connect with me