Jump to content
Русская поддержка Invision Community
  1. Модель элемента контента

    Наследственная цепочка
    Ваша модель контента расширяет несколько классов. В свою очередь, это:
    \IPS\Content\Item - Предоставляет возможности Элементов Контента. Данный класс содержит весь код для различных дополнительных функций элементов контента, которые вы активируете, добавив свойства и интерфейсы в вашу модель. \IPS\Content - Предоставляет небольшое количество функций, которые являются общими для моделей Элемента Контента и моделей Комментария Контента (проясним позже) таких, как получение автора и работа с $databaseColumnMap. \IPS\Patterns\ActiveRecord - Обеспечивает функциональность загрузки элементов из базы данных, работы с их свойствами, сохранения и удаления. Дополнительную информацию об этом классе см. в документе Active Records. Основной скелет
    <?php namespace IPS\yourapp; class _YourClass extends \IPS\Content\Item { /** * @brief Multiton Store */ protected static $multitons; /** * @brief Default Values */ protected static $defaultValues = NULL; /** * @brief Application */ public static $application = 'yourapp'; /** * @brief Module */ public static $module = 'yourmodule'; /** * @brief Database Table */ public static $databaseTable = 'table'; /** * @brief Database Prefix */ public static $databasePrefix = 'prefix_'; /** * @brief Database Column Map */ public static $databaseColumnMap = array( 'author' => 'author' ); /** * @brief Title */ public static $title = ‘thing’; /** * Get URL * * @param string|NULL * @return \IPS\Http\Url */ public function url( $action=NULL ) { $url = \IPS\Http\Url::internal( ... ); if ( $action ) { $url = $url->setQueryString( 'do', $action ); } return $url; } } Указание свойств класса
    Модели Элемента Контента требуют указания нескольких статических свойств для настройки их поведения. Многие из них относятся к классу Active Records.
    public static $application = 'string';
    Обязательное. Ключ приложения, к которому принадлежит элемент контента.
    public static $module = 'string';
    Обязательное. Ключ модуля, к которому принадлежит элемент контента.
    public static $multitons = array();
    public static $defaultValues = NULL;
    Обязательное. Наследуется от \IPS\Patterns\ActiveRecord.
    Эти два свойства обязательны по требованию \IPS\Patterns\ActiveRecord. Их нет необходимости переназначать; они просто должны быть определены.
    public static $databaseTable = 'string';
    Обязательное. Наследуется от \IPS\Patterns\ActiveRecord.
    Имя таблицы базы данных, в которой хранятся эти элементы контента.
    public static $databasePrefix = 'string';
    Необязательное. Наследуется от \IPS\Patterns\ActiveRecord. 
    Указывает префикс поля, используемый этой таблицей.
    public static $databaseColumnMap = array();
    Обязательное. Возможности, предоставленные классами выше, которые расширяет ваша модель, будут проверять этот массив, чтобы узнать, какие столбцы хранятся в вашей базе данных. Требуются следующие элементы, и во всех случаях значение с $databasePrefix опущено:
    author - Должно содержать имя столбца, содержащего ID пользователя, разместившего контент. title - Должно содержать имя столбца, содержащего заголовок контента. date - Должно содержать имя столбца, который содержит UNIX-время, когда был создан элемент контента. ip_address - Должно содержать имя столбца (без $databasePrefix), который содержит IP-адрес пользователя, разместившего контент. public string $title = 'string';
    Ключ для языковой строки, описывающий то, чем является ваш элемент контента (Например, 'Тема', 'Файла', 'Изображение', и т.д.)
    Доступные методы моделей Элементов Контента
    В дополнение к тем методам, которые предоставляются \IPS\Patterns\ActiveRecord (которые работают точно так же, как и для нод), доступен ряд дополнительных методов.
    \IPS\Patterns\ActiveRecordIterator static getItemsWithPermission( ... )
    Получает элементы контента, к которым у текущего пользователя есть доступ. Смотрите phpDoc в файле /system/Content/Item.php для просмотра всех поддерживаемых аргументов.
    \IPS\Member author()
    Возвращает объект \IPS\Member пользователя, разместившего элемент контента. Например:
    $item = YourClass::load( 1 ); $user = $item->author(); echo $user->name; boolean canView( [ \IPS\Member $member=NULL ] )
    Возвращает логическое значение, указывающее, может ли предоставленный пользователь просматривать элемент контента. По умолчанию всегда будет возвращать значение TRUE, но зависит от включены ли разрешения и если включено Hiding.
    $member (\IPS\Member, optional) - Если предоставлено, используются разрешения текущего пользователя при выполнении проверки. По умолчанию будет использоваться текущий пользователь. boolean canEdit( [ \IPS\Member $member=NULL ] )
    Возвращает логическое значение, указывающее, может ли предоставленный пользователь редактировать элемент контента.
    $member (\IPS\Member, optional) - Если предоставлено, используются разрешения текущего пользователя при выполнении проверки. По умолчанию будет использоваться текущий пользователь. boolean canDelete( [ \IPS\Member $member=NULL ] )
    Возвращает логическое значение, указывающее, может ли предоставленный пользователь удалить элемент контента.
    $member (\IPS\Member, optional) - Если предоставлено, используются разрешения текущего пользователя при выполнении проверки. По умолчанию будет использоваться текущий пользователь. boolean static modPermission( string $type [, \IPS\Member $member=NULL [, \IPS\Node\Model $container=NULL ] ] )
    Возвращает логическое значение, указывающее, имеет ли предоставленный пользователь разрешение выполнить действие, указанное параметром $type в указанном контейнере $container (если предоставлен).
    $type (string, required)
    Тип проверяемого разрешения. Допустимые значения:
    edit delete move feature (если включена такая возможность) unfeature (если включена такая возможность) pin (если включена такая возможность) unpin (если включена такая возможность) lock (если включена такая возможность) unlock (если включена такая возможность) hide (если включена такая возможность) unhide (если включена такая возможность) view_hidden (если включена такая возможность) $member (\IPS\Member, optional)
    Если предоставлено, используются разрешения текущего пользователя при выполнении проверки. По умолчанию будет использоваться текущий пользователь.
    $container (\IPS\Node\Model, optional)
    Если предоставлено, проверяет разрешение именно в этом контейнере ноды.
    void modAction( string $type [, \IPS\Member $member=NULL [, string $reason=NULL ] ] )
    Выполняет указанное действие модерации. Выбрасывает исключение OutOfRangeException, если пользователь не имеет разрешения на выполнение этого действия.
    $type (строка, обязательно) - Тип выполняемого действия модерации. Допустимые значения можете найти в списке предыдущего метода. $member (\IPS\Member, необязательно) - Если предоставлено, используются разрешения текущего пользователя при выполнении проверки. По умолчанию будет использоваться текущий пользователь. $reason (строка, необязательно) - Используется только для действий скрыть/показать; определяет причину, по которой предпринимается действие.
  2. Контроллер элемента контента

    Расширение класса \IPS\Content\Controller приводит к унаследованию множества возможностей.
    Как и все типы контроллеров, ваш контроллер элемента контента находится в директории <app>/modules/<location>, например yourapp/modules/front/somemodule/somecontroller.php. 
    Если вы еще не читали о стандартных контроллерах в Invision Community, мы рекомендуем сперва ознакомиться с основными принципами Контроллеров перед продолжением изучения данного материала. Контроллеры элементов контента - это просто более специализированная версия стандартного контроллера диспетчера, и поэтому большая часть функций остается прежней, однако становятся доступны методы, специфичные для элементов контента.
    Основной скелет
    По своей сути контроллер элемента контента прост:
    namespace IPS\yourapp\modules\front\yourmodule; class _yourcontroller extends \IPS\Content\Controller { } Главное, что нужно отметить, чтобы ваш контроллер расширял \IPS\Content\Controller, вместо напрямую \IPS\Dispatcher\Controller. Просто выполнив это, ваш контроллер уже имеет возможность удалять контент - если вы добавите &do=delete&id=X (где X - ID элемента) в URL-адресу элемента, в данном случае контроллер сперва автоматически проверит, имеет ли пользователь разрешение на удаление элемента (что, по умолчанию, доступно только для пользователей, являющихся модератором с разрешением на удаление любого контента). 
    По мере прохождения других шагов этого руководства вы будете внедрять в свой контроллер другие интерфейсы, которые добавят новые функции (как автоматические, так и новые методы, которые вы можете вызвать).
  3. Создание элементов контента

    Создание формы "Добавить элемент"
    Вы можете создать форму, которая позволяет пользователям создавать новые элементы контента, просто вызывая следующее в методе контроллера:
    \IPS\Output::i()->output = \IPS\yourApp\YourModelClass::create( $node ); Вы должны передать ноду, в которой создаётся элемент контента, в виде параметра (или передать NULL, если вы создаёте элемент контента, не зависящие от нод, или если вы добавите элемент формы (например выпадающий список), из которого пользователь может выбрать сам ноду). Метод create() автоматически обработает отображение формы, создание элемента, а затем перенаправит пользователя после создания.
    Элементы формы получаются из метода formElements() унаследованного вашей моделью из модели элемента контента. Вы можете переопределить этот метод в своей собственной модели, добавив дополнительные поля, которые будут отображаться как в форме создания, так и в форме редактирования. Метод автоматически добавляет поля для:
    Заголовка элемента. Тегов (если ваша модель реализует тегирование). Поля редактора для первого комментария к вашему элементу (если комментирование поддерживается вашей моделью, и требуется первый комментарий). Если вы переопределяете метод formElements(), обязательно также вызовите родительский метод, чтобы включить эти автоматические поля.
    Названия для элементов форм имеют префикс в виде значения статического свойства $formLangPrefix (которое по умолчанию пустое, если не будет перезаписано). Вы можете установить это свойство, если хотите использовать собственные языковые строки для кастомизации результата вашей формы.
    Методы жизненного цикла
    Существует несколько методов жизненного цикла, которые можно переопределить для выполнения действий в определенных точках создания.
    boolean canCreate( \IPS\Member $member [, \IPS\Node\Model $container=NULL [, boolean $showError=FALSE ] ] )
    Прежде чем отобразить форму, этот метод вызывается, чтобы определить, имеет ли пользователь разрешение на создание новых элементов. Большинство проверок разрешений обрабатываются автоматически, поэтому обычно вам не нужно переопределять этот метод, но если вам нужно выполнить дополнительные проверки, они могут быть выполнены здесь. Например, модуль личных сообщений имеет настройку, которая может ограничивать количество сообщений, отправленных за день, поэтому данный лимит проверяется в этом методе модели личных сообщений.
    $member (\IPS\Member, обязательный ) - пользователь, чьи разрешения проверяются. $container (\IPS\Node\Model, необязательный) - контейнер, в котором будет создан элемент, если необходимо. $showError (boolean, необязательный, по умолчанию FALSE) - по умолчанию этот метод вернёт знаение true/false. Если $showError имеет значение TRUE, вместо того, чтобы возвращать значение, этот метод будет показывать ошибку пользователю. void processBeforeCreate( массив $values )
    Данный метод вызывается непосредственно перед вводом данных в базу данных, но после того, как объект был создан в памяти, и были установлены стандартные значения, такие как автор, дата и любые поля, которые могут быть установлены благодаря наличию того же ключа, как и столбец базы данных. Важно отметить, что этот метод работает только для новых элементов.
    $values (массив, обязательный) - Массив значений из формы. void processForm( массив $values )
    Данный метод вызывается сразу же после processBeforeCreate (см. ниже). Он отличается от этого метода тем, что он также работает для редактируемых элементов. Вы должны использовать его для установки любых полей, добавленных в formElements(), которые являются более сложными, чем просто установить прямое значение (что было бы сделано автоматически). Стандартный метод устанавливает заголовок, теги (если включено - смотрите раздел Теги) и другие данные, поэтому убедитесь, что вы вызываете метод в родительском классе, чтобы не переопределить это.
    $values (массив, обязательный) - Массив значений из формы. void processAfterCreate( \IPS\Comment\Content $comment=NULL, массив $values )
    Вызывается после того, как элемент контента был добавлен в базу данных, и была завершена вся обработка, включая создание первого комментария, если включено.
    $comment (\IPS\Comment\Content, required, default NULL) - Объект для первого комментария, если применимо $values (array, required) - Массив значений из формы. Увеличение количества сообщений
    По умолчанию, при публикации пользователем нового элемента контента, его количество сообщений увеличивается на единицу. Это может быть нежелательно в зависимости от цели вашего приложения, поэтому, определяя метод incrementPostCount на вашей модели, вы можете контролировать это поведение.
    boolean incrementPostCount( \IPS\Node\Model $container=NULL )
    $container (\IPS\Node\Model, optional, default NULL) - Контейнер, в котором создается элемент контента, если это применимо. Возвращает true или false из этого метода, чтобы определить, следует ли увеличивать количество сообщений пользователя.
  4. Контейнеры элементов контента

    В большинстве случаев ваши элементы контента будут существовать внутри структуры контейнеров нод, которые их классифицируют - например, темы (элемент) в форуме (нода), или изображения (элемент) в альбоме (нода). В модели элементов контента доступно несколько методов, облегчающих работу с этими отношениями.
    Добавление поддержки для нод контейнеров
    Первый шаг, который вам нужно предпринять - добавить новое статическое свойство в вашу модель элемента контента. 
    protected static $containerNodeClass = 'string';
    Значение этого свойства должно быть именем класса модели ноды, позволяя Invision Community распознать отношения. Далее вам нужно добавить ключ контейнера в массив $databaseColumnMap в вашей модели (дополнительную информацию см. в руководстве по модели элементов контента). Значение должно быть именем столбца базы данных, содержащего ID номер контейнера.
    Оба примера можно наблюдать здесь:
    protected static $containerNodeClass = "IPS\yourapp\YourNodeClass"; public static $databaseColumnMap = array( //... Другие значения, определенные в вашей карте столбцов 'container' => 'item_parent_id' ); Дополнительные методы, доступные для моделей элементов контента
    После добавления поддержки контейнеров доступны два метода:
    boolean canMove( \IPS\Member $member=NULL )
    Возвращает логическое значение, указывающее, может ли предоставленный пользователь перемещать элемент в другой контейнер.
    $member (\IPS\Member, optional) - Пользователь, чьи разрешения должны использоваться. По умолчанию используется авторизованный в настоящее время пользователь.  void move( \IPS\Node\Model $container [, boolean $keepLink=FALSE ] )
    Перемещает элемент в другой контейнер. Примечание: данный метод не проверяет разрешения; используйте canMove() в первую очередь.
    $container (\IPS\Node\Model, обязательный) - Объект ноды контейнера, в который будет перемещен элемент. $keepLink (boolean, необязательный, по умолчанию FALSE) - Если true, добавляется ложный элемент контента, который указывает на новое местонахождение старого элемента контента. Дополнительные методы также доступны для модели ноды контейнера, помогающие вам работать с коллекциями элементов; более подробную информацию см. в документации по модели ноды контейнера.
  5. Разрешения в элементах контента

    Элементы контента могут автоматически проверять, имеет ли пользователь разрешение на выполнение определенных действий путем изучения объекта ноды контейнера. Чтобы эта функциональность поддерживалась, как и следовало ожидать, ваши элементы контента должны использовать ноды контейнера. Для получения дополнительной информации обратитесь к документации по контейнерам нод и поддержке контейнеров в элементах контента.
    Поддержка разрешений в элементах контента
    Все, что вам нужно сделать для поддержки разрешений - это реализовать интерфейс разрешений в вашем классе модели элементов контента:
    implements \IPS\Content\Permissions Изменения в методах модели после реализации разрешений
    Несколько методов в вашей модели элемента контента немного меняют поведение при реализации разрешений.
    canView() вернёт FALSE для элемента ноды, у которого пользователь не имеет разрешения на просмотр. loadAndCheckPerms() вызовет исключение OutOfRange, если загружен объект, к которому пользователь не имеет разрешения на просмотр. Во всех местах, где функции что-то делают, будет проверено разрешение. Например, canCreate() теперь вернёт FALSE, если пользователь не имеет разрешения на создание элементов контента в указанной ноде. getItemsWithPermission() будет возвращать только элементы, к которым текущий авторизованный пользователь имеет разрешение на просмотр (или другое разрешение, указанное параметрами). Доступные дополнительные методы модели
    boolean can( строка $permission [, \IPS\Member $member=NULL ] )
    Возвращает логическое значение, указывающее, имеет ли пользователь разрешение на выполнение указанного действия.
    $permission (строка, обязательный) - Ключ проверяемого разрешения. Действие должно соответствовать значению из статического свойства $permissionMap класса контейнера. $member (\IPS\Member, необязательный) - Объект пользователя, разрешения которого должны быть проверены. Вы можете передать объект \IPS\Member\Group, чтобы проверить права группы. Если значение не передано, используется текущий авторизованный пользователь. integer permId()
    Возвращает идентификатор индекса разрешения для этой модели элемента.
     
  6. Маршрутизация контента

    Расширение маршрутизации контента для Элемента Контента
    Многие фнукции Invision Community обрабатываются централизованно и автоматически, например, предупреждения и разрешения модератора. Для поддержки этого, вам необходимо зарегистрировать ваши типы элементов контента с помощью ядра, что с делается с помощью простого расширения Content Router (далее Маршрутизация Контента). Дополнительные сведения о расширениях смотрите в соответствующем документе.
    Как реализовать расширение ContentRouter
    Первым шагом к реализации вашего маршрутизатора контента является создание расширения ContentRouter в Центре разработчика вашего приложения. Имя класса должно иметь отношение к цели вашей модели, к примеру Темы. Откройте созданный файл и добавьте такой код (изменив значения, если это необходимо):
    namespace IPS\yourApp\extensions\core\ContentRouter; class _YourClass { public $classes = array( 'IPS\yourApp\YourContentItemClass' ); } Далее добавьте следующее свойство в вашу модель ноды (но не в модель элемента контента):
    static $modPerm = 'string';
    Значение используется как ключ для хранения нод, с которыми модератор имеет разрешение работать. Это может быть что угодно. Создайте языковую строку в вашем файле lang.php с этим же ключом - это будет текстовое представление того, как называются ваши ноды (например, 'Категории'). Наконец, добавьте языковую строку в файл lang.php для каждого из действий модерации, используя этот формат:
    can_<action>_<title> где <title> это ключ, определяемый статическим свойством $title из вашей модели элемента контента. Действия, которые вам нужно определить, будут зависеть от того, какие функции элементов контента вы поддерживаете в своей модели, но могут включать:
    pin и unpin (если поддерживается закрепление). feature и unfeature (если поддерживается возможность делать контент популярным). hide, unhide и view_hidden (если поддерживается скрытие и одобрение). lock, unlock и reply_to_locked (если поддерживается закрытие). edit. move. delete. Примечание: если ваш элемент контента поддерживает комментирование, повторите этот последний шаг для действий, которые могут быть выполнены у комментариев (edit, delete, hide, unhide и view_hidden), где <title> будет ключом, определённым статическим свойством $title из вашей модели комментария контента.
    В качестве примера предположим, что $title нашей модели элемента контент является 'myapp_entry'. В таком случае языковые строки будут с такими ключами:
    'can_edit_myapp_entry' => "Можно редактировать записи?", 'can_move_myapp_entry' => "Можно перемещать записи?", 'can_delete_myapp_entry' => "Можно удалять записи?" ...и так далее.
    Поведение, которое изменяется после реализации расширения ContentRouter
    При создании модератора администраторы смогут настраивать разрешения модератора для ваших элементов контента. При просмотре профиля пользователя, показ всего контента, размещенного этим пользователем, будет содержать и ваши элементы контента. Если вы поддерживаете скрытие элементов контента, при просмотре панели модератора будут показаны скрытые элементы контента из вашего приложения. При перестройке количества сообщений пользователя учитываются элементы вашего контента. При удалении всего контента пользователя, элементы контента вашего приложения у пользователя также будут удалены.
  7. Работа с контентом

    Если вы используете элементы контента в своем приложении, то, разумеется, вы захотите использовать контент в этих элементах в какой-то момент. Существует две возможности в зависимости от того, использует ли ваша модель определенный столбец для контента или ожидает, что первый комментарий будет действовать как контент (так, например, в приложении "Форумы").
    Для поля определённого контента
    Для поля определённого контента просто добавьте ключ в $databaseColumnMap со значением, являющимся столбцом в базе данных, содержащей контент.
    Для комментариев в качестве контента
    Когда вы реализуете комментарии контента, первый комментарий будет автоматически рассматриваться как элемент контента.
    Методы, доступные для работы с контентом
    string content()
    Возвращает значение контента.
    string truncated( [ boolean $oneLine=FALSE ] )
    Возвращает контент в формате, подходящем для использования с виджетом data-ipsTruncate.
    $oneLine (логический, необязательный, по умолчанию FALSE) - по умолчанию параграфы воспринимаются в разрыв строки. Если данный параметр имеет значение TRUE, параграфы заменяются пробелами вместо разрывов строк, что делает усеченный контент подходящим для однострочного отображения.  
  8. Популярный элемент контента

    Как реализовать популярность
    Чтобы поддерживать возможность делать контент популярным в вашем приложении, вы сперва должны реализовать интерфейс в вашей модели элемента контента:
    implements \IPS\Content\Featurable Затем вам нужно добавить ключ в ваше свойство $databaseColumnMap, со значением, являющимся именем столбца в вашей таблице базы данных, в которой хранится статус популярности элемента.
    Ну и наконец, вам нужно добавить поддержку в ваши шаблоны. Например:
    {{if $item->canFeature()}} <a href='{$item->url()->setQueryString( array( 'do' => 'moderate', 'action' => 'feature' ) )}'>{lang="feature"}</a> {{endif}} {{if $item->canUnfeature()}} <a href='{$item->url()->setQueryString( array( 'do' => 'moderate', 'action' => 'unfeature' ) )}'>{lang="unfeature"}</a> {{endif}} Изменения после реализации
    После реализации интерфейса \IPS\Content\Featurable, модераторы с соответствующим разрешением смогут видеть и использовать инструменты для популяризации контента при выборе элементов в списке элементов контента.
    Дополнительные доступные методы модели
    \IPS\Patterns\AciveRecordIterator static featured( [ integer $limit [, string $order [, \IPS\Node\Model $container ] ] ] )
    Возвращает популярные элементы. Если разрешения поддерживаются в вашей модели, возвращаются только те элементы, на просмотр которых у пользователя есть разрешение.
    $limit (integer, необязательный, по умолчанию 10) - Количество элементов для возврата. $order (string, необязательный, по умолчанию 'RAND()') - Порядок сортировки для использования в запросе. $container (\IPS\Node\Model, необязательный, по умолчанию NULL) - Если указано, будут возвращены только популярные элементы из данного контейнера. boolean canFeature( \IPS\Member $member )
    Указывает, имеет ли пользователь разрешение на установку элемента популярным. Этот метод учитывает, включен ли элемент. Этот метод учитывает, является ли уже элемент популярным.
    $member (\IPS\Member, необязательный) - Если предоставлено, будут проверять разрешения данного пользователя. По умолчанию, будет использован текущий авторизованный пользователь. boolean canUnfeature( \IPS\Member $member )
    Указывает, имеет ли пользователь разрешение на установку элемента НЕ популярным. Этот метод учитывает, является ли уже элемент не популярным.
    $member (\IPS\Member, необязательный) - Если предоставлено, будут проверять разрешения данного пользователя. По умолчанию, будет использован текущий авторизованный пользователь.
  9. Закреплённый элемент контента

    Как реализовать закрепление
    Чтобы поддерживать закрепление элементов контента в вашей модели, вам необходимо реализовать следующий интерфейс:
    implements \IPS\Content\Pinnable Затем вы должны добавить ключ закрепления в свойство $databaseColumnMap, со значением, которое является именем столбца базы данных, хранящего статус закрепления вашего элемента.
    Ну и наконец, вам нужно добавить поддержку в ваши шаблоны. Например:
    {{if $item->canPin()}} <a href='{$item->url()->setQueryString( array( 'do' => 'moderate', 'action' => 'pin' ) )}'>{lang="pin"}</a> {{endif}} {{if $item->canUnpin()}} <a href='{$item->url()->setQueryString( array( 'do' => 'moderate', 'action' => 'unpin' ) )}'>{lang="unpin"}</a> {{endif}} Изменения после реализации
    Закреплённые элементы будут отображаться вверху списка элементов контента. Модераторы с соответствующим разрешением смогут видеть и использовать инструменты для закрепления контента при выборе элементов в списке элементов контента. Дополнительные доступные методы модели
    boolean canPin( \IPS\Member $member )
    Указывает, имеет ли пользователь разрешение на закрепление элементов. Этот метод учитывает, был ли элемент уже закреплен.
    $member (\IPS\Member, optional) - Если предоставлено, будут проверять разрешения данного пользователя. По умолчанию, будет использован текущий авторизованный пользователь. boolean canUnpin( \IPS\Member $member )
    Указывает, имеет ли пользователь разрешение откреплять элементы. Этот метод учитывает, является ли элемент уже незакрепленным.
    $member (\IPS\Member, optional) - Если предоставлено, будут проверять разрешения данного пользователя. По умолчанию, будет использован текущий авторизованный пользователь.
  10. Тегирование элементов контента

    К элементам контента пользователи могут добавлять теги. Теги могут быть использованы для поиска других различных типов контента с такими же тегами. Префикс является одним из тегов элемента, который показывается выделенным и в начале заголовка элемента.
    Как реализовать тегирование
    Тегирование требует, чтобы ваши элементы контента находились внутри ноды контейнера. Во-первых, вам необходимо реализовать интерфейс тегирования:
    implements \IPS\Content\Tags Затем вы можете отображать префикс и теги в отображении для своего элемента, например:
    {{if $item->prefix()}} <a href="{url="app=core&module=system&controller=tags&tag={$item->prefix()}" seoTemplate="tags"}">{$item->prefix()}</a> {{endif}} {{if count( $file->tags() )}} <ul> {{foreach $file->tags() as $tag}} <li> <a href="{url="app=core&module=system&controller=tags&tag={$tag}" seoTemplate="tags"}">{$tag}</a> </li> {{endforeach}} </ul> {{endif}} Изменения после реализации
    Поле для ввода тегов будет добавлено в форму создания/редактирования. Префиксы и теги будут отображаться в списках контента. Дополнительные доступные методы модели
    boolean static canTag( [ \IPS\Member $member [, \IPS\Node\Model $container ] ] )
    Указывает, имеет ли пользователь разрешение на тегирование элементов.
    $member (\IPS\Member, optional) - Если предоставлено, при проверке будут использоваться разрешения текущего пользователя. По умолчанию, будет использован текущий авторизованный пользователь. $container (\IPS\Node\Model, optional) - Если предоставлено, проверяет, может ли пользователь тегировать в этой конкретной ноде. boolean static canPrefix( [ \IPS\Member $member [, \IPS\Node\Model $container ] ] )
    Указывает, имеет ли пользователь разрешение на выбор тега в качестве префикса для элементов.
    $member (\IPS\Member, optional) - Если предоставлено, при проверке будут использоваться разрешения текущего пользователя. По умолчанию, будет использован текущий авторизованный пользователь. $container (\IPS\Node\Model, optional) - Если предоставлено, проверяет, может ли пользователь выбирать префикс к элементам в этой конкретной ноде. array tags()
    Возвращает массив тегов элемента.
    string prefix( [ boolean $encode ] )
    Возвращает префикс для элемента (NULL если элемент не имеет префикса).
    $encode (boolean, optional, default FALSE) - Если true, url-encode вернёт префикс.
  11. Поиск элементов контента

    Как реализовать поиск
    Функциональность поиска (и связанные с ним функции, такие как ленты активности) автоматически обрабатывается для вас ядром Invision Community. Вам просто нужно указать, что ваши элементы контента должны быть доступны для поиска, реализуя интерфейс:
    implements \IPS\Content\Searchable Обратите внимание, что вы также должны реализовать расширение ContentRouter.
    Изменения после реализации
    Контент будет проиндексирован и включён в результаты поиска и ленты активности. Индекс будет автоматически обновляться при создании, редактировании, перемещении, скрытии и т.д. контента.
  12. Репутация элементов контента

    Как реализовать репутацию
    Сначала вам нужно реализовать интерфейс репутации в своей модели, например:
    implements \IPS\Content\Reputation Затем вам нужно добавить статическое свойство в свою вашу модель элемента контента, которое отличает этот тип репутации от другого вида контента. Это может быть всё, что вам нравится, но принято использовать имя столбца, в котором хранится идентификатор элемента (например, topic_id или entry_id).
    public static $reputationType = 'string';
    Наконец, добавьте кнопки репутации, вызвав шаблон кнопок репутации в представлении (шаблоне) вашего элемента контента:
    {template="reputation" app="core" group="global" params=“$item"} Дополнительные доступные методы модели
    boolean canGiveReputation( integer $type [, \IPS\Member $member ] )
    Указывает, может ли пользователь выдать репутацию автору элемента контента.
    $type (integer, обязательный) - Тип репутации. Либо 1, либо -1, где 1 - положительная репутация, а -1 - отрицательная репутация. $member (\IPS\Member, необязательный) - Пользователь, чьи разрешения должны быть использованы при проверке. По умолчанию используется текущий авторизованный пользователь. void giveReputation( integer $type [, \IPS\Member $member ] )
    Выдаёт репутацию автору элемента контента. Выбрасывает исключение DomainException, если пользователь не имеет права выдавать репутацию этому элементу.
    $type (integer, обязательный) - Тип выдаваемой репутации. Либо 1, либо -1, где 1 - положительная репутация, а -1 - отрицательная репутация. $member (\IPS\Member, необязательный) - Пользователь, чьи разрешения должны быть использованы при проверке. По умолчанию используется текущий авторизованный пользователь. integer repGiven( [ \IPS\Member $member ] )
    Возвращает значение, указывающее была ли выдана репутация (и какого типа) пользователю за элемент контента. Возвращаемые значения:
    1 - была выдана положительная репутация. -1 - была выдана отрицательная репутация. 0 - репутация не выдана.  
    $member (\IPS\Member, необязательный) - Пользователь, чьи разрешения должны быть использованы при проверке. По умолчанию используется текущий авторизованный пользователь.
  13. Подписка на элемент контента

    Как реализовать возможность подписываться
    Примечание: ваше приложение также должно реализовать поиск (\IPS\Content\Searchable) для возможности реализовать подписку.
    Сперва вы должны реализовать интефрейс подписки в вашей модели элемента контента, например:
    implements \IPS\Content\Followable Затем вам нужно вставить конструкцию в шаблон, которая покажет кнопку Подписаться, в ваши ноды и сами элементы контента. В просмотр ноды (например просмотр форума), вставьте данный тег:
    {template="follow" app="core" group="global" params=“'yourApp','yourNodeClass', $node->_id, \IPS\yourApp\YourContentClass::containerFollowers( $node )->count( TRUE )"} Параметры в этом теге:
    yourApp - ключ вашего приложения. yourNodeClass - имя класса вашей ноды контейнера. $node->_id - ID вашего контейнера (например форум, в приложении "Форумы"). Последний параметр должен статически вызывать containerFollowers (смотрите ниже) в вашем классе элемента, чтобы передать текущее количество подписчиков. в шаблон просмотра элемента контента (например просмотр темы), вставьте следующий тег:
    {template="follow" app="core" group="global" params="'yourApp', 'yourContentItemClass', $item->id, $item->followersCount()"} Параметры:
    yourApp - ключ вашего приложения. yourContentItemClass - название класса вашего элемента контента. $item->id - ID соответствующего элемента контента. Последний параметр просто вызывает $item->followersCount() для передачи текущего количества подписчиков. Изменения после реализации
    После публикации нового элемента контента, пользователи, подписанные на ноду, в которой размещён элемент, получат уведомление. Если контент должен быть одобрен модератором, уведомления будут отложены до тех пор, пока контент не будет одобрен. Дополнительные доступные методы модели
    integer static containerFollowers( \IPS\Node\Model $node [, integer $privacy [, array $frequencyTypes [, \IPS\DateTime $date [, integer|array $limit [, string $order [, integer $flags ] ] ] ] ] ] )
    Возвращает подписчиков ноды.
    $node (\IPS\Node\Model, обязательный) - Нода, из которой будут возвращены подписчикии. $privacy (integer, необязательный, по умолчанию 3) - Поразрядное значение, представляющее типы подписки, которые должны быть возвращены (смотрите ниже для получения дополнительной информации). Значение по умолчанию 3 включает как анонимных, так и публичных подписчиков. $frequencyTypes (array, необязательный, по умолчанию array( 'none', 'immediate', 'daily', 'weekly' ) ) - Позволяет вам сузить возвращаемых подписчиков до определённых типов подписок. По умолчанию учитываются все типы. $limit (integer or NULL, необязательный, по умолчанию NULL) - Позволяет ограничить количество возвращаемых подписчиков. Значение передаётся в виде параметра LIMIT в результирующий запрос. $order (string, необязательный, по умолчанию NULL) - Позволяет вам определить столбец, по которому будут упорядочены результаты. $flags (integer or NULL, необязательный, по умолчанию NULL) - SQL флаги, которые будут переданы в \IPS\Db при выполнении базового запроса. Побитовые значения приватности подписок
    Конфигурация конфиденциальности подписок позволяет пользователю указать, какой должна быть подписка - 'публичной' или 'анонимной', то есть его подписка будет учтена при подсчёте общего количества подписчиков, но не будет показано имя подписчика. Значения:
    const FOLLOW_PUBLIC = 1; const FOLLOW_ANONYMOUS = 2;  
  14. Просмотр страниц элементов контента

    Ваш элемент контента может автоматически отслеживать количество просмотров реализуя интерфейс просмотра страниц. Обратите внимание, что кеширование гостевой страницы может сделать счет неточным, так как кешированная страница не увеличит количество просмотров.
    Реализация отслеживания просмотра страниц
    Во-первых, вам необходимо реализовать интерфейс просмотра страниц в вашей модели элементов контента, например:
    implements \IPS\Content\Views Наконец, убедитесь, что метод manage() в вашем контроллере элемента контента вызывает родительский метод manage():
    parent::manage(); Дополнительные доступные методы модели
    array stats( [ boolean $includeFirstComment ] )
    Возвращает массив статистических данных о элементе, с ключом num_views, содержащим количество просмотров.
    $includeFirstComment (boolean, необязательный, по умолчанию TRUE) - Определяет, подсчитывается ли первый комментарий в количестве комментариев элемента.
  15. Поделиться элементом контента

    Кнопки Поделиться позволяют пользователям распространять элементы контента в различные социальные сети, настроенные администратором.
    Как реализовать ссылки Поделиться
    Во-первых, ваша модель элемента контента должна реализовать интерфейс ссылок поделиться, например:
    implements \IPS\Content\Shareable Наконец, включите шаблон ссылок в просмотр вашего элемента контента:
    {template="sharelinks" app="core" group="global" params="$item"} Дополнительные доступные методы модели
    array sharelinks()
    Возвращает массив URL-адресов сервисов для элемента контента.
  16. Жалобы элементов контента

    Поддерживая механизм жалоб в вашем приложении, пользователи смогут жаловаться на ваши элементы контента модераторам, которые смогут рассматривать их в центре жалоб.
    Как реализовать жалобы
    Во-первых, вам необходимо реализовать интерфейс жалоб в вашей модели элементов контента, например:
    implements \IPS\Content\ReportCenter Затем добавьте статическое свойство в модель вашего элемента контента. Это свойство является названием иконки FontAwesome, которая будет представлять ваши элементы контента при просмотре в центре жалоб:
    public static $icon = 'string';
    Наконец, включите ссылку жалоб в свой HTML код. В этом случае вы не должны вызывать метод canReport(), поскольку он является ресурсоемким. Вместо этого проверьте наличие возможности у группы создавать жалобы, а так же, чтобы пользователь не являлся автором этого элемента контента. Например:
    {{if !\IPS\Member::loggedIn()->group['gbw_no_report'] and $item->author()->member_id != \IPS\Member::loggedIn()->member_id }} <a href='{$item->url('report')}' data-ipsDialog data-ipsDialog-size='narrow' data-ipsDialog-title="{lang="report_post"}" data-ipsDialog- flashMessage="{lang="node_error"}" title='{lang="report_post"}'><i class='icon-exclamation-sign'></i>&nbsp; {lang="report_post"}</a> {{endif}} Дополнительные доступные методы модели
    boolean canReport( [ \IPS\Member $member ] )
    Указывает, сможет ли пользователь жаловаться на элемент. Рассматривает наличие у группы пользователя разрешения на подачу жалоб, может ли пользователь просматривать контент и имеет ли уже отправленную жалобу на элемент.
    $member (\IPS\Member, optional) - Пользователь, чьи разрешения должны быть проверены. По умолчанию используется текущий авторизованный пользователь. \IPS\core\Reports\Report report( string $reportContent )
    Отправляет и возвращает жалобу на элемент.
    $reportContent (string, required) - Контент жалобы.
  17. Маркеры прочитанности элемента контена

    Реализация маркеров прочитанности в Элементах Контента
    Маркеры прочитанности контента позволяют пользователям легко видеть, какие элементы контента уже были просмотрены с помощью небольшой иконки в списке контента. Они являются стандартной функцией Invision Community и вы должны реализовать их, если ваше приложение каким-либо образом связано с пользовательским контентом.
    Как реализовать маркеры прочитанности
    Во-первых, ваша модель элемента контента должна реализовать интерфейс маркера прочитанности, например:
    implements \IPS\Content\ReadMarkers Затем вы должны добавить ключ в свойство $databaseColumnMap вашей модели. Ключ (и), который вы должны использовать, зависит от других функций, которые вы можете реализовать, но во всех случаях значение должно быть именем столбца базы данных, который хранит unix-время для соответствующего действия.
    Добавьте ключ updated. Добавьте ключ last_comment, если вы используете комментарии. Добавьте ключ last_review, если вы используете отзывы. Наконец, убедитесь, что, когда пользователь просматривает элемент, учитывается маркировка прочитанности. В методе manage() вашего контроллера вы должны вызвать родительский метод:
    parent::manage(); или вручную вызвать $item->markRead() для запуска действия маркировки.
    Дополнительные доступные методы модели
    Примечание: Чтобы использовать методы containerUnread() и markContainerRead(), описанные ниже, ваша модель ноды контейнера должна реализовать следующие методы. Дополнительную информацию см. в руководстве Контейнеры.
    get__items() get__comments() setLastComment() getLastCommentTime() boolean static containerUnread( \IPS\Node\Model $container [, \IPS\Member $member ] )
    Указывает, имеет ли указанный контейнер (включая дочерние) какой-либо непрочитанный контент для пользователя.
    $container (\IPS\Node\Model, обязательный) - контейнер для проверки. $member (\IPS\Member, необязательный) - Пользователь, чей статус прочитанности должен проверяться. По умолчанию будет использоваться текущий авторизованный пользователь. void static markContainerRead( \IPS\Node\Model $container [, \IPS\Member $member [, boolean $children ] ] )
    Помечает контейнер (и, необязательно, потомков) как прочитанный.
    $container (\IPS\Node\Model, обязательный) - Контейнер для маркировки прочтения. $member (\IPS\Member, необязательный) - Пользователь, чей статус прочитанности должен быть изменён. По умолчанию будет использоваться текущий авторизованный пользователь. $children (boolean, необязательный, по умолчанию TRUE) - Должны ли потомки контейнера стать также прочитанными? integer unread( [ \IPS\Member $member ] )
    Возвращает целое число, указывающее статус прочтения элемента. Возвращаемые значения:
    0 если элемент прочитан. -1 если элемент не прочитан и никогда не читался. 1 если элемент не прочитан, но был прочитан ранее (т. е. с момента последнего прочтения появилась новая активность). Применяется только при использовании комментариев.  
    $member ( \IPS\Member, необязательный ) - Пользователь, чей статус прочитанности должен проверяться. По умолчанию будет использоваться текущий авторизованный пользователь. void markRead( [ \IPS\Member $member [, integer $time [, mixed $extraContainerWhere ] ] ] )
    Помечает элемент как прочитанный.
    $member (\IPS\Member, необязательный) - Пользователь, чей статус прочитанности должен быть обновлён. По умолчанию будет использоваться текущий авторизованный пользователь. $time (integer, необязательный) - unix-время для установки как 'последнее прочтение'. По умолчанию, или если передан NULL, будет использовано текущее время. $extraContainerWhere (mixed, необязательный) - массив или строка, содержащая дополнительные операторы WHERE, которые должны быть переданы в базовый запрос.
    \IPS\DateTime timeLastRead( [ \IPS\Member $member ] )
    Возвращает объект DateTime, указывающий на последнее прочтение элемента пользователем (или NULL, если элемент ещё не прочитан)
    $member (\IPS\Member, необязательный) - Пользователь, чьё время последнего прочтения должно быть возвращено. По умолчанию будет использоваться текущий авторизованный пользователь.  
  18. Опросы в элементах контента

    Реализуя опросы в вашем приложении, пользователи смогут создать опрос при создании нового элемента контента. Процесс выполняется автоматически; новая вкладка будет отображаться в форме создания элемента, которая позволит управлять опросом.
    Как реализовать опросы
    Во-первых, ваша модель элемента контента должна реализовать интерфейс опроса, например:
    implements \IPS\Content\Polls Затем добавьте ключ в ваше свойство $databaseColumnMap со значением, являющимся названием столбца базы данных, хранящего ID опроса для данного элемента (обратите внимание, вы можете иметь только один опрос для одного элемента контента).
    Наконец, отобразите опрос в шаблоне просмотра элемента контента. Например:
    {$item->getPoll()|raw} Выполнение дополнительных действий после голосования
    При желании, ваша модель может быть оповещена, когда пользователь голосует в опросе. Для добавления поддержки этого, вы должны реализовать SPL Observer:
    implements \SplObserver В вашей модели добавьте метод обновления, который будет вызван, когда опрос получает голоса:
    void update( \IPS\Poll $poll )
    $poll (\IPS\Poll) - Опрос, на который проголосовали. Наконец, при отображении вашего элемента контента присоедините элемент к опросу. Например:
    if ( $poll = $item->getPoll() ) { $poll->attach( $item ); } Дополнительные доступные методы модели
    boolean static canCreatePoll( [ \IPS\Member $member [, \IPS\Node\Model $container ] ] )
    Указывает, может ли пользователь создать опрос.
    $member (\IPS\Member, необязательный) - Пользователь, разрешения которого должны быть проверены. По умолчанию будет использоваться текущий авторизованный пользователь. $container (\IPS\Node\Model, необязательный) - Проверяет, могут ли быть созданы опросы в этом контейнере. \IPS\Poll getPoll()
    Возвращает опрос для этого элемента (или NULL, если опроса у элемента нет).
  19. Рейтинг элемента контента

    Рейтинги позволяют пользователям оценивать элементы контента из 5 или 10 (в зависимости от настроек) звёзд.
    Как реализовать рейтинги
    Во-первых, вам необходимо реализовать интерфейс рейтингов в своей модели контента, например:
    implements \IPS\Content\Ratings Далее добавьте следующие ключи в свойство $databaseColumnMap вашей модели. Это необязательно, но добавление их сделает ваше приложение намного более эффективным при возврате среднего рейтинга при просмотре. Как обычно, значение каждого ключа должно быть именем столбца базы данных, который содержит значение.
    rating_average - текущий средний рейтинг элемента. rating_total -общая сумма всех рейтингов элемента. rating_hits - количество полученных голосов элементом. Наконец, отобразите рейтинг в шаблоне просмотра контента. Например:
    {$item->rating()|raw} Дополнительные доступные методы модели
    boolean canRate( [ \IPS\Member $member ] )
    Указывает, имеет ли пользователь разрешение на оценку этого элемента.
    $member (\IPS\Member, необязательный) - Пользователь, чьи разрешения должны быть проверены. По умолчанию используется текущий авторизованный пользователь. float averageRating()
    Возвращает средний рейтинг элементов (общий рейтинг, деленный на количество голосов).
    string rating()
    Отображает значки звездочек, представляющие текущий средний рейтинг. Если у пользователя есть разрешение на оценку элемента, эти значки будут интерактивными, позволяя пользователю кликнуть, чтобы оценить.
  20. Встаривание элемента контента

    По всему Invision Community элементы контента могут быть встроены в другой контент, генерируя небольшой предварительный просмотр контента. Вы можете поддерживать такой тип встраивания для своих элементов контента, позволяя им встраиваться в другие области сообщества.
    Примечание. Вы должны были внедрить расширение ContentRouter для поддержки встраивания.
    Как реализовать встраивание
    Во-первых, вам необходимо реализовать интерфейс встаривания в вашей модели элементов контента, например:
    implements \IPS\Content\Embeddable
 Затем убедитесь, что URL-адреса вашего контента содержат параметр "id", который является основным идентификатором вашего контента. Если это не так, вам необходимо переопределить метод loadFromUrl() в вашем классе (это определено в \IPS\Patterns\ActiveRecord):
    public function loadFromUrl( \IPS\Http\Url $url ) { return static::load( ... ); } Контроллер и модель автоматически поддерживают встраивание с использованием общего шаблона. Если вы хотите использовать собственный шаблон, переопределите метод embedContent() в вашей модели и верните другой HTML:
    string embedContent( array $params )
    $params (array, обязательный) - Дополнительные параметры, которые были переданы во встраиваемом URL.
  21. Пример Элемента контента

    Ниже приведен пример модели элемента контента, в которой используются несколько функций, обсуждаемых в этом разделе.
    <?php namespace IPS\downloads; /** * File Model */ class _File extends \IPS\Content\Item implements \IPS\Content\Permissions, \IPS\Content\Tags, \IPS\Content\Reputation, \IPS\Content\Followable, \IPS\Content\ReportCenter, \IPS\Content\ReadMarkers, \IPS\Content\Hideable, \IPS\Content\Featurable, \IPS\Content\Pinnable, \IPS\Content\Lockable, \IPS\Content\Shareable { /** * @brief Application */ public static $application = 'downloads'; /** * @brief Module */ public static $module = 'downloads'; /** * @brief Database Table */ public static $databaseTable = 'downloads_files'; /** * @brief Database Prefix */ public static $databasePrefix = 'file_'; /** * @brief Multiton Store */ protected static $multitons; /** * @brief Default Values */ protected static $defaultValues = NULL; /** * @brief Node Class */ public static $containerNodeClass = 'IPS\downloads\Category'; /** * @brief Comment Class */ public static $commentClass = 'IPS\downloads\File\Comment'; /** * @brief Review Class */ public static $reviewClass = 'IPS\downloads\File\Review'; /** * @brief Database Column Map */ public static $databaseColumnMap = array( 'container' => 'cat', 'author' => 'submitter', 'views' => 'views', 'title' => 'name', 'content' => 'desc', 'num_comments' => 'comments', 'num_reviews' => 'reviews', 'last_comment' => 'last_comment', 'last_review' => 'last_review', 'date' => 'submitted', 'updated' => 'updated', 'rating' => 'rating', 'approved' => 'open', 'approved_by' => 'approver', 'approved_date' => 'approvedon', 'pinned' => 'pinned', 'featured' => 'featured', 'locked' => 'locked', 'ip_address' => 'ipaddress' ); /** * @brief Title */ public static $title = 'downloads_file'; /** * @brief Icon */ public static $icon = 'download'; /** * @brief Form Lang Prefix */ public static $formLangPrefix = 'file_'; /** * @brief Reputation Type */ public static $reputationType = 'file_id'; /** * @brief Follow Area Key */ public static $followArea = 'file'; /** * Get URL * * @param string|NULL $action Action * @return \IPS\Http\Url */ public function url( $action=NULL ) { $url = \IPS\Http\Url::internal( "app=downloads&module=downloads&controller=view&id={$this->id}", 'front', 'downloads_file', $this->name_furl ); if ( $action ) { $url = $url->setQueryString( 'do', $action ); } return $url; } /** * Should new items be moderated? * * @param \IPS\Member $member The member posting * @param \IPS\Node\Model $container The container * @return bool */ public static function moderateNewItems( \IPS\Member $member, \IPS\Node\Model $container = NULL ) { if ( $container and $container->bitoptions['moderation'] and !static::modPermission( 'unhide', $member, $container ) ) { return TRUE; } return parent::moderateNewItems( $member, $container ); } /** * Should new comments be moderated? * * @param \IPS\Member $member The member posting * @return bool */ public function moderateNewComments( \IPS\Member $member ) { $commentClass = static::$commentClass; return $this->container()->bitoptions['comment_moderation'] and !$commentClass::modPermission( 'unhide', $member, $this->container() ); } /** * Should new reviews be moderated? * * @param \IPS\Member $member The member posting * @return bool */ public function moderateNewReviews( \IPS\Member $member ) { $reviewClass = static::$reviewClass; return $this->container()->bitoptions['reviews_mod'] and !$reviewClass::modPermission( 'unhide', $member, $this->container() ); } /** * Get elements for add/edit form * * @param \IPS\Content\Item|NULL $item The current item if editing or NULL if creating * @param int $container Container (e.g. forum) ID, if appropriate * @return array */ public static function formElements( $item=NULL, \IPS\Node\Model $container=NULL ) { $return = parent::formElements( $item, $container ); $return['file_desc'] = new \IPS\Helpers\Form\Editor( 'file_desc', $item ? $item->desc : NULL, TRUE, array( 'app' => 'downloads', 'key' => 'Downloads', 'autoSaveKey' => 'downloads-new-file' ) ); return $return; } }  
×
×
  • Create New...

Important Information

By using our site you agree to our Privacy Policy