Jump to content
Дизайн и модификация Invision Community IPBSkinsBETA
Search In
  • More options...
Find results that contain...
Find results in...
Sign in to follow this  
vinegredz

Как повлиять на выборку записей в базе данных?

Recommended Posts

Здравствуйте.

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

  1. Добавил поле "Partner ID" в профиль пользователя (тип число) со значением, например, "3"
  2. Добавил поле "Partner ID" (тип число) в базу данных
  3. Создал новую запись в базе данных, указав значение поля "Partner ID" равное 3

Мне нужно сделать так, чтобы в шаблон recordRow (который является циклом перебирающим строки из базы данных) попадали только те записи, у которых поле "Partner ID" совпадает со значением в профиле авторизованного пользователя. Сейчас я могу сделать вот так:

{{if $row->customFieldDisplayByKey('partner') != \IPS\Member::loggedIn()->profileFields()['core_pfieldgroups_1']['core_pfield_3']}}
Доступ запрещен
{{else}}
Доступ разрешен
{{endif}}

Но проблема в том, что это "пост фильтр". То есть в таблице у пользователя будут присутствовать строки к которым нет доступа и бывают ситуации, когда на одной странице у пользователя нет доступа ни к одной из записей. Вопрос: как повлиять на то, что попадает в $rows любой базы данных, чтобы на уровень раньше (а не в шаблоне вывода строк) добавить фильтр по значению поля "Partner ID"?

Share this post


Link to post

Нужно в \system\Helpers\Table\Content.php вносить изменения

	public function __construct( $class, \IPS\Http\Url $baseUrl, $where=NULL, \IPS\Node\Model $container=NULL, $includeHidden=\IPS\Content\Hideable::FILTER_AUTOMATIC, $permCheck='view', $honorPinned=TRUE, $showMovedLinks=FALSE, $callback=NULL )

Проверяете класс ($class) и добавляете условие в $where

Share this post


Link to post

Спасибо. Вот решение. В указанный файл в строку номер 319 добавляем такой код:

// Сортируем, только если авторизованный пользовать НЕ админ
if(\IPS\Member::loggedIn()->isAdmin() == False) {

  // Сортировка только для записей из базы данных с ID1
  if($class == 'IPS\cms\Records1') {

	// Показывать только те записи, у которых поле с ID32 совпадает со значением поля в профиле пользователя
  	$where[] = array( 'field_32=?', \IPS\Member::loggedIn()->profileFields()['core_pfieldgroups_1']['core_pfield_3'] );

  };

};

Мне как-то сыкотно оригинальные файлы редактировать. Как внести эти правки, чтобы они при обновлении не затерлись?

Share this post


Link to post
10 часов назад, vinegredz сказал:

Как внести эти правки, чтобы они при обновлении не затерлись?

Создайте плагин.

Share this post


Link to post

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...