Перейти к содержанию

Лидеры

  1. invisionbyte

    invisionbyte

    Администраторы


    • Баллы

      6

    • Постов

      962


  2. Вадим

    Вадим

    Команда сайта


    • Баллы

      3

    • Постов

      53


Популярный контент

Показан контент с высокой репутацией за 18.03.2015 в Записи

  1. Если пользователь является администратором {{if \IPS\Member::loggedIn()->isAdmin()}} Код {{endif}} Если пользователь авторизован (не является гостем) {{if \IPS\Member::loggedIn()->member_id}} Код {{endif}} Если пользователь принадлежит группе {{if member.inGroup(array("4"))}} Код {{endif}} Ограничение отображения контента в Pages количеством символов {truncate="$record->_content" length="500"} Если номер ID пользователя (просмотр) {{if \IPS\Member::loggedIn()->member_id == '1'}} Текст видит только пользователь с ID #1 {{endif}} Если номер ID пользователя (отображение) {{if $comment->author()->member_id =='2'}} Текст отображается только у пользователя, чей ID = 2 {{endif}} Отображение поля профиля {$comment->author()->ProfileFields()['core_pfieldgroups_2']['core_pfield_1']}
    2 балла
  2. В IPS4 можно выбрать различные типы репутации: В зависимости от настроек репутации, вы можете разрешить пользователям вашего форума оценивать контент в ту или иную сторону (+/-). Если пользователь повышает или понижает репутацию сообщения, он может вернуть оценку и изменить её в другу сторону. Простыми словами: если пользователь повысил репутацию сообщения, передумав, он может её понизить. В данной статье мы уберём эту возможность, тем самым запретим многократное изменение репутации сообщениям, то есть пользователи смогут выставить репутацию сообщению только один раз. Для этого отредактируем файл: \system\Content\Content.php Найти: /* If we've given positive rep already, we can only do negative now */ case 1: return ( $type === -1 ); /* If we've given negative rep already, we can only do positive now */ case -1: return ( $type === 1 ); Заменить на: /* If we've given positive rep already, we can only do negative now */ case 1: return ( $type === 0 ); /* If we've given negative rep already, we can only do positive now */ case -1: return ( $type === 0 ); Для клиентов и пользователей нашего форума - invisionbyte.ru
    1 балл
  3. В сети всё чаще стали появляться случаи редиректов на другие сайты на форумах IP.Board. В нашем случае на форуме при определённых условиях производился редирект пользователя на страницу filestore321.com/download.php?id=xxxxxxxx. Редирект может производиться не обязательно на указанный сайт, но и на многие другие: file2store.info, url123.info и т.д. Об этом сообщал только Яндекс, другие поисковые системы или антивирусы его не обнаруживали. Яндекс в панели Веб-мастера определяет его как "Поведенческий анализ": Код вируса зашифрован и находится в базе данных в таблице skin_cache. Таким образом, для удаления вируса недостаточно просто перестроить кеш файлы шаблонов - в этом случае он снова запишется в файлы кеша из базы данных. Удаление вируса на IP.Board 3.x Открываем phpmyadmin, переходим на вкладку Поиск и ищем: preg_replaceОткрываем найденные результаты из таблицы skin_cache. Результаты могут быть найдены сразу в нескольких столбцах, нам нужен skin_global. Копируем содержимое столбца в текстовый документ и находим опять же preg_replace: Сравните найденный вами отрезок кода с показанным на изображении выше. Это и есть вредоносный код. Удаляем его как показано на изображении. Вставляем содержимое обратно в столбце и сохраняем изменения. Остался один шаг - перестроить кеш файлы шаблонов, чтобы вирус был окончательно удалён из файлов кеша. Автор: http://invisionbyte.ru
    1 балл
  4. Основная проблема обновления форума IP.Board 3.x это конечно же кодировка, на версиях 2.x русскоязычные форумы в основном пользовались кодировкой cp1251. Если кодировка форума utf8, значит вы сэкономите время на конвертации базы данных. Исходная информация о пациенте: Версия форума: 2.3.4 До какой версии будем обновляться: 4.1 На форуме сообщений: 902482 Зарегистрировано пользователей: 30311 Приступим... Копия форума Для начала необходимо создать полную копию вашего форума на поддомене или в папке со всеми файлами форума и копией его базы данных. Для копии базы данных можно использовать утилиту Supex Dumper, позволяющую с лёгкостью и без проблем создавать бэкапы даже больших баз данных. Процесс обновления будет производиться постепенно по каждой линейке: 3.0.x -> 3.1.x -> 3.2.x -> 3.3.x -> 3.4.x -> 4.0.x -> 4.1.x . Эта схема выбрана не зря - она зарекомендовался себя как самая стабильная схема обновления с минимально возможным возникновением ошибок. Supex Dumper Скачать программу можно на официальном сайте - https://sypex.net/, упрощённая версия программы абсолютно бесплатна, она нам вполне подойдёт. Скачиваем программу и загружаем папку sxd в корневой каталог форума. Переходим в адресной строке по адресу site.ru/sxd, вводим данные для доступа к базе и видим очень простой и удобный интерфейс, позволяющий импортировать/экспортировать базу. SSH Для подключения по протоколу SSH воспользуемся программой Putty, скачать которую можно также абсолютно бесплатно с сайта putty.org.ru/download.html. Подключаемся к серверу и снимаем копию с помощью команд: Экспорт mysqldump -u пользователь_БД -p имя_БД > имя_файла Импорт mysql -u пользователь_БД -p имя_БД < файл_дампа_БД Теперь работаем только с копией форума Удаление ненужных файлов В IP.Board 2.x используется устаревшая структура директорий, поэтому нам необходимо почистить форум перед обновлением и удалить все ненужные для дальнейшего использования файлы и папки. Удаляем: /admin /converge_local /interface /ips_kernel /jscripts /lofiversion /modules /resources /retail /skin_acp /sources admin.php index.php init.php Загружаем дистрибутив IP.Board 305.zip в корень форума и распаковываем архив с заменой файлов. Проходим процесс авторизации и выставляем chmod 0777 на соответствующие папки: cache cache/lang_cache cache/lang_cache/1 cache/lang_cache/1 cache/skin_cache public/style_images public/style_css cache/tmp hooks uploads conf_global.php Открываем файл conf_global.php и меняем строчку $INFO['mysql_codepage'] = 'cp1251'; На $INFO['sql_charset'] = 'utf8'; Конвертация базы данных из cp1251 в utf8 Для процесса конвертации кодировки базы, необходимо выполнить определённый запрос к каждой таблице: ALTER TABLE название_таблицы DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci, CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci ; либо воспользоваться скриптом, позволяющим создать такие запросы автоматически. Автор скрипта - Ritsuka. Сам скрипт: Копируем содержание скрипта и вставляем в файл php, например convert.php. Загружаем файл на сервер и обращаемся к файлу из строки браузера. Результатом работы скрипта вы увидите запросы к базе, которые необходимо выполнить в phpmyadmin. Совет: если у вас большая таблица сообщений, рекомендуется запрос для перекодирования этой таблицы выполнять отдельно ото всех запросов, чтобы не вызвать ошибку лимита времени на выполнение. После перекодирования базы рекомендуется сделать её копию, например тем же Supex Dumper, чтобы у вас всегда была в наличии база в utf8. Теперь у нас всё готово для запуска процесса обновления. Обновление форума до 3.0.5 Обращаемся в адресной строке по адресу: site.ru/admin/upgrade и следуем указаниям мастера обновления. В процессе обновления форума IP.Board до 3.0.5 у вас могут возникнуть следующие ошибки: Ошибка: CREATE TABLE. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'TYPE=MyISAM' at line 33 Начиная с версии MySQL 5.5 синтаксис изменился с TYPE= на ENGINE= . Таким образом, необходимо скопировать весь лог ошибок в текстовый документ. Исправление ошибки. В таком случае нам нужно запустить процесс обновления ещё раз. Отметьте опцию выполнения запросов вручную перед началом обновления, в этом случае у нас появится возможность самостоятельно выполнять необходимые запросы исправив TYPE=MyISAM на ENGINE=MyISAM вручную. То есть, перед выполнение предложенных мастером запросов, мы их исправляем. ВНИМАНИЕ: проверяйте каждый запрос на наличие 'TYPE=MyISAM'. После обновления возникла другая неприятная ошибка - текст сообщений отображается знаками вопроса: Идём в базу и видим точно такую же картину: Делаем вывод - нужно было убедиться не только в правильном сравнении таблиц (utf8_general_ci), но и правильное отображение данных в них, хотя бы в самых основных - сообщения, темы, форумы, пользователи. Перекодировка базы в utf8 с помощью Supex Dumper Заливаем бэкап базы от 2.3.x и делаем экспорт базы с помощью программы Supex Dumper, выбрав в опции Кодировка значение utf8. После этого удаляем базу в phpmyadmin и импортируем её дампером, снова указав кодировку utf8 и поставив галочку на пункте Коррекция кодировки. Вуаля: Обновление форума с 3.0.5 до 3.1.4 Загружаем IP.Board 314.zip в корень форума, распаковываем архив с заменой файлов и выставляем права на указанные мастером обновления папки. Для обновления форума переходим по адресу site.ru/admin/upgrade и снова отмечаем галочку на пункте В получаемых запросах снова меняем TYPE=MyISAM на ENGINE=MyISAM и выполняем в phpmyadmin. Процесс обновления завершён успешно! Снимаем копию форума (без папки uploads) и базы данных и продолжаем наше обновление. Обновление форума с 3.1.4 до 3.2.3 Технология обновления такая же - загружаем 323.zip в корень форума, распаковываем и переходим по site.ru/admin/upgrade. Начиная с этой версии редактировать запросы уже не нужно, разработчики учли этот момент и исправили запросы для более новой версии MySQL. Обновление форума с 3.2.3 до 3.3.4 Без проблем обновляемся до IP.Board 334.zip и продолжаем наше обновление. Обновление форума с 3.3.4 до 3.4.6 Точно также производим обновление, залив дистрибутив 3.4.6.zip в корень форума. Проблем на этом этапе не возникло. Если у вас будут проблемы при обновлении - пишите в комментариях, будем разбираться. Обновление 3.4.6 до 4.1.4 Обновление производится по общему принципу - заливаем файлы 4.1.4.zip поверх старых с заменой существующих. Переходим по адресу site.ru/admin/upgrade. Перед обновлением рекомендуем ознакомиться с общей информацией по переходу между линейками 3.x и 4.x - Обновление с 3.x до 4.x - общая информация. Таким образом мы произвели обновление большого форума на IP.Board 2.3.x до актуальной на данный момент версии 4.1.x с почти миллионом сообщений без потери какой-либо информации.
    1 балл
  5. В Invision Community встроен механизм периодической проверки обновлений вашего приложения, плагина, либо темы с отображением информационного окна в админцентре о выпуске обновления. При создании приложения, плагина или темы, вы можете указать URL адрес обновлений. Invision Community будет периодически посылать запрос на указанный URL с параметром текущего номера ID версии. Например, если вы укажите адрес следующим образом: http://сайт.ru/myapp/check.phpА кто-то использует версию приложения с ID версии "10002", то будет отправлен следующий запрос: http://сайт.ru/myapp/check.php?version=10002URL должен вернуть объект в формате JSON со следующими данными: version указывается удобочитаемая последняя доступная версия (например: "1.0.0")longversion указывается ID номер последней доступной версии (например: "100000")released указывается дата релиза версии в формате UNIX-времениupdateurl указывается URL-адрес, по которому администратор может загрузить обновлениеПример: { "longversion": 100019, "version": "4.0.0 RC5a", "released": 1426680323, "updateurl": "http:\/\/community.invisionpower.com\/blogs\/entry\/9723-ips-community-suite-400-release-candidate-available\/" }
    1 балл
  6. Введение в Content Items. Часть 1 Содержимое В некоторых областях потребуется содержимое (content) элемента. Для некоторых элементов, это будет описание, а для других, которым требуются комментарии (см. объяснение свойства $firstCommentRequired в главе 3), это будет содержимое первого комментария. Другие требования Нет Дополнительно Комментарии Что меняется после внедрения Нет Дополнительные методы, доступные после внедрения content() Возвращает содержимое. truncated( bool $oneLine=FALSE ) Возвращает содержимое в формате, в котором его можно поместить в элемент <div data-ipsTruncate> для обрезки. Как применить ЛИБО Добавьте элемент content к $databaseColumnMap с указанием колонки в базе данных, в которой содержится контент. ЛИБО Реализуйте комментарии (см. главу 3) для возвращения первого комментария. Рекомендуемое Введение Элементы контента можно помечать как рекомендуемое и отображать на главной странице или в других местах. Другие требования Нет Дополнительно Права доступа. Полномочия модератора. Что меняется после внедрения Пользователи с соответствующими правами модератора увидят инструмент для пометки таблиц элементов содержимого в качестве рекомендуемых/не рекомендуемых. Дополнительные методы, доступные после внедрения static featured( int $limit=10, string $order=‘RAND()’ ) Отображает рекомендуемое. Если включены Права Доступа, будут возвращены только те элементы, на просмотр которых есть права у вошедшего в данный момент пользователя. canFeature( \IPS\Member $member=NULL ) Возвращает логическое значение, указывающее может ли $member (вошедший пользователь, если NULL) помечать элемент как рекомендуемый. Принимает во внимание, если он уже рекомендуемый. canUnfeature( \IPS\Member $member=NULL ) Возвращает логическое значение, указывающее может ли $member (вошедший пользователь, если NULL) снимать с элемента пометку рекомендуемый. Принимает во внимание, если он уже рекомендуемый. Как применить 1. Добавить интерфейс: implements \IPS\Content\Featurable2. Добавьте элемент featured к $databaseColumnMap, указывая колонку в базе данных, которая содержит данные о том рекомендуемый элемент или нет. 3. Добавляет кнопку рекомендовать/отменить рекомендацию в шаблоне для просмотра элемента содержимого. {{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}} Закрепление Элементы содержимого можно закрепить, чтобы они отображались в верхней части списков. Требования Контейнеры Необязательно Права модераторов Что меняется после внедрения • Закрепленные элементы будут отображаться в верхней части таблиц элементов содержимого. • Пользователи с соответствующими правами модератора увидят инструмент для пометки таблиц элементов содержимого в качестве рекомендуемых/не рекомендуемых. Дополнительные методы, доступные после внедрения canPin( \IPS\Member $member=NULL ) Возвращает логическое значение, указывающее может ли $member (вошедший пользователь, если NULL) закрепить элемент. Учитывает является ли элемент уже Рекомендуемым. canUnpin( \IPS\Member $member=NULL ) Возвращает логическое значение, указывающее может ли $member (вошедший пользователь, если NULL) отменять закрепление элемента. Учитывает является ли элемент уже Рекомендуемым. Как применить 1. Добавьте интерфейс: implements \IPS\Content\Pinnable2. Добавляет pinned элемент к $databaseColumnMap с указанием колонки в базе данных, которая содержит данные о том закреплен элемент содержимого или нет. 3. Добавляет кнопку поднять/опустить к шаблону для просмотра элемента содержимого: {{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}}Закрыть Материалы могут быть закрыты, что означает, что в дальнейшем к ним нельзя добавлять комментарии. Другие требования Комментарии Дополнительно Права модераторов Что меняется после внедрения Заблокированные элементы больше не будут получать комментарии, если только у пользователя нет прав оставлять комментарии к заблокированным элементам.Пользователи, имеющие соответствующие права модератора, увидят инструмент для блокировки/разблокировки таблиц элементов содержимого.Дополнительные методы, доступные после внедрения canLock( \IPS\Member $member=NULL ) Возвращает логическое значение, указывающее может ли $member (пользователь, вошедший в данный момент, если NULL) заблокировать элемент. Принимает во внимание, если он уже заблокирован. canUnlock( \IPS\Member $member=NULL ) Возвращает логическое значение, указывающее может ли $member (пользователь, вошедший в данный момент, если NULL) разблокировать элемент. Учитывает, если он уже заблокирован. Как применить 1. Добавить интерфейс: implements \IPS\Content\Lockable2. Добавляет элемент locked к $databaseColumnMap с указанием колонки в базе данных, которая содержит данные о том заблокирован ли элемент содержимого или нет. Или элемент locked для текстовой колонки. 3. Добавляет кнопку поднять/опустить к шаблону для просмотра элемента содержимого: {{if $item->canLock()}} <a href='{$item->url()->setQueryString( array( 'do' => 'moderate', 'action' => 'lock' ) )}'>{lang="lock"}</a> {{endif}} {{if $item->canUnlock()}} <a href='{$item->url()->setQueryString( array( 'do' => 'moderate', 'action' => 'unlock' ) )}'>{lang="unlock"}</a> {{endif}}Скрытие / Восстановление Материалы могут быть скрыты от обычных пользователей. Это может быть использовано для запроса подтверждения от сотрудников ресурса прежде, чем определенное содержимое можно будет просматривать, и как способ для сотрудников скрыть нежелательный контент. Другие требования Нет Дополнительно КонтейнерыПолномочия модератораЧто изменится после внедрения canView(…)вернет значение "ложь" для элемента, который скрыт, если пользователь не может просматривать скрытые элементы содержимого. Это также приведет к тому, что loadAndCheckPerms(…)выдаст исключение OutOfRange, если будет загружен подобный объект.Скрытые элементы будут отображаться только тем пользователям, которые имеют права на просмотр скрытого контента.Пользователи, имеющие соответствующие права модератора, увидят инструмент для блокировки/разблокировки таблиц элементов содержимого.Контент от пользователей, который находится на премодерации, будет скрыт до тех пор, пока не будет подтвержден вручную.Дополнительные методы, доступные после внедрения hidden() Возвращает число, указывающее состояние скрытия: • -1 означает, что содержимое скрыто, но раньше оно не было скрытым. • 0 означает, что содержимое не скрыто (значение по умолчанию, обычное состояние). • 1 означает, что содержимое скрыто и было отмечено как скрытое на момент публикации. canHide( \IPS\Member $member=NULL ) Возвращает логическое значение, указывающее может ли $member (пользователь, вошедший в данный момент, если NULL) скрыть элемент. Принимает во внимание, если он уже заблокирован. canUnhide( \IPS\Member $member=NULL ) Возвращает логическое значение, указывающее может ли $member (пользователь, вошедший в данный момент, если NULL) отменить скрытие элемента. Учитывает, если он уже заблокирован. static canViewHiddenItems( \IPS\Member $member=NULL ) Возвращает логическое значение, указывающее может ли $member (пользователь, вошедший в данный момент, если NULL) просматривать скрытые элементы. Для проверки индивидуального элемента используйте canView(). Как применить 1. Добавить интерфейс: implements \IPS\Content\Hideable2. Добавьте либо элемент hidden или элемент approved к $databaseColumnMapс указанием колонки в базе данных, которая содержит данные о статусе содержимого. Элемент Значение, если не скрыт (обычный, по умолчанию) Значение, если скрыт (ранее был не скрыт) Значение, если ожидает утверждения hidden -1 1 approved 1 -1 При желании также можно добавить approved_by (чтобы хранить ID пользователя, который утвердил контент) и approved_date (чтобы хранить временную отметку утверждения контента). 3. Добавит кнопки скрыть/восстановить к шаблону просмотра содержимого: {{if $item->canHide()}} <li><a href='{$item->url()->setQueryString( array( 'do' => 'moderate', 'action' => 'hide' ) )}'>{lang="hide"}</a></li> {{endif}} {{if $item->canUnhide()}} <li><a href='{$item->url()->setQueryString( array( 'do' => 'moderate', 'action' => 'unhide' ) )}'>{{if $item->hidden() === 1}}{lang="approve"}{{else}}{lang="unhide"}{{endif}}</a></li> {{endif}} 4. Если контент, добавляемый пользователем, находится на премодерации, он по умолчанию будет скрыт. Вы можете переопределить этот метод таким образом, чтобы весь контент в определенных узлах всегда требовал подтверждения модератором. Чтобы сделать это, перезапишите метод moderateNewItems(…)- например: 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 ); } Теги Материалы могут помечаться тегами. Теги можно использовать для поиска разных типов данных с одними и теми же метками (тегами). Другие требования • Контейнеры Что изменится после внедрения Поле для ввода тегов будет добавлено к форме создания / редактирования. Префиксы и теги будут отображаться в таблицах содержимого. Дополнительные методы, доступные после внедрения static canTag( \IPS\Member $member=NULL, \IPS\Node\Model $container) Возвращает логическое значение, указывающее может ли $member (пользователь, вошедший в данный момент, если NULL) помечать элементы в $container. Вы можете изменить этот метод, если у вас для каждого узла стоит отдельная настройка для включения/выключения тегов. static canPrefix( \IPS\Member $member=NULL, \IPS\Node\Model $container) Возвращает логическое значение, указывающее может ли $member (пользователь, вошедший в данный момент, если NULL) добавлять префиксы к элементам в $container. Вы можете изменить этот метод, если у вас для каждого узла стоит отдельная настройка для включения/выключения префиксов tags() Возвращает массив тегов для элемента. prefix() Возвращает префикс для элемента (или NULL). Как применить 1. Добавить интерфейс: implements \IPS\Content\Tags2. Отображать теги и префиксы на странице просмотра элемента: {{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}}Поиск Элементы содержимого можно включить в результаты поиска и в списки последних действий. Другие требования Перенаправление содержимого Теги Дополнительно КонтейнерыПрава доступаСкрытие / восстановлениеЧто изменится после внедрения Содержимое будет проиндексировано и включено в результаты поиска и последние действия. Индекс будет автоматически обновлен, когда комментарии создаются, редактируются, перемещаются, скрываются, итп., и работает автоматически и с MySQL index, и со Sphinx. Дополнительные методы, доступные после внедрения Нет Как применить Добавить интерфейс: implements \IPS\Content\SearchableРепутация Пользователи могут "лайкать" или присваивать репутацию элементам содержимого. Общая репутация отображается в профиле пользователя. Другие требования Нет Что изменится после внедрения Нет Дополнительные методы, доступные после внедрения 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\Reputation2. Добавьте свойство, указывающее ключ для разделения репутации, присваиваемой данному типу содержимого, от другого типа репутации. Это может быть все, что угодно, но рекомендуется использовать название колонки в таблице вашей базы данных (с префиксом), в которой хранится ID. public static $reputationType = 'item_id';3. Добавляет кнопки репутации на страницу, на которой отображается ваш элемент: {template="reputation" app="core" group="global" params=“$item"} Подписка Пользователи могут следить за контейнерами и получать уведомления, когда к ним добавляются новые элементы содержимого. Требования КонтейнерыСодержимоеЧто изменится после внедрения После публикации нового элемента содержимого, пользователи, которые подписаны на узел получат уведомление. Если контент стоит на премодерации, уведомления будут отправлены после того, как содержимое будет подтверждено модератором. Дополнительные методы, доступные после внедрения static containerFollowers( \IPS\Node\Model $container, int $privacy=3, array $frequencyTypes=array( ‘immediate’, ‘daily’, ‘weekly ), array $limit=array( 0, 25 ), string $order=‘name’ ) Возвращает объект \IPS\Db\Select, который может повторяться для получения данных о том, какие пользователи подписаны на $container. См. доступные варианты в phpDocs. $privacy является побитовым значением, использующим константы \IPS\Content\FOLLOW_* - значение по умолчанию 3, включает общедоступную и анонимную подписку. Как применить 1. Добавить интерфейс: implements \IPS\Content\Followable2. Добавляет следующую кнопку на страницу, где Вы отображаете элементы содержимого в узле: {template="follow" app="core" group="global" params=“‘yourApp’,’YourCNodeClass’, $node->_id, \IPS\yourApp \YourContentClass::containerFollowers( $node )->count( TRUE )"}Просмотры страниц Элементы Содержимого могут автоматически отслеживать сколько раз они были просмотрены. Требования Нет Что изменится после внедрения Когда просматривается материал, колонка в базе данных, которая содержит количество просмотров, будет обновляться. stats()выдаст элемент, содержащий количество просмотров. Дополнительные методы, доступные после внедрения Нет Как применить 1. Добавить интерфейс: implements \IPS\Content\Views2. Добавляет элемент views к $databaseColumnMap с указанием колонки в базе данных, которая содержит количество просмотров. 3. Убедитесь, что контроллер вызывает parent::manage()в начале метода manage() Поделиться ссылками Элементы содержимого могут предоставлять ссылки, чтобы поделиться материалами в социальных сетях. Другие требования Нет Что изменится после внедрения Нет Дополнительные методы, доступные после внедрения sharelinks() Возвращает массив ссылок для обмена. Как применить 1. Добавить интерфейс: implements \IPS\Content\Shareable2. Отображать ссылке где-то в Вашем шаблоне: {template="sharelinks" app="core" group="global" params="$item"}Жалобы На элементы содержимого можно жаловаться модераторам. Другие требования Содержимое Что изменится после внедрения Нет Дополнительные методы, доступные после внедрения canReport( [$member] ) Проверяет может ли пользователь (либо какой-то определенный, или вошедший в данный момент) жаловаться на контент, учитывая разрешено ли его группе отправлять жалобы, могут ли они просматривать содержимое, являются ли они автором или отправляли ли они уже жалобу на данный элемент содержимого. report( $reportContent ) Отправляет жалобу Как применить 1. Добавить интерфейс: implements \IPS\Content\ReportCenter2. Добавляет новые свойства для определения названия класса CSS для представления Вашего элемента содержимого при просмотре жалоб. public static $icon = 'icon';3. Отображает ссылку где-то в вашем шаблоне. Вы не должны вызывать 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}} Маркеры прочитанного Элементы содержимого могут содержать данные о том, какие пользователи уже прочитали их. Требования Нет Дополнительно Контейнеры Комментарии Что изменится после внедрения Когда просматривается элемент, то он будет помечен как прочитанный для конкретного пользователя. Дополнительные методы, доступные после внедрения static containerUnread( \IPS\Node\Model $container, \IPS\Member $member=NULL ) Возвращает логическое значение, указывающее может ли данный контейнер (или его дочерний элемент) содержать непрочитанные элементы. static markContainerRead( \IPS\Node\Model $container, \IPS\Member $member=NULL ) Помечает все элементы в контейнере (также и дочерние) как прочитанные. unread( \IPS\Member $member=NULL ) Возвращает 0, если элемент прочитан; -1 если не прочитан и никогда не был прочитан; или 1 если не прочитан, но был прочитанным ранее (применимо только при совместном использовании с комментариями). Если $member равен NULL, будет использовать вошедшего в данный момент пользователя. markRead( \IPS\Member $member=NULL ) Помечает элемент как прочитанный пользователей $member (пользователь, вошедший в данный момент, если NULL). timeLastRead( \IPS\Member $member=NULL ) Возвращает объект \IPS\DateTime, указывающий, когда $member (пользователь, вошедший в данный момент, если NULL) в последний раз прочитал элемент. Как применить 1. Добавить интерфейс: implements \IPS\Content\ReadMarkers2. Добавьте элемент updated к $databaseColumnMap с указанием колонки в базе данных, которая соержит либо временную отметку о том, когда в последний раз был обновлен контент. если только Вы не используете комментарии или обзоры, в этом случае нужно использовать last_comment/ last_review. 3. Убедитесь, что контроллер вызывает parent::manage()в начале метода manage(), или иным образом убедитесь, что Вы вызываете markRead()вручную при просмотре элемента содержимого. В целях использования containerUnread() и markContainerRead() ваши контейнеры должны работать со следующими методами (см. раздел Контейнеры): get items()get comments()setLastComment()getLastCommentTime()Опросы Пользователи могут добавлять опросы к элементам содержимого. Другие требования Нет Что изменится после внедрения При создании или редактировании элемента содержимого, появится новая вкладка, на которой пользователь сможет создать опрос. Дополнительные методы, доступные после внедрения static canCreatePoll( \IPS\Member $member \IPS\Node\Model $container ) Возвращает логическое значение, указывающее может ли пользователь создавать опрос в этом контейнере ($container будет NULL если ваш элемент содержимого не использует данную переменную). Вы можете изменить этот метод, чтобы добавить отдельные настройки опросов для каждого контейнера. getPoll() Возвращает объект \IPS\Poll, связанный с элементом содержимого, либо NULL если его нет. Как применить 1. Добавить интерфейс: implements \IPS\Content\Polls2. Добавьте элемент poll к $databaseColumnMap с указанием колонки в базе данных, которая содержит ID опроса. 3. Отображать опрос где-то в Вашем шаблоне: {$item->getPoll()|raw}При желании, ваш класс может следить за тем, когда кто-то голосует в опросе. Для осуществления: 1. Добавить интерфейс: implements \SplObserver2. Добавьте метод update который делает все что нужно сделать, когда в опросе появляется новый голос. Он получит объект \IPS\Poll в качестве субъекта. 3. При отображении вашего элемента, присоединит его к опросу: if ( $poll = $topic->getPoll() ) { $poll->attach( $item ); }Рейтинг Пользователи могут оценивать элементы содержимого (по шкале от 1 до 5). Это следует использовать только в том случае, если не используются обзоры (см. Главу 4). Другие требования Нет Что изменится после внедрения Нет Дополнительные методы, доступные после внедрения canRate( \IPS\Member $member = NULL ) Возвращает логическое значение, указывающее может ли вошедший в данный момент пользователь выставлять оценку элементу. averageRating() Возвращает средний рейтинг элемента содержимого. rating() Отображает статистику с указанием текущего среднего рейтинга. Если в настоящее время вошедший пользователь может выставлять оценку, он сможет нажать на звёздочки для выставления оценки. Как применить 1. Добавить интерфейс: implements \IPS\Content\Ratings2. Дополнительно можно добавить следующие элементы к $databaseColumnMap (добавление либо rating_average или rating_total и rating_hits поможет избежать необходимости запрашивать средний рейтинг при отображении формы): rating_average, для текущего среднего рейтингаrating_total, для общего показателя всех рейтинговrating_hits, сколько раз оценивали данный элемент3. Отображение рейтинга в вашем шаблоне: {$item->rating()|raw}Встраивание Когда URL-адрес вашего контента публикуется еще где-то в сообществе, ссылку можно автоматически заменить на превью содержимого. Другие требования Перенаправление Что изменится после внедрения Когда URL-адрес вашего контента публикуется еще где-то в сообществе, ссылка будет заменена на превью содержимого. Дополнительные методы, доступные после внедрения Нет Как применить 1. Убедитесь, что URL вашего контента содержит параметр "id", который является основным ID контента. Если это не так, вам потребуется изменить метод loadFromUrl в классе (это определено в \IPS\Patterns\ActiveRecord): public function loadFromUrl( \IPS\Http\Url $url ) { return static::load( ... ); }2. Добавить интерфейс: implements \IPS\Content\Embeddable3. Для получения встраиваемого контента, будет вызван URL элемента с “&do=embed” в конце ссылки. В предварительно просмотре встраиваемого содержимого убедитесь, что получили нужный результат. Введение в Content Items. Часть 1
    1 балл
  7. С большинством классов вы будете работать во время использования Узлов, а Элементы Содержимого будут расширять \IPS\Patterns\ActiveRecord. Объекты этого класса представляют собой строку в таблице базы данных. Очень важно, чтобы вы использовали методы, предоставляемые этим классом, а не вызывали базу данных напрямую, так как если Вы добавите дополнительные функции к элементу содержимого, методы будут выполнять более сложные задачи. static load( int $id ) Генерирующий метод, который получает запись из базы данных и возвращает объект вашего класса Элемента Содержимого. Результаты кэшируются, поэтому если вы загрузите один и тот же элемент дважды, второй запрос не будет сделан к базе данных, оба вызова вернут один и тот же объект (тот же объект по упоминанию - не копия объекта). Например: $item = YourClass::load( 1 );static constructFromData( array $data ) Если по какой-то причине вам необходимо выбрать данные непосредственно из базы данных (например, если вы хотите получить самые последние записи), и у вас есть массив, содержащий строки из базы данных, метод constructFromData позволяет создать объект из этих данных, без вызова load, который сделает другой (ненужный) запрос к базе данных. Например: $item = YourClass::constructFromData( \IPS\Db::i()->select(...)- >first() );__get( mixed $key ) __set( mixed $key, mixed $value ) Несмотря на то, что вы не вызываете эти методы непосредственно - "волшебные" методы get и set позволяют получить и установить данные в строке базы данных. Статическое свойство, $databasePrefix, можно выставлять, если колонки в таблице вашей базы данных начинаются с одного и того же префикса. Например, предположим, что ваша таблица базы данных выглядит так: item_id item_title item_author 1 Foo 1 2 Bar 1 3 Baz 1 Вы установите $databasePrefix: static $databasePrefix = 'item_';Вы будете загружать первый ряд подобным образом (он автоматически будет искать колонки, с названием “id”): $item = YourClass::load( 1 ); Если вы хотите изменить поведение какой-либо определенной колонки (например, если у вас есть колонка базы данных, которая хранит значение timestamp, и вы хотите чтобы getter/setter обрабатывал объекты \IPS\DateTime) вы можете определить методы, называемые get_<key> и set_<key>. В этих методах свойство $_data хранит исходные значения. Например: public function get_date() { return \IPS\DateTime::ts( $this->_data[‘date’] ); } public function set_date( $value ) { $this->data[‘date’] = $value->getTimestamp(); } save() После изменения любых свойств, вы должны вызвать метод save, чтобы фактически сохранить эти изменения в базе данных: $item = YourClass::load( 1 ); $item->title = 'New Title'; $item->save();delete() Метод delete удаляет элемента из базы данных. Например: $item = YourClass::load( 1 ); $item->delete(); __clone() Есть отличный метод, который автоматически подстраивает первичный ключ, если Вы клонируете элемент. Пример: $item = YourClass::load( 1 ); $copy = clone $item; $copy->save(); echo $item->id; // 4Битовые флаги Класс ActiveRecord содержит специальные функции для облегчения побитовой работы, что позволяет использовать одну колонку INT в базе данных для хранения нескольких двоичных значений. Чтобы сделать это, Вы можете следующим образом определить статическое свойство $bitOptions в своем классе: public static $bitOptions = array( 'bitwise_column' => array( 'bitwise_column' => array( 'property_1' => 1, 'property_2' => 2, 'property_3' => 4, ), ), ); В этом примере есть столбец в базе данных (bitwise_column), в котором хранятся побитовые данные (если вам нужно хранить значения немного большие, чем могут храниться в едином поле INT, вы можете добавить дополнительные столбцы). Этот столбец сохраняет 3 логических значения (property_1, property_2 и property_3). При определении свойств, вы должны определить числовым значением, которое их представляет, поэтому номер должен каждый раз удваиваться (1, 2, 4, 8, 16, и т.д.). ActiveRecord будет автоматически предоставлять объект \IPS\Patterns\Bitwise для этой колонки, которая использует \ArrayAccess. Вы можете получить и установить значения, как если бы они были массивом: / * Получение значения * / if ( $object->bitwise_column[‘property_1’] ) { // . . . } /* Настройка */ $object->bitwise_column[‘property_2’] = FALSE; $object->save(); /* Получение срок из базы */ $rowsWithPropery1AsTrue = \IPS\Db::i()->select( ‘*’, ‘table’, \IPS \Db::i()->bitwiseWhere( \IPS\YourClass:: $bitOptions['bitwise_column'], 'property_1' )); Заметки Определение класса Когда Вы создаете классы в Invision Community, Вы всегда будете определять свой класс при помощи идущего вначале подчеркивания. Даже если вы делаете это, вы не вызываете его при помощи предшествующего знака нижнего подчеркивания. Это технически способ работы автозагрузки. loadAndCheckPerms Существует метод loadAndCheckPerms( int $id ),который является общим для всех классов, рассматриваемых в данном документе, хотя он не является частью \IPS\Patterns\ActiveRecord. По умолчанию он ведет себя так же, как метод load( int $id ), предоставленный \IPS\Patterns\ActiveRecord, тем не менее, если Вы добавляете дополнительные функции, проверьте соответствующие разрешения. Например, после того, как вы примените права доступа клиентского уровня, выскочит OutOfRangeException, если у вошедшего в данный момент пользователя нет прав на просмотр объекта. Аналогичным образом, после того как вы реализовали скрытие содержимого, будет появляться OutOfRangeException, если происходит загрузка скрытого объекта, а у вошедшего в данный момент пользователя нет прав на просмотр скрытых объектов. Таким образом, вы всегда должны использовать метод через load( int $id ) при загрузке узлов, элементов содержимого, комментариев и обзоров в клиентской части, или для любого кода, вызываемого из фронт-энда.
    1 балл
  8. Для подключения способа оплаты с помощью системы Robokass, вам необходимо приобрести модуль оплаты в нашем файловом архиве. Для подключения модуля следуйте следующим инструкциям: 1. Скопируйте папку applications из архива модуля в корень вашего форума 2. Выполните запрос в базу данных: INSERT INTO `core_sys_lang_words` (`word_id`, `lang_id`, `word_app`, `word_plugin`, `word_key`, `word_default`, `word_custom`, `word_default_version`, `word_custom_version`, `word_js`, `word_export`) VALUES ('', 1, 'nexus', NULL, 'gateway__Robokassa', 'Robokassa', NULL, '100000', NULL, 0, 1), ('', 1, 'nexus', NULL, 'robokassa_MrchLogin', 'Merchant Login (MrchLogin)', NULL, '100000', NULL, 0, 1), ('', 1, 'nexus', NULL, 'robokassa_roboPassword', 'Merchant Password (MerchantPass)', NULL, '100000', NULL, 0, 1), ('', 1, 'nexus', NULL, 'robokassa_roboPassword2', 'Merchant Password 2 (MerchantPass2)', NULL, '100000', NULL, 0, 1), 3. Создайте валюту Рубль в вашем интернет-магазине (админцентр > Магазин > Платежи > Настройки > Валюта). Если валюта не RUB, скрипт обращается за курсом на сайт ЦБ и конвертирует сумму в рубли 4. Перейдите на сайт http://robokassa.ru/ru/ в личный кабинет магазина (если не зарегистрированы - пройдите регистрацию). В кабинете необходимо создать новый магазин и заполнить все требуемые данные. После создания магазина в его технических настройках необходимо указать следующие данные: Идентификатор магазина - введите название вашего сайта или компании Пароль #1 - укажите пароль посложнее Пароль #2 - укажите пароль посложнее Result URL - http://<домен.ру>/applications/nexus/interface/gateways/robokassa.php Метод отсылки данных по Result Url: POST Success URL - http://<домен.ру>/applications/nexus/interface/gateways/robokassa.php?success=1 Метод отсылки данных по Success Url: POST Fail URL - http://<домен.ру>/applications/nexus/interface/gateways/robokassa.php?fail=1 Метод отсылки данных по Fail Url: POST Сохраняем настройки. Далее необходимо добавить Robokassa в способах оплаты в магазине, для этого заходим в админцентр > Магазин > Платежи > Настройки > Способы оплаты Заполняем поля и сохраняем. Способ оплаты настроен.
    1 балл
×
×
  • Создать...

Важная информация

Используя наш сайт вы соглашаетесь с нашей Политикой конфиденциальности