«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 14:05:44  №1282322 2
>>1282306
Скорее не с той стороны всё-таки.
У тебя есть какой-то набор параметров, по которым происходит выборка из базы (например, тебе нужны 20 студентов с фамилией "иванов", отсортированных по имени). Тогда набор параметров будет представлять собой объект с подобными полями:
{order_by: "name", search: "иванов", page: 1, perpage: 20}
Этот объект можно передавать на фронт с бэка, чтобы знать текущее состояние выборки на фронте и по нему строить другие запросы к бэку (например, изменить страницу с первой на вторую). Его же можно передавать get-параметрами (удобнее всего - в обычном джсоне одним параметром), либо в теле post-запроса, и обрабатывать его на бэке (в соответствии с ним построить запрос к базе). Такой подход гораздо гибче ковыряния в request query (тем более в шаблоне).
Аноним 2018/10/21 18:42:30  №1282462 3
>>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 4
>>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 в браузере.

Если что-то еще непонятно - задавай вопросы. Это обучающий тред.
Аноним 2018/10/22 10:16:02  №1282628 5
Аноним 2018/11/05 09:49:47  №1290010 6
>>1281726
Какая разница, что у тебя на домашнем компьютере?
>>1282306
А почему бы не делать сортировку по баллам дефолтно, если не задан параметр sort_by? Это намного логичнее, чем заниматься подстановкой параметров в ссылки.
>>1282527
Посмотри за Flux, его реализовали в React/Redux например.
>>1283377
Во-первых, студентам один год дают бесплатно, во-вторых можно всегда взять VSCode и настроить. Мне в компании хотели лицензию выдать, но я имаксер.
>>1289947
Лучше всего React/Redux, ибо порог вхождения минимален.
>>1289183
Slim/Silex.
Ответы: >>1290292
Аноним 2018/11/05 19:18:17  №1290292 7
>>1290010
> Во-первых, студентам один год дают бесплатно
Даже не один, можно продлевать лицензию по мере перехода с курса на курс. Например у меня в сумме лицензия с 2014-го по 2019-й, и как только закончится - сразу куплю, оно того стоит. Ещё у них там скидки появляются (друг купил PHPStorm за полцены в день дружбы лол: https://blog.jetbrains.com/blog/2018/07/30/celebrate-this-friendship-day-with-jetbrains-and-unwrap-your-presents/ )

>>1289947
А как не быть токсичным, если ты сам себя дауном называешь? И зачем тебе распыляться на два фронта, пиши себе бекенд, в чём проблема? Или работодатели не могут отдельно фронта нанять?

>>1290027
Без вёрстки сможешь только туду-списки по туториалам делать. Сейчас в моде styled components (подход когда обеспечения модульности вёрстку кладут рядом с JS кодом), для разработки на фронтенд фреймворке нужно уметь в вёрстку:
- https://www.styled-components.com/
- https://vuejs.org/v2/guide/single-file-components.html
Ответы: >>1290331 >>1290527
Аноним 2018/11/05 20:29:06  №1290331 8
>>1290292
> https://www.styled-components.com/

Мне не нравится. Что мешает верстку для компонента класть в отдельный CSS файл? Их подход:

- по производительности очень плох
- способствует загромождению шаблонов стилями
- не взаимодействует нормально с devtools
Ответы: >>1290407
Аноним 2018/11/05 21:33:25  №1290407 9
>>1290331
> по производительности очень плох
Но это ведь не инлайн стили, там в итоге один css файл собирается. Не вижу причин для проседаний.

> способствует загромождению шаблонов стилями
Стили находятся не в шаблоне, а в компоненте. В случае с Vue - это отдельный .vue файл, в случае с реактом будет просто вёрстка вверху файла. Компоненты обладает высоким cohesion (зацеплением?), из-за чего их очень удобно переиспользовать.

> не взаимодействует нормально с devtools
Там есть соурсмапы, так что всё тоже самое.

Из недостатков отмечу, что не работает emmet синтаксис для написания стилей, так как IDE не видит стили внутри JS кода (но это просто плагин для реакта нормальный не сделали, для Vue сделали).

> Что мешает верстку для компонента класть в отдельный CSS файл?
Тоже хороший вариант. Я хотел акцентировать внимание на том, что вёрстка во фронтенд фреймворках идёт бок-о-бок с JS кодом и её обязательно нужно знать.
Ответы: >>1290427
Аноним 2018/11/05 21:56:05  №1290427 10
>>1290407

>> не взаимодействует нормально с devtools
> Там есть соурсмапы, так что всё тоже самое.
Нет, там будут в HTML-коде CSS-классы вроде x76gdydsv, которые невозможно читать. Плюс, sourcemaps это зло: они часто глючат, требуют усилий по их поддержке, могут быть не той версии, итд. Лишняя возня. Плюс, при попытке отредактировать что-то в devtools они отключаются.
Аноним 2018/11/06 07:47:31  №1290527 11
>>1290292
>И зачем тебе распыляться на два фронта
---> >>1289176
Ответы: >>1290530
Аноним 2018/11/06 07:51:08  №1290530 12
>>1290527
>
Хуёвый работодатель, чо. У нас фронт и бек - отдельные люди со специализацией.