Динамическое добавление виджетов без перезагрузки страницы

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
fly2k
Сообщения: 155
Зарегистрирован: 2013.03.19, 05:31

Динамическое добавление виджетов без перезагрузки страницы

Сообщение fly2k »

Всем привет!

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

Нужно создать что-то типа мета-виджета, который не просто динамически(js/ajax) что-то рисует, а может добавлять(удалять) в своё тело другие виджеты Yii. То есть этот мета-виджет должен быть каким то образом(через конфиг) информирован об Yii-классах виджетов, которыми он будет манипулировать. При этом, бд и тд не нужно, то есть редактируемые типы заданы опять же через конфиг мета-виджета. И хотелось бы, чтобы не требовалось никаких добавлений в конечный контроллер.

Я вижу несколько вариантов реализации:
  1. Без запросов к серверу вообще. Виджеты "рендерятся" клиентом. JS-код сам знает как рисовать все возможные виджеты.
    1. js-plugin "узнает" о том как и что рисовать на стадии инициализации. То есть, мета-виджет каким то(?) образом передает "шаблоны" известных ему Yii-виджетов, и по этим шаблонам, js на клиенте может рисовать произвольное количество виджетов по шаблонам, без обращения к серверу.
    2. Самостоятельный js(jquery plugin). Не вариант, ибо нет возможности оперировать Yii-виджетами.
  2. С запросом к серверу. Виджеты рендерятся сервером и передаются клиенту аяксом.
    1. Сделать отдельный action, который можно подцепить в конечном контроллере. Этот action возвращает аяксом тело запрошенного виджета, со всеми ресурсами(js/css), а клиент рисует полученное тело и применяет ресурсы.
    2. Делать какими то стандартными методами типа Pjax. Но я не очень понял как именно. Получается что либо ножно сильно задевать конечный контроллер, либо передавать всё тело мета-виджета. Чёт я тут не понимаю.
Кто что думает? Может еще какие варианты есть?
Как по мне, так идеальный вариант 1.a, но я пока не понимаю как его реализовать.
Пока что я сделал вариант 2.a:
на сервере
Тут я очевидно что-то намудрил. Не понятно как красиво собрать ресурсы виджета. Пришлось вот так вот через вьюху собирать.
на клиенте
Тут тоже не очень понятно. Сначала пытался сделать в соответсвии с заданными POS для js и по честному вставлять в соответсвующие места документа(POS_HEAD|POS_BEGIN|etc), но в итоге вообще в док вставляю только css и тело, а js применяю средствами jquery всё в куче. Стоит ли заморачиваться с pos?

В общем, либо я сильно чего то не знаю, либо это имхо хорашая тема для cookbook. Так что буду рад любому присутсвию в теме Александра и других авторов :)
Тут возможно что-то из js кода Yii можно использовать, но я доков не нашел, а в сам код не сильно въехал. Пытался экспериментировать, как то использовать, в итоге треснул на этом и как то забыл про yii.*.js вообще.

Буду рад любому совету!

Спасибо!
// Yii2Rulez!
fly2k
Сообщения: 155
Зарегистрирован: 2013.03.19, 05:31

Re: Динамическое добавление виджетов без перезагрузки страницы

Сообщение fly2k »

Еще для варианта 2.a наверное правильнее виджет завернуть в модуль и action сделать сделать в контроллере модуля?
// Yii2Rulez!
Аватара пользователя
chungachguk
Сообщения: 435
Зарегистрирован: 2012.07.17, 11:52

Re: Динамическое добавление виджетов без перезагрузки страницы

Сообщение chungachguk »

Как ничего не понять и не подать виду... пойду стопоря накачу
Аватара пользователя
Insolita
Сообщения: 788
Зарегистрирован: 2011.06.06, 01:39
Контактная информация:

Re: Динамическое добавление виджетов без перезагрузки страницы

Сообщение Insolita »

а какого вообще рода виджеты - вообще любые заданные, чисто интерфейсные - типа от \yii\bootstrap (button, collapse, nav, tabs) или в т.ч более комплексные типа gridview или вообще свои самописные
ты типа конструктора сайта/интерфейса хочешь замутить? Подразумевается что на одной странице может быть несколько таких метиавиджетов? Или приведенный в примере css - редактор и есть конечная цель, а виджеты - это формы редактирования css-свойств?
Тут я очевидно что-то намудрил. Не понятно как красиво собрать ресурсы виджета. Пришлось вот так вот через вьюху собирать.
что подразумевается под "красиво собрать ресурсы виджета" типа чтоб доп.скрипты в области скриптов оказывались, цсс - области цсс в исходнике страницы? а оно действительно необходимо?
Последний раз редактировалось Insolita 2014.11.21, 20:36, всего редактировалось 3 раза.
Аватара пользователя
r3verser
Сообщения: 195
Зарегистрирован: 2012.04.01, 17:29
Откуда: Киев

Re: Динамическое добавление виджетов без перезагрузки страницы

Сообщение r3verser »

Нужно создать что-то типа мета-виджета, который не просто динамически(js/ajax) что-то рисует, а может добавлять(удалять) в своё тело другие виджеты Yii. То есть этот мета-виджет должен быть каким то образом(через конфиг) информирован об Yii-классах виджетов, которыми он будет манипулировать.
Нужен use case какой-нить с реальными виджетами, которые ты хочешь поместить в мета виджет, и что должно быть в итоге. Ибо конечный результат не совсем понятен.
Аватара пользователя
r3verser
Сообщения: 195
Зарегистрирован: 2012.04.01, 17:29
Откуда: Киев

Re: Динамическое добавление виджетов без перезагрузки страницы

Сообщение r3verser »

chungachguk писал(а):Как ничего не понять и не подать виду... пойду стопоря накачу
официант, нам с chungachguk, 2 по 100 пожалуйста. :mrgreen:
dmg
Сообщения: 685
Зарегистрирован: 2012.10.15, 03:09

Re: Динамическое добавление виджетов без перезагрузки страницы

Сообщение dmg »

IMHO.
не вдаваясь подобности, но, на мой вкус, без учета прав пользователя, добавление чего либо на страницу неправильно, а значит, через сервер
ps. 200 сухого красного.
fly2k
Сообщения: 155
Зарегистрирован: 2013.03.19, 05:31

Re: Динамическое добавление виджетов без перезагрузки страницы

Сообщение fly2k »

Мдя, опять получилось, что без стакана не разобраться... но я пока воздержусь ;)

Согласен, что, может, ни к чему пытаться сделать это без обращения к серверу. Поэтому остается вариант 2.

В итоге, задача сводится к тому, чтобы по аяксу передать клиенту рендер+ресы(js/css) запрашиваемого виджета. И да, виджет может быть произвольный, в пределах того, что было сконфигурировано в мета-виджете. То есть, мета-виджет должен всё таки знать о классах возмножных суб-виджетов, то есть о том как их рендерить. Но список этих виджетов может задаваться с использованием любых классов от \yii\widget\InputWidget. В моем примере возможные субвиджеты задаются через https://github.com/flyiing/css/blob/master/types.php - мета-виджет умеет рисовать только то, что задано в этом конфиге. Но конфиг можно менять добавляя произвольные классы виджетов, не меняя код мета-виджета.

И тут у меня вопросы по реализации. Я "ручками" вытаскиваю ресы из вьюхи и в массиве отдаю клиенту. Сбор с вьюхи происходит по типу renderAjax. Вообще, можно и его использовать, но тогда на клиенте ресы нада по другому из общей кучи доставать. Ну и вообще, мне интересно, как это делается по уму? Было бы здорово, если бы был какой то стандартный(из коробки или из cookbook) метод такого взаимодействия клиента и сервера, когда можно отрендерить виджет, отдать клиенту, а тот его, не парясь особо о ресах, вставляет в нужное место. По идее, это на Pjax похоже, но я так и не понял как его использовать в этом смысле. Там есть что-про применение ресов, но я нашел только про линки на внешние js-файлы. И оно же вроде как работает только с заданым врапером - как вставить полученное в произвольное место тоже не понятно.

Ну и еще можно по другому вообще спросить, в лоб: кто бы как реализовывал подобное http://flyiing.ru/demo/css/single ? Прям вот как?
// Yii2Rulez!
Ответить