1

だから私はCakePHPを学んでいて、CakePHPがどのように機能するかを学ぶために、ストレートPHPで構築できる一連の基本的なアプリケーションを構築しようとしています。現在、私は基本的な注文管理システムに取り組んでいます-ユーザーは複数の注文を持つことができ、注文はユーザーに属します。

データベースをセットアップし、CakePHPを正しく構成しました(インストールしていないDebugKitを除いて、デフォルトのタイムゾーンやデータベース接続などのトピックごとに開始ページにすべて緑色が表示されます)。「ユーザーのリスト」ページもあります。

ここに画像の説明を入力してください

上のスクリーンショットで実際にわかるように、私が遭遇している問題は、/ users/edit_userで既存のユーザーを編集しようとしているときです。

ここに画像の説明を入力してください

ユーザーの編集内容を保存しようとしていますが、(1)$this->Form->hidden(...)IDに使用し、(2)モデルのテーブルの主キーに主キーを設定します。public $primaryKey = 'ID';

これをやろうとするたびに、既存のレコードを更新するのではなく、新しいレコードを挿入するだけで、PKを識別し、送信するIDを追加することで問題が解決すると思いましたが、何かが足りないはずです。

関連するページのコードは次のとおりです。

モデル

<?php
/**
 * app/Model/User.php
 *
 */
class User extends AppModel
{
    public $name = 'User';
    public $primaryKey = 'ID';

    // <hasMany>
    public $hasMany = array(
                            'Order' => array('dependent' => true)
                        );
}

?>

コントローラ

<?php
/**
 * app/Controller/UsersController.php
 *
 */
class UsersController extends AppController
{
    //public $scaffold;

    /* Validation */
    public $validate = array(
            'username' => array(
                    'required' => true,
                    'allowEmpty' => false,
                    'loginRule1' => array(
                        'rule' => 'alphaNumeric',
                        'message' => "Usernames must be alphanumeric!"
                                        ),
                    'loginRule2' => array(
                        'rule' => array('minLength', 4),
                        'message' => 'Usernames must be at least 4 characters.'
                                        ),
                                ),
            'password' => array(
                    'required' => true,
                    'allowEmpty' => false,
                    'passwordRule1' => array(
                        'rule' => array('minLength', 4),
                        'message' => 'Passwords must be between 4 and 8 characters.'
                                            ),
                    'passwordRule2' => array(
                        'rule' => array('maxLength', 8),
                        'message' => 'Passwords must be between 4 and 8 characters.'
                                            )
                                )
            );


    /* Actions */

    public function index()
    {
        // Grab all users
        $users = $this->User->find('all');

        // Set/Send users to View
        $this->set('users', $users);
    }

    public function new_user()
    {
        /* Has any Form data been POST'd? */
        if ($this->request->is('post'))
        {
            // Save User data to the DB
            $this->User->save($this->request->data);

            $this->redirect('/users');
        }
    }

    /*
        Accessing Args:
            (1) Direct URL Routing Method
                --> ...
            (2) Named Params Method
                --> CakeRequest['named']['[name]']
    */
    public function edit_user($id = null)
    {
        $id = $this->request['named']['currentID'];

        // Display the current data of the user
        if (!empty($id))
        {
            $userInfo = $this->User->find('all', 
                    array('conditions' => array('User.ID' => $id)));

            $this->set('userData', $userInfo);
        }
        else
            $this->set('error', '$id is empty!');

        /* Has any Form data been POST'd? */
        if ($this->request->is('post'))
        {
            // Save User data to the DB
            $this->User->save($this->request->data);

            $this->redirect('/users');
        }
    }
}

?>

View / Users / edit_user.ctp

<div class="row-fluid">

    <div class-"span12"></div>
    <div class="span12"></div>

    <div class="span8 offset2">

        <?php
            echo "Hidden ID Field Value: " . $userData[0]['User']['ID'];
            echo "<hr>";



            echo $this->Form->create('User');
            echo $this->Form->input('username');
                echo "  Current Name: " . 
                    $userData[0]['User']['username'];
            echo $this->Form->input('password');
                echo "  Current password: " . 
                    $userData[0]['User']['password'];

            // Hidden ID field to make save ~ an UDATE
            echo $this->Form->hidden('User', 
                    array('ID' => $userData[0]['User']['ID'],
                            'type' => 'hidden'));

            echo $this->Form->end('Save');

        ?>
    </div>

</div>

新しいレコードを挿入する代わりに、既存のレコードを編集/更新できるようになる、私が行っていないことを誰かが見ていますか?御時間ありがとうございます!

4

2 に答える 2

4

問題はおそらく、ここで使用されているForm要素のタイプに関係しています。私はあなたのファイルでこのようなものを試すことをお勧めし/View/Users/edit_user.ctpます:

// Hidden ID field to make save an UPDATE
echo $this->Form->input('id', array('type' => 'hidden'));

編集の保存の詳細については、CakePHPブログチュートリアルを参照してください。

于 2013-03-19T22:06:58.680 に答える
4

フォームに値をエコーする必要はありません。CakePHPはそれよりも賢いです。代わりにこれを行ってください:

<?php
class UsersController {

    public function edit($id) {
        if ($this->request->is('post')) {
            if ($this->User->save($this->request->data)) {
                $this->Session->setFlash('User successfully saved.');
                $this->redirect(array('action' => 'index'));
            }
        }
        else {
            $this->request->data = $this->User->findById($id);
        }
    }
}

次に、ビューに次のようなフォームを作成します。

<?php
    echo $this->Form->create('User');
    echo $this->Form->input('User.name');
    // and any other fields
    echo $this->Form->input('User.id', array('type' => 'hidden'));
    echo $this->Form->end('Save user');
?>

CakePHPは、フォームフィールドに内容に基づいた値を自動的に入力します$this->request->data

CakePHPクックブックのブログチュートリアルは、フレームワークとその概念を理解するための良い出発点です。

于 2013-03-19T22:12:29.083 に答える