yii2 advanced ต้องการ echo ชื่อของผู้ที่ Login เข้ามาให้แสดงในหน้าเพจ

3,072 สังคมนักพัฒนาระบบ (Community)

vR9ZJY.png

รบกวนสอบถามครับ พอดีได้ติดตั้งธีมใหม่(Adminlte) คราวนี้ต้องการแสดงชื่อของผู้ที่ทำการล็อกอินเข้ามาในระบบ และรูปภาพตามที่ผู้ใช้ได้ลงทะเบียนมา ไม่ทราบว่าต้องเขียนโค๊ดอย่างไรครับ

คำตอบ/อธิบาย

มานพ กองอุ่น

มานพ กองอุ่น

ตอบเมื่อ

<?=Yii::$app->user->identity->username?>

หากมีการสร้างตาราง profile ต่างหากก็

<?=Yii::$app->user->identity->profile->firstname?>

 

ตอบเมื่อ แก้ไขล่าสุดเมื่อ 15 มิ.ย. 2016, 17:19:45

แล้วถ้าต้องการคลิกปุ่มออกจากระบบแล้วให้ ไปสู่หน้า login 

คือตอนนี้เวลาคลิกปุ่มออกจากระบบแล้วมันยังอยู่หน้าเดิมคือต้องคลิกปุ่ม 2 ครั้งถึงจะ redirect ไปที่หน้า Login แล้วถ้าเราอยากจะให้คลิกครั้งเดียวแล้ว redirect ไปที่หน้า Login เลย(ในส่วนของ Frontend)  ต้องเขียนโค๊ดคำสั่งแบบไหนครับ อาจารย์

 

มานพ กองอุ่น

มานพ กองอุ่น

ตอบเมื่อ แก้ไขล่าสุดเมื่อ 15 มิ.ย. 2016, 23:50:52

ใน actionLogout()

return $this->redirect(['login']);

ใน view ที่ต้องการทำ ปุ่ม logout

<?=Html::a('ออกจากระบบ', ['/site/logout'],[
                'data' => [
                    'method' => 'post',
                ],
'class' => 'btn btn-success'
            ])?>

 

ตอบเมื่อ

อาจารย์ครับ ผมติดปัญหาอีกแล้วครับ พอดีผมสร้างตารางขึ้นมาใหม่ใช้ชื่อ ว่า Profile ข้างในก็จะมีรายละเอียดของบุคคล 

แต่พอตอนที่ User Login เข้ามาผมใช้ให้มันแสดง ชื่อ(firstname)  นามสกุล(lastname) จากตารางนี้ แต่พอใช้คำสั่งนี้ <?=Yii::$app->user->identity->profile->firstname?>

ระบบฟ้องว่า 

Unknown Property – yii\base\UnknownPropertyException

Getting unknown property: app\models\User::profile 

ผมต้องแก้อย่างไร รบกวนอาจารย์ช่วยชี้แนะด้วยครับ

มานพ กองอุ่น

มานพ กองอุ่น

ตอบเมื่อ

profile คือ relation สร้างใน User.php model ครับ

use common\models\Profile;

....
public function getProfile()
{
return $this->hasOne(Profile::className(), ['user_id' => 'id']);
}

 

ตอบเมื่อ

...ขอบคุณมากครับ อาจารย์...

 

ตอบเมื่อ

อาจารย์ครับ ผมมี 3 คำถามที่จะถามอาจารย์และให้อาจารย์ช่วยชี้แนะด้วยครับ

1. ผมได้ดูวีดีแล้วหัดทำตามอาจารย์ในส่วนของการแสดงรูปภาพในการดูโปรไฟล์ของแต่ละ User ปัญหา คือ เวลาที่ผมทำการแก้ไขหรือเปลี่ยนรูปภาพ แต่ภาพไม่เปลี่ยนตามด้วยยังแสดงที่ภาพเดิมอยู่ครับ ภาพไม่เปลี่ยน และเวลาแก้ไขภาพจะถูกเก็บอยู่ที่ด้านนอกโฟลเดอร์ที่ถูกกำหนดไว้ผมต้องแก้อย่างไรครับ (ภาพตัวอย่างตามลิงค์ด้านล่างครับ)

http://picture.in.th/id/80d7e740b4fcdff8ed0f1063c1151d30

http://picture.in.th/id/7fe0e0ccdfacb72b8b11cb4135acad59

และนี่คือ โค๊ดการแก้ไขข้อมูลครับ ผมผิดตรงไหนรบกวนอาจารย์ช่วยชี้แนะด้วยครับ

public function actionUpdate($id)
    {
        $model = $this->findModel($id);
        $user = $model->user;
        $oldpass = $user->password_hash;
        if ($model->load(Yii::$app->request->post()) && $user->load(Yii::$app->request->post())) {
            if ($oldpass!=$user->password_hash){
                $user->password_hash = Yii::$app->security->generatePasswordHash($user->password_hash);
            }
            if($user->save()){
                $file = UploadedFile::getInstance($model, 'profile_img');
                if(isset($file->size)&& $file->size!==0){
                    $file->saveAs('uploads/profile'.$user->id.'.'.$file->extension);
                }
                $model->save();
            }
            
            return $this->redirect(['view', 'id' => $model->user_id]);
        } else {
            return $this->render('update', [
                'model' => $model,
                'user' => $user,
            ]);
        }
    }

 

2. ถ้าผมต้องการที่จะให้ภาพของ User ที่ Login เข้ามาแล้วแสดงผมต้องเขียนโค๊ดกำหนดอย่างไร ดังลิงค์ภาพด้านล่างครับ

http://picture.in.th/id/7012367e6220aa1f96890dc5604815dc

 

 

3. ในโปรเจคงานของผมถ้าต้องการจะให้ User ต้อง Login เข้าระบบก่อนถึงจะเข้าหน้าเว็บไซต์นี้ได้ คือเป็นการ Redirect ไปที่หน้า Login เลยอ่ะครับผมต้องเขียนโค๊ดอย่างไร

************** 3 ข้อนี้ รบกวนอาจารย์ช่วยชี้แนะด้วยนะครับ ขอบพระคุณอย่างมาก*****************

 

มานพ กองอุ่น

มานพ กองอุ่น

ตอบเมื่อ

ข้อ 1 ต้องกำหนด Path ตอน save ภาพให้ถูกต้อง แนะนำ


//...
$filename = Yii::$app->user->getId().'.'.$file->extension;

$file->saveAs(Yii::getAlias('@web').'/uploads/profile/'.$filename);

$user->photo = $filename; //เก็บชื่อไฟล์
$user->save();
//...

ข้อ 2 ใช้การระบุ Path ให้ถูกต้องครับ

<?=Html::img(Yii::getAlias('@web').'/uploads/profile/'.Yii::$app->user->identity->photo);?>

ข้อ 3 กำหนด Access Control Filter ใน Controller โดยเพิ่ม behaviors() key access โดยเรียกใช้ AccessControl

public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::className(),
                'only' => ['logout', 'index', 'feedback', 'my-feedback'], //กำหนด action ที่ต้องการ กำหนด ACF
                'rules' => [

                    [
                        'actions' => ['logout', 'index', 'feedback', 'my-feedback'],//Action ที่ต้อง login
                        'allow' => true,
                        'roles' => ['@'], //สิทธิ์ต้อง login ก่อน
                    ],
                ],
            ],
            'verbs' => [
                'class' => VerbFilter::className(),
                'actions' => [
                    'logout' => ['post'],
                ],
            ],
        ];
    }

 

ตอบเมื่อ

เพิ่มโค๊ดไปแล้วครับในส่วนของการแก้ไขรูปภาพ แต่ระบบฟ้องว่า

PHP Warning – yii\base\ErrorException

move_uploaded_file(/checkgrade/web/uploads/profile/1.png): failed to open stream: No such file or directory

ผมต้องแก้อย่างไรครับ

มานพ กองอุ่น

มานพ กองอุ่น

ตอบเมื่อ

ไม่ได้เลือกไฟล์ ใช่ไหมครับ

ตอบเมื่อ

เลือกครับ ทำการเลือกไฟล์ใหม่ทั้งนามสกุล .jpg, .png, .gif แล้ว แต่ก็ยังเหมือนเดิมครับ

มานพ กองอุ่น

มานพ กองอุ่น

ตอบเมื่อ

$file->saveAs(Yii::getAlias('@webroot')........

 

ตอบเมื่อ แก้ไขล่าสุดเมื่อ 19 มิ.ย. 2016, 15:03:43

ได้แล้วครับ แต่รูปภาพเก่ายังคงอยู่ ยังไม่ถูกแทนที่ครับ

 

มานพ กองอุ่น

มานพ กองอุ่น

ตอบเมื่อ

ไม่น่ามีปัญหานะครับ ลองเปิดรูปขึ้นมาดูครับ หรือลองเอา code มาดูครับ

ตอบเมื่อ

http://picture.in.th/id/9f4a8afada8fadd23f66bad4e5435925

http://picture.in.th/id/efed680e9f7614a87d785ad8a19455b0

http://picture.in.th/id/388e0f59f2090d53df998aeda5f1d300

 

และนี่คือโค๊ดการแก้ไขครับ

 public function actionUpdate($id)
    {
        $model = $this->findModel($id);
        $user = $model->user;
        $oldpass = $user->password_hash;
        if ($model->load(Yii::$app->request->post()) && $user->load(Yii::$app->request->post())) {
            if ($oldpass!=$user->password_hash){
                $user->password_hash = Yii::$app->security->generatePasswordHash($user->password_hash);
            }
            if($user->save()){
                $file = UploadedFile::getInstance($model, 'profile_img');
                if(isset($file->size)&& $file->size!==0){
                    $filename = Yii::$app->user->getId().'.'.$file->extension; 
                    $file->saveAs(Yii::getAlias('@webroot').'/uploads/profile/'.$filename); 
                    $model->photo = $filename; //เก็บชื่อไฟล์
                   
                    
                }
                $model->save();
            }
            
            return $this->redirect(['view', 'id' => $model->user_id]);
        } else {
            return $this->render('update', [
                'model' => $model,
                'user' => $user,
            ]);
        }
    }

 

มานพ กองอุ่น

มานพ กองอุ่น

ตอบเมื่อ

คำถามคือรูปมันเปลี่ยนเป็นรูปใหม่หรือยังครับ ถ้าเปลี่ยนแล้วก็ OK ล่ะครับ และในฐานข้อมูลเป็นรูปใหม่ไหมครับ

ในกรณีนี้คือนามสกุลมันคนละนามสกุลกันครับ ถ้าจะใช้แทนที่ต้องเขียนโปรแกรมลบรูปเก่าก่อนครับ เพราะบางครั้งนามสกุลมันคนละนามสกุลกัน

unlink(Yii::getAlias('@webroot').'/uploads/profile/'.$model->photo);
$file->saveAs(Yii......

 

ตอบเมื่อ

ได้แล้วครับ ขอบคุณครับ

คารม ทรัพย์เจริญพันธ์

คารม ทรัพย์เจริญพันธ์

ตอบเมื่อ

อาจารย์ครับ error แบบนี้แก้ตรงไหนครับ

Unknown Property – yii\base\UnknownPropertyException

Setting unknown property: dektrium\user\Module::enableUnconfimedLogin