max_input_vars -> сабмитить сериализованную в json форму

2

Это скорее для авторов shop-script, но лучше, наверное, публично обсудить, а не на гитхабе.

Время от времени возникают вот такие ошибки при сохранении товара с большим количеством характеристик или артикулов:

https://support.webasyst.ru/9688/ne-dobavlyaetsya-...

https://support.webasyst.ru/4816/ne-sokhranyayutsy...

ну и так далее.

Я тут подумал, что лучше бы не конструировать монстроидальные данные формы и тысячей полей типа product[param][weight] и т.п. а все данные инпутов сериализовать в json и передавать вот это все post'ом / put'ом либо в теле запроса, либо в виде одной переменной, например [data]. В переменной наверное проще, чем stream читать.

Ограничения все равно будут, но раз пользователи умудряются кртинки загружать, то вероятность, что без проблем примут пару мегабайт post'ом выше, чем что у них max_input_vars=5000

Правда, может сказаться на нескольких плагинах. Ну, авторы подтянутся. можно серализуемые поля как-нибудь помечать (классом или data), а 'name' у них наоборот не указывать. Тогда они в сабмит формы не попадут самостоятельно.

Что думаете?

6 комментариев

  • +2
    Алексей Алексей Webasyst 4 февраля 2016 10:44 #

    Чтобы не сказалось на плагинах нужно десериализацию добавить в обработку waRequest::post() - как результат на уровне обмена получим нужные данные, а каким образом они были отправлены на сервер не важно.

    • +1
      ITFrogs ITFrogs 4 февраля 2016 10:46 #

      waRequest::post() должен как-то понять, что данные сериализированы.

      • +1
        Syrnik.com Syrnik.com 4 февраля 2016 10:51 #

        Ну. для отправки можно убрать name у тех, что надо сериализовать, добавить им признак и передвавать в переменной serialized_form. Остальные будут в других переменных.

        Только чтоб структуру не потерять придется какой-то костыль приделать. Может с dot-notation какой-нибудь признак типа data-serialize-name="product.sku.name".

        В любом случае там не так все просто с сохранением структуры. Там же еще могут быть массивы однотипных элементов. (зато, кстати, не надо будет мучиться с пересчетом числовых индексов у структур типа product[sku][0][name]

      • +1
        ITFrogs ITFrogs 4 февраля 2016 09:04 #

        А что если не сериализировать в жсон, а сериализировать нативными средствами?

        Например всегда передавать

        name="data[var01][val01]"

        name="data[var01][val02]"

        ...

        name="data[var02][val01]"

        ...

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

        Еще можно пойти в формах по пути битрикса.

        Тот же подход здесь: http://symfony.com/doc/current/book/forms.html

        Но кто будет это делать?.. Это ж большой объем работ, а у нас тут какое-то затишье. Никакого движения нет. Может новые телевизоры выдумывают.

      • +1
        Syrnik.com Syrnik.com 4 февраля 2016 09:05 #

        Каждая data[var01][val01] это отдельная переменная. Так что не поможет

      • +1
        ITFrogs ITFrogs 4 февраля 2016 10:29 #

        Надо формс распаковать и посмотреть. Там как-то по хитрому сделано.

        Добавить комментарий

        Чтобы добавить комментарий, зарегистрируйтесь или войдите