1

次の作業シナリオをエミュレートしようとしています。Cakephp ブログ投稿の編集段階で、Prev&Nextボタンを追加する必要があります。を押すNextと、現在のフォームが保存され、次のブログ投稿が編集モードで表示される必要があります。

私の編集フォームには次のものがあります。

//form create
echo $this->Html->link('Next', 
    array('controller' => 'posts', 'action' => 'next', $id, $nextId), 
    array('class' => 'btn', 'escape' => false)
  );
//inputs
//form submit

next()メソッドはPostsController次のようになります。

  <?php
  // ... 
  public function next($id = null, $nextId = null) {
    $this->Post->id = $id;
    if (!$this->Post->exists()) {
        throw new NotFoundException('Invalid id', 'info');
    }
  debug($this->request);
    //if ($this->request->is('post') || $this->request->is('put')) {
        if ($this->Post->save($this->request->data)) {
            $this->Session->setFlash('saved', 'ok');
            $this->redirect(
              array('controller'=>'posts', 
                    'action' => 'edit', 
                    $nextId));
        } else {
            $this->Session->setFlash('cant save', 'error');
        }
    //}
}

一見、request->data空で、理由がわかりません。次に、問題は次のとおりです。私の論理は大丈夫ですか? このアプローチを使用して問題を解決できますか?

より良い解決策を共有できますか?

4

2 に答える 2

1

@nahri は、前または次のリンクをクリックしてフォーム データを送信していないという点で正しいです。

シンプルにするために、フォーム内に複数の送信ボタンを含めて、データが送信されるようにする必要がありますが、適切な名前を付けて、コントローラーで要求を適切に処理できるようにする必要があります。

あなたの見解では:

echo $this->Form->submit('Next', array('name'=>'next'));
echo $this->Form->submit('Previous', array('name'=>'previous'));

コントローラーで

if($this->request->is('post') && (isset($this->data['next']) || isset($this->data['previous')) {
    // save post as draft...
    // then redirect 
    if(isset($this->data['next'])){
        $this->redirect(array('action' => 'next'));
    }else{
        $this->redirect(array('action' => 'previous'));
    }
}

上記のコードは、必要な機能を実装できる 1 つの方法の原則を示しているはずです。つまり、アプリケーション用にカスタマイズする必要があります。

フォームを実際に保存しているかのように (同じアクションに対しても) フォームを投稿していることに注意してください。唯一の違いは、前または次のボタンの存在がフォーム データに追加されることです。

これで期待どおりに動作しない場合は、フォームを AJAX でサーバーに戻し、JavaScript でウィンドウをリダイレクトする必要があると思います。

于 2013-04-28T11:20:46.357 に答える
0

フォームを送信していないため、$this->request->dataは空です。

次のようにできます。

$this->Form->create('YourModelName', array('action' => 'next'));

// here you want to include your $next value as a hidden form field
$this->Form->input('next', array('type' => 'hidden', 'value' => $next));

// rest of your form
//..  

$this->Form->end(__('Submit'));

次に、コントローラーでロジックを使用してデータを保存し、次の編集ページにリダイレクトできます。(値は になります$this->request->data['YourModelName']['next'])。

于 2013-04-28T10:02:19.783 に答える