Yii2 Senaryolar (Başlangıç)


        Bu yazıda bir önceki yazımda bahsettiğim bir problemden ve onu çözerken kullandığım Senaryolardan bahsedeceğim.

        Karşılaştığım problemi tekrar hatırlayacak olursak, Modelin kullandığı tabloda tutulmayan alanların, formlarda kullanılması halinde meydana gelebilecek hatalardı. Bir önceki yazıda oluşturduğumuz örnek üzerinden gidelim:
  • İlk olarak formda, veritabanında olmayan bir alan oluşturalım. Bunun için uygulama_adi/views/users/create.php dosyasını açıyoruz. Ve 
    <div class="users-create">

        <h1><?= Html::encode($this->title) ?></h1>

        <?= $this->render('_form', [
            'model' => $model,
        ]) ?>

    </div>

        Şeklinde olan div kısmının içerisine yine aynı dizinde olan _form.php dosyasındaki div kısmının içeriğini yapıştırıyoruz. Bu işlemi yapmamızın sebebi yeni alanlar ekleyerek sayfaları farklılaştırmak.  Bu işlemden sonra aşağıdaki sonucu elde ediyoruz:

<?php ActiveForm::end(); ?>

<div class="users-create">

    <h1><?= Html::encode($this->title) ?></h1>

    <?php $form = ActiveForm::begin(); ?>

    <?= $form->field($model, 'username')->textInput(['maxlength' => 50]) ?>
    <?= $form->field($model, 'password')->passwordInput(['maxlength' => 255]) ?>
    <?= $form->field($model, 'email')->textInput(['maxlength' => 255]) ?>
    <?= $form->field($model, 'cell_phone')->textInput(['maxlength' => 13]) ?>

    <div class="form-group">
        <?= Html::submitButton($model->isNewRecord ? 'Create' : 'Update',
        ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>

    </div>

    <?php ActiveForm::end(); ?>

</div>

        Veritabanından olmayan bir alan ekleyelim demiştik. Şimdi 'password' alanının altına şu kodu ekliyoruz:

    <?= $form->field($model, 'password_repeat')->passwordInput(['maxlength' => 255]) ?>
  • Form ile ilgili yapılacaklar bittikten sonra formda yaptığımız değişiklikleri Modele bildirmeye geldi sıra. Bu işlem için uygulama_adi/models/Users.php dosyasını açıyoruz:
class Users extends \yii\db\ActiveRecord
{
public static function tableName()
{
    return 'users';
}
public function rules()
{
    return [
        [['username', 'password', 'email', 'cell_phone', 'authKey'], 'required'],
        [['username'], 'string', 'max' => 50],
        [['password', 'email'], 'string', 'max' => 255],
        [['cell_phone'], 'string', 'max' => 13],
        [['username'], 'unique']
        ];
}


        Daha sonra eklediğimiz 'password_repeat' alanını modelde tanımlamamız gerekiyor. Bunu yaptıktan sonra rules() / kurallar kısmında kuralını belirtmemiz gerekir. Bu işlemleri yaptıktan sonra şöyle görünür:

class Users extends \yii\db\ActiveRecord
{
    public $password_repeat;    // Alanı tanımladık

public static function tableName()
{
    return 'users';
}
public function rules()
{
    return [
        [['username', 'email'], 'required'],
        [['username'], 'string', 'max' => 50],
                [['password', 'password_repeat'], 'required'],      // Password Repeat alanını gerekli kıldık
        [['password', 'email'], 'string', 'max' => 255],
        [['password_repeat'], 'compare', 'compareAttribute'=>'password',
                'message' => ('Passwords don\'t match')],   // Password Repeat alanının kurallarını belirledik.
        [['cell_phone'], 'string', 'max' => 13],
        [['username'], 'unique']
    ];
}

  • Bu gibi alanların artmasıyla yani diğer formlarda da ek alanlar kullanılmaya başlayınca veritabanınada bulunmayan bu alanları kaydetmek mümkün olmaz. Bu durumda Senaryolar kullanılır. 
  • Senaryo belirli durumlara göre kullanılan alanların değişmesi durumudur. Bu örneğe uygun bir senaryo eklemek istersek aynı yollarla update.php dosyasına da yeni alanlar eklediğimizi düşünelim ve buna uygun bir senaryo örneği oluşturalım: Model dosyamıza şu kodları ekliyoruz:

    public function scenarios()
    {
        $scenarios = parent::scenarios();
        $scenarios['create'] = ['username', 'password', 'password_repeat', 'email', 'cell_phone'];
        $scenarios['update'] = ['username', 'old_password', 'new_password', 'new_confirm', 'email', 'cell_phone'];
        return $scenarios;
    }
  • Burada create ve update için senaryoları oluşturup hangi senaryoda hangi alanlar aktif bunları belirliyoruz.
  • Belirledikten sonra uygulama_adi/controllers/UsersController.php dosyasında create ve update action'ları (metotları) içerisine bu senaryoları kullanması gerektiğini belirtiyoruz.
    • actionCreate içerisine aşağıdaki komutu yazıyoruz:
      • $model = new Users(['scenario' => 'create']);
    • actionUpdate içerisine de aşağıdaki komudu yazıyoruz:
      • $model = $this->findModel($id);
        if ($model !== null) {
                $model->scenario = 'update';
        }
        Her şey yolunda gitmişse tüm kayıtlarla doğru bir şekilde create ve update işlemi gerçekleştirilebilir. İyi çalışmalar.