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

-
- phpBB 1.2.0
- Сообщения: 13
- Стаж: 7 лет 6 месяцев
- Благодарил (а): 1 раз
Как закрыть тему для гостей
Настройки прав доступа позволяют закрыть форум целиком. Как закрыть отдельную тему для незарегистрированных пользователей? Я так понял нужно править или шаблон или viewforum.php
-
- Поддержка
- Сообщения: 12752
- Стаж: 13 лет 8 месяцев
- Благодарил (а): 159 раз
- Поблагодарили: 2276 раз
Re: Как закрыть тему для гостей
В 3.2 не правят код движка, в 3.2 пишут расширения
Исключить тему для показа можно да, из событий в viewforum.php
Отправлено спустя 6 минут 27 секунд:
Можно вклиниться в событие
Отправлено спустя 1 минуту 9 секунд:
Плюс в
Исключить тему для показа можно да, из событий в viewforum.php
Отправлено спустя 6 минут 27 секунд:
Можно вклиниться в событие
core.viewforum_get_topic_data
и изменить там sql-запрос для гостей (добавить WHERE). Проверка зарегистрирован ли пользователь - $user->data['is_registered']
Отправлено спустя 1 минуту 9 секунд:
Плюс в
viewtopic.php
надо добавить проверку (также через расширение), чтобы гость не мог получить доступ по прямой ссылке-
- phpBB 1.2.0
- Сообщения: 13
- Стаж: 7 лет 6 месяцев
- Благодарил (а): 1 раз
Re: Как закрыть тему для гостей
Тогда может подскажете есть ли какая либо документация? Интересно почитать как устроена система.
Отправлено спустя 10 минут 13 секунд:
Вот это событие из viewforum.php
Зная название темы, как предотвратить её вывод для гостей?
Отправлено спустя 3 минуты 8 секунд:
Мои скудные познания в php не позволяют охватить весь смысл происходящего. Я понял, что здесь формируется запрос к бд.
Отправлено спустя 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',
);
Мои скудные познания в php не позволяют охватить весь смысл происходящего. Я понял, что здесь формируется запрос к бд.
Последний раз редактировалось Sheer 28.10.2017 19:01, всего редактировалось 2 раза.
Причина: bb-код. Когда же вы наконец научтесь пользоваться bb-кодами!!!
Причина: bb-код. Когда же вы наконец научтесь пользоваться bb-кодами!!!
-
- Поддержка
- Сообщения: 12752
- Стаж: 13 лет 8 месяцев
- Благодарил (а): 159 раз
- Поблагодарили: 2276 раз
Re: Как закрыть тему для гостей
В целом описание расширений, которое ближе к практике - Расширения - это просто!
По базе данных - Таблицы БД phpBB3
Официальная документация по расширениям - https://area51.phpbb.com/docs/dev/3.1.x/index.html
А именно тут внутри расширения надо добавить
По базе данных - Таблицы БД phpBB3
Официальная документация по расширениям - https://area51.phpbb.com/docs/dev/3.1.x/index.html
А именно тут внутри расширения надо добавить
$sql_array['WHERE'] = 'тут условие';
(условие лучше всё-таки не по названию, а по id темы прописывать)-
- Former team member
- Сообщения: 12113
- Стаж: 18 лет 2 месяца
- Откуда: Калининград не Кенигсберг
- Благодарил (а): 36 раз
- Поблагодарили: 1526 раз
Re: Как закрыть тему для гостей
Общие ошибки новичков (07.11.2005) & Как задавать вопросы
Мини FAQ
Если ничто другое не помогает, прочтите, наконец, инструкцию!
"Никакая инструкция не может перечислить всех обязанностей должностного лица, предусмотреть все отдельные случаи и дать вперёд соответствующие указания, а поэтому господа инженеры должны проявить инициативу и, руководствуясь знаниями своей специальности и пользой дела, принять все усилия для оправдания своего назначения".
Циркуляр Морского технического комитета №15 от 29.11.1910 г.
-
- Поддержка
- Сообщения: 12752
- Стаж: 13 лет 8 месяцев
- Благодарил (а): 159 раз
- Поблагодарили: 2276 раз
Re: Как закрыть тему для гостей
pantheonptz,
Код в phpBB хорош тем, что читается просто по-английски, даже без знаний языка
результат = класс базы данных -> sql_запрос(класс базы данных->построить_sql_запрос('ВЫБОР', sql_массив))
То есть построить запрос выборки из массива, выполнить его, и результат записать в $result
Отправлено спустя 2 минуты 4 секунды:
Код в phpBB хорош тем, что читается просто по-английски, даже без знаний языка
$sql_array
- sql массив, массив с частями sql-запроса$result = $db->sql_query($db->sql_build_query('SELECT', $sql_array));
результат = класс базы данных -> sql_запрос(класс базы данных->построить_sql_запрос('ВЫБОР', sql_массив))
То есть построить запрос выборки из массива, выполнить его, и результат записать в $result
Отправлено спустя 2 минуты 4 секунды:
Ну уж не сказать. Сначала моды дорабатывать начала, а потом только разобралась на чём пишу-то...
-
- Former team member
- Сообщения: 12113
- Стаж: 18 лет 2 месяца
- Откуда: Калининград не Кенигсберг
- Благодарил (а): 36 раз
- Поблагодарили: 1526 раз
Re: Как закрыть тему для гостей
Мы все учились понемногу Чему-нибудь и как-нибудь
Но тут не все так просто, нужно ведь сначала пометить тему, что она будет недоступна для гостей. Это еще одно событие в posting.php и изменение структуры таблицы
Потом исключить ее и сообщения из этой темы из поиска для гостей. Для начинающего не подсилу.
Но тут не все так просто, нужно ведь сначала пометить тему, что она будет недоступна для гостей. Это еще одно событие в posting.php и изменение структуры таблицы
topics
Потом исключить ее и сообщения из этой темы из поиска для гостей. Для начинающего не подсилу.
Общие ошибки новичков (07.11.2005) & Как задавать вопросы
Мини FAQ
Если ничто другое не помогает, прочтите, наконец, инструкцию!
"Никакая инструкция не может перечислить всех обязанностей должностного лица, предусмотреть все отдельные случаи и дать вперёд соответствующие указания, а поэтому господа инженеры должны проявить инициативу и, руководствуясь знаниями своей специальности и пользой дела, принять все усилия для оправдания своего назначения".
Циркуляр Морского технического комитета №15 от 29.11.1910 г.
-
- Поддержка
- Сообщения: 12752
- Стаж: 13 лет 8 месяцев
- Благодарил (а): 159 раз
- Поблагодарили: 2276 раз
Re: Как закрыть тему для гостей
Для расширения для одного форума, и тем более в исполнении новичка, не надо. Достаточно дописать id существующей темы в запрос (на универсальность расширение не претендует)
Вот с поиском то да, уже отдельная задача
-
- phpBB 1.2.0
- Сообщения: 13
- Стаж: 7 лет 6 месяцев
- Благодарил (а): 1 раз
Re: Как закрыть тему для гостей
Добавить в расширение, что-то типа -
Если пользователь не зарегистрированный, то добавить условие id темы не равняется нужному?
Код: Выделить всё
if (!$user->data['is_registered'])
{
$sql_array['WHERE'] = 't.topic <> 49';
}
Последний раз редактировалось Sheer 28.10.2017 21:03, всего редактировалось 1 раз.
Причина: bb-код. Когда же вы наконец научтесь пользоваться bb-кодами!!!
Причина: bb-код. Когда же вы наконец научтесь пользоваться bb-кодами!!!
-
- Поддержка
- Сообщения: 12752
- Стаж: 13 лет 8 месяцев
- Благодарил (а): 159 раз
- Поблагодарили: 2276 раз
Re: Как закрыть тему для гостей
pantheonptz, да, по логике всё так
(Технические моменты остались,
(Технические моменты остались,
$sql_array
получить и возвратить, и т.д.)-
- phpBB 1.2.0
- Сообщения: 13
- Стаж: 7 лет 6 месяцев
- Благодарил (а): 1 раз
-
- Поддержка
- Сообщения: 12752
- Стаж: 13 лет 8 месяцев
- Благодарил (а): 159 раз
- Поблагодарили: 2276 раз
-
- Former team member
- Сообщения: 12113
- Стаж: 18 лет 2 месяца
- Откуда: Калининград не Кенигсберг
- Благодарил (а): 36 раз
- Поблагодарили: 1526 раз
Re: Как закрыть тему для гостей
В перехватчике
Отправлено спустя 1 минуту 34 секунды:
pantheonptz, кроме bb-кода
Отправлено спустя 1 минуту 9 секунд:
+
Создание страниц в стиле конференции
Код: Выделить всё
// получаем из viewtopic
$sql_array = $event['sql_array'];
// тут какой-то код, именяющий запрос, то бишь массив $sql_array
// возвращаем измененный обратно во viewtopic
$event['sql_array'] = $sql_array;
pantheonptz, кроме bb-кода
[icode]
есть код [code]
с подсветкой синтаксиса кодаОтправлено спустя 1 минуту 9 секунд:
+
Создание страниц в стиле конференции
Общие ошибки новичков (07.11.2005) & Как задавать вопросы
Мини FAQ
Если ничто другое не помогает, прочтите, наконец, инструкцию!
"Никакая инструкция не может перечислить всех обязанностей должностного лица, предусмотреть все отдельные случаи и дать вперёд соответствующие указания, а поэтому господа инженеры должны проявить инициативу и, руководствуясь знаниями своей специальности и пользой дела, принять все усилия для оправдания своего назначения".
Циркуляр Морского технического комитета №15 от 29.11.1910 г.
-
- phpBB 1.2.0
- Сообщения: 13
- Стаж: 7 лет 6 месяцев
- Благодарил (а): 1 раз
Re: Как закрыть тему для гостей
Вставил в событие следующий код
При обращении к форуму http://epagneulbreton-mooir.ru/forum/viewforum.php?f=13
выдает
Я так понял, что как то порчу запрос возвращающий данные о топиках. Как поправить?
Отправлено спустя 58 минут 19 секунд:
719 строчка из driver.php странно, что ошибку выдается здесь. Здесь же вроде обрабатывается массив данных FROM
Код: Выделить всё
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;
}
выдает
Код: Выделить всё
[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)
-
- Поддержка
- Сообщения: 12752
- Стаж: 13 лет 8 месяцев
- Благодарил (а): 159 раз
- Поблагодарили: 2276 раз
Re: Как закрыть тему для гостей
Поля
И попробовала поменять что-то в названном событии, результата никакого не получила, так что перекинула код в событие
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;
}
$this->user
(и передать этот объект в расширение), иначе условие всегда будет срабатывать