Как SMF обрабатывает адресную строку?

Автор Kira, 04 марта 2018, 01:50:52

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

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

Kira

Товарищи, расскажите пожалуйста, как SMF обрабатывает адресную строку.

Например, я дописываю в ней "index.php?topic=100.msg100#msg100", нажимаю ентер и что происходит?
Так понимаю, где-то в index.php есть функция, которая разбирает URL по частям, передаёт в display.php этот хвост, там формируется содержимое страницы, и передаётся в display.template.php, чтобы вывести его на экран, правильно? Интересны подробности. Какие функции при этом работают, какие параметры передаются, кто такой $scripturl, имеет ли $linktree какое-нибудь другое применение, кроме как вывод строчки под главным меню?

И наоборот. Например, я сделал страничку с адресом ..?action=myaction, загрузил не неё скриптами что-нибудь из своей таблицы в базе. Как сделать, чтобы в  адресной строке появилось ..?action=myaction;myid=100?

GeorG

Цитата: Kira от 04 марта 2018, 01:50:52Так понимаю, где-то в index.php есть функция, которая разбирает URL по частям, передаёт в display.php этот хвост
Да, и если бы вы прошлись поиском по файлу то скорее всего бы нашли этот хвост.
Вот эта строчка в массиве $actionArray:
'display' => array('Display.php', 'Display'),А далее уже функция Display() в файле Display.php, и в ней подключение шаблона Display.template.php:
loadTemplate('Display');Линктрей формируется по многим функциям (не в какой-то одной), в том числе и функции Display.

Цитата: Kira от 04 марта 2018, 01:50:52кто такой $scripturl
Глобальная переменная, заданная в файле QueryString.php
$scripturl = $boardurl . '/index.php';А переменная $boardurl прописывается в файле Settings.php во время установки форума.

Вообще, поиск по файлам рулит ;)

Цитата: Kira от 04 марта 2018, 01:50:52сделал страничку с адресом ..?action=myaction, загрузил не неё скриптами что-нибудь из своей таблицы в базе. Как сделать, чтобы в  адресной строке появилось ..?action=myaction;myid=100?
Опять же формируется в функциях, с постраничной навигацией, взаимодействие с шаблоном через _GET параметры (вот это что в примере после точки с запятой, и есть GET параметры страницы).
Верстка тем по шаблону, их доработка/переработка, переделка тем с версии smf 1.1 на smf 2.0. Примеры работ - insidestyle.ru
Установка модов (заточка под ваш форум); Моды под заказ; Обновление форума; Правильный перенос; Удаление/лечение вирусов; Устранения ошибок.
Обращаться в ЛС
Мой форум
Модуль анти-спама CleanTalk, сам пользуюсь
Сервера которыми сам пользуюсь - cadedic.ru

Kira

Спасибо.
Я только осваиваю php, опыта ноль, извиняюсь за тупость.

1. То есть там особого механизма нет? Хвостики ссылок прописываются в текстовом виде в ссылках везде, где только можно (?topic=* в списке тем, ?аction=profile;u=* в списке пользователей и т.д.), а соответствующие функции берут их через _GET из адресной строки при переходе по этим ссылкам?

2. Добавить хвостик в адресную строку без перезагрузки страницы невозможно?

3. Правильно ли такое решение? В адресную строку добавить хвостик таким способом echo "<meta http-equiv='Refresh' content='0; URL=index.php?action=myaction;myid=100'>";а потом обработать её в файле myaction.php через if($_GET[myid]==100).

ЦитироватьЛинктрей формируется по многим функциям (не в какой-то одной), в том числе и функции Display.
Это как раз понятно. Вопрос, есть ли у неё какая другая задача кроме вывода строчки под главным меню?

iaroslav

Цитата: Kira от 04 марта 2018, 09:57:452. Добавить хвостик в адресную строку без перезагрузки страницы невозможно?
Очень даже возможно. Но с помощью яваскрипта.
Например, нижеприведённая функция при вызове её со страницы допишет вам к адресной строке &123
var __GET = window.location.search;
history.pushState({},{},__GET+"&123");

Работать, правда, только в новых браузерах будет.

И именно допишет - ничего не вызывая и не перезагружая страницу.

Соотвественно для ситуации из вашего первого сообщения
Цитата: Kira от 04 марта 2018, 01:50:52И наоборот. Например, я сделал страничку с адресом ..?action=myaction, загрузил не неё скриптами что-нибудь из своей таблицы в базе. Как сделать, чтобы в  адресной строке появилось ..?action=myaction;myid=100?
Код для добавления на страницу будет выглядеть вот так
<script>
var __GET = window.location.search;
history.pushState({},{},__GET+";myid=100");
</script>

Kira

 O0
Спасибо! Работает отлично, но для моих целей не очень подходит. Есть несколько вкладок, содержимое каждой грузится из другого файла аяксом при её открытии и в window. внезапно отсутствует. Передать в адр. стоку результат выполнения кода в этом содержимом пока не получается. Буду думать дальше..  :)

iaroslav

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

Другое дело, что сам аякс вполне может передавать переменные. Почему бы вам просто не передавать их через него? А саму переменную привязывать к сессии пользователя на форуме (через массив $_SESSION в php), таки образом добившись, что она будет одной и той же независимо от количества открытых окон.

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

Kira

Не, я имел в виду вкладки меню на странице, а не вкладки браузера.

Полукнопки-полувкладки сделаны по такому принципу. http://dbmast.ru/files/demo/adaptivnye-taby-css.html

<input id="tab1" type="radio" name="tabs" checked onClick="showContent(\'tab1.php\')">
            <label for="tab2">таб1</label>
            <input id="tab2" type="radio" name="tabs" onClick="showContent(\'tab2.php\')">
            <label for="tab2">таб2</label>
            <input id="tab3" type="radio" name="tabs" onClick="showContent(\'tab3.php\')">
            <label for="tab3">таб3</label>
            <input id="tab4" type="radio" name="tabs" onClick="showContent(\'tab4.php\')">
            <label for="tab4">таб4</label>
           
Содержимое выводится так:<div id="content">
<!-- CONTENT -->
</div>
    <div id="loading" style="display: none">
Идет загрузка...
    </div>
через эту функцию <script>
    function showContent(link) {
        var cont = document.getElementById('content');
        var loading = document.getElementById('loading');
        cont.innerHTML = loading.innerHTML;   
        var http = createRequestObject();
        if( http ) 
        { http.open('get', link);
            http.onreadystatechange = function () 
            {   if(http.readyState == 4) 
                {   cont.innerHTML = http.responseText;  }    }
            http.send(null);  }
        else 
        {  document.location = link;   }   }
    // ajax объект
    function createRequestObject() 
    {  try { return new XMLHttpRequest() }
        catch(e) 
        {  try { return new ActiveXObject('Msxml2.XMLHTTP') }
            catch(e) 
            {   try { return new ActiveXObject('Microsoft.XMLHTTP') }
                catch(e) { return null; }   } } }
</script>
И, если я пишу подсказанное вами в файлах tab*.php , оно не работает, и вообще вывод из этих файлов отсутствует в коде документа (клик правой кнопкой - Просмотр кода станицы), хотя присутствует на странице.

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

GeorG

#7
Цитата: Kira от 04 марта 2018, 09:57:45То есть там особого механизма нет? Хвостики ссылок прописываются в текстовом виде в ссылках везде, где только можно (?topic=* в списке тем, ?аction=profile;u=* в списке пользователей и т.д.), а соответствующие функции берут их через _GET из адресной строки при переходе по этим ссылкам?
Не совсем понимаю, про какие именно "хвостики" в данном контексте речь, но механизм там есть, и вручную get параметры обычно не прописываются. Вернее они прописываются, но не то чему они равны (это информация обычно читается из БД).

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

Цитата: Kira от 04 марта 2018, 09:57:452. Добавить хвостик в адресную строку без перезагрузки страницы невозможно?
Опять хвостики... Для этого используются ajax запросы, с помощью них можно подгружать контент, не перезагружаю саму страницу.


Цитата: Kira от 04 марта 2018, 09:57:45Правильно ли такое решение
Непонятен сам смысл данного действа. С помощью GET и POST формируются запросы с параметрами которые обрабатывает сервер (что именно предпочтительно, это другой вопрос), а тут получается что сам сервер передал то, что уже должен был обработать (чё он сразу то не обработал)?

Цитата: Kira от 04 марта 2018, 09:57:45Вопрос, есть ли у неё какая другая задача кроме вывода строчки под главным меню?
Я как навигацию использую, для перехода по разделам из темы, ещё это вроде как используется поисковиками, для составлении карты сайта.

Цитата: Kira от 07 марта 2018, 05:25:28И, если я пишу подсказанное вами в файлах tab*.php , оно не работает
А зачем там это писать? Там (в файлах php) уже должна быть обработка того, чего вам надо выводить на этих вкладках. Т.е., пишите непосредственно функции которые обращаются к БД, берут из неё нужную вам информацию и передают в шаблон.
Верстка тем по шаблону, их доработка/переработка, переделка тем с версии smf 1.1 на smf 2.0. Примеры работ - insidestyle.ru
Установка модов (заточка под ваш форум); Моды под заказ; Обновление форума; Правильный перенос; Удаление/лечение вирусов; Устранения ошибок.
Обращаться в ЛС
Мой форум
Модуль анти-спама CleanTalk, сам пользуюсь
Сервера которыми сам пользуюсь - cadedic.ru

iaroslav

Цитата: Kira от 07 марта 2018, 05:25:28Не, я имел в виду вкладки меню на странице, а не вкладки браузера.
Если что-то на одной странице, то для передачи каких-то переменных можете использовать простые переменные яваскрипта. В смысле вот так вот.
<script>
var my_var = "какая-то переменная";
</script>
И незачем лишний раз менять адресную строку.
Цитата: Kira от 07 марта 2018, 05:25:28И, если я пишу подсказанное вами в файлах tab*.php , оно не работает, и вообще вывод из этих файлов отсутствует в коде документа (клик правой кнопкой - Просмотр кода станицы), хотя присутствует на странице.
Если в том файле есть только оный код скрипта, то помимо тега <script>, вроде как, надо использовать ещё и прочие обязательные теги.
То есть писать вот так вот.
<html>
<head></head>
<body>
<script>
var __GET = window.location.search;
history.pushState({},{},__GET+";myid=100");
</script>
</body>
</html>
Хотя тут могу и ошибаться - давно такое делал и точно не помню как именно надо аджаксом запускать яваскрипты.