Commit f06b5ab1 by Paul Klimov

Widget "yii\authclient\widgets\Choice" fixed.

parent 722c93fc
......@@ -49,4 +49,9 @@ interface ClientInterface
* @return array list of user attributes
*/
public function getUserAttributes();
/**
* @return array view options in format: optionName => optionValue
*/
public function getViewOptions();
}
\ No newline at end of file
......@@ -39,6 +39,10 @@ trait ClientTrait
* @var array authenticated user attributes.
*/
private $_userAttributes;
/**
* @var array view options in format: optionName => optionValue
*/
private $_viewOptions;
/**
* @param string $id service id.
......@@ -111,12 +115,31 @@ trait ClientTrait
/**
* @param array $userAttributes list of user attributes
*/
public function setUserAttributes(array $userAttributes)
public function setUserAttributes($userAttributes)
{
$this->_userAttributes = $userAttributes;
}
/**
* @param array $viewOptions view options in format: optionName => optionValue
*/
public function setViewOptions($viewOptions)
{
$this->_viewOptions = $viewOptions;
}
/**
* @return array view options in format: optionName => optionValue
*/
public function getViewOptions()
{
if ($this->_viewOptions === null) {
$this->_viewOptions = $this->defaultViewOptions();
}
return $this->_viewOptions;
}
/**
* Generates service name.
* @return string service name.
*/
......@@ -142,4 +165,14 @@ trait ClientTrait
{
throw new NotSupportedException('Method "' . get_class($this) . '::' . __FUNCTION__ . '" not implemented.');
}
/**
* Returns the default [[viewOptions]] value.
* Particular client may override this method in order to provide specific default view options.
* @return array list of default [[viewOptions]]
*/
protected function defaultViewOptions()
{
return [];
}
}
\ No newline at end of file
......@@ -17,6 +17,9 @@ use yii\authclient\OpenId;
*/
class GoogleOpenId extends OpenId
{
/**
* @inheritdoc
*/
public function init()
{
parent::init();
......@@ -28,4 +31,15 @@ class GoogleOpenId extends OpenId
'pref/language',
];
}
/**
* @inheritdoc
*/
protected function defaultViewOptions()
{
return [
'popupWidth' => 880,
'popupHeight' => 520,
];
}
}
\ No newline at end of file
......@@ -17,6 +17,9 @@ use yii\authclient\OpenId;
*/
class YandexOpenId extends OpenId
{
/**
* @inheritdoc
*/
public function init()
{
parent::init();
......@@ -26,4 +29,15 @@ class YandexOpenId extends OpenId
'contact/email',
];
}
/**
* @inheritdoc
*/
protected function defaultViewOptions()
{
return [
'popupWidth' => 900,
'popupHeight' => 550,
];
}
}
\ No newline at end of file
......@@ -10,12 +10,12 @@ namespace yii\authclient\widgets;
use yii\base\Widget;
use Yii;
use yii\helpers\Html;
use yii\authclient\provider\ProviderInterface;
use yii\authclient\ClientInterface;
/**
* Class Choice
*
* @property ProviderInterface[] $providers auth providers list.
* @property ClientInterface[] $providers auth providers list.
* @property array $baseAuthUrl configuration for the external services base authentication URL.
*
* @author Paul Klimov <klimov.paul@gmail.com>
......@@ -24,28 +24,28 @@ use yii\authclient\provider\ProviderInterface;
class Choice extends Widget
{
/**
* @var ProviderInterface[] auth providers list.
* @var ClientInterface[] auth providers list.
*/
private $_providers;
private $_clients;
/**
* @var string name of the auth provider collection application component.
* @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 $providerCollection;
public $clientCollection = 'auth';
/**
* @var array configuration for the external services base authentication URL.
* @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 provider id to URL
* @var string name of the GET param , which should be used to passed auth client id to URL
* defined by {@link baseAuthUrl}.
*/
public $providerIdGetParamName = 'provider';
public $clientIdGetParamName = 'client_id';
/**
* @var array the HTML attributes that should be rendered in the div HTML tag representing the container element.
*/
public $mainContainerHtmlOptions = [
'class' => 'services'
'class' => 'auth-clients'
];
/**
* @var boolean indicates if popup window should be used instead of direct links.
......@@ -58,22 +58,22 @@ class Choice extends Widget
public $autoRender = true;
/**
* @param ProviderInterface[] $providers auth providers
* @param ClientInterface[] $clients auth providers
*/
public function setProviders(array $providers)
public function setClients(array $clients)
{
$this->_providers = $providers;
$this->_clients = $clients;
}
/**
* @return ProviderInterface[] auth providers
* @return ClientInterface[] auth providers
*/
public function getProviders()
public function getClients()
{
if ($this->_providers === null) {
$this->_providers = $this->defaultProviders();
if ($this->_clients === null) {
$this->_clients = $this->defaultClients();
}
return $this->_providers;
return $this->_clients;
}
/**
......@@ -96,14 +96,14 @@ class Choice extends Widget
}
/**
* Returns default auth providers list.
* @return ProviderInterface[] auth providers list.
* Returns default auth clients list.
* @return ClientInterface[] auth clients list.
*/
protected function defaultProviders()
protected function defaultClients()
{
/** @var $collection \yii\authclient\provider\Collection */
$collection = Yii::$app->getComponent($this->providerCollection);
return $collection->getProviders();
/** @var $collection \yii\authclient\Collection */
$collection = Yii::$app->getComponent($this->clientCollection);
return $collection->getClients();
}
/**
......@@ -116,47 +116,48 @@ class Choice extends Widget
Yii::$app->controller->getRoute()
];
$params = $_GET;
unset($params[$this->providerIdGetParamName]);
unset($params[$this->clientIdGetParamName]);
$baseAuthUrl = array_merge($baseAuthUrl, $params);
return $baseAuthUrl;
}
/**
* Outputs external service auth link.
* @param ProviderInterface $service external auth service instance.
* @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 providerLink($service, $text = null, array $htmlOptions = [])
public function providerLink($client, $text = null, array $htmlOptions = [])
{
if ($text === null) {
$text = Html::tag('span', ['class' => 'auth-icon ' . $service->getName()], '');
$text .= Html::tag('span', ['class' => 'auth-title'], $service->getTitle());
$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 ' . $service->getName();
$htmlOptions['class'] = 'auth-link ' . $client->getName();
}
if ($this->popupMode) {
if (isset($service->popupWidth)) {
$htmlOptions['data-popup-width'] = $service->popupWidth;
$viewOptions = $client->getViewOptions();
if (isset($viewOptions['popupWidth'])) {
$htmlOptions['data-popup-width'] = $viewOptions['popupWidth'];
}
if (isset($service->popupHeight)) {
$htmlOptions['data-popup-height'] = $service->popupHeight;
if (isset($viewOptions['popupHeight'])) {
$htmlOptions['data-popup-height'] = $viewOptions['popupHeight'];
}
}
echo Html::a($text, $this->createProviderUrl($service), $htmlOptions);
echo Html::a($text, $this->createProviderUrl($client), $htmlOptions);
}
/**
* Composes external service auth URL.
* @param ProviderInterface $provider external auth service instance.
* @param ClientInterface $provider external auth service instance.
* @return string auth URL.
*/
public function createProviderUrl($provider)
{
$this->autoRender = false;
$url = $this->getBaseAuthUrl();
$url[$this->providerIdGetParamName] = $provider->getId();
$url[$this->clientIdGetParamName] = $provider->getId();
return Html::url($url);
}
......@@ -166,7 +167,7 @@ class Choice extends Widget
protected function renderMainContent()
{
echo Html::beginTag('ul', ['class' => 'auth-services clear']);
foreach ($this->getProviders() as $externalService) {
foreach ($this->getClients() as $externalService) {
echo Html::beginTag('li', ['class' => 'auth-service']);
$this->providerLink($externalService);
echo Html::endTag('li');
......
......@@ -26,33 +26,46 @@ class ClientTraitTest extends TestCase
public function testSetGet()
{
$provider = new Client();
$client = new Client();
$id = 'test_id';
$provider->setId($id);
$this->assertEquals($id, $provider->getId(), 'Unable to setup id!');
$client->setId($id);
$this->assertEquals($id, $client->getId(), 'Unable to setup id!');
$name = 'test_name';
$provider->setName($name);
$this->assertEquals($name, $provider->getName(), 'Unable to setup name!');
$client->setName($name);
$this->assertEquals($name, $client->getName(), 'Unable to setup name!');
$title = 'test_title';
$provider->setTitle($title);
$this->assertEquals($title, $provider->getTitle(), 'Unable to setup title!');
$client->setTitle($title);
$this->assertEquals($title, $client->getTitle(), 'Unable to setup title!');
$userAttributes = [
'attribute1' => 'value1',
'attribute2' => 'value2',
];
$client->setUserAttributes($userAttributes);
$this->assertEquals($userAttributes, $client->getUserAttributes(), 'Unable to setup user attributes!');
$viewOptions = [
'option1' => 'value1',
'option2' => 'value2',
];
$client->setViewOptions($viewOptions);
$this->assertEquals($viewOptions, $client->getViewOptions(), 'Unable to setup view options!');
}
public function testGetDescriptiveData()
public function testGetDefaults()
{
$provider = new Client();
$this->assertNotEmpty($provider->getName(), 'Unable to get name!');
$this->assertNotEmpty($provider->getTitle(), 'Unable to get title!');
$this->assertNotEmpty($provider->getName(), 'Unable to get default name!');
$this->assertNotEmpty($provider->getTitle(), 'Unable to get default title!');
$this->assertNotNull($provider->getViewOptions(), 'Unable to get default view options!');
}
}
class Client extends Object implements ClientInterface
{
use ClientTrait;
public function authenticate() {}
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment