|  |  |  | <?php
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * @link http://www.yiiframework.com/
 | 
					
						
							|  |  |  |  * @copyright Copyright (c) 2008 Yii Software LLC
 | 
					
						
							|  |  |  |  * @license http://www.yiiframework.com/license/
 | 
					
						
							|  |  |  |  */
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace yii\authclient\widgets;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | use yii\base\Widget;
 | 
					
						
							|  |  |  | use Yii;
 | 
					
						
							|  |  |  | use yii\helpers\Html;
 | 
					
						
							|  |  |  | use yii\authclient\ClientInterface;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * Choice prints buttons for authentication via various auth clients.
 | 
					
						
							|  |  |  |  * By default this widget relies on presence of [[\yii\authclient\Collection]] among application components
 | 
					
						
							|  |  |  |  * to get auth clients information.
 | 
					
						
							|  |  |  |  *
 | 
					
						
							|  |  |  |  * Example:
 | 
					
						
							|  |  |  |  * ~~~
 | 
					
						
							|  |  |  |  * <?= yii\authclient\Choice::widget([
 | 
					
						
							|  |  |  |  *     'baseAuthUrl' => ['site/auth']
 | 
					
						
							|  |  |  |  * ]); ?>
 | 
					
						
							|  |  |  |  * ~~~
 | 
					
						
							|  |  |  |  *
 | 
					
						
							|  |  |  |  * You can customize the widget appearance by using [[beginWidget()]] and [[endWidget()]] syntax
 | 
					
						
							|  |  |  |  * along with using method {@link clientLink()} or {@link createClientUrl()}.
 | 
					
						
							|  |  |  |  * For example:
 | 
					
						
							|  |  |  |  *
 | 
					
						
							|  |  |  |  * ~~~
 | 
					
						
							|  |  |  |  * <?php $authChoice = yii\authclient\Choice::beginWidget([
 | 
					
						
							|  |  |  |  *     'baseAuthUrl' => ['site/auth']
 | 
					
						
							|  |  |  |  * ]); ?>
 | 
					
						
							|  |  |  |  * <ul>
 | 
					
						
							|  |  |  |  * <?php foreach ($authChoice->getClients() as $client): ?>
 | 
					
						
							|  |  |  |  *     <li><?= $authChoice->clientLink($client); ?></li>
 | 
					
						
							|  |  |  |  * <?php endforeach; ?>
 | 
					
						
							|  |  |  |  * </ul>
 | 
					
						
							|  |  |  |  * <?php yii\authclient\Choice::endWidget(); ?>
 | 
					
						
							|  |  |  |  * ~~~
 | 
					
						
							|  |  |  |  *
 | 
					
						
							|  |  |  |  * @see \yii\authclient\AuthAction
 | 
					
						
							|  |  |  |  *
 | 
					
						
							|  |  |  |  * @property ClientInterface[] $providers auth providers list.
 | 
					
						
							|  |  |  |  * @property array $baseAuthUrl configuration for the external services base authentication URL.
 | 
					
						
							|  |  |  |  *
 | 
					
						
							|  |  |  |  * @author Paul Klimov <klimov.paul@gmail.com>
 | 
					
						
							|  |  |  |  * @since 2.0
 | 
					
						
							|  |  |  |  */
 | 
					
						
							|  |  |  | class Choice extends Widget
 | 
					
						
							|  |  |  | {
 | 
					
						
							|  |  |  | 	/**
 | 
					
						
							|  |  |  | 	 * @var ClientInterface[] auth providers list.
 | 
					
						
							|  |  |  | 	 */
 | 
					
						
							|  |  |  | 	private $_clients;
 | 
					
						
							|  |  |  | 	/**
 | 
					
						
							|  |  |  | 	 * @var string name of the auth client collection application component.
 | 
					
						
							|  |  |  | 	 * This component will be used to fetch {@link services} value if it is not set.
 | 
					
						
							|  |  |  | 	 */
 | 
					
						
							|  |  |  | 	public $clientCollection = 'authClientCollection';
 | 
					
						
							|  |  |  | 	/**
 | 
					
						
							|  |  |  | 	 * @var array configuration for the external clients base authentication URL.
 | 
					
						
							|  |  |  | 	 */
 | 
					
						
							|  |  |  | 	private $_baseAuthUrl;
 | 
					
						
							|  |  |  | 	/**
 | 
					
						
							|  |  |  | 	 * @var string name of the GET param , which should be used to passed auth client id to URL
 | 
					
						
							|  |  |  | 	 * defined by {@link baseAuthUrl}.
 | 
					
						
							|  |  |  | 	 */
 | 
					
						
							|  |  |  | 	public $clientIdGetParamName = 'authclient';
 | 
					
						
							|  |  |  | 	/**
 | 
					
						
							|  |  |  | 	 * @var array the HTML attributes that should be rendered in the div HTML tag representing the container element.
 | 
					
						
							|  |  |  | 	 */
 | 
					
						
							|  |  |  | 	public $mainContainerHtmlOptions = [
 | 
					
						
							|  |  |  | 		'class' => 'auth-clients'
 | 
					
						
							|  |  |  | 	];
 | 
					
						
							|  |  |  | 	/**
 | 
					
						
							|  |  |  | 	 * @var boolean indicates if popup window should be used instead of direct links.
 | 
					
						
							|  |  |  | 	 */
 | 
					
						
							|  |  |  | 	public $popupMode = true;
 | 
					
						
							|  |  |  | 	/**
 | 
					
						
							|  |  |  | 	 * @var boolean indicates if widget content, should be rendered automatically.
 | 
					
						
							|  |  |  | 	 * Note: this value automatically set to 'false' at the first call of [[createProviderUrl()]]
 | 
					
						
							|  |  |  | 	 */
 | 
					
						
							|  |  |  | 	public $autoRender = true;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/**
 | 
					
						
							|  |  |  | 	 * @param ClientInterface[] $clients auth providers
 | 
					
						
							|  |  |  | 	 */
 | 
					
						
							|  |  |  | 	public function setClients(array $clients)
 | 
					
						
							|  |  |  | 	{
 | 
					
						
							|  |  |  | 		$this->_clients = $clients;
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/**
 | 
					
						
							|  |  |  | 	 * @return ClientInterface[] auth providers
 | 
					
						
							|  |  |  | 	 */
 | 
					
						
							|  |  |  | 	public function getClients()
 | 
					
						
							|  |  |  | 	{
 | 
					
						
							|  |  |  | 		if ($this->_clients === null) {
 | 
					
						
							|  |  |  | 			$this->_clients = $this->defaultClients();
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							|  |  |  | 		return $this->_clients;
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/**
 | 
					
						
							|  |  |  | 	 * @param array $baseAuthUrl base auth URL configuration.
 | 
					
						
							|  |  |  | 	 */
 | 
					
						
							|  |  |  | 	public function setBaseAuthUrl(array $baseAuthUrl)
 | 
					
						
							|  |  |  | 	{
 | 
					
						
							|  |  |  | 		$this->_baseAuthUrl = $baseAuthUrl;
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/**
 | 
					
						
							|  |  |  | 	 * @return array base auth URL configuration.
 | 
					
						
							|  |  |  | 	 */
 | 
					
						
							|  |  |  | 	public function getBaseAuthUrl()
 | 
					
						
							|  |  |  | 	{
 | 
					
						
							|  |  |  | 		if (!is_array($this->_baseAuthUrl)) {
 | 
					
						
							|  |  |  | 			$this->_baseAuthUrl = $this->defaultBaseAuthUrl();
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							|  |  |  | 		return $this->_baseAuthUrl;
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/**
 | 
					
						
							|  |  |  | 	 * Returns default auth clients list.
 | 
					
						
							|  |  |  | 	 * @return ClientInterface[] auth clients list.
 | 
					
						
							|  |  |  | 	 */
 | 
					
						
							|  |  |  | 	protected function defaultClients()
 | 
					
						
							|  |  |  | 	{
 | 
					
						
							|  |  |  | 		/** @var $collection \yii\authclient\Collection */
 | 
					
						
							|  |  |  | 		$collection = Yii::$app->getComponent($this->clientCollection);
 | 
					
						
							|  |  |  | 		return $collection->getClients();
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/**
 | 
					
						
							|  |  |  | 	 * Composes default base auth URL configuration.
 | 
					
						
							|  |  |  | 	 * @return array base auth URL configuration.
 | 
					
						
							|  |  |  | 	 */
 | 
					
						
							|  |  |  | 	protected function defaultBaseAuthUrl()
 | 
					
						
							|  |  |  | 	{
 | 
					
						
							|  |  |  | 		$baseAuthUrl = [
 | 
					
						
							|  |  |  | 			Yii::$app->controller->getRoute()
 | 
					
						
							|  |  |  | 		];
 | 
					
						
							|  |  |  | 		$params = $_GET;
 | 
					
						
							|  |  |  | 		unset($params[$this->clientIdGetParamName]);
 | 
					
						
							|  |  |  | 		$baseAuthUrl = array_merge($baseAuthUrl, $params);
 | 
					
						
							|  |  |  | 		return $baseAuthUrl;
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/**
 | 
					
						
							|  |  |  | 	 * Outputs client auth link.
 | 
					
						
							|  |  |  | 	 * @param ClientInterface $client external auth client instance.
 | 
					
						
							|  |  |  | 	 * @param string $text link text, if not set - default value will be generated.
 | 
					
						
							|  |  |  | 	 * @param array $htmlOptions link HTML options.
 | 
					
						
							|  |  |  | 	 */
 | 
					
						
							|  |  |  | 	public function clientLink($client, $text = null, array $htmlOptions = [])
 | 
					
						
							|  |  |  | 	{
 | 
					
						
							|  |  |  | 		if ($text === null) {
 | 
					
						
							|  |  |  | 			$text = Html::tag('span', '', ['class' => 'auth-icon ' . $client->getName()]);
 | 
					
						
							|  |  |  | 			$text .= Html::tag('span', $client->getTitle(), ['class' => 'auth-title']);
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							|  |  |  | 		if (!array_key_exists('class', $htmlOptions)) {
 | 
					
						
							|  |  |  | 			$htmlOptions['class'] = 'auth-link ' . $client->getName();
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							|  |  |  | 		if ($this->popupMode) {
 | 
					
						
							|  |  |  | 			$viewOptions = $client->getViewOptions();
 | 
					
						
							|  |  |  | 			if (isset($viewOptions['popupWidth'])) {
 | 
					
						
							|  |  |  | 				$htmlOptions['data-popup-width'] = $viewOptions['popupWidth'];
 | 
					
						
							|  |  |  | 			}
 | 
					
						
							|  |  |  | 			if (isset($viewOptions['popupHeight'])) {
 | 
					
						
							|  |  |  | 				$htmlOptions['data-popup-height'] = $viewOptions['popupHeight'];
 | 
					
						
							|  |  |  | 			}
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							|  |  |  | 		echo Html::a($text, $this->createClientUrl($client), $htmlOptions);
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/**
 | 
					
						
							|  |  |  | 	 * Composes client auth URL.
 | 
					
						
							|  |  |  | 	 * @param ClientInterface $provider external auth client instance.
 | 
					
						
							|  |  |  | 	 * @return string auth URL.
 | 
					
						
							|  |  |  | 	 */
 | 
					
						
							|  |  |  | 	public function createClientUrl($provider)
 | 
					
						
							|  |  |  | 	{
 | 
					
						
							|  |  |  | 		$this->autoRender = false;
 | 
					
						
							|  |  |  | 		$url = $this->getBaseAuthUrl();
 | 
					
						
							|  |  |  | 		$url[$this->clientIdGetParamName] = $provider->getId();
 | 
					
						
							|  |  |  | 		return Html::url($url);
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/**
 | 
					
						
							|  |  |  | 	 * Renders the main content, which includes all external services links.
 | 
					
						
							|  |  |  | 	 */
 | 
					
						
							|  |  |  | 	protected function renderMainContent()
 | 
					
						
							|  |  |  | 	{
 | 
					
						
							|  |  |  | 		echo Html::beginTag('ul', ['class' => 'auth-clients clear']);
 | 
					
						
							|  |  |  | 		foreach ($this->getClients() as $externalService) {
 | 
					
						
							|  |  |  | 			echo Html::beginTag('li', ['class' => 'auth-client']);
 | 
					
						
							|  |  |  | 			$this->clientLink($externalService);
 | 
					
						
							|  |  |  | 			echo Html::endTag('li');
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							|  |  |  | 		echo Html::endTag('ul');
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/**
 | 
					
						
							|  |  |  | 	 * Initializes the widget.
 | 
					
						
							|  |  |  | 	 */
 | 
					
						
							|  |  |  | 	public function init()
 | 
					
						
							|  |  |  | 	{
 | 
					
						
							|  |  |  | 		if ($this->popupMode) {
 | 
					
						
							|  |  |  | 			$view = Yii::$app->getView();
 | 
					
						
							|  |  |  | 			ChoiceAsset::register($view);
 | 
					
						
							|  |  |  | 			$view->registerJs("\$('#" . $this->getId() . "').authchoice();");
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							|  |  |  | 		$this->mainContainerHtmlOptions['id'] = $this->getId();
 | 
					
						
							|  |  |  | 		echo Html::beginTag('div', $this->mainContainerHtmlOptions);
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/**
 | 
					
						
							|  |  |  | 	 * Runs the widget.
 | 
					
						
							|  |  |  | 	 */
 | 
					
						
							|  |  |  | 	public function run()
 | 
					
						
							|  |  |  | 	{
 | 
					
						
							|  |  |  | 		if ($this->autoRender) {
 | 
					
						
							|  |  |  | 			$this->renderMainContent();
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							|  |  |  | 		echo Html::endTag('div');
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | }
 |