Обзоры практически идентичны комментариям - они ведут себя так же, и все необязательные настройки комментариев доступны также и для обзоров.
Обзоры отличаются несколькими ключевыми моментами:
- При отправке обзора, кроме текста, пользователи должны указать рейтинг от 1 до 5.
- Другие пользователи могут пометить считаю ли они этот обзор полезным или бесполезным; затем обзоры можно сортировать по их полезности.
- Пользователи могут отправлять только один обзор к одному элементу содержимого.
Вы можете следовать инструкциям по реализации комментариев для добавления обзоров, применив несколько небольших различий.
Модель
Классу Вашей модели для отзывов нужно расширить \IPS\Content\Review (что в свою очередь расширяет
\IPS\Content\Comment).
Существует несколько обязательных дополнительных элементов databaseColumnMap:
Элемент | Описание |
rating | Рейтинг (0-5), отправляемый с обзором. |
votes_total | Общее количество полученных голосов полезный/бесполезный. |
votes_helpful | Количество голосов votes_total, которые оценили как полезный. |
votes_data | JSON объект, содержащий сведения о том, кто проголосовал полезный/бесполезный и что они проголосовали |
Изменения вносимые в модель Элемента Содержимого
Вместо того, чтобы к модели Элемента Содержимого добавить новое свойство под названием $commentClass, добавьте свойство $reviewClass:
/** * @brief Review Class */ public static $reviewClass = 'IPS\yourapp\YourClass';
И для $databaseColumMap:
Название элемента для Комментариев | Название элемента для Обзоров |
num_comments | num_reviews |
last_comment | last_review |
last_comment_by | last_review_by |
Название элемента для Комментариев | Название элемента для Обзоров |
unapproved_comments | unapproved_reviews |
При желании Вы можете также добавить дополнительный элемент "рейтинг", который будет содержать текущий средний рейтинг для всех обзоров.
Дополнительные свойства и методы в \IPS\Content\Item
Комментарии | Обзоры |
static $commentsPerPage | static $reviewsPerPage |
commentPageCount() | reviewPageCount() |
commentPagination() | reviewPagination() |
comments( … ) | reviews( … ) |
commentForm() | reviewForm() |
lastCommentPageUrl() | lastReviewPageUrl() |
canComment() | canReview() |
moderateNewComments( … ) | moderateNewReviews( … ) |
canViewHiddenComments( … ) | canViewHiddenReviews( … ) |
averageReviewRating()
Возвращает целое число от 1 до 5 с указанием среднего рейтинга по данному элементу
Отображение
Вот пример рекомендуемого HMTL для отображения обзоров:
<div data-controller='core.commentFeed' data-feedID='file-{$item->id}-reviews'> {{if $item->canReview()}} <h2 class='ipsType_sectionTitle'>{lang="write_a_review"}</h2> <div class='ipsAreaBackground_light ipsPad'> {$item->reviewForm()|raw} </div> <br> {{endif}} <div class="ipsClearfix"> {{if $item->reviewPageCount() > 1}} <div class="ipsPos_left"> {$item->reviewPagination( array( 'tab', 'sort' ) )|raw}</div> {{endif}} <div class="ipsButtonBar ipsClearfix ipsResponsive_showDesktop ipsPos_right"> <ul class="ipsButtonRow ipsPos_left ipsClearfix"> <li data-action="tableFilter" data-filter=""> <a href="{$item->url()- >setQueryString( array( 'tab' => 'reviews', 'page' => 1, 'sort' => 'helpful' ) )}" class="{{if !isset( request.sort ) or request.sort != 'newest'}}ipsButtonRow_active{{endif}}" data- action="filterClick">{lang="most_helpful"}</a> </li> <li data-action="tableFilter" data- filter="members_filter_banned"> <a href="{$item->url()- >setQueryString( array( 'tab' => 'reviews', 'page' => 1, 'sort' => 'newest' ) )}" class="{{if isset( request.sort ) and request.sort == 'newest'}}ipsButtonRow_active{{endif}}" data- action="filterClick">{lang="newest"}</a> </li> </ul> </div> </div> <br><br> <div data-role='commentFeed'> {{foreach $item->reviews() as $review}} {$review->html()|raw} {{endforeach}} </div> </div>