Story.php 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. <?php
  2. namespace app\models\base;
  3. use Yii;
  4. /**
  5. * This is the model class for table "story".
  6. *
  7. * @property int $id
  8. * @property int|null $topic_id
  9. * @property string|null $title
  10. * @property string $meta_title
  11. * @property string $url
  12. * @property string|null $keywords
  13. * @property string $description
  14. * @property int $order
  15. * @property int $active
  16. * @property string $show
  17. * @property string $ext
  18. */
  19. class Story extends BaseFrontendClass
  20. {
  21. /**
  22. * @var string
  23. */
  24. public $photo;
  25. public static $story_dir = 'story-images';
  26. /**
  27. * {@inheritdoc}
  28. */
  29. public static function tableName()
  30. {
  31. return 'story';
  32. }
  33. /**
  34. * {@inheritdoc}
  35. */
  36. public function rules()
  37. {
  38. return [
  39. [['topic_id', 'order', 'active'], 'integer'],
  40. [['meta_title', 'url', 'description', 'title'], 'required'],
  41. [['keywords', 'show', 'ext'], 'string'],
  42. [['title'], 'string', 'max' => 255],
  43. [['meta_title'], 'string', 'max' => 70],
  44. [['url'], 'string', 'max' => 128],
  45. [['description'], 'string', 'max' => 300],
  46. ];
  47. }
  48. /**
  49. * {@inheritdoc}
  50. */
  51. public function attributeLabels()
  52. {
  53. return [
  54. 'id' => 'ID',
  55. 'topic_id' => 'Topic ID',
  56. 'title' => 'Title',
  57. 'meta_title' => 'Meta Title',
  58. 'url' => 'Url',
  59. 'keywords' => 'Keywords',
  60. 'description' => 'Description',
  61. 'order' => 'Order',
  62. 'active' => 'Active',
  63. 'show' => 'Show',
  64. 'ext' => 'Ext',
  65. ];
  66. }
  67. /**
  68. * {@inheritdoc}
  69. * @return StoryQuery the active query used by this AR class.
  70. */
  71. public static function find()
  72. {
  73. return new StoryQuery(get_called_class());
  74. }
  75. /**
  76. * {@inheritdoc}
  77. * @return StoryQuery the active query used by this AR class.
  78. */
  79. public function GetById($id)
  80. {
  81. return $this->find()->andWhere(['id'=>$id])->one();
  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. public function search($search, $countList = 20)
  136. {
  137. $sql = "SELECT SQL_CALC_FOUND_ROWS *, MATCH (`title`,`keywords`) AGAINST (':search') AS rang FROM ".Story::tableName().
  138. " WHERE MATCH (`title`,`keywords`) AGAINST ('$search' IN BOOLEAN MODE) ".
  139. " AND active > 0 ".
  140. " ORDER BY rang DESC LIMIT ".$countList*1;
  141. return $this->findBySql($sql, [':search' => $search, ':limit' => $countList])->all();
  142. }
  143. public function getForNews($id)
  144. {
  145. $sql = 'select r.topic_id as id, title, t.active as active from '.StoryRelation::tableName().' r , '.Story::tableName().' t '.
  146. 'where r.topic_id = t.id and r.news_id = '. $id.' order by `order`';
  147. return $this->findBySql($sql, [])->all();
  148. }
  149. /**
  150. * {@inheritdoc}
  151. * @return status.
  152. */
  153. public function saveImg($id, $file, $type)
  154. {
  155. $post = Yii::$app->request->post();
  156. $pcut = isset($post['cropping'])?$post['cropping']:false;
  157. $t = ['image/jpeg'=>'jpg','image/png'=>'png']; //расширить допустимый список и вынести в общий класс
  158. if( isset( $t[$type] ) ){
  159. $ext = $t[$type];
  160. //загрузка временной фото на обработку
  161. $name = basename($id."_origin.".$ext);
  162. $file_tmp = Yii::getAlias('@webroot').'/'.static::$story_dir."/$name";
  163. if( move_uploaded_file($file, $file_tmp) ){
  164. // фото исходник для дальнейшей обработки
  165. $name = basename($id."_sizehd.jpg");
  166. $hdfile = Yii::getAlias('@webroot').'/'.static::$story_dir."/$name";
  167. if( $pcut ){
  168. $cut = ['x'=>round($pcut['x']), 'y'=>round($pcut['y']), 'w'=>round($pcut['width']), 'h'=>round($pcut['height'])];
  169. $this->generateImageCrop($file_tmp, $hdfile, 1920, 1080, $cut);
  170. }else{
  171. // без обрезки
  172. $this->generatePreview( $file_tmp, $hdfile, 1920, 1080);
  173. }
  174. //unlink($file_tmp); удалить оригинал или оставить?
  175. // фото на главную сюжета 1300х731
  176. $name = basename($id."_size1.webp");
  177. $ofile = Yii::getAlias('@webroot').'/'.static::$story_dir."/$name";
  178. $this->generatePreview( $hdfile, $ofile, 1300, 731);
  179. $name = basename($id."_size1.jpg");
  180. $ofile = Yii::getAlias('@webroot').'/'.static::$story_dir."/$name";
  181. $this->generatePreview( $hdfile, $ofile, 1300, 731);
  182. // фото на в ленту(можно отдавать поисковикам) сюжета 680x383
  183. $name = basename($id."_size2.webp");
  184. $ofile = Yii::getAlias('@webroot').'/'.static::$story_dir."/$name";
  185. $this->generatePreview( $hdfile, $ofile, 680, 383);
  186. $name = basename($id."_size2.jpg");
  187. $ofile = Yii::getAlias('@webroot').'/'.static::$story_dir."/$name";
  188. $this->generatePreview( $hdfile, $ofile, 680, 383);
  189. // size3 пропустим в текущем дизайне не применим
  190. // фото на в малая(можно отдавать в админку, инжекты и пр. лабудень) сюжета 320х180
  191. $name = basename($id."_size4.webp");
  192. $ofile = Yii::getAlias('@webroot').'/'.static::$story_dir."/$name";
  193. $this->generatePreview( $hdfile, $ofile, 320, 180 );
  194. $name = basename($id."_size4.jpg");
  195. $ofile = Yii::getAlias('@webroot').'/'.static::$story_dir."/$name";
  196. $this->generatePreview( $hdfile, $ofile, 320, 180 );
  197. return true;
  198. }
  199. }
  200. return false;
  201. }
  202. }