News.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329
  1. <?php
  2. namespace app\models\base;
  3. use app\models\base\Image;
  4. use Yii;
  5. /**
  6. * This is the model class for table "news".
  7. *
  8. * @property int $id Уникальный id
  9. * @property string $uid uid
  10. * @property string $mark
  11. * @property string $alias символный URL
  12. * @property string $old_url
  13. * @property string $dt_pub дата публикации
  14. * @property string $dt_cr дата создания
  15. * @property string $dt_upd дата изменения
  16. * @property int $rev ревизия документа
  17. * @property string $title заг h1
  18. * @property string $lid лид
  19. * @property string $text содержание
  20. * @property string|null $meta_title meta title
  21. * @property string $author автор
  22. * @property string $show_author Показывать автора
  23. * @property string $editors редакторы
  24. * @property string $link URL редиректа
  25. * @property string $embed_url медиа вставка
  26. * @property string $photo_name имя фото файла
  27. * @property string $photo_title подпись фото
  28. * @property string $photo_include Показывать миниатюру
  29. * @property string $photo_rcol Показывать в доп колонке
  30. * @property string $active 0 не пуб. 1 - норм 2 - топ
  31. * @property string $verifed Проверено корректором
  32. * @property string $top в топ новости
  33. * @property string $NH Новость часа
  34. * @property string $comments Включать коменты
  35. * @property int $flags флаги бит маска
  36. * @property string $photo фотогалерея
  37. * @property string $video видео
  38. * @property string $audio аудио
  39. * @property int $export_rss не отдавать в Яндекс новости (mail,dzen,..) бит маска
  40. * @property string $noindex Не отдавать в поиск
  41. * @property int $type тип публикации
  42. * @property int $inscription подпись после статьи (на правах рекл. мед.)
  43. * @property string $old_gallery_title подпись к старым галереям
  44. * @property NewsTopic[] $topics
  45. */
  46. class News extends BaseFrontendClass
  47. {
  48. /**
  49. * @var bin
  50. */
  51. public $fdzen;
  52. public $fmail;
  53. public $commerc;
  54. public $mcommerc;
  55. public $pcommerc;
  56. public static $story_dir = 'images/news';
  57. /**
  58. * {@inheritdoc}
  59. */
  60. public static function tableName()
  61. {
  62. return '{{%news}}';
  63. }
  64. /**
  65. * {@inheritdoc}
  66. */
  67. public function rules()
  68. {
  69. return [
  70. [['title', 'lid'], 'required'],
  71. [['id', 'rev', 'flags', 'export_rss', 'type', 'inscription'], 'integer'],
  72. [['dt_pub', 'dt_cr', 'dt_upd'], 'safe'],
  73. [['title', 'lid', 'text', 'show_author', 'editors', 'embed_url', 'photo_name', 'photo_title', 'photo_include', 'photo_rcol', 'active', 'verifed', 'top', 'NH', 'comments', 'photo', 'video', 'audio', 'noindex', 'old_gallery_title'], 'string'],
  74. [['uid','mark'], 'string', 'max' => 36],
  75. [['alias', 'old_url', 'author', 'link'], 'string', 'max' => 255],
  76. [['meta_title'], 'string'],
  77. [['id'], 'unique'],
  78. ];
  79. }
  80. /**
  81. * {@inheritdoc}
  82. */
  83. public function attributeLabels()
  84. {
  85. return [
  86. 'id' => 'ID',
  87. 'uid' => 'Uid',
  88. 'alias' => 'Alias',
  89. 'old_url' => 'Old Url',
  90. 'dt_pub' => 'Dt Pub',
  91. 'dt_cr' => 'Dt Cr',
  92. 'dt_upd' => 'Dt Upd',
  93. 'rev' => 'Rev',
  94. 'title' => 'Title',
  95. 'lid' => 'Lid',
  96. 'text' => 'Text',
  97. 'meta_title' => 'Meta Title',
  98. 'author' => 'Author',
  99. 'show_author' => 'Show Author',
  100. 'editors' => 'Editors',
  101. 'link' => 'Link',
  102. 'embed_url' => 'Embed Url',
  103. 'photo_name' => 'Photo Name',
  104. 'photo_title' => 'Photo Title',
  105. 'photo_include' => 'Photo Include',
  106. 'photo_rcol' => 'Photo Rcol',
  107. 'active' => 'Active',
  108. 'verifed' => 'Verifed',
  109. 'top' => 'Top',
  110. 'NH' => 'Nh',
  111. 'comments' => 'Comments',
  112. 'flags' => 'Flags',
  113. 'photo' => 'Photo',
  114. 'video' => 'Video',
  115. 'audio' => 'Audio',
  116. 'export_rss' => 'Export Rss',
  117. 'noindex' => 'Noindex',
  118. 'type' => 'Type',
  119. 'inscription' => 'Inscription',
  120. 'old_gallery_title' => 'Old Gallery Title',
  121. ];
  122. }
  123. /**
  124. * {@inheritdoc}
  125. * @return status.
  126. */
  127. public function saveImg($id, $file, $type)
  128. {
  129. $post = Yii::$app->request->post();
  130. $pcut = isset($post['cropping'])?$post['cropping']:false;
  131. $t = ['image/jpeg'=>'jpg','image/png'=>'png', 'image/webp'=>'webp']; //расширить допустимый список и вынести в общий класс
  132. if( isset( $t[$type] ) ){
  133. $ext = $t[$type];
  134. //загрузка временной фото на обработку
  135. $name = basename($id."_origin.".$ext);
  136. $file_tmp = Yii::getAlias('@webroot').'/'.static::$story_dir."/news/$name";
  137. if( move_uploaded_file($file, $file_tmp) ){
  138. // фото исходник для дальнейшей обработки
  139. $name = basename($id."_sizehd.jpg");
  140. $hdfile = Yii::getAlias('@webroot').'/'.static::$story_dir."/news/$name";
  141. if( $pcut ){
  142. $cut = ['x'=>round($pcut['x']), 'y'=>round($pcut['y']), 'w'=>round($pcut['width']), 'h'=>round($pcut['height'])];
  143. $this->generateImageCrop($file_tmp, $hdfile, 1920, 1080, $cut);
  144. }else{
  145. // без обрезки
  146. $this->generatePreview( $file_tmp, $hdfile, 1920, 1080);
  147. }
  148. //unlink($file_tmp); удалить оригинал или оставить?
  149. // фото на главную сюжета 1300х731
  150. $name = basename($id."_size1.webp");
  151. $ofile = Yii::getAlias('@webroot').'/'.static::$story_dir."/webp/$name";
  152. $this->generatePreview( $hdfile, $ofile, 1300, 731);
  153. $name = basename($id."_size1.jpg");
  154. $ofile = Yii::getAlias('@webroot').'/'.static::$story_dir."/news/$name";
  155. $this->generatePreview( $hdfile, $ofile, 1300, 731);
  156. // фото на НЧ 841x473
  157. $name = basename($id."_size5.webp");
  158. $ofile = Yii::getAlias('@webroot').'/'.static::$story_dir."/webp/$name";
  159. $this->generatePreview( $hdfile, $ofile, 841, 473);
  160. $name = basename($id."_size5.jpg");
  161. $ofile = Yii::getAlias('@webroot').'/'.static::$story_dir."/news/$name";
  162. $this->generatePreview( $hdfile, $ofile, 841, 473);
  163. // фото на в ленту(можно отдавать поисковикам) сюжета 680x383
  164. $name = basename($id."_size2.webp");
  165. $ofile = Yii::getAlias('@webroot').'/'.static::$story_dir."/webp/$name";
  166. $this->generatePreview( $hdfile, $ofile, 680, 383);
  167. $name = basename($id."_size2.jpg");
  168. $ofile = Yii::getAlias('@webroot').'/'.static::$story_dir."/news/$name";
  169. $this->generatePreview( $hdfile, $ofile, 680, 383);
  170. $name = basename($id."_size3.webp");
  171. $ofile = Yii::getAlias('@webroot').'/'.static::$story_dir."/webp/$name";
  172. $this->generatePreview( $hdfile, $ofile, 500, 282);
  173. $name = basename($id."_size3.jpg");
  174. $ofile = Yii::getAlias('@webroot').'/'.static::$story_dir."/news/$name";
  175. $this->generatePreview( $hdfile, $ofile, 500, 282);
  176. // size3 пропустим в текущем дизайне не применим
  177. // фото на в малая(можно отдавать в админку, инжекты и пр. лабудень) сюжета 320х180
  178. $name = basename($id."_size4.webp");
  179. $ofile = Yii::getAlias('@webroot').'/'.static::$story_dir."/webp/$name";
  180. $this->generatePreview( $hdfile, $ofile, 320, 180 );
  181. $name = basename($id."_size4.jpg");
  182. $ofile = Yii::getAlias('@webroot').'/'.static::$story_dir."/news/$name";
  183. $this->generatePreview( $hdfile, $ofile, 320, 180 );
  184. $name = basename($id.".jpg");
  185. $ofile = Yii::getAlias('@webroot').'/'.static::$story_dir."/news/$name";
  186. $this->generatePreview( $hdfile, $ofile, 94, 94, ['sharpen' => '10 -enhance -gravity center -crop 94x94+0+0 +repage'] );
  187. return $file_tmp;
  188. }
  189. }
  190. return false;
  191. }
  192. /**
  193. * {@inheritdoc}
  194. * @return status.
  195. */
  196. public function deleteImg($id)
  197. {
  198. $img = ["_origin.png", "_origin.jpeg", "_origin.jpg", "_sizehd.jpg", "_size1.webp", "_size1.jpg", "_size2.webp", "_size2.jpg", "_size3.webp", "_size3.jpg", "_size4.webp", "_size4.jpg", ".jpg"];
  199. foreach( $img as $prefix ){
  200. $name = basename($id.$prefix);
  201. if( strpos( $prefix, 'webp' ) === false ){
  202. $file = Yii::getAlias('@webroot').'/'.static::$story_dir."/news/$name";
  203. }else{
  204. $file = Yii::getAlias('@webroot').'/'.static::$story_dir."/webp/$name";
  205. }
  206. @unlink( $file );
  207. }
  208. }
  209. public function Active($id, $state = -1)
  210. {
  211. if( $state < 0 ){
  212. $this->active = ($this->active == 'Y')?'N':'Y';
  213. }else{
  214. $this->active = $state;
  215. }
  216. return $this->save(false);
  217. }
  218. public function NH($id, $state = -1)
  219. {
  220. if( $state < 0 ){
  221. $this->NH = ($this->NH == 'Y')?'N':'Y';
  222. }else{
  223. $this->NH = $state;
  224. }
  225. return $this->save(false);
  226. }
  227. public function KD($id, $state = -1)
  228. {
  229. if( $state < 0 ){
  230. $this->top = ($this->top == 'Y')?'N':'Y';
  231. }else{
  232. $this->top = $state;
  233. }
  234. return $this->save(false);
  235. }
  236. /**
  237. * {@inheritdoc}
  238. * @return NewsQuery the active query used by this AR class.
  239. */
  240. public static function find()
  241. {
  242. return new NewsQuery(get_called_class());
  243. }
  244. /**
  245. * @return \yii\db\ActiveQuery
  246. */
  247. public function getTopicRelations()
  248. {
  249. return $this->hasMany(NewsTopicRelation::class,['news_id'=>'id']);
  250. }
  251. /**
  252. * @return \yii\db\ActiveQuery
  253. */
  254. public function getTopics()
  255. {
  256. return $this->hasMany(NewsTopic::class,['id'=>'topic_id'])->via('topicRelations');
  257. }
  258. /**
  259. * @return \yii\db\ActiveQuery
  260. */
  261. public function getTagsRelations()
  262. {
  263. return $this->hasMany(TagsRelation::class,['news_id'=>'id']);
  264. }
  265. /**
  266. * @return \yii\db\ActiveQuery
  267. */
  268. public function getTags()
  269. {
  270. return $this->hasMany(Tags::class,['id'=>'topic_id'])->via('tagsRelations');
  271. }
  272. /**
  273. * @return \yii\db\ActiveQuery
  274. */
  275. public function getStoryRelations()
  276. {
  277. return $this->hasMany(StoryRelation::class,['news_id'=>'id']);
  278. }
  279. public function isAmicPhoto()
  280. {
  281. return (bool) ($this->flags & 2);
  282. }
  283. /**
  284. * @return \yii\db\ActiveQuery
  285. */
  286. public function getStories()
  287. {
  288. return $this->hasMany(Story::class,['id'=>'topic_id'])->via('storyRelations');
  289. }
  290. /**
  291. * @return \yii\db\ActiveQuery
  292. */
  293. public function getStory()
  294. {
  295. return $this->hasMany(Story::class,['id'=>'topic_id'])->via('storyRelations');
  296. }
  297. /**
  298. * @return Image
  299. */
  300. public function getImage($type="webp"):Image
  301. {
  302. return Image::findOne($this->id,$type,$this->photo_name);
  303. }
  304. }