Матрешка Из Виджетов

всем привет

не могу определиться как правильно поступить

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

а может сделать компонент или расширение?

Юзкейс не помешал бы.

уот из юзкейс?

типа - что это должно будет делать?

Ну типа пока не очень понятно, что за штуку Вы хотите, и почему, допустим, нельзя вызывать виджеты из контроллера/вьюхи.

как и все новички хочу то чего пока не могу и не понимаю сути :lol:

на самом деле мне надо реализовать аутентификацию из соцсетей в своем модуле

есть замечательная штука на уровне расширения и очень простая штука для ламеров

и мне захотелось сделать аутентификацию "попроще" и на понятном мне уровне - на уровне виджетов

то что я хотел - я уже сделал и все работает

НО

как-то самому не очень нравится - код "не ремонтнопригодный"

как есть сейчас = это виджет, который вызывается так =


<?php 

$this->widget('AuthWidget',array(

    'services'=>array(

        'facebook',

        'vk',

        'yandex',

        'odnoklassniki',

        'mail'

    )

)); 

?>

внутри виджета такой run =


public function run()

{ 

   $this->redirect_uri = 'http://mysite.ru'.Yii::app()->request->requestUri;

   sort($this->services);

   foreach($this->services as $val)

   {

      echo $this->Links($val);

   }

   $this->render('myview');

}

ну и соответственно метод Links, который на основе switch формирует ссылки и логику

все работает, но требует = грамотно-профессиональной доработки на основе мнения тех кто умеет больше меня

Всё еще непонятно.

Куда в этом коде Вы хотите присунуть "главный виджет"?

Понимаете, виджет из виджета вызвать - проблем никаких, но сначала бы понять, зачем это всё и как оно должно работать.

упс…так я жэж вроде написал как это должно работать :unsure:

в представлении отображающем форму авторизации запускаем "главный" виджет,

который на основе поданных в него массива значений,

выводит ссылки для авторизации с помощью указанных социальных сетей

при клике на ссылку появляется поп-ап в котором юзер авторизуется на стороннем сервисе


теперь-то я осознал, что матрешка мне, видимо, не понадобится


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

и ставлю плюсик

Непонятка, собственно, связана вот с чем: в качестве примера Вы упоминаете oauth-авторизацию, а там на основе одного виджета все реализовано.

Штука вот в чем: виджет можно расматривать как мини-контроллер. У него есть своя логика и представления (более того, в некоторых извращенных случаях я ими и формы обрабатывал). В случае oauth логика у Вас будет примерно одна и та же, а вот представления (логин такой, логин сякой) могут различаться, поэтому если и городить огород, то именно в части разделения шаблонов (иначе получится дублирование). Ну и вообще конкретно oauth можно и с одной вьюхой сделать, поскольку страницу логина сервисы сами отдают.

Так-то виджеты много чего умеют: $controller = $this->controller; $action = $controller->action; и понеслась по накатанной в сторону non-mvc ада. Ну, вообще тут можно поспорить, конечно, имеет ли право виджет на какие-то вещи, или нет.

Чисто технически же он имеет доступ ко всему приложению.

оооо, спасибо! это слишком умно для меня!

использовать я буду 5 сервисов = ‘facebook’,‘vk’,‘yandex’,‘odnoklassniki’,‘mail’

различия в логике хоть и небольшие, но есть

пока пошел по пути отдельных классов для каждого сервиса, где каждый класс основан на одном супер-классе

в этом родительском классе определены все необходимы свойства и методы (как это сделано у перца с хабрхабра)

а в главном виджете я инициируют объекты нужных классов, указывая в конструкторе класса 3 главных параметра