Advertisement
  1. Code
  2. Yii

Membangun Startup Anda: Kontrol Akses, Hubungan Rekaman Aktif, dan Slug

Scroll to top
Read Time: 15 min
This post is part of a series called Building Your Startup With PHP.
Building Your Startup With PHP: Localization With I18n
Building Your Startup With PHP: User Settings, Profile Images and Contact Details

Indonesian (Bahasa Indonesia) translation by Ilham Saputra (you can also view the original English article)

Final product imageFinal product imageFinal product image
What You'll Be Creating

Ini adalah bagian ke lima dari seri Membangun Startup Anda Dengan PHP pada Tuts+. Dalam seri ini, saya memandu Anda melalui peluncuran startup dari konsep ke realitas menggunakan aplikasi Meeting Planner saya sebagai contoh kehidupan nyata. Setiap langkah di sepanjang jalan, kami akan merilis kode Perencana Pertemuan sebagai contoh sumber terbuka yang dapat Anda pelajari. Kami juga akan membahas masalah bisnis terkait startup saat muncul.

Semua kode untuk Perencana Pertemuan ditulis dalam Kerangka Yii2 untuk PHP. Jika Anda ingin mempelajari lebih lanjut tentang Yii2, periksa seri paralel kami Pemrograman dengan Yii2 di Tuts+.

Dalam tutorial ini, saya akan memandu Anda melalui lebih banyak fitur dari Kerangka Yii yang akan membuat kode manajemen tempat yang ada menjadi lebih kuat. Kami akan menerapkan kontrol akses sederhana Yii untuk memastikan bahwa hanya pengguna yang masuk menambahkan Tempat. Kami akan menggunakan hubungan Rekaman Aktif sehingga hanya menempatkan pengguna yang telah ditambahkan muncul pada pandangan mereka tentang halaman indeks tempat. Kami juga akan menggunakan perilaku licik Yii untuk menerapkan slugs URL-friendly untuk menampilkan tempat-tempat ini. Dan kita akan melakukan sedikit lebih banyak pembersihan dan memoles fitur Place.

Sekadar mengingatkan, saya berpartisipasi dalam rangkaian komentar di bawah ini. Saya terutama tertarik jika Anda memiliki pendekatan yang berbeda atau ide tambahan, atau jika Anda ingin menyarankan topik untuk tutorial selanjutnya. Saya juga menyambut permintaan fitur untuk Perencana Pertemuan.

Kontrol Akses

Kode yang kami tulis sejauh ini memungkinkan siapa pun untuk membuat tempat bahkan jika mereka belum masuk. Kami dapat menggunakan fitur kontrol akses sederhana Yii2 untuk memastikan bahwa pengguna mendaftar dan masuk sebelum menambahkan dan melihat tempat.

Yii2 juga menawarkan Role Based Access Control (RBAC) yang lebih canggih (dan kompleks) yang tidak akan kami terapkan saat ini.

Jika pengguna tidak masuk ketika mereka mengunjungi halaman tempat, Yii akan mengarahkan mereka ke halaman login.

Akses Kontrol bawaan Yii2 mendukung hanya dua peran secara default: tamu (tidak masuk), diwakili oleh '?', Dan diautentikasi, diwakili oleh '@'. Jika Anda tertarik, Kode Ninja membuat contoh bagus untuk memperluas ini untuk mendukung moderator dan administrator (Otorisasi Berdasarkan Peran Sederhana dalam Yii 2.0) tanpa harus menggunakan RBAC.

Kerangka kerja membuatnya cukup sederhana untuk menerapkan kontrol ini. Kami hanya menambahkan perilaku ke PlaceController.php yang menentukan aturan akses untuk setiap tindakan, misalnya. indeks, buat, lihat, dll. Di sini kami akan meninjau perilaku akses tetapi jika Anda tertarik, filter veri Yii memungkinkan Anda membatasi operasi http berdasarkan tindakan pengontrol Anda.

1
public function behaviors()
2
    {
3
        return [
4
            'verbs' => [
5
                'class' => VerbFilter::className(),
6
                'actions' => [
7
                    'delete' => ['post'],
8
                ],
9
            ],
10
            'access' => [
11
                        'class' => \yii\filters\AccessControl::className(),
12
                        'only' => ['index','create', 'create_geo','create_place_google','update','view','slug'],
13
                        'rules' => [
14
                            // allow authenticated users

15
                            [
16
                                'allow' => true,
17
                                'roles' => ['@'],
18
                            ],
19
                            // everything else is denied

20
                        ],
21
                    ],            
22
        ];
23
    }

Setelah ditambahkan, jika Anda mengklik menu Places, Anda akan dialihkan ke halaman login:

Meeting Planner Login PageMeeting Planner Login PageMeeting Planner Login Page

Yii juga menangani pengalihan kembali ke halaman indeks setelah login selesai.

Ketika pengguna mengakses halaman tempat, kita dapat menemukan pengguna saat ini dengan kode ini:

Yii::$app->user->getId();

Jadi, tepat sebelum tempat-tempat baru disimpan, kita dapat memperbarui bidang created_by ke pengguna yang saat ini login. Dan kita dapat mempercayai kontrol akses untuk memastikan metode pembuatan hanya diakses oleh pengguna yang diautentikasi:

1
    public function actionCreate()
2
    {
3
        $model = new Place();       
4
        if ($model->load(Yii::$app->request->post())) {
5
          $form = Yii::$app->request->post();
6
            $model->created_by= Yii::$app->user->getId();
7
            $model->save();

Hubungan Rekaman Aktif

Dalam Meeting Planner, saya ingin melacak pengguna mana yang pertama kali membuat tempat. Ini disimpan di bidang created_by. Kami juga ingin melacak tempat-tempat yang disarankan dan digunakan pengguna untuk pertemuan mereka, frekuensi penggunaan tempat, dan favorit mereka. Kami menggunakan tabel UserPlace untuk ini.

Sekarang kita tahu yang pengguna yang masuk ketika kita membuat tempat, kami ingin mengisi baris relasional dalam tabel UserPlace juga.

Pertama, kita perlu menggunakan generator kode Yii, Gii (http://localhost:8888/mp/index.php/gii/model), untuk membuat model untuk UserPlace:

Meeting Planner Yii2 Gii Model Generator User PlaceMeeting Planner Yii2 Gii Model Generator User PlaceMeeting Planner Yii2 Gii Model Generator User Place

Kemudian, ketika tempat berhasil ditambahkan, kami ingin membuat catatan di tabel UserPlace untuk pengguna aktif. Kami dapat memperpanjang Yii ActiveRecord dengan metode afterSave. Dalam model Place, kami menambahkan:

1
public function afterSave($insert,$changedAttributes)
2
    {
3
        parent::afterSave($insert,$changedAttributes);
4
        if ($insert) {
5
          $up = new UserPlace;
6
          $up->add($this->created_by,$this->id);
7
        } 
8
    }

Dalam model UserPlace, kami menambahkan fungsi:

1
// add place to user place list

2
    public function add($user_id,$place_id) {
3
        // check if it exists

4
        if (!UserPlace::find()
5
            ->where( [ 'user_id' => $user_id, 'place_id' => $place_id ] )
6
            ->exists()) {
7
              // if not, add it

8
              $up = new UserPlace;
9
              $up->user_id =$user_id;
10
              $up->place_id=$place_id;
11
              $up->save();  
12
            }            
13
    }

Ketika pengguna mengunjungi halaman indeks tempat, kami ingin hanya menampilkan tempat-tempat yang telah mereka gunakan, hanya yang ada di tabel UserPlace untuk pengguna itu.

Saya akan memandu Anda melalui dua cara berbeda untuk mencapai hal ini. Karena saya masih mendapatkan pengalaman dengan Yii2.x saat saya berjalan, spesifikasi pendekatan terbaik di sini adalah hal baru bagi saya. Saya ingin berterima kasih kepada Alex Makarov, pengembang Yii yang juga mengelola YiiFeed.com, untuk bantuannya. Baik dia dan pendiri Yii Qiang Xue telah sangat membantu dalam menjawab pertanyaan dan mendukung upaya saya dengan tutorial terkait Yii ini.

Pendekatan Sederhana

Cara termudah adalah dengan menggabungkan tabel Place dengan tabel UserPlace pada pemfilteran properti UserPlace.place_id di UserPlace.user_id dengan pengguna yang diautentikasi saat ini.

Berikut ini metode pengontrol indeks default:

1
public function actionIndex()
2
{
3
    $searchModel = new PlaceSearch();
4
    $dataProvider = $searchModel->search(Yii::$app->request->queryParams);
5
6
    return $this->render('index', [
7
        'searchModel' => $searchModel,
8
        'dataProvider' => $dataProvider,
9
    ]);
10
}

Kami akan membuat metode controller baru yang disebut Yours:

1
    public function actionYours() 
2
    {
3
      $query = Place::find()->joinWith('userPlaces')->where(['user_id' => Yii::$app->user->getId()]);
4
      $searchModel = new PlaceSearch();
5
      
6
         $dataProvider = new ActiveDataProvider([
7
             'query' => $query,
8
             'pagination' => ['pageSize' => 10],
9
         ]);
10
11
         return $this->render('yours',[
12
            'dataProvider' => $dataProvider,
13
            'searchModel'=>$searchModel,
14
         ]);
15
    }

Perhatikan bahwa joinWith('userPlaces') menggunakan kueri relasional yang dihasilkan Gii di Place.php — ini bisa sedikit membingungkan karena Anda menghilangkan awalan 'get':

1
    /**

2
     * @return \yii\db\ActiveQuery

3
     */
4
    public function getUserPlaces()
5
    {
6
        return $this->hasMany(UserPlace::className(), ['place_id' => 'id']);
7
    }

Kami juga perlu memodifikasi kelas PlaceSearch:

1
// add a required rule for created_by
2
public function rules()
3
    {
4
        return [
5
            [['created_by'], 'required'],        
6
7
// add the join within the search query
8
public function search($params)
9
    {
10
        $query = Place::find()->joinWith('user_place')->where(['user_id' => Yii::$app->user->getId()]);
11
        $dataProvider = new ActiveDataProvider([
12
            'query' => $query,
13
        ]);

Pendekatan Alternatif

Cara lain untuk menerapkan ini adalah melalui pengendali UserPlace. Lagi pula, kami melihat "tempat pengguna". Dalam hal ini kita dapat membuat sedikit modifikasi pada metode indeks kontroler Gii yang dihasilkan:

1
public function actionIndex()
2
    {
3
        $searchModel = new UserPlaceSearch();
4
        $searchModel->user_id = Yii::$app->user->getId();
5
        $dataProvider = $searchModel->search(Yii::$app->request->queryParams);
6
7
        return $this->render('index', [
8
            'searchModel' => $searchModel,
9
            'dataProvider' => $dataProvider,
10
        ]);
11
    }

Lalu di /views/user-place/index.php, kita perlu memodifikasi jalur tautan yang dihasilkan dan akses data model, misalnya. /place/create_place_google:

1
<p>
2
       <?= Html::a(Yii::t('frontend', 'Create {modelClass}', [
3
         'modelClass' => 'Place',
4
      ]), ['/place/create'], ['class' => 'btn btn-success']) ?>
5
      
6
      <?= Html::a(Yii::t('frontend','Add Current Location'), ['/place/create_geo'], ['class' => 'btn btn-success']) ?> 
7
      <?= Html::a(Yii::t('frontend','Add a Google {modelClass}',[
8
         'modelClass' => 'Place'
9
      ]), ['/place/create_place_google'], ['class' => 'btn btn-success']) ?> 
10
    </p>

Dalam widget Tampilan Grid, kami menggunakan relasi UserPlace ke tabel Place untuk menjangkau properti dari model terakhir, misalnya. $model->place->slug:

1
<?= GridView::widget([
2
        'dataProvider' => $dataProvider,
3
        //'filterModel' => $searchModel,

4
        'columns' => [
5
           // ['class' => 'yii\grid\SerialColumn'],

6
7
            [
8
                'attribute' => 'place_name',
9
                'format' => 'raw',
10
                'value' => function ($model) {                      
11
                            return '<div>'.$model->place->name.'</div>';
12
                    },
13
            ],
14
            [
15
                'attribute' => 'place_type',
16
                'format' => 'raw',
17
                'value' => function ($model) {                      
18
                            return '<div>'.$model->place->getPlaceType($model->place->place_type).'</div>';
19
                    },
20
            ],
21
            ['class' => 'yii\grid\ActionColumn',
22
    			      'template'=>'{view} {update} ',
23
					    'buttons'=>[
24
                'view' => function ($url, $model) {     
25
                  return Html::a('<span class="glyphicon glyphicon-eye-open"></span>', Yii::getAlias('@web').'/place/'.$model->place->slug, ['title' => Yii::t('yii', 'View'),]);	
26
						      },
27
                 'update' => function ($url, $model) {     
28
                    return Html::a('<span class="glyphicon glyphicon-pencil"></span>', Yii::getAlias('@web').'/place/update/'.$model->place_id, ['title' => Yii::t('yii', 'Update'),]);	
29
  						    }
30
							],
31
			      ],
32
        ],
33
    ]); ?>

Pendekatan UserPlace membutuhkan beberapa perubahan pada tautan di sekitar breadcrumbs, tautan aksi widget dan tombol perintah, tetapi masih cukup sederhana.

Jika Anda meninjau kode dalam rilis ini, Anda dapat melihat tempat pengguna dari keduanya: http://localhost:8888/mp/place/yours dan http://localhost:8888/mp/user-place. Sangat menarik untuk melihat bagaimana Anda dapat mencapai fungsi ini dengan dua pendekatan berbeda dalam Yii.

Slug

Setelah Anda mengaktifkan URL cantik dalam Kerangka Yii, halaman tampilan untuk objek model biasanya adalah sesuatu seperti http://meetingplanner.com/place/692, di mana 692 menunjukkan ID objek yang akan ditampilkan. Selain tidak mencolok bagi pengguna, itu juga kurang efektif dengan mesin pencari. Lebih baik menggunakan string ramah URL seperti http://meetingplanner.com/place/caffe-seattle. Senar kadang-kadang disebut sebagai slug. Yii2 menyediakan dukungan built-in untuk siput, dalam bentuk Sluggable Behaviors. Perilaku adalah bagian dari dukungan Rekaman Aktif Yii, dan mereka dapat diterapkan secara otomatis ke model objek data.

Dalam model tempat kami, kami menambahkan properti siput. Beginilah cara kami menerapkan Sluggable Behavior dalam model tempat:

1
public function behaviors()
2
    {
3
        return [
4
            [
5
                'class' => SluggableBehavior::className(),
6
                'attribute' => 'name',
7
                'immutable' => true,
8
                'ensureUnique'=>true,
9
            ],

Yii akan memastikan selama operasi save() bahwa slug field diisi dengan versi kolom nama yang ramah URL. Dengan kata lain, jika nama tempat adalah Oddfellows Cafe, siput akan menjadi oddfellows-cafe.

Properti immutable memastikan bahwa slug tidak pernah berubah meskipun nama yang ramah diedit. Ini berguna untuk menjaga tautan ke tempat-tempat serta referensi mesin pencari.

Properti ensureUnique menghasilkan slug unik dengan menambahkan indeks akhiran secara otomatis.

Generator kode otomatis Yii, Gii biasanya terhubung ke objek berdasarkan ID numerik. Kami ingin mengubah tautan ini untuk menggunakan siput. Ada dua tempat di mana kode ini ada.

Yang pertama adalah pada halaman indeks tempat di kolom tindakan grid. Anda dapat menyesuaikan tautan ini seperti ini di /frontend/views/places/index.php:

1
<?= GridView::widget([
2
        'dataProvider' => $dataProvider,
3
        'filterModel' => $searchModel,
4
        'columns' => [
5
            ['class' => 'yii\grid\SerialColumn'],
6
            'name',
7
            [
8
                'attribute' => 'place_type',
9
                'format' => 'raw',
10
                'value' => function ($model) {                      
11
                            return '<div>'.$model->getPlaceType($model->place_type).'</div>';
12
                    },
13
            ],
14
            ['class' => 'yii\grid\ActionColumn',
15
    			      'template'=>'{view} {update} ',
16
					    'buttons'=>[
17
                'view' => function ($url, $model) {     
18
                  return Html::a('<span class="glyphicon glyphicon-eye-open"></span>', 'place/'.$model->slug, ['title' => Yii::t('yii', 'View'),]);	
19
						      }
20
							],
21
			],
22
        ],
23
    ]); ?>

Tempat lainnya adalah di breadcrumbs:

Meeting Planner BreadcrumbsMeeting Planner BreadcrumbsMeeting Planner Breadcrumbs

Misalnya, di /frontend/views/place/update.php, kita perlu mengubah ini:

1
<?php
2
3
use yii\helpers\Html;
4
5
/* @var $this yii\web\View */
6
/* @var $model frontend\models\Place */
7
8
$this->title = Yii::t('frontend', 'Update {modelClass}: ', [
9
    'modelClass' => 'Place',
10
]) . ' ' . $model->name;
11
$this->params['breadcrumbs'][] = ['label' => Yii::t('frontend', 'Places'), 'url' => ['index']];
12
$this->params['breadcrumbs'][] = ['label' => $model->name, 'url' => ['view', 'id' => $model->id]];
13
$this->params['breadcrumbs'][] = Yii::t('frontend', 'Update');
14
?>

Mengganti kode ID tampilan untuk menggunakan slug:

1
...
2
$this->params['breadcrumbs'][] = ['label' => Yii::t('frontend', 'Places'), 'url' => ['index']];
3
$this->params['breadcrumbs'][] = ['label' => $model->name, 'url' => ['slug', 'slug' => $model->slug]];
4
$this->params['breadcrumbs'][] = Yii::t('frontend', 'Update');
5
...

Cleanup and Polish

Saat kami membangun Perencana Pertemuan, akan ada sprint kode untuk membuat fitur baru dan periode yang diperlukan untuk cleanup and polish. Ini mungkin merupakan siklus berulang.

Saya akan membahas beberapa skenario yang ingin saya bahas pada saat ini. Tentu saja, akan terus ada area pembersihan yang diperlukan selama kita membangun kode, mengambil umpan balik pengguna dan meningkatkan produk.

Memperluas Bar Navigasi

Yii2 terintegrasi dengan baik dengan Bootstrap, sehingga aplikasi Anda tampak hebat dan berjalan responsif langsung dari kotak. Jika Anda ingin membuat bilah navigasi dengan menu tarik-turun, akan sangat membantu jika Anda meninjau dokumentasi Bootstrap dan memahami penggunaan notasi array singkat dalam PHP oleh Yii2. Dokumentasi widget Yii2 Navbar tidak memberikan banyak contoh saat ini.

Saya memutuskan untuk mulai memperbarui navigasi Perencana Rapat dengan beberapa menu tarik-turun berdasarkan keadaan pengguna, misalnya. tamu atau dikonfirmasi.

Bootstrap Dropdown Menu in Meeting PlannerBootstrap Dropdown Menu in Meeting PlannerBootstrap Dropdown Menu in Meeting Planner

Berikut kode yang mengimplementasikan hal di atas—Saya yakin saya akan terus memodifikasinya saat kita mengikuti:

1
NavBar::begin([
2
    'brandLabel' => Yii::t('frontend','MeetingPlanner.io'), //

3
    'brandUrl' => Yii::$app->homeUrl,
4
    'options' => [
5
        'class' => 'navbar-inverse navbar-fixed-top',
6
    ],
7
]);
8
if (Yii::$app->user->isGuest) {
9
    $menuItems[] = ['label' => Yii::t('frontend','Signup'), 'url' => ['/site/signup']];
10
    $menuItems[] = ['label' => Yii::t('frontend','Login'), 'url' => ['/site/login']];
11
} else {    
12
  $menuItems = [
13
      ['label' => Yii::t('frontend','Places'), 'url' => ['/place/yours']],              
14
  ];	
15
}
16
$menuItems[]=['label' => Yii::t('frontend','About'),
17
	'items' => [
18
		['label' => Yii::t('frontend','Learn more'), 'url' => ['/site/about']],
19
		['label' => Yii::t('frontend','Contact'), 'url' => ['/site/contact']],
20
	],
21
];    
22
if (!Yii::$app->user->isGuest) {
23
	$menuItems[] = [
24
	            'label' => 'Account',
25
	            'items' => [
26
	                 [
27
	                    'label' => Yii::t('frontend','Contact information'),
28
	                    'url' => ['/user-contact'],
29
	                ],
30
	                 [
31
	                    'label' => Yii::t('frontend','Logout').' (' . Yii::$app->user->identity->username . ')',
32
	                    'url' => ['/site/logout'],
33
	                    'linkOptions' => ['data-method' => 'post']
34
	                ],
35
	            ],
36
	        ];				
37
}            			
38
echo Nav::widget([
39
    'options' => ['class' => 'navbar-nav navbar-right'],
40
    'items' => $menuItems,
41
]);
42
NavBar::end();

Memvalidasi Model dengan Tepat Sebelum Menyimpan

Saya menulis ulang tindakan pembuatan di PlaceController untuk memvalidasi model sebelum kami mencoba menambahkan relasi UserPlace. Ada beberapa kasus di mana data yang tidak valid dapat dikirimkan dan ini akan mematahkan upaya untuk menambah hubungan. Ini juga memastikan bahwa pengguna akan dikembalikan ke formulir dengan pesan kesalahan ramah ketika validasi gagal.

1
public function actionCreate()
2
    {
3
        $model = new Place();       
4
        if ($model->load(Yii::$app->request->post())) {
5
    		      $form = Yii::$app->request->post();
6
            if (!is_numeric($model->place_type)) {
7
               $model->place_type=Place::TYPE_OTHER;
8
            }
9
            $model->created_by= Yii::$app->user->getId();
10
            // validate the form against model rules
11
            if ($model->validate()) {
12
                // all inputs are valid
13
                $model->save();
14
                // lookup gps location from address
15
                $model->addLocationFromAddress($model,$form['Place']['full_address']); 
16
                return $this->redirect(['view', 'id' => $model->id]);
17
            } else {
18
                // validation failed
19
                return $this->render('create', [
20
                    'model' => $model,
21
                ]);
22
            }            
23
        } else {
24
            return $this->render('create', [
25
                'model' => $model,
26
            ]);
27
        }
28
    }

Mencegah Duplikat

Di kode pembuatan tempat awal kami, kami ingin melindungi terhadap duplikat. Tempat dapat memiliki nama yang identik, misalnya. ada banyak Starbucks Coffees (terlalu banyak), tetapi kami ingin mencegah tempat yang tepat dibuat dua kali, mis. Starbucks Coffee dengan Google Place ID identik atau nama dan alamat jalan yang identik.

Yii menawarkan validator model yang terintegrasi dengan ActiveForms untuk melakukan banyak pekerjaan ini bagi kami. Berikut adalah aturan yang akan kami tetapkan dalam model Place:

1
/**

2
     * @inheritdoc

3
     */
4
     public function rules()
5
     {
6
         return [
7
             [['name','slug'], 'required'],
8
             [['place_type', 'status', 'created_by', 'created_at', 'updated_at'], 'integer'],
9
             [['name', 'google_place_id', 'slug', 'website', 'full_address', 'vicinity'], 'string', 'max' => 255],
10
             [['website'], 'url'],
11
             [['slug'], 'unique'],
12
             [['searchbox'], 'unique','targetAttribute' => 'google_place_id'],             
13
             [['name', 'full_address'], 'unique', 'targetAttribute' => ['name', 'full_address']],
14
         ];
15
     }

Validator dapat menegakkan bidang dan jenis bidang dan panjang yang diperlukan. Mereka juga dapat memvalidasi URL seperti dengan bidang situs web di atas, alamat email, dan lainnya. Anda juga dapat menulis validator kustom.

Ada beberapa validator built-in khusus untuk keunikan. Misalnya, mereka dapat memvalidasi satu bidang keunikan seperti yang telah kita lakukan dengan bidang siput. Tetapi ada juga validator keunikan yang lebih kompleks.

Saat pengguna menambahkan tempat dengan Google Autocomplete, kami ingin menerapkan keunikan google_place_id yang dihasilkan di bidang tersembunyi tetapi kami ingin pesan kesalahan muncul di bidang searchbox. Definisi ini menyelesaikannya:

1
[['searchbox'], 'unique','targetAttribute' => 'google_place_id'],             

Kami juga ingin memastikan bahwa nama dan alamat itu unik bersama. Dengan kata lain, banyak tempat dapat memiliki nama yang sama atau alamat yang sama tetapi tidak ada tempat yang sama di kedua bidang. Definisi ini melakukan itu:

1
[['name', 'full_address'], 'unique', 'targetAttribute' => ['name', 'full_address']],

Tentu saja, banyak pengguna dapat menambahkan tempat yang sama ke daftar UserPlaces mereka.

Menghilangkan Penghapusan

Saya juga ingin melindungi dari penghapusan Tempat. Generator kode otomatis Yii, Gii, biasanya terhubung untuk menghapus operasi dari kisi indeks dan memperbarui halaman. Kami ingin menghapusnya. Dan kami ingin membatasi akses ke tindakan penghapusan dari pengontrol.

Berikut ini contoh halaman indeks tempat dengan ikon hapus:

Meeting Planner Place Index Page with Delete ActionMeeting Planner Place Index Page with Delete ActionMeeting Planner Place Index Page with Delete Action

Saat kami menyesuaikan tautan slug di atas, kami menghapus penggunaan default dari perintah delete.

Ngomong-ngomong, saya sangat menghargai penggunaan Bootstrap dan Glyphicons Yii. Mereka bekerja dengan indah.

Inilah halaman tampilan dengan tombol hapus:

Meeting Planner Update with Delete buttonMeeting Planner Update with Delete buttonMeeting Planner Update with Delete button

Untuk saat ini, mari komentar kode untuk tombol Delete di /frontend/views/place/view.php. Kami mungkin ingin menambahkannya kembali untuk administrator di beberapa titik.

1
         <?php /* Html::a(Yii::t('frontend', 'Delete'), ['delete', 'id' => $model->id], [

2
             'class' => 'btn btn-danger',

3
             'data' => [

4
                 'confirm' => Yii::t('frontend', 'Are you sure you want to delete this item?'),

5
                 'method' => 'post',

6
             ],

7
         ]) */ ?>

Mencegah Autocomplete Masukkan Submission Kunci

Saat saya membuat beberapa kode Geotokasi HTML5 dan Google Places terlengkapi otomatis, ada beberapa kesalahan yang muncul, beberapa terkait dengan JavaScript.

Misalnya, jika Anda mengklik tombol Enter setelah mengetik di bidang autocomplete, Google akan mengirimkan formulir. Kita perlu mengesampingkan ini.

Di create_place.js kami, kami menambahkan penangan kunci untuk menghentikan pengiriman formulir:

1
function setupListeners() { 
2
    // ...

3
    var place_input = document.getElementById('place-searchbox');
4
    google.maps.event.addDomListener(place_input, 'keydown', function(e) { 
5
        if (e.keyCode == 13) { 
6
            e.preventDefault();
7
        }
8
      });
9
}

Sekarang ketika Anda menekan Enter, Anda akan melihat peta di halaman dan dapat mengedit sisa formulir sebelum mengirimkan.

Create a Place from Google PlacesCreate a Place from Google PlacesCreate a Place from Google Places

Meninjau Manfaat Menggunakan Kerangka

Banyak orang berpikir PHP adalah platform yang kurang serius atau mampu untuk dikembangkan. Bagi saya, kesuksesan Facebook dengan PHP selamanya membuktikan mereka salah.

Banyak orang belum pernah mendengar tentang Kerangka Yii atau mengabaikan nilai kerangka kerja.

Tak lama setelah seri Startup ini, kami telah mendapatkan manfaat dari sejumlah besar fitur kerangka Yii—mempercepat pengembangan, memberikan arsitektur bersih dan kode kualitas:

  • Arsitektur MVC
  • migrasi database
  • Rekaman relasi dan validasi model aktif
  • pembuatan kode otomatis
  • Integrasi Bootstrap dan Glyphicons
  • filter kontrol akses
  • perilaku slug
  • internasionalisasi

Inilah mengapa saya menjadi pendukung utama untuk Kerangka Yii. Ini membuat saya menjadi pengembang yang jauh lebih efisien, yang mampu memberikan solusi jauh lebih cepat daripada saya menggunakan vanilla PHP.

Apakah berikutnya?

Pada tutorial selanjutnya Membangun Startup Anda Dengan PHP, kita akan membangun dukungan untuk pengaturan pengguna, kontak, dan gambar profil.

Silakan tambahkan pertanyaan dan komentar Anda di bawah ini; Saya biasanya berpartisipasi dalam diskusi. Anda juga dapat menghubungi saya di Twitter @reifman atau mengirim email kepada saya secara langsung.

Link Terkait

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.