1
|
|
|
<?php
|
2
|
|
|
/**
|
3
|
|
|
* @author Sergey Glagolev <[email protected]>
|
4
|
|
|
* @link https://github.com/shogodev/argilla/
|
5
|
|
|
* @copyright Copyright © 2003-2014 Shogo
|
6
|
|
|
* @license http://argilla.ru/LICENSE
|
7
|
|
|
* @package frontend.models
|
8
|
|
|
*
|
9
|
|
|
* @method static Banner model(string $class = __CLASS__)
|
10
|
|
|
*
|
11
|
|
|
* @property integer $id
|
12
|
|
|
* @property integer $position
|
13
|
|
|
* @property integer $location
|
14
|
|
|
* @property string $title
|
15
|
|
|
* @property string $url
|
16
|
|
|
* @property string $img
|
17
|
|
|
* @property integer $swd_w
|
18
|
|
|
* @property integer $swd_h
|
19
|
|
|
* @property string $code
|
20
|
|
|
* @property string $pagelist
|
21
|
|
|
* @property string $pagelist_exc
|
22
|
|
|
* @property boolean $new_window
|
23
|
|
|
* @property boolean $visible
|
24
|
|
|
*
|
25
|
|
|
* @property FSingleImage $image
|
26
|
|
|
*/
|
27
|
|
|
|
28
|
|
|
class Banner extends FActiveRecord
|
29
|
|
|
{
|
30
|
|
|
protected $banners;
|
31
|
|
|
|
32
|
|
|
protected $bannersUrl;
|
33
|
|
|
|
34
|
|
|
private static $bannerLocations;
|
35
|
|
|
|
36
|
3 |
|
public function behaviors()
|
37
|
|
|
{
|
38
|
|
|
return array(
|
39
|
3 |
|
'imageBehavior' => array('class' => 'SingleImageBehavior', 'path' => 'images'),
|
40
|
3 |
|
);
|
41
|
|
|
}
|
42
|
|
|
|
43
|
3 |
|
public function defaultScope()
|
44
|
|
|
{
|
45
|
3 |
|
$alias = $this->getTableAlias(false, false);
|
46
|
|
|
|
47
|
|
|
return array(
|
48
|
3 |
|
'condition' => $alias.'.visible=1',
|
49
|
3 |
|
'order' => $alias.'.position',
|
50
|
3 |
|
);
|
51
|
|
|
}
|
52
|
|
|
|
53
|
|
|
/**
|
54
|
|
|
* @param string $location
|
55
|
|
|
*
|
56
|
|
|
* @return Banner[]
|
57
|
|
|
*/
|
58
|
3 |
|
public function getByLocationAll($location)
|
59
|
|
|
{
|
60
|
3 |
|
$this->checkLocation($location);
|
61
|
|
|
|
62
|
3 |
|
if( !isset($this->banners[$location]) )
|
63
|
3 |
|
$this->banners[$location] = $this->findAllByAttributes(array('location' => $location));
|
64
|
|
|
|
65
|
3 |
|
return $this->banners[$location];
|
66
|
|
|
}
|
67
|
|
|
|
68
|
|
|
/**
|
69
|
|
|
* @param string $location
|
70
|
|
|
*
|
71
|
|
|
* @return Banner
|
72
|
|
|
*/
|
73
|
1 |
|
public function getByLocation($location)
|
74
|
|
|
{
|
75
|
1 |
|
return Arr::reset($this->getByLocationAll($location));
|
76
|
|
|
}
|
77
|
|
|
|
78
|
|
|
/**
|
79
|
|
|
* @param null|string $location
|
80
|
|
|
*
|
81
|
|
|
* @return mixed
|
82
|
|
|
*/
|
83
|
2 |
|
public function getByCurrentUrlAll($location = null)
|
84
|
|
|
{
|
85
|
2 |
|
$url = $this->getPrepareUrl(Yii::app()->controller->getCurrentUrl());
|
86
|
|
|
|
87
|
2 |
|
if( !isset($this->bannersUrl[$url]) )
|
88
|
2 |
|
{
|
89
|
|
|
/**
|
90
|
|
|
* @var Banner[] $banners
|
91
|
|
|
*/
|
92
|
2 |
|
if( isset($location) )
|
93
|
2 |
|
$banners = $this->getByLocationAll($location);
|
94
|
|
|
else
|
95
|
2 |
|
$banners = $this->findAll();
|
96
|
|
|
|
97
|
2 |
|
$this->bannersUrl[$location][$url] = array();
|
98
|
2 |
|
foreach($banners as $banner)
|
99
|
|
|
{
|
100
|
2 |
|
if( $this->containUrl($banner->pagelist, $url) && !$this->containUrl($banner->pagelist_exc, $url) )
|
101
|
2 |
|
$this->bannersUrl[$location][$url][] = $banner;
|
102
|
2 |
|
}
|
103
|
2 |
|
}
|
104
|
|
|
|
105
|
2 |
|
return $this->bannersUrl[$location][$url];
|
106
|
|
|
}
|
107
|
|
|
|
108
|
|
|
/**
|
109
|
|
|
* @param null|string $location
|
110
|
|
|
*
|
111
|
|
|
* @return mixed
|
112
|
|
|
*/
|
113
|
1 |
|
public function getByCurrentUrl($location = null)
|
114
|
|
|
{
|
115
|
1 |
|
return Arr::reset($this->getByCurrentUrlAll($location));
|
116
|
|
|
}
|
117
|
|
|
|
118
|
|
|
/**
|
119
|
|
|
* @param array $imageOptions
|
120
|
|
|
* @param array $linkOptions
|
121
|
|
|
*/
|
122
|
|
|
public function render($imageOptions = array(), $linkOptions = array())
|
123
|
|
|
{
|
124
|
|
|
$image = CHtml::image($this->image, '', $imageOptions);
|
125
|
|
|
|
126
|
|
|
if( $this->new_window )
|
127
|
|
|
$linkOptions['target'] = '_blank';
|
128
|
|
|
|
129
|
|
|
echo CHtml::link($image, $this->url, $linkOptions);
|
130
|
|
|
}
|
131
|
|
|
|
132
|
3 |
|
private function containUrl($urlList, $url)
|
133
|
|
|
{
|
134
|
3 |
|
if( empty($urlList) )
|
135
|
3 |
|
return false;
|
136
|
|
|
|
137
|
3 |
|
foreach(explode("\n", $urlList) as $searchPage)
|
138
|
|
|
{
|
139
|
3 |
|
$pattern = '#^'.str_replace('*', '.*', trim($searchPage)).'$#';
|
140
|
|
|
|
141
|
3 |
|
if( preg_match($pattern, $url, $matches) )
|
142
|
3 |
|
return true;
|
143
|
3 |
|
}
|
144
|
|
|
|
145
|
3 |
|
return false;
|
146
|
|
|
}
|
147
|
|
|
|
148
|
3 |
|
private function getPrepareUrl($url)
|
149
|
|
|
{
|
150
|
3 |
|
return preg_replace('/\?.*/', '', $url);
|
151
|
|
|
}
|
152
|
|
|
|
153
|
3 |
View Code Duplication |
private function checkLocation($location)
|
|
|
|
|
154
|
|
|
{
|
155
|
3 |
|
if( !self::$bannerLocations )
|
156
|
3 |
|
{
|
157
|
1 |
|
Yii::import('backend.modules.banner.BannerModule');
|
158
|
1 |
|
self::$bannerLocations = BannerModule::$bannerLocations;
|
159
|
1 |
|
}
|
160
|
|
|
|
161
|
3 |
|
if( !isset(self::$bannerLocations[$location]) )
|
162
|
3 |
|
throw new CHttpException(500, 'Location '.$location.' не указан в свойстве $bannerLocations класса BannerModule');
|
163
|
|
|
}
|
164
|
|
|
} |
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.
You can also find more detailed suggestions in the “Code” section of your repository.