forked from kartik-v/yii2-social
-
Notifications
You must be signed in to change notification settings - Fork 0
/
TwitterPlugin.php
131 lines (117 loc) · 4.06 KB
/
TwitterPlugin.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
<?php
/**
* @copyright Copyright © Kartik Visweswaran, Krajee.com, 2014
* @package yii2-social
* @version 1.3.0
*/
namespace kartik\social;
use Yii;
use yii\base\InvalidConfigException;
use yii\helpers\Html;
/**
* Widget to render various Twitter plugins
*
* Usage:
* ```
* echo TwitterPlugin::widget([
* 'screenName' => 'TWITTER_SCREEN_NAME',
* 'type' => TwitterPlugin::MENTION,
* 'settings' => ['size' => 'large']
* ]);
* ```
*
* @author Kartik Visweswaran <kartikv2@gmail.com>
* @since 1.0
*/
class TwitterPlugin extends Widget
{
const SHARE = 'twitter-share-button';
const FOLLOW = 'twitter-follow-button';
const HASHTAG = 'twitter-hashtag-button';
const MENTION = 'twitter-mention-button';
const TWEET = 'twitter-tweet';
/**
* @var string the Twitter plugin type
* defaults to Twitter Share (Tweet) button
*/
public $type = self::SHARE;
/**
* @var string the Twitter hash tag
* (to be used for hashtag button)
*/
public $hashTag;
/**
* @var string the Twitter screen name
* (to be used for follow, hashtag & mention buttons)
*/
public $screenName;
/**
* @var array the Twitter plugin settings
*/
public $settings = [];
/**
* Initialize the widget
*
* @throws InvalidConfigException
*/
public function init()
{
$this->validPlugins = [
self::SHARE,
self::FOLLOW,
self::HASHTAG,
self::MENTION,
self::TWEET,
];
parent::init();
$this->tag = ($this->type === self::TWEET) ? 'blockquote' : 'a';
$this->setConfig('twitter');
$this->settings['lang'] = $this->language;
if ($this->type === self::HASHTAG && empty($this->hashTag) && empty($this->options['data-href'])) {
throw new InvalidConfigException("The Twitter 'hashTag' must be set for displaying the 'hashtag' button.");
}
if (($this->type === self::FOLLOW || $this->type === self::HASHTAG || $this->type === self::MENTION) && empty($this->screenName) && empty($this->options['data-href'])) {
throw new InvalidConfigException("The Twitter 'screenName' must be set for displaying the " . str_replace('-', ' ', $this->type) . ".");
}
if ($this->type === self::TWEET && empty($this->content)) {
throw new InvalidConfigException("The Twitter 'content' must be set for displaying 'embedded tweets'.");
}
if (!isset($this->noscript)) {
$this->noscript = Yii::t('kvsocial', 'Please enable JavaScript on your browser to view the Twitter {pluginName} plugin correctly on this site.', ['pluginName' => Yii::t('kvsocial', str_replace('twitter-', '', $this->type))]
);
}
$this->registerAssets();
$this->setPluginOptions();
if ($this->type === self::FOLLOW) {
$this->options['href'] = 'https://twitter.com/' . Html::encode($this->screenName);
} elseif ($this->type === self::HASHTAG) {
$this->options['href'] = 'https://twitter.com/intent/tweet?button_hashtag=' . Html::encode($this->hashTag);
$this->options['data-related'] = empty($this->options['data-related']) ? $this->screenName : $this->screenName . ',' . $this->options['data-related'];
} elseif ($this->type === self::MENTION) {
$this->options['href'] = 'https://twitter.com/intent?screen_name=' . Html::encode($this->screenName);
}
echo $this->renderPlugin();
}
/**
* Registers the necessary assets
*/
protected function registerAssets()
{
$view = $this->getView();
$js = <<< SCRIPT
!function(d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0];
p = /^http:/.test(d.location) ? 'http' : 'https';
if (!d.getElementById(id)) {
js = d.createElement(s);
js.id = id;
js.src = p + '://platform.twitter.com/widgets.js';
fjs.parentNode.insertBefore(js, fjs);
}
}
(document, "script", "twitter-wjs");
SCRIPT;
$view->registerJs($js);
}
}
?>