0

私はアジャイルツールキットの「本」をフォローしていて、http://agiletoolkit.org/learn/app/authに到達しました。

提供されたコードを使用してみました:

class page_account extends Page {
    function init(){
        parent::init();

        $this->api->auth->check();

        $model = $this->add('Model_Customer');
        $model->getField('email')->system(true);
        $this->add('FormAndSave')->setModel($model)->loadData($this->api->auth->get('id'));
    }
}

しかし、それは私にモデルが設定されていないエラーを与えたので、FormAndSaveがどこから派生したかを知っているので、コードを次のように変更しました:

class page_account extends Page {
    function init(){
        parent::init();

        $this->api->auth->check();

        $model = $this->add('Model_Customer');

        $saveForm=$this->add('Form');

        $saveForm->setModel($model)->loadData($this->api->auth->get('id'));

        $saveForm->addSubmit();

        $saveForm->onSubmit(function($saveForm) {

        try {
            $saveForm->update()->js()->univ()->successMessage('Saved changes.')->execute();
        } catch(Exception $e) {
            $saveForm->js()->univ()->alert('Failed to save.')->execute();
        }
});

    }
}

これにより、少なくともデータを保存できますが、パスワードフィールドを表示できません。次の方法でモデルに追加できます。

$model = $this->add('Model_Customer');
$model->addField('password', 'password');

問題は、ハッシュ化されたパスワード(明らかにheh)が表示され、-> system(true)を追加するとパスワードが見えなくなることです。これはModel_Customerです:

class Model_Customer extends Model_Table {
    public $table='customer';

    function init() {
        parent::init();

        $this->addField('name');
        $this->addField('email');
    }
}

助けていただければ幸いです。説明があれば素晴らしいと思います。私はこのフレームワークを学んでおり、学べば学ぶほどよいでしょう。

現在、フォームには、ユーザーが自分のパスワードを編集するためのパスワードフィールドが表示されていません。その機能を実装するにはどうすればよいですか?私が言ったように、私がそれをモデルに再び追加するならば、私はフィールドを表示させることができます、しかしそれはあなたが本当に望むものではないハッシュされたパスワードを表示します。どうすればこれを適切に行うことができますか?

ありがとう!

更新:私はそれを機能させていますが、これが正しい方法か安全な方法かわかりません:

    class page_account extends Page {
    function init(){
        parent::init();

        $this->api->auth->check();

        $auth=$this->api->auth;

        $model = $this->add('Model_Customer');

        $model->addField('password')->type('password');

        $saveForm=$this->add('MVCForm');

        $saveForm->setModel($model)->loadData($this->api->auth->get('id'));

        $saveForm->set('password', '');

        $saveForm->addSubmit();

        if($saveForm->isSubmitted()){

            // Short-cuts
            $auth=$this->api->auth;
            $l=$saveForm->get('email');
            $p=$saveForm->get('password');

            if ($p) {
                // Manually encrypt password
                $enc_p = $auth->encryptPassword($p,$l);
                $saveForm->set('password', $enc_p);
            } else {
                $saveForm->set('password', $model->get('password'));
            }

            $saveForm->update()->js()->univ()->successMessage('Saved user information. ')->execute();
        }
    }
}

これにより、パスワードに空のフィールドが作成され、そこに何かを入力した場合にのみ更新されます。

4

1 に答える 1

1

確かではありませんが、それが正しい方法だと思います。それは機能し、セキュリティ上の問題は見当たりません。

class page_account extends Page {
    function init(){
        parent::init();

        $this->api->auth->check();

        $auth=$this->api->auth;

        $model = $this->add('Model_Customer');

        $model->addField('password')->type('password');

        $saveForm=$this->add('MVCForm');

        $saveForm->setModel($model)->loadData($this->api->auth->get('id'));

        $saveForm->set('password', '');

        $saveForm->addSubmit();

        if($saveForm->isSubmitted()){

            // Short-cuts
            $auth=$this->api->auth;
            $l=$saveForm->get('email');
            $p=$saveForm->get('password');

            if ($p) {
                // Manually encrypt password
                $enc_p = $auth->encryptPassword($p,$l);
                $saveForm->set('password', $enc_p);
            } else {
                $saveForm->set('password', $model->get('password'));
            }

            $saveForm->update()->js()->univ()->successMessage('Saved user information. ')->execute();
        }
    }
}
于 2012-08-24T20:38:17.840 に答える