From 09985e121d7908f7b96d154fc893fb44cd9d91d1 Mon Sep 17 00:00:00 2001 From: Klimov Paul Date: Tue, 17 Mar 2015 14:22:00 +0200 Subject: [PATCH] `yii\authclient\GoogleSignInButton` created --- .../authclient/widgets/GoogleSignInButton.php | 150 ++++++++++++++++++ 1 file changed, 150 insertions(+) create mode 100644 extensions/authclient/widgets/GoogleSignInButton.php diff --git a/extensions/authclient/widgets/GoogleSignInButton.php b/extensions/authclient/widgets/GoogleSignInButton.php new file mode 100644 index 0000000000..ccbccde4db --- /dev/null +++ b/extensions/authclient/widgets/GoogleSignInButton.php @@ -0,0 +1,150 @@ + + * @since 2.0 + */ +class GoogleSignInButton extends Widget +{ + /** + * @var GoogleOAuth google auth client instance. + */ + public $client; + /** + * @var array button tag HTML options, which will be merged with the default ones. + */ + public $buttonHtmlOptions = []; + + /** + * @var string|array name of the JavaScript function, which should be used as sign-in callback. + * If blank default one will be generated: it will redirect page to the auth action using auth result + * as GET parameters. + * You may pass an array configuration of the URL here, which + * will be used creating default callback. + */ + private $_callback; + + /** + * @param string $callback + */ + public function setCallback($callback) + { + $this->_callback = $callback; + } + + /** + * @return string + */ + public function getCallback() + { + if (empty($this->_callback)) { + $this->_callback = $this->generateCallback(); + } elseif (is_array($this->_callback)) { + $this->_callback = $this->generateCallback($this->_callback); + } + return $this->_callback; + } + + /** + * Initializes the widget. + */ + public function init() + { + if (!($this->client instanceof GoogleOAuth)) { + throw new InvalidConfigException('"' . $this->className() . '::client" must be instance of "' . GoogleOAuth::className() . '"'); + } + } + + /** + * Runs the widget. + */ + public function run() + { + $this->registerClientScript(); + return $this->renderButton(); + } + + protected function generateCallback($url = null) + { + if (empty($url)) { + $url = ['auth', 'authclient' => $this->client->id]; + } + $url = Url::to($url); + if (strpos($url, '?') === false) { + $url .= '?'; + } else { + $url .= '&'; + } + + $callbackName = 'googleSignInCallback' . md5($this->id); + $js = <<view->registerJs($js, View::POS_END, __CLASS__ . '#' . $this->id); + + return $callbackName; + } + + /** + * Registers necessary JavaScript. + */ + protected function registerClientScript() + { + $js = <<view->registerJs($js, View::POS_END, __CLASS__); + } + + /** + * Renders sign-in button. + * @return string button HTML. + */ + protected function renderButton() + { + $buttonHtmlOptions = array_merge( + [ + 'class' => 'g-signin', + 'data-callback' => $this->getCallback(), + 'data-clientid' => $this->client->clientId, + 'data-cookiepolicy' => 'single_host_origin', + 'data-requestvisibleactions' => null, + 'data-scope' => $this->client->scope, + ], + $this->buttonHtmlOptions + ); + return Html::tag('span', Html::tag('span', '', $buttonHtmlOptions), ['id' => 'signinButton']); + } +} \ No newline at end of file