Уважаемые пользователи!
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 | Как задавать вопросы | Как устанавливать расширения

Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение ;) ).
Аватара пользователя
pantheonptz
phpBB 1.2.0
Сообщения: 13
Стаж: 6 лет 5 месяцев
Благодарил (а): 1 раз

Как закрыть тему для гостей

Сообщение pantheonptz »

Настройки прав доступа позволяют закрыть форум целиком. Как закрыть отдельную тему для незарегистрированных пользователей? Я так понял нужно править или шаблон или viewforum.php
Аватара пользователя
Татьяна5
Поддержка
Поддержка
Сообщения: 12372
Стаж: 12 лет 7 месяцев
Благодарил (а): 223 раза
Поблагодарили: 3517 раз
Контактная информация:

Re: Как закрыть тему для гостей

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

В 3.2 не правят код движка, в 3.2 пишут расширения
Исключить тему для показа можно да, из событий в viewforum.php

Отправлено спустя 6 минут 27 секунд:
Можно вклиниться в событие core.viewforum_get_topic_data и изменить там sql-запрос для гостей (добавить WHERE). Проверка зарегистрирован ли пользователь - $user->data['is_registered']

Отправлено спустя 1 минуту 9 секунд:
Плюс в viewtopic.php надо добавить проверку (также через расширение), чтобы гость не мог получить доступ по прямой ссылке
Аватара пользователя
pantheonptz
phpBB 1.2.0
Сообщения: 13
Стаж: 6 лет 5 месяцев
Благодарил (а): 1 раз

Re: Как закрыть тему для гостей

Сообщение pantheonptz »

Тогда может подскажете есть ли какая либо документация? Интересно почитать как устроена система.

Отправлено спустя 10 минут 13 секунд:
Вот это событие из viewforum.php
Зная название темы, как предотвратить её вывод для гостей?

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

$vars = array(
	'forum_data',
	'sql_array',
	'forum_id',
	'topics_count',
	'sort_days',
	'sort_key',
	'sort_dir',
);
extract($phpbb_dispatcher->trigger_event('core.viewforum_get_topic_data', compact($vars)));

$sql_approved = ' AND ' . $phpbb_content_visibility->get_visibility_sql('topic', $forum_id, 't.');

if ($user->data['is_registered'])
{
	if ($config['load_db_track'])
	{
		$sql_array['LEFT_JOIN'][] = array('FROM' => array(TOPICS_POSTED_TABLE => 'tp'), 'ON' => 'tp.topic_id = t.topic_id AND tp.user_id = ' . $user->data['user_id']);
		$sql_array['SELECT'] .= ', tp.topic_posted';
	}

	if ($config['load_db_lastread'])
	{
		$sql_array['LEFT_JOIN'][] = array('FROM' => array(TOPICS_TRACK_TABLE => 'tt'), 'ON' => 'tt.topic_id = t.topic_id AND tt.user_id = ' . $user->data['user_id']);
		$sql_array['SELECT'] .= ', tt.mark_time';

		if ($s_display_active && sizeof($active_forum_ary))
		{
			$sql_array['LEFT_JOIN'][] = array('FROM' => array(FORUMS_TRACK_TABLE => 'ft'), 'ON' => 'ft.forum_id = t.forum_id AND ft.user_id = ' . $user->data['user_id']);
			$sql_array['SELECT'] .= ', ft.mark_time AS forum_mark_time';
		}
	}
}

if ($forum_data['forum_type'] == FORUM_POST)
{
	// Get global announcement forums
	$g_forum_ary = $auth->acl_getf('f_read', true);
	$g_forum_ary = array_unique(array_keys($g_forum_ary));

	$sql_anounce_array['LEFT_JOIN'] = $sql_array['LEFT_JOIN'];
	$sql_anounce_array['LEFT_JOIN'][] = array('FROM' => array(FORUMS_TABLE => 'f'), 'ON' => 'f.forum_id = t.forum_id');
	$sql_anounce_array['SELECT'] = $sql_array['SELECT'] . ', f.forum_name';

	// Obtain announcements ... removed sort ordering, sort by time in all cases
	$sql_ary = array(
		'SELECT'	=> $sql_anounce_array['SELECT'],
		'FROM'		=> $sql_array['FROM'],
		'LEFT_JOIN'	=> $sql_anounce_array['LEFT_JOIN'],

		'WHERE'		=> '(t.forum_id = ' . $forum_id . '
				AND t.topic_type = ' . POST_ANNOUNCE . ') OR
			(' . $db->sql_in_set('t.forum_id', $g_forum_ary) . '
				AND t.topic_type = ' . POST_GLOBAL . ')',

		'ORDER_BY'	=> 't.topic_time DESC',
	);
Отправлено спустя 3 минуты 8 секунд:
Мои скудные познания в php не позволяют охватить весь смысл происходящего. Я понял, что здесь формируется запрос к бд.
Последний раз редактировалось Sheer 28.10.2017 19:01, всего редактировалось 2 раза.
Причина: bb-код. Когда же вы наконец научтесь пользоваться bb-кодами!!!
Аватара пользователя
Татьяна5
Поддержка
Поддержка
Сообщения: 12372
Стаж: 12 лет 7 месяцев
Благодарил (а): 223 раза
Поблагодарили: 3517 раз
Контактная информация:

Re: Как закрыть тему для гостей

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

В целом описание расширений, которое ближе к практике - Расширения - это просто!
По базе данных - Таблицы БД phpBB3
Официальная документация по расширениям - https://area51.phpbb.com/docs/dev/3.1.x/index.html

А именно тут внутри расширения надо добавить $sql_array['WHERE'] = 'тут условие'; (условие лучше всё-таки не по названию, а по id темы прописывать)
Аватара пользователя
Sheer
Former team member
Сообщения: 12113
Стаж: 17 лет 1 месяц
Откуда: Калининград не Кенигсберг
Благодарил (а): 54 раза
Поблагодарили: 2752 раза
Контактная информация:

Re: Как закрыть тему для гостей

Сообщение Sheer »

Татьяна5 писал(а): 28.10.2017 18:59Официальная документация по расширениям
https://area51.phpbb.com/docs/dev/3.1.x ... index.html
pantheonptz писал(а): 28.10.2017 18:45Мои скудные познания в php
Тогда бесполезно.
Изображение
Общие ошибки новичков (07.11.2005) & Как задавать вопросы
Мини FAQ
Если ничто другое не помогает, прочтите, наконец, инструкцию!
"Никакая инструкция не может перечислить всех обязанностей должностного лица, предусмотреть все отдельные случаи и дать вперёд соответствующие указания, а поэтому господа инженеры должны проявить инициативу и, руководствуясь знаниями своей специальности и пользой дела, принять все усилия для оправдания своего назначения".
Циркуляр Морского технического комитета №15 от 29.11.1910 г.
Аватара пользователя
Татьяна5
Поддержка
Поддержка
Сообщения: 12372
Стаж: 12 лет 7 месяцев
Благодарил (а): 223 раза
Поблагодарили: 3517 раз
Контактная информация:

Re: Как закрыть тему для гостей

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

pantheonptz,
Код в phpBB хорош тем, что читается просто по-английски, даже без знаний языка

$sql_array - sql массив, массив с частями sql-запроса

$result = $db->sql_query($db->sql_build_query('SELECT', $sql_array));
результат = класс базы данных -> sql_запрос(класс базы данных->построить_sql_запрос('ВЫБОР', sql_массив))
То есть построить запрос выборки из массива, выполнить его, и результат записать в $result

Отправлено спустя 2 минуты 4 секунды:
Sheer писал(а): 28.10.2017 19:03Тогда бесполезно.
Ну уж не сказать. Сначала моды дорабатывать начала, а потом только разобралась на чём пишу-то...
Аватара пользователя
Sheer
Former team member
Сообщения: 12113
Стаж: 17 лет 1 месяц
Откуда: Калининград не Кенигсберг
Благодарил (а): 54 раза
Поблагодарили: 2752 раза
Контактная информация:

Re: Как закрыть тему для гостей

Сообщение Sheer »

Мы все учились понемногу Чему-нибудь и как-нибудь
Но тут не все так просто, нужно ведь сначала пометить тему, что она будет недоступна для гостей. Это еще одно событие в posting.php и изменение структуры таблицы topics
Потом исключить ее и сообщения из этой темы из поиска для гостей. Для начинающего не подсилу.
Изображение
Общие ошибки новичков (07.11.2005) & Как задавать вопросы
Мини FAQ
Если ничто другое не помогает, прочтите, наконец, инструкцию!
"Никакая инструкция не может перечислить всех обязанностей должностного лица, предусмотреть все отдельные случаи и дать вперёд соответствующие указания, а поэтому господа инженеры должны проявить инициативу и, руководствуясь знаниями своей специальности и пользой дела, принять все усилия для оправдания своего назначения".
Циркуляр Морского технического комитета №15 от 29.11.1910 г.
Аватара пользователя
Татьяна5
Поддержка
Поддержка
Сообщения: 12372
Стаж: 12 лет 7 месяцев
Благодарил (а): 223 раза
Поблагодарили: 3517 раз
Контактная информация:

Re: Как закрыть тему для гостей

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

Sheer писал(а): 28.10.2017 19:56сначала пометить тему, что она будет недоступна для гостей
Для расширения для одного форума, и тем более в исполнении новичка, не надо. Достаточно дописать id существующей темы в запрос (на универсальность расширение не претендует)
Вот с поиском то да, уже отдельная задача
Аватара пользователя
pantheonptz
phpBB 1.2.0
Сообщения: 13
Стаж: 6 лет 5 месяцев
Благодарил (а): 1 раз

Re: Как закрыть тему для гостей

Сообщение pantheonptz »

Добавить в расширение, что-то типа -

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

if (!$user->data['is_registered'])
{
	$sql_array['WHERE'] = 't.topic <> 49';
}
Если пользователь не зарегистрированный, то добавить условие id темы не равняется нужному?
Последний раз редактировалось Sheer 28.10.2017 21:03, всего редактировалось 1 раз.
Причина: bb-код. Когда же вы наконец научтесь пользоваться bb-кодами!!!
Аватара пользователя
Татьяна5
Поддержка
Поддержка
Сообщения: 12372
Стаж: 12 лет 7 месяцев
Благодарил (а): 223 раза
Поблагодарили: 3517 раз
Контактная информация:

Re: Как закрыть тему для гостей

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

pantheonptz, да, по логике всё так
(Технические моменты остались, $sql_array получить и возвратить, и т.д.)
Аватара пользователя
pantheonptz
phpBB 1.2.0
Сообщения: 13
Стаж: 6 лет 5 месяцев
Благодарил (а): 1 раз

Re: Как закрыть тему для гостей

Сообщение pantheonptz »

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

Re: Как закрыть тему для гостей

Сообщение Sheer »

В перехватчике

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

// получаем из viewtopic
$sql_array = $event['sql_array'];
// тут какой-то код, именяющий запрос, то бишь массив $sql_array
// возвращаем измененный обратно во viewtopic
 $event['sql_array'] = $sql_array;
Отправлено спустя 1 минуту 34 секунды:
pantheonptz, кроме bb-кода [icode] есть код [code] с подсветкой синтаксиса кода

Отправлено спустя 1 минуту 9 секунд:
+
Создание страниц в стиле конференции
Изображение
Общие ошибки новичков (07.11.2005) & Как задавать вопросы
Мини FAQ
Если ничто другое не помогает, прочтите, наконец, инструкцию!
"Никакая инструкция не может перечислить всех обязанностей должностного лица, предусмотреть все отдельные случаи и дать вперёд соответствующие указания, а поэтому господа инженеры должны проявить инициативу и, руководствуясь знаниями своей специальности и пользой дела, принять все усилия для оправдания своего назначения".
Циркуляр Морского технического комитета №15 от 29.11.1910 г.
Аватара пользователя
pantheonptz
phpBB 1.2.0
Сообщения: 13
Стаж: 6 лет 5 месяцев
Благодарил (а): 1 раз

Re: Как закрыть тему для гостей

Сообщение pantheonptz »

Вставил в событие следующий код

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

if (!$user->data['is_registered'])
{
	$sql_array = $event['sql_array'];
	$sql_array['WHERE'] .= ' AND t.topic <> 49 ';
	// пробовал и просто присваивание $sql_array['WHERE'] = 't.topic <> 49 '; ошибка та же
	$event['sql_array'] = $sql_array;
}
При обращении к форуму http://epagneulbreton-mooir.ru/forum/viewforum.php?f=13
выдает

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

[phpBB Debug] PHP Warning: in file [ROOT]/phpbb/db/driver/driver.php on line 719: Invalid argument supplied for foreach()

Общая ошибка
SQL ERROR [ mysql4 ]

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 'FROM () WHERE t.topic_id IN (49, 95, 98, 83, 94, 66, 61, 47, 38, 33, 17, 11)' at line 1 [1064]
Я так понял, что как то порчу запрос возвращающий данные о топиках. Как поправить?

Отправлено спустя 58 минут 19 секунд:
719 строчка из driver.php

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

foreach ($array['FROM'] as $table_name => $alias)
странно, что ошибку выдается здесь. Здесь же вроде обрабатывается массив данных FROM
Аватара пользователя
Татьяна5
Поддержка
Поддержка
Сообщения: 12372
Стаж: 12 лет 7 месяцев
Благодарил (а): 223 раза
Поблагодарили: 3517 раз
Контактная информация:

Re: Как закрыть тему для гостей

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

Поля topic в phpbb_topics нет
И попробовала поменять что-то в названном событии, результата никакого не получила, так что перекинула код в событие core.viewforum_get_topic_ids_data

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

if (!$this->user->data['is_registered'])
{
		$sql_ary = $event['sql_ary'];
		$sql_ary['WHERE'] .= ' AND t.topic_id <> 49';
		$event['sql_ary'] = $sql_ary;
}
pantheonptz писал(а): 29.10.2017 13:08$user
$this->user (и передать этот объект в расширение), иначе условие всегда будет срабатывать
Перенесено из форума Поддержка phpBB 3.2.x в форум Для авторов 29.10.2017 19:26 модератором rxu

Ответить

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