Перейти к содержимому


Переменные в фильтрах?


Сообщений в теме: 13

#1 Tony999

    Активный участник

  • Пользователи
  • PipPipPip
  • 406 сообщений
  • Пол:Мужчина
  • Город:Санкт-Петербург

Отправлено 24 Ноябрь 2014 - 22:15

Как это сделать?
Почему, например, глобальные переменные типа $user и все поля этого массива прекрасно работают в вычислениях в т.ч. и в SQL-запросах, но не работают в стандартных фильтрах, сколько я не пытался в режиме Эксперта, хотя это по сути тоже SQL-запросы.

Объясните, пожалуйста! И можно как-то обойти или вылечить это?
Спасибо!
КБ - помощь, проекты и решения.
Хостинг. Аренда. Продажа.
ВашаБаза.рф

#2 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 722 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 25 Ноябрь 2014 - 10:27

Цитата

в т.ч. и в SQL-запросах

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

#3 Tony999

    Активный участник

  • Пользователи
  • PipPipPip
  • 406 сообщений
  • Пол:Мужчина
  • Город:Санкт-Петербург

Отправлено 28 Ноябрь 2014 - 02:37

А что такое {current}? Это же ведь каким-то образом подставляет в чистый SQL запрос user_id текущего пользователя?
Кстати, попробовал в фильтре 'Кто добавил' = '{current}' or 'Кто добавил'=1
И получил вроде, что хотел: записи могут смотреть только "Кто добавил" и "Администратор".
Хотелось бы еще больше возможностей в фильтрах иметь.

Сообщение отредактировал Tony999: 28 Ноябрь 2014 - 17:23

КБ - помощь, проекты и решения.
Хостинг. Аренда. Продажа.
ВашаБаза.рф

#4 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 722 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 28 Ноябрь 2014 - 11:11

Цитата

А что такое {current}? Это же ведь каким-то образом подставляет в чистый SQL запрос user_id текущего пользователя?

Это псевдопеременная, мы ее сами заменяем на id текущего пользователя. Чтобы добавить какие-то новые данные, придется добавлять еще пачку таких же переменных, к тому же это затормозит обработку фильтров.

#5 Александр Пономарев

    Активный участник

  • Пользователи
  • PipPipPip
  • 434 сообщений
  • Пол:Мужчина
  • Город:Таганрог

Отправлено 12 Март 2015 - 18:43

Я создал в системной таблице f_users поле number_mo, чтобы по нему фильтровать доступ клиента к записям, относящимся к нему. Мне это удобнее, чем заморачиваться с владельцем записи. Рассчитывал, что фильтр поймет конструкцию {$user.number_mo} , но он ее, похоже, не понимает. Почему? Как можно использовать возможность расширения полей в системной записи user в f_users и можно ли вообще это делать? Будет ли отдавать запрос SELECT это значение или проблемы только в фильтрах?

#6 maksn

    Активный участник

  • Пользователи
  • PipPipPip
  • 314 сообщений
  • Пол:Мужчина

Отправлено 13 Март 2015 - 08:39

Просмотр сообщенияCbCoder (25 Ноябрь 2014 - 10:27) писал:

В SQL-запросах переменные из PHP работать не могут, если только эти запросы не лежат внутри PHP-кода, как это обстоит в вычислениях. В фильтрах же используется чистый SQL, PHP там нет, поэтому и невозможно вставить переменные.
PHP там есть, что то вроде str_replace. Иначе как бы обрабатывалось {current}?

Просмотр сообщенияCbCoder (28 Ноябрь 2014 - 11:11) писал:

Чтобы добавить какие-то новые данные, придется добавлять еще пачку таких же переменных, к тому же это затормозит обработку фильтров.
Никаких новых переменных там не нужно. Нужно перед добавлением условия, разрешить исполнять PHP код, аналогично тому, как это происходит с {current} или `Тип` like '%Клиент%' and `Кто добавил`='{current}' В этом случае решились бы многие проблемы. Не хотите же сказать, что такого вида запрос корректен с точки зрения SQL?
SELECT * FROM `f_data42` WHERE `Тип` like '%Клиент%' and `Кто добавил`='{current}
Сервер сразу же сгенерирует ошибку "Field 'Тип' not exists in table f_data42"

Сообщение отредактировал maksn: 13 Март 2015 - 08:49

"...Сижу, паяю. CRM починяю..."
Мои разработки

#7 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 722 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 13 Март 2015 - 10:11

И где вы тут увидели исполнение PHP-кода? Где в приведенной строке хоть один элемент PHP-кода? Это обычная строка, в которой идет замена шаблонов, никаких php-переменных и кода там и близко нет.

#8 maksn

    Активный участник

  • Пользователи
  • PipPipPip
  • 314 сообщений
  • Пол:Мужчина

Отправлено 13 Март 2015 - 13:34

Просмотр сообщенияCbCoder (13 Март 2015 - 10:11) писал:

И где вы тут увидели исполнение PHP-кода? Где в приведенной строке хоть один элемент PHP-кода? Это обычная строка, в которой идет замена шаблонов, никаких php-переменных и кода там и близко нет.
Я полагал, что {current} или `Тип` у вас обрабатывается функцией str_replace() перед тем как отдать запрос на сервер. Других способов я что то не вижу. А "приведенную строку" в таком виде
SELECT * FROM `f_data42` WHERE `Тип` like '%Клиент%' and `Кто добавил`='{current}'
отдавать на SQL сервер, значит гарантированно получить Error

Сообщение отредактировал maksn: 13 Март 2015 - 14:33

"...Сижу, паяю. CRM починяю..."
Мои разработки

#9 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 722 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 13 Март 2015 - 15:44

Повторюсь: причем тут исполнение php-кода? Да, строка проходит обработку, но об этом я все сказал еще в посте #4. PHP-переменных в данной строке нет.

#10 maksn

    Активный участник

  • Пользователи
  • PipPipPip
  • 314 сообщений
  • Пол:Мужчина

Отправлено 13 Март 2015 - 18:19

Просмотр сообщенияCbCoder (13 Март 2015 - 15:44) писал:

Да, строка проходит обработку,
Собственно, мы все тут и просим именно это.
Сделайте, please так, чтобы в этой самой обработке, обрабатывался и наш, пользовательский код :)

Сообщение отредактировал maksn: 13 Март 2015 - 18:20

"...Сижу, паяю. CRM починяю..."
Мои разработки

#11 Александр Пономарев

    Активный участник

  • Пользователи
  • PipPipPip
  • 434 сообщений
  • Пол:Мужчина
  • Город:Таганрог

Отправлено 13 Март 2015 - 18:28

В общем пришлось во всех таблицах делать по нескольку полей доступа с автоматическим присвоением значений из "родительских" таблиц и раздавать доступ по нему через фильтр "поле равно текущий". Размер базы данных можно смело умножать на полтора.

#12 Александр Пономарев

    Активный участник

  • Пользователи
  • PipPipPip
  • 434 сообщений
  • Пол:Мужчина
  • Город:Таганрог

Отправлено 14 Март 2015 - 01:57

Просмотр сообщенияАлександр Пономарев (13 Март 2015 - 18:28) писал:

В общем пришлось во всех таблицах делать по нескольку полей доступа с автоматическим присвоением значений из "родительских" таблиц и раздавать доступ по нему через фильтр "поле равно текущий". Размер базы данных можно смело умножать на полтора.

Для поля типа "Пользователь" установил возможность выбора нескольких вариантов, в фильтре указал "содержит {текущий}" .
Описание фильтра сама программа сделала таким:
`Аппарат МО` like '%-{current}-%'

Сообщение отредактировал Александр Пономарев: 14 Март 2015 - 02:07


#13 Riddick

    Активный участник

  • Пользователи
  • PipPipPip
  • 70 сообщений

Отправлено 18 Март 2015 - 02:00

Просмотр сообщенияАлександр Пономарев (13 Март 2015 - 18:28) писал:

В общем пришлось во всех таблицах делать по нескольку полей доступа с автоматическим присвоением значений из "родительских" таблиц

А можно поинтересоваться, почему несколько полей? И не могли бы вы поделиться вашей схемой разделения прав между юзерами?

#14 Александр Пономарев

    Активный участник

  • Пользователи
  • PipPipPip
  • 434 сообщений
  • Пол:Мужчина
  • Город:Таганрог

Отправлено 08 Октябрь 2015 - 22:43

В таблице задается несколько полей типа "Пользователь" и несколько фильтров по ним, а пользователям потом разрешается или нет использование этих фильтров. Поскольку в поле "Пользователь" допускается указание нескольких пользователей, условие фильтра пишется не "равно", а "содержит". Соответственно сами поля "Пользователь" подтаблицы заполняются из родительских записей таблицы. Несколько сумбурно получилось. Но у меня была утилитарная задача распределения права доступа для многих пользователей типа "Клиент" с тем, чтобы не задавать им разные роли в самой системе. Это очень дорого и нецелесообразно.





Количество пользователей, читающих эту тему: 4

0 пользователей, 4 гостей, 0 анонимных