NewsTopic.php 6.4 KB

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