Jump to content
  • Введение в Comments

       (0 reviews)

    Вадим

    Модель

    Скелетон

    namespace IPS\yourApp;
    
    class _Comment extends \IPS\Content\Comment
    {
    	/**
    	* @brief [ActiveRecord] Multiton Store
    	*/
    	protected static $multitons;
    
    	/**
    	* @brief Default Values
    	*/
    	protected static $defaultValues = NULL;
    
    	/**
    	* @brief [Content\Comment]	Item Class
    	*/
    	public static $itemClass = 'IPS\yourApp\YourClass';
    
    	/**
    	* @brief [ActiveRecord] Database Table
    	*/
    	public static $databaseTable = 'yourapp_comments';
    
    	/**
    	* @brief [ActiveRecord] Database Prefix
    	*/
    	public static $databasePrefix = ‘comment_';
    
    	/**
    	* @brief Title
    	*/
    	public static $title = ‘thing_comments’;
    
    	/**
    	* @brief Database Column Map
    	*/
    	public static $databaseColumnMap = array( 
    		'item'	=> 'fid',
    		'author'	=> 'mid', 
    		'author_name'	=> 'author', 
    		'content'	=> 'text',
    		'date'	=> 'date', 
    		'ip_address'	=> 'ip_address',
    	);
    }
    

    Введение

    Так же, как и сами Элементы Содержимого, Комментариям также нужна модель, которая следует элементу проектирования Active Record.

    Наследование схоже с Элементами Содержимого (хотя и используется \IPS\Content\Comment вместо
    \IPS\Content\Item, оба расширяют \IPS\Content. Требуемые свойства такие же, как и для Элементов Содержимого, с добавлением $itemClass.

    Элементы, необходимые для $databaseColumnMap:

    • item должен быть колонкой, которая содержит ID элемента, к которому принадлежит колонка.
    • author, как и item, должен быть колонкой, которая содержит ID пользователя, который опубликовал содержимое.
    • content должен быть колонкой, которая содержит текст комментария.
    • date должна быть колонкой, которая содержит временную отметку - когда был опубликован комментарий.
    • ip_address должен быть колонкой, которая содержит IP адрес пользователя, который добавил комментарий.

    Дополнительные элементы:

    • author_name - необязательно, но если указано, то должно быть колонкой, которая содержит юзернейм пользователя, который оставил комментарий.
    • first должен быть колонкой, содержащей логическое значение - является ли элемент первым комментарием к элементу содержимого или нет.

    Имеющиеся методы

    В дополнение к предоставляемым \IPS\Patterns\ActiveRecord (которые работают точно так же для моделей Элементов Содержимого) доступно еще несколько дополнительных методов:

    url( $action=NULL )
    Получает URL к данному комментарию напрямую (будет автоматически работать на правильном номере страницы и якоре). В отличие от Элементов Содержимого, этот метод уже определен.

    item()
    Возвращает объект \IPS\Content\Item элемента, которому принадлежит комментарий.

    author() truncated( bool $oneLine=FALSE ) canView(…) canEdit(…) canDelete(…) modPermission(…) modAction(…)
    Они ведут себя так же, как элементы содержимого.

    isFirst()
    Возвращает логическое значение, указывающее является ли это первым комментарием к материалу.

    isIgnored( \IPS\Member $member=NULL )
    Возвращает логическое значение, указывающее нужно ли игнорировать этот комментарий пользователю $member (пользователь, вошедший в данный момент, если NULL).

    dateLine()
    Возвращает строку, которая может использоваться в шаблонах, отображая информацию вроде "Опубликовано 2 дня назад".

    html()
    Возвращает HTML для отображения комментария (в его шаблоне).

    Дополнительные свойства

    Можно указать ряд дополнительных свойств:

    static $commentTemplate
    Обратная функция, указывающая шаблон, который используется для отображения комментария (по умолчанию используется стандартный шаблон).

    static $formTemplate
    Обратная функция, указывающая шаблон, который используется для отображения формы для публикации комментария (по умолчанию используется стандартный шаблон).

    static $incrementPostCount
    Логическое значение, контролирующая следует ли увеличивать количество подсчитанных публикаций для комментариев данного типа.

    static $formLangPrefix
    Ведет себя так же, как и для элементов содержимого, позволяя вам менять языковые строки, используемые в форме отправки.

    Изменения, которые следует произвести в модели Элемента Содержимого

    Добавьте новое свойство к своей модели Элемента Содержимого:

    public static $commentClass = ‘IPS\yourapp\YourClass';

    Если вашему Элементу Содержимого необходим первый комментарий - например, темам в IP.Board требуется как минимум один пост, поэтому данное утверждение правдиво для тем; но файлы IP.Downloads публикуются без начального комментария, поэтому в данном случае утверждение не верно - добавьте дополнительное свойство:

    protected static $firstCommentRequired = TRUE;

    Добавляет новые элементы к $databaseColumnMap:

     

    Элемент

    Описание

    Обязательно?

    num_comments

    Число комментариев

    Да

    last_comment

    Unix временная отметка о том, когда был добавлен последний комментарий

    Нет

    last_comment_by

    ID пользователя, который оставил последний комментарий

    Нет

    last_comment_name

    Юзернейм пользователя, который оставил последний комментарий

    Нет

    Создайте расширение EditorLocations

    Для отображения текстового редактора комментария, он будет автоматически искать расширение редактора, использующее свойства $application и $module вашего элемента содержимого, поэтому вам потребуется создать расширение редактора, удовлетворяющее этому требованию.

    Отображение

    Вы можете отображать комментарии любым образом, но, если Вы хотите убедиться, что такие функции JavaScript, как AJAX-ответы и редактирование работают, вы должны применить определенные атрибуты.

    Вот пример разметки:

    <div data-controller='core.commentFeed' data-feedID='messages-
    {$item->id}'>
    	<br>
    	{{if $item->commentPageCount() > 1}}
    		{$item->pagination()|raw}
    		<br><br><br>
    	{{endif}}
    	<div data-role='commentFeed'>
    		{{foreach $item->comments() as $comment}}
    		{$comment->html()|raw}
    		{{endforeach}}
    	</div>
    	<div data-role='replyArea'>
    		{$item->commentForm()|raw}
    	</div>
    </div>
    

    Эти методы будут использовать обобщенные шаблоны. Чтобы настроить используемый шаблон, добавьте один или оба этих метода к своей модели Комментариев (здесь показаны значения по умолчанию):

    /**
    * @brief [Content\Comment]	Comment Template
    */
    public static $commentTemplate = array( array( 'global', 'core', 'front' ), 'commentContainer' );
    
    
    /**
    * @brief [Content\Comment]	Form Template
    */
    public static $formTemplate = array( array( 'forms', 'core', 'front' ), 'commentTemplate' );
    

    Изменения Элементов Содержимого

    Дополнительные свойства и методы в \IPS\Content\Item

    static $commentsPerPage
    Контролирует количество комментариев на странице. По умолчанию - 25.

    commentPageCount()
    Возвращает число страниц комментариев.

    commentPagination()
    Возвращает HTML ссылок разбивки на страницы

    comments( int $limit=NULL, int $offset=NULL, string $order=‘date’, string $orderDirection=‘asc’, \IPS\Member $member=NULL )
    возвращает либо объект \IPS\Content\Comment (если $limit равен 1) или массив комментариев. См. phpdocs для полной информации.

    commentForm()
    Возвращает HTML формы ответа.

    lastCommentPageUrl()
    Возвращает URL последней страницы комментариев.

    canComment()
    Возвращает логическое значение, указывающее может ли вошедший пользователь оставлять комментарии.

    Изменения поведения

    stats()теперь будет возвращать дополнительный элемент, включая количество комментариев.

    Поиск

    Комментарии могут быть включены в результаты поиска и последние действия наряду с элементами содержимого.

    Другие требования

    Поиск должен быть применен и к элементам контента.

    Что изменится после внедрения

    Комментарии будут проиндексированы и включены в результаты поиска и последние действия. Индекс будет автоматически обновлен, когда комментарии создаются, редактируются, перемещаются, скрываются, итп., и работает автоматически и с MySQL index, и со Sphinx.

    Дополнительные методы, доступные после внедрения

    Нет

    Как применить

    1. Добавить интерфейс:

    implements \IPS\Content\Searchable

    Жалобы

    На комментарии можно жаловаться модераторам.

    Другие требования

    Нет

    Что изменится после внедрения

    Кнопка "Пожаловаться" будет автоматически отображаться рядом с комментарием для пользователей, у которых есть возможность отправлять жалобы на комментарии.

    Дополнительные методы, доступные после внедрения

    canReport( [$member] )
    Проверяет может ли пользователь (или конкретный пользователь, или пользователь вошедший в данный момент) жаловаться на содержимое, учитывая может ли группа, к которой принадлежит пользователь, отправлять жалобы, просматривать содержимое, являются ли члены группы авторами и отправляли ли они уже жалобу на данный элемент содержимого.

    report( $reportContent )
    Отправляет жалобу

    Как применить

    1.    Добавить интерфейс:

    implements \IPS\Content\ReportCenter

    2.    Добавляет новые свойства для определения имени класса CSS в целях представления данного элемента содержимого при просмотре отчетов.

    public static $icon = 'icon';

    История редактирования

    Комментарии могут вести лог того, кто отредактировал комментарий, а также записывать все внесенные изменения.

    Другие требования

    Нет

    Что изменится после внедрения

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

    Дополнительные методы, доступные после внедрения

    editLine()
    Возвращает строку "Отредактировано х дней назад Пользователем" для отображения рядом с комментарием.

    editHistory( bool $staff )
    Возвращает итератор с историей редактирования.

    Как применить

    1.    Добавить интерфейс:

    implements \IPS\Content\EditHistory

    2.    Добавляет следующие элементы к $databaseColumnMap

    Элемент

    Описание

    Требуется?

    edit_time

    Unix временная отметка - когда было внесено последнее изменение

    Да

    edit_show

    Логическое значение, указывающее нужно ли показывать сообщение о редактировании

    Да

    edit_member_name

    Юзернейм пользователя, внесшего изменения

    Да

    edit_reason

    Причина редактирования

    Нет, но рекомендуется

    edit_member_id

    ID пользователя, внесшего изменения

    Нет

    Скрытие / восстановление

    Комментарии могут быть скрыты для простых пользователей. Это может быть использовано для обязательного подтверждения администрацией ресурса комментариев, прежде чем их можно будет просмотреть, и как способ скрыть нежелательные комментарии.

    Другие требования

    Нет

    Дополнительно

    Полномочия модератора

    Что изменится после внедрения

    • loadAndCheckPerms(…)теперь будет выдавать ошибку OutOfRange, если загружается скрытый элемент содержимого, и у вошедшего пользователя нет прав на просмотр скрытого содержимого.
    • Скрытые комментарии теперь будут отображаться только для тех пользователей, у которых есть права на просмотр скрытых комментариев.
    • Пользователи, имеющие соответствующие права модератора, теперь увидят кнопку скрыть/восстановить под комментарием.
    • Комментарии от пользователей, контент от которых подлежит модерации, будут скрыты до тех пор, пока вручную не будут подтверждены администрацией.

    Дополнительные методы, доступные после внедрения

    hidden()
    Возвращает число, указывающее состояние скрытия:

    • -1 означает, что содержимое скрыто, но раньше оно не было скрытым.
    • 0 означает, что содержимое не скрыто (значение по умолчанию, обычное состояние).
    • 1 означает, что содержимое скрыто и было отмечено как скрытое на момент публикации.

    canHide( \IPS\Member $member=NULL )
    Возвращает логическое значение, указывающее может ли $member (пользователь, вошедший в данный момент, если NULL) скрыть элемент. Учитывает, если он уже заблокирован.

    canUnhide( \IPS\Member $member=NULL )
    Возвращает логическое значение, указывающее может ли $member (пользователь, вошедший в данный момент, если NULL) отменить скрытие элемента. Учитывает, если он уже заблокирован.

    Новый метод также доступен в классе элемента содержимого:

    canViewHiddenComments( \IPS\Member $member=NULL )
    Возвращает логическое значение, указывающее может ли $member (пользователь, вошедший в данный момент, если NULL) просматривать скрытые комментарии к публикации.

    Как применить

    1.    Добавить интерфейс:

    implements \IPS\Content\Hideable

    2.    Добавляет либо элемент hidden или элемент approved к $databaseColumnMap с указанием колонки в базе данных, которая содержит статус содержимого.

    Элемент

    Значение, если не скрыт (обычный, по умолчанию)

    Значение, если скрыт (ранее был не скрыт)

    Значение, если ожидает подтверждения

    hidden

    -1

    1

    approved

    1

    -1

    3.    Дополнительно, вы также можете добавить элемент unapproved_comments к
    $databaseColumnMap в классе элемента содержимого указывает на колонку, содержащую количество комментариев, ожидающих подтверждения.

    4.    Комментарии от пользователей, контент от которых подлежит модерации, будут по умолчанию скрыты автоматически. Вы можете переопределить метод, который обрабатывает данную функцию, например чтобы все комментарии в определенных узлах обязательно требовали подтверждения. Чтобы сделать это, перезапишите метод moderateNewComments(…)в классе элемента содержимого - например:

    public static function moderateNewComments( \IPS\Member
    $member )
    {
    if ( $this->item()->container()->bitoptions[‘moderation’] and !static::modPermission( 'unhide', $member, $this->item()-
    >container() ) )
    {
    return TRUE;
    }
    
    return parent::moderateNewComments( $member );
    }

    Репутация

    Пользователи могут "лайкать" или присваивать репутацию комментариям. Общая репутация отображается в профиле пользователя.

    Другие требования

    Нет

    Что изменится после внедрения

    Кнопки репутации будут автоматически отображаться рядом с комментариями.

    Дополнительные методы, доступные после внедрения

    reputation()
    Возвращает целое число с указанием текущей репутации элемента.

    canGiveReputation( int $type, \IPS\Member $member=NULL )
    Возвращает логическое значение, указывающее может ли $member (вошедший в данный момент пользователь, если NULL) присваивать $type (1 - положительная, -1 - отрицательная) репутации комментарию.

    giveReputation( $type, \IPS\Member $member=NULL )
    Присваивает репутацию комментарию. Сгенерирует DomainException если $member  не разрешено присваивать репутацию комментарию.

    repGiven( \IPS\Member $member=NULL )
    Возвращает целое число (1 - положительная, -1 - отрицательная, 0 - нет репутации) с указанием какую репутацию $member (вошедший в данный момент пользователь если NULL) присвоил комментарию.

    Как применить

    1.    Добавить интерфейс:

    implements \IPS\Content\Reputation

    2.    Добавьте свойство, указывающее ключ для разделения репутации, присваиваемой данному типу содержимого, от другого типа репутации. Это может быть все, что угодно, но рекомендуется использовать название колонки в таблице вашей базы данных (с префиксом), в которой хранится ID.

    public static $reputationType = ‘comment_id’;

    Подписка

    Пользователи могут оформлять подписку на элементы содержимого и им будет приходить уведомление, когда будет добавлен новый комментарий.

    Другие требования

    Должна быть возможность подписаться на элемент содержимого.

    Что изменится после внедрения

    После публикации нового комментария, пользователи, подписанные на контент, получат уведомление. Если комментарий требует утверждения модератором, то уведомления будут отложены до тех пор, пока комментарий не будет утвержден.

    Дополнительные методы, доступные после внедрения

    Эти методы доступны для класса элемента содержимого, а не для класса комментария:

    followers( int $privacy=3, array $frequencyTypes=array( ‘immediate’, ‘daily’, ‘weekly ), array $limit=array( 0, 25 ), string $order=‘name’ )
    Возвращает объект \IPS\Db\Select, который может повторяться с целью получения данных о том, какие пользователи подписаны на элемент содержимого. См. phpDocs для доступных вариантов. $privacy является побитовым значением, использующим константы \IPS\Content\FOLLOW_* - значение по умолчанию 3, включает общедоступную и анонимную подписку.

    Как применить

    1. Добавьте кнопку подписки на страницу, где можно просмотреть Ваш элемент содержимого:

    {template="follow" app="core" group="global" params=“'yourApp', ‘YourContentItemClass’, $item->id, $item->followers()->count( TRUE
    )"}

     



    User Feedback

    Join the conversation

    You can post now and register later. If you have an account, sign in now to post with your account.
    Note: Your post will require moderator approval before it will be visible.

    Guest

    • This will not be shown to other users.
    • Add a review...

      ×   Pasted as rich text.   Paste as plain text instead

        Only 75 emoji are allowed.

      ×   Your link has been automatically embedded.   Display as a link instead

      ×   Your previous content has been restored.   Clear editor

      ×   You cannot paste images directly. Upload or insert images from URL.

      Loading...

Messenger

    ×
    ×
    • Create New...

    Important Information

    By using our site you agree to our Privacy Policy