* @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']); } }