Comments.php 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. <?php
  2. namespace app\models\base;
  3. use Yii;
  4. use app\helpers\Transliterator;
  5. use app\helpers\Avatar;
  6. use yii\db\ActiveRecord;
  7. use yii\helpers\Url;
  8. use app\models\CommentsConf;
  9. /**
  10. * @property string $id
  11. * @property string $comment_pull_id
  12. * @property string $message
  13. * @property \app\models\News | null $post
  14. * @property string $publishedAt
  15. * @property string $author
  16. * @property string $parent_id
  17. * @property string $fakename
  18. * @property string $liked
  19. */
  20. class Comments extends ActiveRecord
  21. {
  22. public static $conf = null;
  23. public static $story_dir = 'images/avatar-images';
  24. public $islike = false;
  25. public $merr = false;
  26. public static function tableName()
  27. {
  28. return "{{%comments}}";
  29. }
  30. public function init()
  31. {
  32. parent::init();
  33. self::$conf = \Yii::$app->cache->getOrSet(CommentsConf::$keysCache, function () {
  34. return CommentsConf::find()->one();
  35. });
  36. }
  37. public function getPost()
  38. {
  39. $sql = $this->hasOne(\app\models\News::class,['id'=>'news_id'])->createCommand()->getRawSql();
  40. return $this->hasOne(\app\models\News::class,['id'=>'news_id']);
  41. }
  42. public function getPublishedAt($simle = false){
  43. if( $simle ) return date( "H:i:s d-m-Y", strtotime( $this->created_at ) );
  44. if($this->created_at<date("Y-m-d H:i:s",strtotime("-1 day"))){
  45. return date("d",strtotime($this->created_at))." ".mb_strtolower(Transliterator::month(date("n",strtotime($this->created_at))));
  46. } else {
  47. $diff = ceil((time() - strtotime($this->created_at))/60); //В минутах
  48. if($diff<=60){
  49. return Transliterator::plural($diff,['минуту','минуты', 'минут'],true,'только что','минуту')." назад";
  50. } else {
  51. $diff = (int)floor($diff/60);
  52. return Transliterator::plural($diff,['час','часа', 'часов'],true,'только что','час')." назад";
  53. }
  54. }
  55. }
  56. public function beforeSave($insert)
  57. {
  58. if( $insert ){
  59. $this->merr = \app\models\CommentsFilter::test($this);
  60. if( $this->merr ) $this->visible = 'N';
  61. }
  62. return true;
  63. }
  64. public function afterSave($insert, $changedAttributes) {
  65. parent::afterSave($insert, $changedAttributes);
  66. if( $insert ){
  67. $news = \Yii::$app->db->createCommand('SELECT title FROM news WHERE id='.$this->news_id)->queryOne();
  68. $ntitle = '';
  69. if( $news && isset( $news['title'] ) ) $ntitle = $news['title'];
  70. $stat = ($this->visible == 'Y')?'green':'red';
  71. $tstat = ($this->visible == 'Y')?'Показывается':'Спрятано';
  72. $msg = "Fakename: <b>".$this->fakename."</b><br><br>Сообщение: <br>".$this->message."<br><br>IP: ".$this->ip_address."<br> HTTP_USER_AGENT: ".$this->user_agent
  73. ."<br>[".$this->created_at."]<br><br>"
  74. ."Статус:<p style='color:$stat'>".$tstat."(".$this->visible.")</p><br>"
  75. ."<b>".$this->merr."</b><br>"
  76. .'<br>Новость: <a href="https://www.amic.ru/news/'.$this->news_id.'">'.$ntitle.'/</a><br><br><hr>'
  77. .'<a href="https://www.amic.ru/manager/comments/toggle?id='.$this->id.'&value=N">Cкрыть</a><br>'
  78. .'<a href="https://www.amic.ru/manager/comments/toggle?id='.$this->id.'&value=Y">Показать</a><br>';
  79. \Yii::$app->mailer->compose()
  80. ->setFrom(\Yii::$app->params['senderEmail'])
  81. ->setTo(\Yii::$app->params['moderatorEmail'])
  82. ->setSubject('Сообщение с сайта amic.ru')
  83. // ->setTextBody('Текст сообщения')
  84. ->setHtmlBody($msg)
  85. ->send();
  86. }
  87. }
  88. public function getHash()
  89. {
  90. return md5($this->user_agent.'_'.$this->ip_address);
  91. }
  92. public function getAvatar()
  93. {
  94. $hash = $this->getHash();
  95. $name = "avatar_{$hash}.png";
  96. if( !file_exists( Yii::getAlias('@webroot').'/'.static::$story_dir."/$name" ) ){
  97. file_put_contents( Yii::getAlias('@webroot').'/'.static::$story_dir."/$name", Avatar::get($hash, 48) );
  98. }
  99. return "/".static::$story_dir."/$name";
  100. }
  101. // Возможно будет лучше в кэше или БД
  102. public function isUserLike($cid)
  103. {
  104. $session = \Yii::$app->session;
  105. if ($session->has('likeed_'.$cid)){
  106. return true;
  107. }
  108. return false;
  109. }
  110. public function setUserLike($nid, $cid)
  111. {
  112. $session = \Yii::$app->session;
  113. $session->set('likeed_'.$cid, $nid);
  114. $r = $session->get('likeedn_'.$nid);
  115. if( $r && is_array($r) ){
  116. array_push($r, $cid);
  117. }else{
  118. $r = [$cid];
  119. }
  120. $session->set('likeedn_'.$nid, $r);
  121. }
  122. public function getUserLike($nid)
  123. {
  124. $session = \Yii::$app->session;
  125. return $session->get('likeedn_'.$nid);
  126. }
  127. public function getAuthor()
  128. {
  129. // здесь ещё если есть профиль добавить проверку
  130. if( trim( $this->fakename ) ){
  131. return $this->fakename;
  132. }
  133. return "Гость";
  134. }
  135. }