Уважаемые пользователи!
C 7 ноября 2020 года phpBB Group прекратила выпуск обновлений и завершила дальнейшее развитие phpBB версии 3.2.
С 1 августа 2024 года phpBB Group прекращает поддержку phpBB 3.2 на официальном сайте.
Сайт официальной русской поддержки phpBB Guru продолжит поддержку phpBB 3.2 до 31 декабря 2024 года.
С учетом этого, настоятельно рекомендуется обновить конференции до версии 3.3.

Как сделать отображение модуля в личном разделе по условию?

Форум для авторов расширений для phpBB. Здесь можно попросить помощи в разработке у коллег.
Правила форума
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Мини [FAQ] по phpBB3.1.x/3.3.x | FAQ | Как задавать вопросы | Как устанавливать расширения

Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение ;) ).
Аватара пользователя
KimIV
phpBB 2.0.1
Сообщения: 286
Стаж: 8 лет 6 месяцев
Откуда: Кунгур
Благодарил (а): 169 раз
Поблагодарили: 21 раз
Контактная информация:

Как сделать отображение модуля в личном разделе по условию?

Сообщение KimIV »

Собственно весь вопрос в заголовке. А тут дам пояснение.
В личный раздел добавляю новый модуль и мне нужно, чтобы он отображался только при наступлении некоего события. Если по простому, то есть переменная, которая принимает значения true и false. Нужно, чтобы при истине модуль отображался, а при лжи - его не было видно.

Функция описания модуля

Код: Выделить всё

namespace kimiv\fleaMarket\ucp;

class ucp_fm_profile_info
{
	function module()
	{
		global $config;

		return array(
			'filename'	=> '\kimiv\fleaMarket\ucp\ucp_fm_profile_module',
			'title'		=> 'UCP_PROFILE',
			'version'	=> $config['fleaMarket_version'],
			'modes'		=> array(
				'configuration'	=> array(
					'title' => 'UCP_FM_PROFILE',		// Имя модуля/вкладки
					'auth' => 'ext_kimiv/fleaMarket && acl_u_fleamarket_use',
					'cat' => array('UCP_PROFILE')),
			),
		);
	}
}
Пробовал вставлять

Код: Выделить всё

'auth' => 'ext_kimiv/fleaMarket && acl_u_fleamarket_use && S_FM_REGISTERED',
При входе в личный раздел ругается

Код: Выделить всё

Parse error: syntax error, unexpected ')' in N:\home\chipgu.ru\www\includes\functions_module.php(472) : eval()'d code on line 1
[phpBB Debug] PHP Warning: in file [ROOT]/includes/functions.php on line 5284: Cannot modify header information - headers already sent by (output started at [ROOT]/includes/functions_module.php(472) : eval()'d code:1)
[phpBB Debug] PHP Warning: in file [ROOT]/includes/functions.php on line 5284: Cannot modify header information - headers already sent by (output started at [ROOT]/includes/functions_module.php(472) : eval()'d code:1)
[phpBB Debug] PHP Warning: in file [ROOT]/includes/functions.php on line 5284: Cannot modify header information - headers already sent by (output started at [ROOT]/includes/functions_module.php(472) : eval()'d code:1)
ЧипГуру
Ты должен делать добро из зла, потому что его больше не из чего делать. Уоренн Роберт Пенн.
Аватара пользователя
Sheer
Former team member
Сообщения: 12113
Стаж: 17 лет 1 месяц
Откуда: Калининград не Кенигсберг
Благодарил (а): 54 раза
Поблагодарили: 2752 раза
Контактная информация:

Re: Как сделать отображение модуля в личном разделе по условию?

Сообщение Sheer »

Попробуй просто

Код: Выделить всё

'auth' => 'acl_u_fleamarket_use', 
Изображение
Общие ошибки новичков (07.11.2005) & Как задавать вопросы
Мини FAQ
Если ничто другое не помогает, прочтите, наконец, инструкцию!
"Никакая инструкция не может перечислить всех обязанностей должностного лица, предусмотреть все отдельные случаи и дать вперёд соответствующие указания, а поэтому господа инженеры должны проявить инициативу и, руководствуясь знаниями своей специальности и пользой дела, принять все усилия для оправдания своего назначения".
Циркуляр Морского технического комитета №15 от 29.11.1910 г.
Перенесено из форума Флейм в форум Для авторов (phpBB 3.1.x) 03.05.2016 13:23 модератором Sheer

Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16313
Стаж: 17 лет 10 месяцев
Откуда: Красноярск
Благодарил (а): 533 раза
Поблагодарили: 2119 раз
Контактная информация:

Re: Как сделать отображение модуля в личном разделе по условию?

Сообщение rxu »

Sheer писал(а): Попробуй просто
Тогда модуль не будет исчезать при отключении расширения. Часть ext_kimiv/fleaMarket за это отвечает.
Изображение
Аватара пользователя
Татьяна5
Поддержка
Поддержка
Сообщения: 12372
Стаж: 12 лет 7 месяцев
Благодарил (а): 223 раза
Поблагодарили: 3517 раз
Контактная информация:

Re: Как сделать отображение модуля в личном разделе по условию?

Сообщение Татьяна5 »

Приходит в голову при ненаступлении некоторого условия принудительно менять право u_fleamarket_use для текущего пользователя на false (где-нибудь в ucp.php, для надёжности). Хотя не проверяла
Аватара пользователя
Sheer
Former team member
Сообщения: 12113
Стаж: 17 лет 1 месяц
Откуда: Калининград не Кенигсберг
Благодарил (а): 54 раза
Поблагодарили: 2752 раза
Контактная информация:

Re: Как сделать отображение модуля в личном разделе по условию?

Сообщение Sheer »

rxu писал(а): Тогда модуль не будет исчезать при отключении расширения
Так это в миграции прописать надо.
Изображение
Общие ошибки новичков (07.11.2005) & Как задавать вопросы
Мини FAQ
Если ничто другое не помогает, прочтите, наконец, инструкцию!
"Никакая инструкция не может перечислить всех обязанностей должностного лица, предусмотреть все отдельные случаи и дать вперёд соответствующие указания, а поэтому господа инженеры должны проявить инициативу и, руководствуясь знаниями своей специальности и пользой дела, принять все усилия для оправдания своего назначения".
Циркуляр Морского технического комитета №15 от 29.11.1910 г.
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16313
Стаж: 17 лет 10 месяцев
Откуда: Красноярск
Благодарил (а): 533 раза
Поблагодарили: 2119 раз
Контактная информация:

Re: Как сделать отображение модуля в личном разделе по условию?

Сообщение rxu »

Миграция при простом отключении не отрабатывает.
Изображение
Аватара пользователя
Sheer
Former team member
Сообщения: 12113
Стаж: 17 лет 1 месяц
Откуда: Калининград не Кенигсберг
Благодарил (а): 54 раза
Поблагодарили: 2752 раза
Контактная информация:

Re: Как сделать отображение модуля в личном разделе по условию?

Сообщение Sheer »

Ща проверю...

Отправлено спустя 9 минут 3 секунды:
Ну да...
А может использовать событие event core.module_auth

Отправлено спустя 27 минут 59 секунд:
Придумал... есть событие

Код: Выделить всё

/**
* Use this event to enable and disable additional UCP modules
*
* @event core.ucp_display_module_before
* @var    p_master    module    Object holding all modules and their status
* @var    mixed        id        Active module category (can be the int or string)
* @var    string        mode    Active module
* @since 3.1.0-a1
*/
$vars = array('module', 'id', 'mode');
extract($phpbb_dispatcher->trigger_event('core.ucp_display_module_before', compact($vars)));
Изображение
Общие ошибки новичков (07.11.2005) & Как задавать вопросы
Мини FAQ
Если ничто другое не помогает, прочтите, наконец, инструкцию!
"Никакая инструкция не может перечислить всех обязанностей должностного лица, предусмотреть все отдельные случаи и дать вперёд соответствующие указания, а поэтому господа инженеры должны проявить инициативу и, руководствуясь знаниями своей специальности и пользой дела, принять все усилия для оправдания своего назначения".
Циркуляр Морского технического комитета №15 от 29.11.1910 г.
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16313
Стаж: 17 лет 10 месяцев
Откуда: Красноярск
Благодарил (а): 533 раза
Поблагодарили: 2119 раз
Контактная информация:

Re: Как сделать отображение модуля в личном разделе по условию?

Сообщение rxu »

Вобщем, есть такая фишка. Строка auth в этих файлах модулей позволяет использовать ряд ключей:
  • При использовании ключа вида 'acl_([a-z0-9_]+)(,\$id)?' делается проверка $auth->acl_get(\'\\1\'\\2)'. Чтобы было яснее, вторая часть (,\$id) (идентификатор форума) является необязательной.
    Пример 1: если в строке встречается acl_u_fleamarket_use, будет выполнена проверка $auth->acl_get('acl_u_fleamarket_use')
    Пример 2: если в строке встречается, скажем, acl_f_read, $id, будет выполнена проверка $auth->acl_get('acl_f_read', $id), где $id будет заменена на текущий идентификатор форума.
  • При использовании ключа вида aclf_([a-z0-9_]+) будет выполнена проверка $auth->acl_getf_global(\'\\1\').
    Пример: если в строке встречается ключ aclf_f_read, будет выполнена проверка $auth->acl_getf_global('f_read'), которая вернет true, если пользователь имеет разрешение на чтение хотя бы в одном форуме, и false в противном случае.
  • При использовании ключа вида cfg_([a-z0-9_]+) будет выполнена проверка на $config[\'\\1\'], т.е. на указанный параметр конфигурации.
    Пример: если в строке встречается ключ cfg_my_magic_config, будет выполнена проверка $config['my_magic_config'].
  • При использовании ключа вида request_([a-zA-Z0-9_]+) будет выполнена проверка $request->variable(\'\\1\', false).
    Пример: если в строке встречается ключ request_my_magic_post_var, будет выполнена проверка $request->variable('my_magic_post_var', false). Соответственно, полученное значение, при его наличии, будет приведено к типу boolean; при отсутствии вернет false.
  • При использовании ключа вида ext_([a-zA-Z0-9_/]+) будет выполнена проверка array_key_exists(\'\\1\', $phpbb_extension_manager->all_enabled()), т.е. проверено, включено ли указанное расширение.
    Пример: если в строке встречается ключ ext_kimiv/fleaMarket, будет выполнена проверка array_key_exists('kimiv/fleaMarket', $phpbb_extension_manager->all_enabled()), т.е. поиск данного идентификатора расширения в списке включённых.
  • При использовании ключа вида authmethod_([a-z0-9_\\\\]+) будет выполнена проверка ($config[\'auth_method\'] === \'\\1\'), т.е. проверка на то, является ли указанный метод авторизации текущим.
    Пример: если в строке встречается ключ authmethod_db, будет выполнена проверка ($config['auth_method'] === 'db').
Примерно из этого можно исходить в данном случае.
Изображение
Аватара пользователя
KimIV
phpBB 2.0.1
Сообщения: 286
Стаж: 8 лет 6 месяцев
Откуда: Кунгур
Благодарил (а): 169 раз
Поблагодарили: 21 раз
Контактная информация:

Re: Как сделать отображение модуля в личном разделе по условию?

Сообщение KimIV »

Спасибо всем за участие... надо обдумать и проверить работу auth.

Но для видимости модулей есть ещё параметр display. Видел примеры его использования 'display' => false. А переменную вместо false туда можно как-то загнать? Сам пробовал и получал ошибку, что переменная неопределена. Хотя она определяется и инициализируется в главном контроллере расширения.
Ты должен делать добро из зла, потому что его больше не из чего делать. Уоренн Роберт Пенн.
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16313
Стаж: 17 лет 10 месяцев
Откуда: Красноярск
Благодарил (а): 533 раза
Поблагодарили: 2119 раз
Контактная информация:

Re: Как сделать отображение модуля в личном разделе по условию?

Сообщение rxu »

KimIV писал(а): Видел примеры его использования 'display' => false
Есть параметр module_display. Он может быть 0 или 1, насколько я понимаю. На лету можно попробовать менять через событие core.modify_module_row через изменение элемента массива $module_row['display'].
Изображение
Аватара пользователя
KimIV
phpBB 2.0.1
Сообщения: 286
Стаж: 8 лет 6 месяцев
Откуда: Кунгур
Благодарил (а): 169 раз
Поблагодарили: 21 раз
Контактная информация:

Re: Как сделать отображение модуля в личном разделе по условию?

Сообщение KimIV »

ЗЫ. У меня регистрация в барахолке делается отдельно от форумной. И видимость модуля нужно включить только, если пользователь зарегистрировался в барахолке. А право acl_u_fleamarket_use регулирует возможность регистрацит.
Ты должен делать добро из зла, потому что его больше не из чего делать. Уоренн Роберт Пенн.
Аватара пользователя
LavIgor
Former team member
Сообщения: 3468
Стаж: 9 лет 11 месяцев
Благодарил (а): 41 раз
Поблагодарили: 932 раза

Re: Как сделать отображение модуля в личном разделе по условию?

Сообщение LavIgor »

KimIV, когда было нужно, я напрямую прописывал значения прав доступа в $auth->cache, таким образом можно по сути работать с правами доступа, не выдавая их пользователям напрямую.
Думаю, в Вашем случае можно придумать отдельное право доступа и давать его как раз на основе подобных манипуляций.
Насколько это корректно, сказать не могу, но это работает.

Отправлено спустя 4 минуты 42 секунды:
Хотя конкретно в случае модулей лучше использовать подходящее для этого событие, предложенное Sheer.
Аватара пользователя
KimIV
phpBB 2.0.1
Сообщения: 286
Стаж: 8 лет 6 месяцев
Откуда: Кунгур
Благодарил (а): 169 раз
Поблагодарили: 21 раз
Контактная информация:

Re: Как сделать отображение модуля в личном разделе по условию?

Сообщение KimIV »

Всем огромное спасибо за участие, особенно Sheer и rxu. Отчитываюсь о проделанной работе.

1. В слушателе подписался на событие 'core.ucp_display_module_before' => 'ucp_display_module_before',
2. В функции обработки события воспользовался функцией set_display объекта p_master

Код: Выделить всё

	public function ucp_display_module_before($event)
	{
		// Зарегистрированность пользователя
        $sql = 'SELECT COUNT(user_id) as total
			FROM ' . FM_USERS_TABLE . '
			WHERE user_id = ' . $this->user->data['user_id'];
        $result = $this->db->sql_query($sql);      // Выполнение запроса
        $row = $this->db->sql_fetchrow($result);   // Результат запроса в массив строк

		$module = $event['module'];
		$module->set_display('\kimiv\fleaMarket\ucp\ucp_fm_profile_module', false, $row['total']);
	}
Не знаю, насколько это всё правильно, но оно работает именно так, как мне нужно. Если пользователь НЕ зарегистрировался в барахолке, то модуль в личном разделе скрыт, и наоборот.
Ты должен делать добро из зла, потому что его больше не из чего делать. Уоренн Роберт Пенн.
Аватара пользователя
Sheer
Former team member
Сообщения: 12113
Стаж: 17 лет 1 месяц
Откуда: Калининград не Кенигсберг
Благодарил (а): 54 раза
Поблагодарили: 2752 раза
Контактная информация:

Re: Как сделать отображение модуля в личном разделе по условию?

Сообщение Sheer »

С модулем вроде все нормально, нужно только память освобождать
После

Код: Выделить всё

$row = $this->db->sql_fetchrow($result);   // Результат запроса в массив строк 
добавить

Код: Выделить всё

$this->db->sql_freeresult($result); 
Изображение
Общие ошибки новичков (07.11.2005) & Как задавать вопросы
Мини FAQ
Если ничто другое не помогает, прочтите, наконец, инструкцию!
"Никакая инструкция не может перечислить всех обязанностей должностного лица, предусмотреть все отдельные случаи и дать вперёд соответствующие указания, а поэтому господа инженеры должны проявить инициативу и, руководствуясь знаниями своей специальности и пользой дела, принять все усилия для оправдания своего назначения".
Циркуляр Морского технического комитета №15 от 29.11.1910 г.
Ответить

Вернуться в «Для разработчиков»