Story.php 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. <?php
  2. namespace app\models\base;
  3. use app\models\StoryImages;
  4. use app\models\TopicImages;
  5. use Yii;
  6. use app\components\behaviors\CachedBehavior;
  7. /**
  8. * This is the model class for table "story".
  9. *
  10. * @property int $id
  11. * @property int|null $topic_id
  12. * @property string|null $title
  13. * @property string $meta_title
  14. * @property string $url
  15. * @property string|null $keywords
  16. * @property string $description
  17. * @property int $order
  18. * @property int $active
  19. * @property string $show
  20. * @property string $ext
  21. */
  22. class Story extends BaseFrontendClass
  23. {
  24. /*
  25. * Ключи кэширования для авто сброса
  26. */
  27. public static $keysCache=[
  28. 'archive_rubrics-Story-##' =>600,
  29. 'archive_news-Story-##' =>60,
  30. 'archive_rubrics-Story-' =>600,
  31. 'archive_news-Story-' =>60
  32. ];
  33. /**
  34. * @var string
  35. */
  36. public $photo;
  37. public static $story_dir = 'story-images';
  38. /**
  39. * {@inheritdoc}
  40. */
  41. public static function tableName()
  42. {
  43. return 'story';
  44. }
  45. /**
  46. * {@inheritdoc}
  47. */
  48. public function rules()
  49. {
  50. return [
  51. [['topic_id', 'order', 'active'], 'integer'],
  52. [['meta_title', 'url', 'description', 'title'], 'required'],
  53. [['keywords', 'show', 'ext'], 'string'],
  54. [['title'], 'string', 'max' => 255],
  55. [['meta_title'], 'string', 'max' => 70],
  56. [['url'], 'string', 'max' => 128],
  57. [['description'], 'string', 'max' => 300],
  58. ];
  59. }
  60. /**
  61. * {@inheritdoc}
  62. */
  63. public function attributeLabels()
  64. {
  65. return [
  66. 'id' => 'ID',
  67. 'topic_id' => 'Topic ID',
  68. 'title' => 'Title',
  69. 'meta_title' => 'Meta Title',
  70. 'url' => 'Url',
  71. 'keywords' => 'Keywords',
  72. 'description' => 'Description',
  73. 'order' => 'Order',
  74. 'active' => 'Active',
  75. 'show' => 'Show',
  76. 'ext' => 'Ext',
  77. ];
  78. }
  79. /**
  80. * {@inheritdoc}
  81. * @return StoryQuery the active query used by this AR class.
  82. */
  83. public static function find()
  84. {
  85. return new StoryQuery(get_called_class());
  86. }
  87. /**
  88. * {@inheritdoc}
  89. * @return StoryQuery the active query used by this AR class.
  90. */
  91. public function GetById($id)
  92. {
  93. return $this->find()->andWhere(['id'=>$id])->one();
  94. }
  95. public function beforeSave($insert)
  96. {
  97. if (!parent::beforeSave($insert)) {
  98. return false;
  99. }
  100. if( is_int($this->show) ){
  101. $this->show = ($this->show == 1)?'Y':'N';
  102. }
  103. return true;
  104. }
  105. /**
  106. * {@inheritdoc}
  107. * @return status.
  108. */
  109. public function del($id)
  110. {
  111. if( Yii::$app->user->can('admin') ){
  112. $name = basename($id."_*.*");
  113. $file = Yii::getAlias('@webroot').'/'.static::$story_dir."/$name";
  114. foreach (glob("$file") as $filename) {
  115. unlink($filename);
  116. }
  117. // to do удалить связи то же надобудет
  118. $this->delete();
  119. }
  120. }
  121. /**
  122. * {@inheritdoc}
  123. * @return status.
  124. */
  125. public function Show($id, $state = -1)
  126. {
  127. if( $state < 0 ){
  128. $this->show = ($this->show == 'Y')?'N':'Y';
  129. }else{
  130. $this->show = $state;
  131. }
  132. return $this->save();
  133. }
  134. /**
  135. * {@inheritdoc}
  136. * @return status.
  137. */
  138. public function Active($id, $state = -1)
  139. {
  140. if( $state < 0 ){
  141. $this->active = ($this->active == 1)?0:1;
  142. }else{
  143. $this->active = $state;
  144. }
  145. return $this->save();
  146. }
  147. public function search($search, $countList = 20)
  148. {
  149. $sql = "SELECT SQL_CALC_FOUND_ROWS *, MATCH (`title`,`keywords`) AGAINST ('$search') AS rang FROM ".Story::tableName().
  150. " WHERE MATCH (`title`,`keywords`) AGAINST ('$search' IN BOOLEAN MODE) ".
  151. " AND active > 0 ".
  152. " ORDER BY rang DESC LIMIT ".$countList*1;
  153. return $this->findBySql($sql, [':search' => $search, ':limit' => $countList])->all();
  154. }
  155. public function getForNews($id)
  156. {
  157. $sql = 'select r.topic_id as id, title, t.active as active, url from '.StoryRelation::tableName().' r , '.Story::tableName().' t '.
  158. 'where r.topic_id = t.id and r.news_id = '. $id.' order by `order`';
  159. return $this->findBySql($sql, [])->all();
  160. }
  161. /**
  162. * {@inheritdoc}
  163. * @return status.
  164. */
  165. public function saveImg($id, $file, $type)
  166. {
  167. $post = Yii::$app->request->post();
  168. $pcut = isset($post['cropping'])?$post['cropping']:false;
  169. $t = ['image/jpeg'=>'jpg','image/png'=>'png', 'image/webp'=>'webp']; //расширить допустимый список и вынести в общий класс
  170. if( isset( $t[$type] ) ){
  171. $ext = $t[$type];
  172. //загрузка временной фото на обработку
  173. $name = basename($id."_origin.".$ext);
  174. $file_tmp = Yii::getAlias('@webroot').'/'.static::$story_dir."/$name";
  175. if( move_uploaded_file($file, $file_tmp) ){
  176. // фото исходник для дальнейшей обработки
  177. $name = basename($id."_sizehd.jpg");
  178. $hdfile = Yii::getAlias('@webroot').'/'.static::$story_dir."/$name";
  179. if( $pcut ){
  180. $cut = ['x'=>round($pcut['x']), 'y'=>round($pcut['y']), 'w'=>round($pcut['width']), 'h'=>round($pcut['height'])];
  181. $this->generateImageCrop($file_tmp, $hdfile, 1920, 1080, $cut);
  182. }else{
  183. // без обрезки
  184. $this->generatePreview( $file_tmp, $hdfile, 1920, 1080);
  185. }
  186. //unlink($file_tmp); удалить оригинал или оставить?
  187. // фото на главную сюжета 1300х731
  188. $name = basename($id."_size1.webp");
  189. $ofile = Yii::getAlias('@webroot').'/'.static::$story_dir."/$name";
  190. $this->generatePreview( $hdfile, $ofile, 1300, 731);
  191. $name = basename($id."_size1.jpg");
  192. $ofile = Yii::getAlias('@webroot').'/'.static::$story_dir."/$name";
  193. $this->generatePreview( $hdfile, $ofile, 1300, 731);
  194. // фото на в ленту(можно отдавать поисковикам) сюжета 680x383
  195. $name = basename($id."_size2.webp");
  196. $ofile = Yii::getAlias('@webroot').'/'.static::$story_dir."/$name";
  197. $this->generatePreview( $file_tmp, $ofile, 680, 383);
  198. $name = basename($id."_size2.jpg");
  199. $ofile = Yii::getAlias('@webroot').'/'.static::$story_dir."/$name";
  200. $this->generatePreview( $file_tmp, $ofile, 680, 383);
  201. // size3 пропустим в текущем дизайне не применим
  202. // фото на в малая(можно отдавать в админку, инжекты и пр. лабудень) сюжета 320х180
  203. $name = basename($id."_size4.webp");
  204. $ofile = Yii::getAlias('@webroot').'/'.static::$story_dir."/$name";
  205. $this->generatePreview( $file_tmp, $ofile, 320, 180 );
  206. $name = basename($id."_size4.jpg");
  207. $ofile = Yii::getAlias('@webroot').'/'.static::$story_dir."/$name";
  208. $this->generatePreview( $file_tmp, $ofile, 320, 180 );
  209. return true;
  210. }
  211. }
  212. return false;
  213. }
  214. public function getImage(){
  215. return new StoryImages(["topic_id"=>$this->id]);
  216. }
  217. public function behaviors()
  218. {
  219. $keys = array_keys(self::$keysCache);
  220. return [
  221. 'CachedBehavior' => [
  222. 'class' => CachedBehavior::class,
  223. 'cache_key' => $keys,
  224. ]
  225. ];
  226. }
  227. }