- 1. 概要
- 2. 後付けでキーを設定
1. 概要
これ、うまく説明するのが難しいなぁ。
えっと、「form」の、記述内容を含め、数も条件によって変化させているのですね。
関数で生成しています。
「form」自体が「.blade.php」に直接記述しているものではないので、「@csrf」と書くわけにゃいかんのです。
かと言って
<input type="hidden" name="_token" value="...">
と書いても、「value」に記述するキーが、実際にコンテンツを表示する際に生成されるので、あらかじめ用意しておくことができない。
前ページの手法で、逃げることも考えましたが・・・。
工夫して、何とかすることができました。
2. 後付けでキーを設定
わたしの場合は、最低ひとつは「form」があったので、なんとかなりましたが、最低の1つがなくても、ダミーの「form」をあらかじめ静的に埋め込んでおきます。
名前を仮に「dummy」としておきましょうか。
「.blade.php」内に
<form name="dummy" action="" method="POST">
@csrf
</form>
と記述しておきます。
動的に生成する「form」の名称を仮に、「sample」としておきましょうか。
動的に生成する結果が下記のようになるようにします。
<form name="sample" action="" method="POST">
<input type="hidden" name="_token" value="">
・・・ 略 ・・・
</form>
「javascript」の関数を書いておきます。
function setCSRF()
{
var token = document.dummy._token.value;
document.forms['sample'].elements['_token'].value = token;
}
後は、「.blade.php」かテンプレートで記述している「body」の個所に
<body onload="setCSRF()">
と書いておけば、うまく設定されます。
「form」のネーミングルールだけきちんとしておけば、「javascript」の中に行を追加するだけで、なんとかなります。
あ、「dummy」とする「form」が必ず先頭になるようにしておけば、「document.forms」の要素数をうまいことコントロールすることで、うまくいくな。
function setCSRF()
{
var token = document.dummy._token.value;
for (let i=0; i<document.forms.length; i++)
{
document.forms[i].elements['_token'].value = token;
}
}
これで、いいや。
|