Облако тегов Yii2 — Widget
Облако тегов для yii2 в простейшем примере. Widget TagCloud с выводом тегов разного размера в зависимости от популярности.
Если у Вас есть уже модуль управления тегами, то скорей всего есть уже и созданная база данных.
База данных у меня выглядит примерно так
1 2 3 4 5 6 7 8 9 10 11 | CREATE TABLE `yii2_tags` ( `id` int(11) NOT NULL, `name` varchar(128) CHARACTER SET utf8 NOT NULL, `frequency` int(11) DEFAULT '0' ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; INSERT INTO `admin_tags` (`id`, `name`, `frequency`) VALUES (1, 'tag1', 4), (8, 'tag11', 1), (9, 'tag111', 8), (4, 'tag1111', 1); |
Создадим модель для управления виджетом или добавим уже в существующую.
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 | <? namespace models; class Tag extends base\ActiveRecord { public static function tableName() { return 'yii2_tags'; } public function rules() { return [ ['name', 'required'], ['frequency', 'integer'], ['name', 'string', 'max' => 128], ]; } public function attributeLabels() { return [ 'id' => 'ID', 'title' => 'Title', ]; } public static function findTagFreq($limit = 20) { $models = Tag::find()->where(['>', 'frequency', 1])->orderBy(['frequency' => SORT_DESC])->limit($limit)->all(); $total = 0; foreach ($models as $model) { $total += $model->frequency; } $tags = []; if ($total > 0) { foreach ($models as $model) { $tags[$model->name] = 8 + (int) (40 * $model->frequency / ($total)); } ksort($tags); } return $tags; } } |
Далее создаем сам Widgets
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 | <? namespace widgets; use models\Tag; use Yii; use yii\helpers\Html; class TagCloud extends \yii\base\Widget { public $limit = 10; public function run() { //$tags = Tag::findTagFreq($limit); $tags = Tag::findTagFreq(); $str = ''; foreach ($tags as $tag => $weight) { $link = Html::a(Html::encode($tag), Yii::$app->getUrlManager()->createUrl(['/tags', 'id' => $tag])); $str .= Html::tag('span', $link, [ 'style' => "font-size:{$weight}px", ]) . "\n"; } return $str; } } |
Ну и в заключении вставляем этот виджет в view
1 2 3 | use widgets\TagCloud; <?=TagCloud::widget()?> |
Отлично! То что искал