«phpClub» — архив тем ("тредов"), посвящённых изучению PHP и веб-технологий.
Аноним 2018/10/21 13:33:55  №1282306 1
>>1281608 (OP)
Подскажите пожалуйста, мб не туда смотрю, вроде был список сделанных списков студентов.
Я уже спрашивал, но нифига не понял как сделать много гет-параметров, хотел бы подсмотреть как другие люди решали мой вопрос.

Допустим я искал студента по фамилии Иванов и сейчас у меня в адресной строке: index.php?search=Иванов
И я хотел бы чтоб кнопка сортировки (например по баллам) тогда имела внутри ссылку на index.php?search=Иванов&sort_by=grades, а если ничего не искал то index.php?sort_by=grades.

Я в twig нашел как засунуть в href текущий url {{ app.request.query.all }}, но как туда добавлять что-то вообще не понимаю, и не гуглится нихрена, и документацию twig почитал нихрена не вижу, я может вообще не с той стороны подхожу?
Аноним 2018/10/21 18:42:30  №1282462 2
>>1282306
вырвать руки или ебать тебя в жопу.

сделай форму к странице, сохрани там все варианты
<form>
<input type=hidden name=search value="ivanov">
<input type=hidden name=order value="grades">
<input type=hidden name=page value="1">
</form>

далее делаешь жабаскрипт при клике на ссылку, которая соберет твои данные, типа
$.post("prettyurl.php",{"search": $("input[name=search").val(), "order": $("input[name=search").val()}, function(data){ alert(data);});

году в 2005м закончили с этой ебаторией и генерацией ссылок для пейджеров из php, генери на фронте все ссылки


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

Ответы: >>1282626
Аноним 2018/10/22 10:14:23  №1282626 3
>>1282462

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

Также, в твоем коде нет индикатора загрузки и обработки ошибок, советую почитать мой урок про аякс: https://github.com/codedokode/pasta/blob/master/js/ajax.md

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

>>1282306

Списка нет, но можно на гитхабе поискать по student list.

> Я в twig нашел как засунуть в href текущий url {{ app.request.query.all }}

Это для фреймворка Симфони, а не для Твига. В Симфони в шаблон передается глобальная переменная app, которая содержит много всяких полей. Это немного нарушает разделение ответственности в MVC, если view может так спокойно залезть в параметры запроса (хотя и сокращает код).

Я вижу, что у многих вызвает вопросы генерация ссылок, давай разберемся. В протоколе HTTP у нас нет состояния: сервер не "помнит", какие параметры пагинации или поиска ты задавал раньше. Потому ты их должен указывать при генерации ссылки. Да, ссылки будут получаться длинные.

Вот вариант решения: сделать функцию, которая будет принимать на вход текущее значение параметров (сортировка, поиск итд), название колонки и выдавать ссылку для нее:

function generateSortLink($viewParams, $column): string

Это может быть функция, метод, статических метод (паттерн Utility Class), функция-расширение twig. Она определяет по названию колонки и текущей выбранной колонке направление сортировки, собирает параметры и генерирует ссылку, например, с помощью http_build_query.

Что такое $viewParams? Это текущие параметры вывода таблицы, их конечно можно сделать массивом, а можно сделать классом с комментариями:

class TableFilter
{
public $searchPhrase;
public $sortBy;
public $sortDir;
public $page
}

Заметим, что класс получился универсальный и подойдет не только к таблице студентов, но и вообще к любой таблице с фильтром и сортировкой.

Аналогично, для пагинации можно написать похожую функцию:

function generatePagerLink(TableFilter $viewParams, int $page): string

При желании, можно как-то объединить эти функции в одну универсальную, например, такую:

function generateTableLink(TableFilter $currentParams, array $replace): string

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

Теперь затронем тему аякса и JS. В страницу можно встраивать код на JS, который может сам отправлять запросы на сервер аяксом и вставлять результат на страницу без ее перезагрузки. Если ты разбираешься или интересуешься JS и хочешь сделать обновление таблицы без перезагрузки, то есть довольно интересная библиотека pjax. Она перехватывает клики по ссылкам, запрашивает указанную в ссылке страницу аяксом и вставляет ее в указанную область страницы. Таким образом ты можешь сделать страницу, работающую без JS, а затем в соответствие с принципом progressive enhancement, для пользователей с JS добавить возможность работы без перезагрузки страницы. И это все - почти без написания JS кода.

pjax умеет отправлять формы, потому ты можешь заставить форму поиска работать без перезагрузки страницы при наличии JS.

При этом будет корректно работать кнопка "назад" и обновляться URL в браузере.

Если что-то еще непонятно - задавай вопросы. Это обучающий тред.