«phpClub» — архив тем ("тредов"), посвящённых изучению PHP и веб-технологий.
Аноним 2019/04/12 12:39:59  №1379741 1
Сап двачеры. Помогите с одной проблемой:
echo <<< END
хуй
залупа
END; - видимо не работает в 7 версии - так как по-другому вывести несколько строк?
Ответы: >>1379743 >>1380456
Аноним 2019/04/12 14:06:23  №1379804 2
Аноны, вот в выводе списка студентов есть кнопки постраничной навигации, сортировки и поиска, по отдельности это все понятно как сдклать. Вопрос, я жму на смену страницы в постраничной навигации, передается по get параметром номер страницы, а как передать текущую выбранную пользователем сортировку в таблице,чтобы она не сбилась?
Ответы: >>1379829 >>1379833
Аноним 2019/04/12 14:37:21  №1379833 3
tmp22.jpg (29, 509x207)
207x509
>>1379804
Вот моя функция на пике, которая решает эту проблему.
Идея в том, что гет-параметры сохраняются из предыдущего запроса и просто подставляются в новую ссылку. Функция передаётся как замыкание в шаблон и через неё формируются ссылки на пагинацию и т.д.
Если у кого есть идея лучше - прошу озвучить, так как я писал от балды.
Ответы: >>1380001 >>1380456
Аноним 2019/04/13 18:18:19  №1380456 4
>>1379833

У тебя как-то странно сделано, что параметры сохраняются в $this->get. Это значит, что если ты с помощью функции linkMaker() создашь 2 анонимных функции, то одна будет влиять на другую (параметры, переданные в одну, отобразятся в другой). Это неправильно. Лучше сделать так:

function makeLinkGenerator(array $basicParams): callable {
\treturn function (array $override) { ... };
}

Использование:

$linkGen = makeLinkGenerator(['sort' => 'name', 'page' => 3]);
echo $linkGen(['page' => 2]); // Меняем страницу
echo $linkGen(['sort' => 'score', 'page' => '']); // при смене сортировки сбрасываем пагинацию

Можно сделать аналогичную штуку с помощью объекта:

$linkGen = new LinkGenerator([....]);
$linkGen->makeLink([....]);

Можно сделать специализированные функции для разных видов ссылок:

$linkGen = new LinkGenerator([....]);
$linkGen->makePaginationLink(3);
$linkGen->makeSortLink('-name');

Ты же зачем-то смешал оба подхода. Если ты используешь анонимную функцию, то не надо перезаписывать поля объекта.

Можно вместо массива с базовыми параметрами использовать объект ViewParams/ViewFilter.

Также стоит предусмотреть такие вещи:

- если номер страницы равен 1, то его не надо добавлять в ссылку
- если мы меняем сортировку, то надо сбрасывать пагинацию

>>1379741

Возможно, у тебя там отступ (пробелы) перед END или какие-то лишние символы после.
Ответы: >>1380688 >>1380690
Аноним 2019/04/14 08:29:05  №1380690 5
tmp23.jpg (125, 1173x382)
382x1173
Продублирую в новом ИТТ треде:


>>1380456
>У тебя как-то странно сделано, что параметры сохраняются в $this->get. Это значит, что если ты с помощью функции linkMaker() создашь 2 анонимных функции, то одна будет влиять на другую (параметры, переданные в одну, отобразятся в другой). Это неправильно.

>$this->get
Так ведь там весь массив гет из реквеста, а не просто место для сохранения. Параметры не столько сохраняются, сколько апдейтятся - меняется только один, за который отвечает ссылка, и она пересобирается с новым значением.
Ну и разные функции нет смысла создавать - всегда один гет-массив приходит в запросе и с ним работаем.
Вообще, задумка была такой, что замыкание передаётся в шаблон под каким-то именем, где просто вызывается как на пикрелейтед. Меняются только запрошенные параметры, остальные не остаются как были. Ну и пустой писанины чтоб поменьше.

Я тут не подумал сразу и вкинул эту функцию в тред, без комментов, без пояснений нормальных. Потом только дошло, что она не оформлена никак у меня.

>если мы меняем сортировку, то надо сбрасывать пагинацию
Зачем? Количество записей ведь не изменилось. Я вот со своей этой функцией поигрался - вполне юзабельно вроде. Страницы жмёшь - меняет страницы, сортировку меняешь - сортировка только и меняется, что нажали - то и выводит.
Ответы: >>1394737
Аноним 2019/05/06 06:02:15  №1394737 6
>>1380690

> Так ведь там весь массив гет из реквеста, а не просто место для сохранения.

А это неправильно и говорит о том, что ты не понимаешь разделение ответственности. Задача генератора ссылок - генерировать ссылки, а откуда пришли данные, из GET или из базы данных, или еще откуда-то - он знать не должен. Потому в нем не должно быть упоминания массива GET. Ты не разделяешь зоны ответственности в коде.

> Вообще, задумка была такой, что замыкание передаётся в шаблон под каким-то именем, где просто вызывается как на пикрелейтед. Меняются только запрошенные параметры, остальные не остаются как были. Ну и пустой писанины чтоб поменьше.

Ну так можно сделать нормально, так что можно сделать несколько анонимных функций и они не влияют друг на друга.

> Зачем? Количество записей ведь не изменилось.

Я вроде писал, так везде делают. Когда ты жмешь сортировку, ты хочешь увидеть САМЫЕ большие или маленькие значения, а для этого надо перейти на первую страницу. Иначе ты оказываешься где-то в середине.