Улучшение навигации просмотра тем

Автор Slavegirl, 18 ноября 2013, 19:48:19

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Slavegirl

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

Некоторое время назад у меня появилось желание немного улучшить юзабилити при навигации по страницам открытой темы и предыдущим / следующим темам (для широкоформатных дисплеев). Идея навеяна подобной функцией в Одноклассниках при просмотре фотографий, где реализована возможность их листать влево / вправо (на скриншоте ниже можно увидеть большие серые кнопки со стрелками). Кнопки будут выводиться с помощью javascript, для "узких" разрешений экрана они будут скрыты.

Хочу реализовать следующий алгоритм:

Кнопка вправо

1. Мы находимся на первой странице какой-нибудь темы, нажимаем кнопку "Вправо" и попадаем на следующую страницу этой же темы.
2. Когда мы дошли до последней страницы темы, кнопка "Вправо" нам открывает первую страницу следующей (более старой) темы в разделе, по аналогии со ссылкой: http://forum.com/board/current-topic/?prev_next=next.
3. Когда мы дошли до последней страницы самой старой темы, кнопка "Вправо" нам открывает первую страницу самой новой темы в разделе. И далее по кругу.

Кнопка влево

1. Мы находимся, например, на третьей странице темы, нажатие на кнопку "Влево" будет листать нам страницы текущей темы в обратном порядке, пока мы не дойдем до первой страницы.
2. Когда мы дошли до первой страницы темы, после нажатия на кнопку "Влево" нам отрывается последняя страница предыдущей (более новой) темы в разделе, по аналогии со ссылкой: http://forum.com/board/current-topic/?prev_next=prev.
3. После того, как будет достигнута первая страница самой новой темы в разделе, кнопка "Влево" нам открывает последнюю страницу самой старой темы. И далее по кругу.

Проблем с выводом самих кнопок у меня нет. Есть проблема с получением ссылок, которые к этим кнопкам нужно подключить. А именно, я не знаю, как в текущей теме узнать, что мы сейчас находимся на первой или последней странице. Также я не знаю, как получить ссылку на последнюю страницу предыдущей темы. Кроме этого после нажатия на кнопки, нас не должно перенаправлять к последнему непрочитанному ответу (с меткой #), который может находиться где-нибудь в середине или внизу страницы. Навигационные кнопки должны всегда открывать нам страницы с самого начала.

Прошу у Вас помощи реализовать данный функционал, а именно помочь мне в нахождении ссылок для навигации. Искать решение, насколько я понимаю, нужно в файлах /Sources/Display.php и /Themes/Current-theme/Display.template.php.

После подключения кнопок навигации обязуюсь выложить в этой теме окончательный рабочий вариант вместе с графическим оформлением и javascript-кодом.

С уважением,
Slavegirl

GeorG

Цитата: Slavegirl от 18 ноября 2013, 19:48:19Есть проблема с получением ссылок, которые к этим кнопкам нужно подключить. А именно, я не знаю, как в текущей теме узнать, что мы сейчас находимся на первой или последней странице.
Взять код который генерирует странницы и с ним уже играться.
Верстка тем по шаблону, их доработка/переработка, переделка тем с версии smf 1.1 на smf 2.0. Примеры работ - insidestyle.ru
Установка модов (заточка под ваш форум); Моды под заказ; Обновление форума; Правильный перенос; Удаление/лечение вирусов; Устранения ошибок.
Обращаться в ЛС
Мой форум
Модуль анти-спама CleanTalk, сам пользуюсь
Сервера которыми сам пользуюсь - cadedic.ru

Slavegirl

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

Код для ссылок получился следующим:

Display.php

// Content navigation links.
$current_topic_url = $scripturl . '?topic=' . $topic . '.0';
$is_single_page = $context['page_info']['num_pages'] == 1 || (isset($_REQUEST['all']) && $can_show_all);
$is_single_topic = $board_info['num_topics'] == 1;

$context['content_navigation_links'] = array(
'prev' => '<a id="toPrev" href="' . (!$is_single_page || !$is_single_topic ? ($context['page_info']['current_page'] > 1 ? $context['links']['prev'] : ($is_single_topic ? $context['links']['last'] : $current_topic_url . ';prev_next=prev')) : $current_topic_url) . '"' . ($is_single_page && $is_single_topic ? ' onclick="return false;"' : '') . '><span style="display: none;">' . $txt['previous_page'] . '</span></a>',
'next' => '<a id="toNext" href="' . (!$is_single_page || !$is_single_topic ? ($context['page_info']['current_page'] < $context['page_info']['num_pages'] && !$is_single_page ? $context['links']['next'] : $current_topic_url . (!$is_single_topic ? ';prev_next=next' : '')) : $current_topic_url) . '"' . ($is_single_page && $is_single_topic ? ' onclick="return false;"' : '') . '><span style="display: none;">' . $txt['next_page'] . '</span></a>',
);


Параллельно обнаружила один незначительный баг в движке при создании нумерации страниц, и даже удалось его исправить.

После добавления кнопок показатель отказов уменьшился на 3%. Осталось добавить такую же навигацию при выводе результатов поиска, последних тем, списка сообщений/тем конкретного пользователя и личных сообщениях. То есть везде, где отображается контент.

GeorG

Модификация полезна, так что можно завернуть всё это в мод, и на официальный сайт :)
Верстка тем по шаблону, их доработка/переработка, переделка тем с версии smf 1.1 на smf 2.0. Примеры работ - insidestyle.ru
Установка модов (заточка под ваш форум); Моды под заказ; Обновление форума; Правильный перенос; Удаление/лечение вирусов; Устранения ошибок.
Обращаться в ЛС
Мой форум
Модуль анти-спама CleanTalk, сам пользуюсь
Сервера которыми сам пользуюсь - cadedic.ru

Slavegirl

К сожалению, модификации писать не умею... Способна только редактировать уже готовые :)

Yworld_garry


kak2z

#6
Цитата: Yworld_garry от 26 ноября 2013, 04:27:59
Господи, мне бы жену такую angel

я про это еще раньше думал)) так что чур моя))  :D

П.С. А теперь по делу)) Спасибо что поделились)) но не совсем понял куда этот хак добавлять надо..
П.П.С. Вижу что в Display.php - но куда именно не нашел)
Если нужно что то исправить, обновить, переставить, настроить, сделать форум заново - пишите в ЛС)

valek0972

Цитата: kak2z от 26 ноября 2013, 10:11:50но не совсем понял куда этот хак добавлять надо..
Может все таки кто нибудь соорудит мод, было бы здорово.

Slavegirl

kak2z, это только небольшая часть кода, определяющая ссылки для кнопок (добавлять нужно перед строкой "// Build the link tree."). Есть еще код, который сами кнопки рисует, CSS-стили для них, javascript, который их выводит и скрывает (если изменяется размер окна).

kak2z

Цитата: Slavegirl от 26 ноября 2013, 18:52:33
kak2z, это только небольшая часть кода, определяющая ссылки для кнопок (добавлять нужно перед строкой "// Build the link tree."). Есть еще код, который сами кнопки рисует, CSS-стили для них, javascript, который их выводит и скрывает (если изменяется размер окна).

я увидел что он добавляет ссылки в context)) просто у меня массив пустой оказывается в display.template.php и добавлял я его почти туда куда Вы только что сказали)

сейчас у Вас гляну на форуме)

UPD: Увидел)) красиво)) зачет))
Если нужно что то исправить, обновить, переставить, настроить, сделать форум заново - пишите в ЛС)

GeorG

Цитата: kak2z от 26 ноября 2013, 19:04:02сейчас у Вас гляну на форуме)
Ага, тоже понравилось...

Цитата: Slavegirl от 26 ноября 2013, 18:52:33kak2z, это только небольшая часть кода, определяющая ссылки для кнопок (добавлять нужно перед строкой "// Build the link tree."). Есть еще код, который сами кнопки рисует, CSS-стили для них, javascript, который их выводит и скрывает (если изменяется размер окна).
Можно просто выложить блоки кода и перед чем их ставить (или что заменять), а там глядишь найдётся человек со свободным временем и оформит всё в мод :)
Верстка тем по шаблону, их доработка/переработка, переделка тем с версии smf 1.1 на smf 2.0. Примеры работ - insidestyle.ru
Установка модов (заточка под ваш форум); Моды под заказ; Обновление форума; Правильный перенос; Удаление/лечение вирусов; Устранения ошибок.
Обращаться в ЛС
Мой форум
Модуль анти-спама CleanTalk, сам пользуюсь
Сервера которыми сам пользуюсь - cadedic.ru

Slavegirl

#11
Код по выводу всех плавающих кнопок на форуме я решила добавить в шаблон модификации от Bugo "Scrolling Buttons", так как там уже использовалась вставка с JQuery, и мне показалось это самым удобным вариантом (файл прикреплен ниже). В верхней части файла еще присутствуют временные переменные, так как навигационные кнопки еще находятся на стадии добавления в другие части форума. Но знающий человек разберется что к чему. CSS-файл и изображения кнопок также прикреплены внизу сообщения.

При определении ссылок для кнопок "Вперед" - "Назад" в других частях форума (кроме отображения сообщений темы) в основном используется следующий код (нужна индивидуальная "подгонка" под каждую задачу):


// Now that we know how many results to expect we can start calculating the page numbers.
$context['page_index'] = constructPageIndex($scripturl . '?action=search2;params=' . $context['params'], $_REQUEST['start'], $num_results, $modSettings['search_results_per_page'], false);

// This is information about which page is current, and which page we're on - in case you don't like the constructed page index. (again, wireless..)
$context['page_info'] = array(
'current_page' => $_REQUEST['start'] / $modSettings['search_results_per_page'] + 1,
'num_pages' => floor(($num_results - 1) / $modSettings['search_results_per_page']) + 1,
);

// Figure out all the link to the next/prev/first/last/etc. for wireless mainly.
$context['links'] = array(
'first' => $_REQUEST['start'] >= $modSettings['search_results_per_page'] ? $scripturl . '?action=search2;params=' . $context['params'] . ';start=0' : '',
'prev' => $_REQUEST['start'] >= $modSettings['search_results_per_page'] ? $scripturl . '?action=search2;params=' . $context['params'] . ';start=' . ($_REQUEST['start'] - $modSettings['search_results_per_page']) : '',
'next' => $_REQUEST['start'] + $modSettings['search_results_per_page'] < $num_results ? $scripturl . '?action=search2;params=' . $context['params'] . ';start=' . ($_REQUEST['start'] + $modSettings['search_results_per_page']) : '',
'last' => $_REQUEST['start'] + $modSettings['search_results_per_page'] < $num_results ? $scripturl . '?action=search2;params=' . $context['params'] . ';start=' . (floor($num_results / $modSettings['search_results_per_page']) * $modSettings['search_results_per_page']) : '',
'up' => $scripturl,
);

// Content navigation links.
$first_page_url = $scripturl . '?action=search2;params=' . $context['params'];
$is_single_page = $context['page_info']['num_pages'] == 1;

$context['content_navigation_links'] = array(
'prev' => '<a id="toPrev" href="' . (!$is_single_page ? ($context['page_info']['current_page'] > 1 ? $context['links']['prev'] : $context['links']['last']) : $first_page_url) . '"' . ($is_single_page ? ' onclick="return false;"' : '') . '><span style="display: none;">' . $txt['previous_page'] . '</span></a>',
'next' => '<a id="toNext" href="' . (!$is_single_page ? ($context['page_info']['current_page'] < $context['page_info']['num_pages'] ? $context['links']['next'] : $context['links']['first']) : $first_page_url) . '"' . ($is_single_page ? ' onclick="return false;"' : '') . '><span style="display: none;">' . $txt['next_page'] . '</span></a>',
);


Данный код обычно можно вставлять после создания нумерации страниц функцией constructPageIndex(). В принципе, при большом желании, дополнительные стрелки "Вперед" - "Назад" можно добавить абсолютно на все страницы форума, где используется нумерация, например, выполнив доработку функции constructPageIndex(). Но я как увидела, сколько исключений нужно учесть только при отображении текущей темы, что решила использовать эти кнопки всего лишь в определенных частях форума с контентом.

Quesabe

Очень интересный мод получился. Однозначно надо запаковать и предоставить народу.
Я не силён к сожалению, но вот вроде софтину нашёл - http://sourceforge.net/projects/smfmc/
Кто знает логику и принцип действий модуля может попробовать запаковать. ПО Java кстати.