Forums / National / Russian / Тех. поддержка / Проблема с cot_pagenav

Kopusha
#1 2023-06-09 13:51

Проблема такая - если я обращаюсь к list в котором 10 элементов и разбиение постраничное по 3 элемента - у меня 4 страницы что логично
При этом /stories&d=2 выдает ошибку 404
/stories?d=2 ведет на верную вторую страницу списка с тремя записями
Но если в запросе есть еще параметры, например 
/stories&country=ita&region=0&d=2 именно с & ведет на верную вторую страницу списка с тремя записями
а /stories&country=ita&region=0?d=2 ведет на d=1, то есть на первую, то есть игнорирует d. Откуда в принципе береться катавасия с ? и &, хоть где начинать искать концы?
Пересмотрел функцию cot_pagenav - там такого нет, использую cot::$cfg['easypagenav'] и не использую $ajax_rel

Заранее спасибо хотя бы за направление куда рыть.

Added 3 hours later:

В общем вопрос можно перефразировать
Почему при имеющемся коде

list($pn, $d, $d_url) = cot_import_pagenav('d', $maxrowsperpage);
$list_url_path = array('c' => $c, 'sort' => $sort, 'sq' => $sq);
$pagenav = cot_pagenav('stories', $list_url_path, $d, $totalitems, $maxrowsperpage);

 

	"SEARCH_ACTION_URL" => cot_url('stories', '', '', true),
	"SEARCH_SQ" => cot_inputbox('text', 'sq', htmlspecialchars($sq), 'class="schstring"'),
	"SEARCH_CAT" => cot_stories_selectcat($c, 'c'),
	"SEARCH_SORTER" => cot_selectbox($sort, "sort", array('', 'ratedesc', 'countdesc'), array($L['stories_mostrelevant'], $L['stories_ratedesc'], $L['stories_countdesc']), false),

Пагинация $pagenav без параметров 'c' => $c, 'sort' => $sort, 'sq' => $sq, 'ec' => $ec или других параметров выглядит как /stories?d=2

Если выбрать категорию не через поиск то получается такая ссылка /stories/nature?d=2

Если использовать поиск (SEARCH_ACTION_URL) и там выбрать категорию то такая ссылка /stories/nature?d=2

То есть при любом экстрапараметре (sort sq c и тд) переменная D со знаком & как /stories/nature?sort=ratedesc&d=2 и это работает, при этом /stories/nature?sort=ratedesc?d=2 уже нет
Мне это очень мешает в плане бесконечной пагинации на js. В идеале хотелось бы привести все к &d=2, видимо я не совсем верно понимаю передачу в урл всех параметров. 

 

Добавлено 6 часов спустя:

Ну вроде как разобрался, не без помощи добрых людей.

https://www.example.com/page?param1=value1&param2=value2&param3=value3

Параметры запроса в URL-адресе обычно указываются после вопросительного знака "?" и разделяются между собой символом амперсанда "&".
 

Решил вопрос костылем, просто всегда передаю лишний фальшивый параметр ec=0, и вместо /stories?d=3 получаю /stories?ec=0&d=3, что меня устраивает

This post was edited by Kopusha (2023-06-10 00:05, 10 months ago)
Dayver
#2 2023-06-10 03:04

Судя по всему есть проблема либо с ЧПУ пресетом либо с подготовкой параметров урла потому что при стандартных условиях пободный баг 

#46887 Kopusha:

/stories&country=ita&region=0&d=2

 еще не встречался ни у кого. И входных данных недостаточно что бы понять где он может быть. Потому для того что бы поиск причины был проведём небольшой ликбез (сейчас пригодится тут и возможно когда-то скопируется в каталог документации раздела Уроки).

 

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

  1.  Первоначально без активации ЧПУ механизм таков:

    Есть сервер, а в нём корневой (для работы сайта) каталог. Допусти вы в браузере запрешиваете адрес http(s)://имя_сайта.ком Для того что бы среагировать на такой запрос сервер проверит есть ли в корневом каталоге файл с именем index.html ... если есть то выдаст в ответ на такой запрос содержимое этого файла. Если на сервере установлен php то скорее всего сервер будет еще настроен таким образом что если файла index.html нету то следует проверить так же наличие файла index.php и если таковой имеется то запустится обработчик той программы которая заложена в этом самом файле результат которой должен будет выдан в качестве ответа на запрос. Если браузер запросит уже более конкретно урл http(s)://имя_сайта.ком/index.php то очевидно произойдёт тот же вызов программы описанной в этом файле.

     

    Двигаемся дальше. Допускаю что очевидно что если в корневом каталоге есть подпапка с именем doc, а в ней содержится файл index.php то обращаясь по урлу http(s)://имя_сайта.ком/doc/ (или без слеша в конце - уже зависит от настроек сервера) или http(s)://имя_сайта.ком/doc/index.php произойдёт вызов программы из файла корневой_каталог/doc/index.php (тут иллюстрируется работа вложенных каталогов).

     

    Так же очевидно должно быть то что если обращатся по адресу http(s)://имя_сайта.ком или http(s)://имя_сайта.ком/doc/ но в соответствующих каталогах нет индексного файла (ни html ни php) то сервер выдаст ошибку. Даже если в каталоге будут другие файлы например script.php то все равно ошибка будет потому что индексный файл на то и именуется таким стандартным образом что бы обеспечить работу как при вызове по короткому урлу http(s)://имя_сайта.ком так и по полному http(s)://имя_сайта.ком/index.php (тут поясняем что такое индексный файл). Так же очевидно что обратившись по адресу http(s)://имя_сайта.ком/script.php сервер проверит наличие в корневом каталоге файла script.php и если он есть то выдаст результат работы программы описанной в этом файле а если не найдёт его то выдаст ошибку.

     

    Двигаемся дальше. Как те или иные скрипты могут быть запрошены разобрались. Но что бы один и тот же срипт мог работать немного (ну или намного) иначе то нужно как то передать ему один или больше параметров в зависимости от значений которых уже скрипт будет работать по разному. Так вот что бы передать в урле такие параметры скрипту мы должны после адреса скрипта поставить знак ? что для сервера и будет означать что в урле часть отвечающая за адресс закончилась и началась область передачи параметров. Примеры:

     

    1) http(s)://имя_сайта.ком/?имя_параметра=значение_параметра
    2) http(s)://имя_сайта.ком/index.php?имя_параметра1=значение_параметра1&имя_параметра2=значение_параметра2
    3) http(s)://имя_сайта.ком/script.php?имя_параметра1=значение_параметра1&имя_параметра2=значение_параметра2
    4) http(s)://имя_сайта.ком/doc/?имя_параметра=значение_параметра
    5) http(s)://имя_сайта.ком/doc/index.php?имя_параметра=
    6) http(s)://имя_сайта.ком/doc/script.php?имя_параметра1=&имя_параметра2=значение_параметра2

    И пояснения к ним

     Как передать параметры через урл скрипту разобрались но забыли упомянуть что для того что бы воспользоваться полученными параметрами внутри программы нам нужно использовать суперглобальную переменную-массив $_GET в которую php поместит переданные в урле имена параметров и их значения

    • все примеры показывают что область определения параметров в урле начинается сразу после знака ?
    • примеры 1 и 4 иллюстрируют что в урле можно опустить имя скрипта и тогда по умолчанию будет обращение к индексному файлу
    • примеры 2 и 3 иллюстрируют что в области урла отвечающей за передаваемые параметры можно размещать не один а больше параметров и для этого пары из ключ=значение нужно разделять символом &
    • примеры 5 и 6 иллюстрируют что при передачи параметров их значения могут быть пусты
  2. Теперь поверхностно разберёмся с тем если мы используем ЧПУ

    На сервере как правило есть специальный модуль (mod_rewrite) который позволяет оперировать урлами до того как передать вызов к php. Он позволяет так сказать предварительно обработать вызываемый адрес прежде чем он передастся обработчику. Этот модуль может как совершать некие проверки с адресом так и преобразовывать его чем обычно и пользуются для того что бы превратить некрасивые длинные урлы в ЧеловекоПонятные Урлы. Так вот если прописать правила обработки то можно добится что:

    • обращая к урлу http(s)://имя_сайта.ком/mainpage будет вызван файл http(s)://имя_сайта.ком/index.php
    • или например вот обращаясь вот так http(s)://имя_сайта.ком/main-page-2 на самом деле будет вызов произойдёт вот так http(s)://имя_сайта.ком/index.php?stranica=2

    Правила обработки как правило находятся в файле .htaccess расположенный в той категории к которой идёт обращение. Но нужно понимать что этот файл и настройки в нем отвечают за то что бы ЧПУ ссылки корректно расшифровывались сервером и вызовы совершались согласно этим настройкам. Но за формирование самих ссылок в закодированном виде уже исключительно отвечает движок и расширения которые используется в нём.

    В дефолтном варианте режим ЧПУ не используется потому движок формирует ссылки только формата http(s)://имя_сайта.ком/index.php?stranica=2 А что бы задейстовать ЧПУ режим тоесть сформировать эти правила расшифровки для .htaccess и правила кодировки генерируемых сайтом ссылок в движке есть плагин URL Editor. Тоесть движок и названный плагин сперва кодирует ссылку из технического вида http(s)://имя_сайта.ком/index.php?stranica=2 в формат http(s)://имя_сайта.ком/main-page-2 помещает её в генерируемые страницы, а уже когда посетитель кликает по этой ссылке то при запросе серверный модуль раскодирует её из ЧПУ формата и вызовы к скриптам совершает в техническом. Это важно для понимания того что за формирование ссылок отвечает только движок и скрипты а расшифровку отвечает серверный модуль mod_rewrite который конфигурируется в  .htaccess

     

    Так же стоит упомянуть что имеющиеся правила как для кодирования ссылок движком так и правила раскодирования урлов сервером могут не полностью предусматривать всех вариаций урлов потому на выходе могут получатся вот такие частично ЧПУзированные ссылки http(s)://имя_сайта.ком/main-page-2?sort=asc которые на самом деле  в расшифрованном варианте являются такими http(s)://имя_сайта.ком/index.php?stranica=2&sort=asc тоесть хоть он частично и закодирован до вида ЧПУ но из-за неполноты настроек не все ссылки движок будет генерировать в красивом формате и чем больше в ссылке параметров тем сложнее нужны правила для кодирования и их расшифровки.

А теперь после краткого ликбеза к вопросу поиска причины проблемы подходим с пониманием что все ваши ссылки вида

/stories&d=2

/stories&country=ita&region=0&d=2

/stories&country=ita&region=0?d=2

являются не корректными (проблемные места подчеркнул) и в обычных условиях движок таких ссылок не сгенерирует, а при обращении по ним сервер не сможет их предварительно корректно раскодировать.и значит вызвать правильные скрипты по правильным адресам с правильными параметрами.

Корректные ссылки выглядели бы так

/stories?d=2

/stories?country=ita&region=0&d=2

/stories?country=ita&region=0&d=2

(проблемные места исправлены и подчёркнуты). 

А вот решение вопроса почему ссылки формируются не правильными уже осложняется тем что скорее всего ваш движок вероятно модифицирован или же используются не стандартные плагины или и то и другое. Но конечно же исправить это можно но тут уже вам следует пойти по цепочке формирования неправильной ссылки, найти то место где происходит сбой и почему. Посмотреть какой набор параметров получает функция cot_url результат которой оказался невалидным. Возможно на формирование параметров влияют каки либо плагины. Вообщем индивидуальных к вашей задаче вопросов много и не зная ответов на них исправить проблему увы пока нельзя. Потому начните посик с того какой набор параметров получает функция cot_url результат который если не поддается дополнительным обработкам попадает в разметку ваших страниц

Добавлено 1 минута спустя:

Мда визуальный редактор и тутошние стили плохо справился с разметкой текста

Pavlo Tkachenko aka Dayver