質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

解決済

1回答

2374閲覧

Cakephp2.8で、Formをネストする

urdapple

総合スコア83

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

0クリップ

投稿2020/01/27 03:04

編集2020/01/27 04:17

あるテーブルの一括更新を考えています。
Formタグがネストできないので、その方法を探しているのですが、Cakeのサイトでの説明ページ(https://book.cakephp.org/2/ja/core-libraries/helpers/form.html)では

バージョン 2.5 で変更: inline と block オプションが追加されました。これらは、リンクを返す代わりに 生成されたフォームタグのバッファリングができます。これは、ネストされたフォームタグを 避けることを助けます。 'inline' => true 設定は、 フォームタグを postLink コンテントブロックもしくは、 block オプションで指定したカスタムブロックに追加します。

とあり、Blockオプションを利用すれば、メインのフォーム外にうまくネストされたフォームを書いだしてくれるようなことが書かれています。
これを利用したいのですが、その方法がどこにも書かれておらず、利用方法をご存知の方おられましたらご教授ください。
以下、実際はとあるモデルのアソシエーション先を全一括更新させるような仕組みなのですが、通常のテーブルでも行全般の一括更新&個別行削除はありえるので、そうしています。

コントローラー

php

1$this->request->data = $this->Model->find('all');

ビュー

php

1echo $this->Form->create("Model名"); 2 3$i = 0; 4/* Model名のデータを一行づつ吐き出す */ 5foreach($this->request->data["Model名"] as $line) 6{ 7 echo "<div>"; 8 echo $this->Form->hidden('Model名." . $i . ".id'); 9 echo $this->Form->text("Model名." . $i . ".hoge"); 10 //▼この削除フォームが問題 11 $this->Form->postLink("削除", 12 [ 13 //第1引数でフォームaction先(URL)を指定 14 "action" => "delete", 15 $line["id"] 16 ], 17 [ 18 //第2引数:ここにBlockオプションを指定できそうなのですが、下記のように書くとbuttonタグの中に「block=true」と書かれるだけでした。 19 "block" => true //A 20 ]); 21 echo "</div>"; 22 $i++; 23} 24 25<?php echo $this->Form->end("更新"); ?>

ソースで見ると削除ボタンを削除Formタグが囲うように出力されており、全体を更新するFormの中に行の削除フォームが入っているように見えるのですが、ブラウザのデベロッパーツールで確認すると・・・
・最初の行のデリートフォームが存在しない
・最後の全体更新ボタンがフォーム外に出てしまっている
などの不具合があったため、予想通り動作せず困っております。

【追記】
いただいたコメントにより、そもそもフォームヘルパーのpostButtonを利用するのは不可能だとわかりました。
そうするとpostLinkを使うしか無いのですが、上記の通り「blockオプション」を利用すればできそうです。
しかしそれも詳細がわからず、普通に書くだけではFormにネストしたFormができてしまい、うまく動きません。
またcakephpの説明にあるようにBlockオプション(ソース中A行)を指定したところ、たしかに削除用のFormタグはすべて消えたのですが、削除で送信されるべきFormタグがどこにも書かれていないので、hrefに自動生成される"#"が効くだけで、同ページが再読込されるだけの状態です。
"block" => trueを指定した上で、何か別の場所にフォームを履く呪文が必要なのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

urdapple

2020/01/27 03:43

あぁ?! ホントですね・・・ 「そのため、この メソッドを開いているフォームの中では使わないでください。 開いているフォームの中でボタンを生成するには、代わりに FormHelper::submit() または FormHelper::button() を使ってください。」って書いてありました。 んじゃ結局FormLink使うしかなさそうですねぇ(;´Д`)
guest

回答1

0

自己解決

お騒がせしました。
"block" => true
ではなく
"inline" => false
にすることで、削除ボタンまわりのFormタグは消え、かつ全体のフォームの外にそのアンカーをクリックした時に動作するFormが自動で作成されました!
これで問題なく動作しました。
ありがとうございました。

投稿2020/01/27 04:34

urdapple

総合スコア83

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問