ChatController.php 6.03 KB
<?php
    namespace frontend\controllers;
    
    use common\models\Chat;
    use common\models\Fields;
    use common\models\File;
    use common\models\Message;
    use Yii;
    use common\models\User;
    use yii\data\ActiveDataProvider;
    use yii\db\ActiveQuery;
    use yii\filters\AccessControl;
    use yii\helpers\ArrayHelper;
    use yii\web\Controller;
    use yii\web\NotFoundHttpException;
    use yii\web\UploadedFile;
    
    /**
     * Site controller
     */
    class ChatController extends Controller
    {
        public $defaultAction = 'list';
        
        public function behaviors()
        {
            return [
                'access' => [
                    'class' => AccessControl::className(),
                    'rules' => [
                        [
                            'actions' => [
                                'list',
                                'message',
                                'message-save',
                            ],
                            'allow'   => true,
                            'roles'   => [ '@' ],
                        ],
                    ],
                ],
            ];
        }
        
        public function actionList()
        {
            $user = \Yii::$app->user->identity;
            $chat = Chat::find()
                        ->where(
                            [
                                'or',
                                [ 'from_user' => $user->id, ],
                                [ 'to_user' => $user->id, ],
                            ]
                        )
                        ->with('messages.user');
            
            $chat = new ActiveDataProvider(
                [
                    'query'      => $chat,
                    'pagination' => [
                        'pageSize' => 5,
                    ],
                ]
            );
            
            return $this->render(
                'list',
                [
                    'chat' => $chat,
                ]
            );
        }
        
        public function actionMessage($user_id)
        {
            $user = \Yii::$app->user->identity;
            if ($user->getId() == $user_id) {
                return $this->redirect([ 'chat/list' ]);
            }
            
            $chat = Chat::find()
                        ->where(
                            [
                                'or',
                                [ 'from_user' => $user_id, ],
                                [ 'to_user' => $user_id, ],
                            ]
                        )
                        ->andWhere(
                            [
                                'or',
                                [ 'from_user' => $user->id, ],
                                [ 'to_user' => $user->id, ],
                            ]
                        )
                        ->with(
                            [
                                'messages' => function ($query) {
                                    /**
                                     * @var ActiveQuery $query
                                     */
                                    $query->orderBy([ 'date' => SORT_DESC ])
                                          ->with('user');
                                },
                            ]
                        )
                        ->one();
            if (!$chat instanceof Chat) {
                $chat = new Chat();
                $chat->from_user = $user->id;
                $chat->to_user = $user_id;
                $chat->save();
            }
            
            $phones = Fields::getData($chat->interlocutor->id, User::className(), 'phone');
            $sites = Fields::getData($chat->interlocutor->id, User::className(), 'site');
            
            $post = \Yii::$app->request->post();
            if (isset( $post )) {
                
                $message = new Message();
                
                if ($message->load($post, 'Message')) {
                    
                    $message->chat_id = $chat->chat_id;
                    $message->user_id = $user->id;
                    
                    $message->file = UploadedFile::getInstances($message, 'file');
                    
                    if (!empty( $message->file )) {
                        
                        if (is_array($message->file)) {
                            
                            foreach ($message->file as $file) {
                                
                                if ($file instanceof UploadedFile) {
                                    
                                    $file_model = new File();
                                    $file_id[] = $file_model->saveFile($file);
                                    
                                }
                                
                            }
                            
                        } else {
                            
                            if ($message->file instanceof UploadedFile) {
                                
                                $file_model = new File();
                                $file_id[] = $file_model->saveFile($message->file);
                            }
                            
                        }
                        
                        $message->files = json_encode($file_id);
                    }
                    
                    $message->save();
                    
                    return $this->redirect(
                        [
                            'chat/message',
                            'user_id' => $user_id,
                        ]
                    );
                    
                }
            }
            
            return $this->render(
                'message',
                [
                    'chat'    => $chat,
                    'user_id' => $user_id,
                    'phones'  => $phones,
                    'sites'   => $sites,
                ]
            );
        }
        
    }