0

いくつかのINPUT要素にいくつかの値を設定しようとしていますが、コードが機能しません。以下のコードを参照してください。

<?php foreach($languages as $language): ?>
   $('input[name="product_description\\[<?php echo $language["language_id"]; ?>\\]\\[name\\]]"').val(data.items[0]['volumeInfo']['title']);
   $('input[name="product_description\\[<?php echo $language["language_id"]; ?>\\]\\[description\\]]"').val(data.items[0]['volumeInfo']['description']);
<?php endforeach ?>

HTMLマークアップは次のようになります。

<input type="text" value="" size="100" name="product_description[1][name]">

何が問題なのですか?jQueryはエラーを返さず、data.items [0] ['volumeInfo'] ['title']に値があるので、何が間違っているのでしょうか。

4

3 に答える 3

2

PHPブロック内にない文字をエスケープ解除しないでください。コードのその部分は処理されず、そのままブラウザーに渡されます。

<?php foreach($languages as $language): ?>
   $('input[name="product_description\[<?php echo $language["language_id"]; ?>\]\[name\]]"').val(data.items[0]['volumeInfo']['title']);
   $('input[name="product_description\[<?php echo $language["language_id"]; ?>\]\[description\]]"').val(data.items[0]['volumeInfo']['description']);
<?php endforeach ?>
于 2012-08-19T18:35:24.637 に答える
2

HTML、PHP、JavaScriptを4行に混在させないでください。

行数を減らすことは良いコードではなく、言語を混合することは悪いコードです。関心の分離に最善を尽くしてください。これにより、コードがモジュール化され、使いやすくなります。このようなエラーは、関心の分離が進んでいるコードでは発生しません。

最初に考える必要があるのは、「なぜ私はコードを何回も書くためにコードを書いているのですか?」です。

結局のところ、あなたはこれをさまざまなfooとbarの値で何度も実行しようとしています。

var inputElement = $('input[name="product_description[foo][bar]"]');
inputElement.val(data.items[0]['volumeInfo']['title']);

これは明らかにJavaScript関数(PHPコードではない)に適しています:

function fooBar(foo, bar) {
  var inputElement = $('input[name="product_description[' + foo + '][' + bar+ ']"]');
  inputElement.val(data.items[0]['volumeInfo'][bar]);
}

まだ最もクリーンではありませんが、JavaScriptが通過する単一のポイントがあります。

OK、これでデータをフィードする必要があります。これは、次のような配列がある場合に実行できます。

var baz = [{"language_id": "foo1"、 "barVal": "bar1"}、{"language_id": "foo2"、 "barVal": "bar2"}、{"language_id": "foo3"、 " barVal ":" bar3 "}、]

ねえ、あなたはPHPでそれを生成することができます:

json_encode($languages); //Assuming you've set up a value for barVal...

したがって、jQueryはそれをループする必要があります。

$.each(baz, function(key, val){
    fooBar(val["language_id"], val["barVal"]);
})

それで、あなたの全体はどのように見えるでしょうか?

//Whatever.php
var baz = <?php echo json_encode($languages); ?>;
function fooBar(foo, bar) {
  var inputElement = $('input[name="product_description[' + foo + '][' + bar+ ']"]');
  inputElement.val(data.items[0]['volumeInfo'][bar]);
}
$.each(baz, function(key, val){
    fooBar(val["language_id"], val["barVal"]);
})

私があなたのコードを見ていたいくつかの懸念...あなたは私があなたが何をしているのかを正確に理解するのに十分な情報を与えていませんでした。また、各値に「」を入れたくないのではないかと思いdata.items[0]['volumeInfo']ますが、それはあなたのコードが言っていることなので、私はそれを実行しました。上記のコードを見て、必要なことを実行するためのいくつかの方法を見つけることができるはずです。

本番環境では、変数foo、bar、baz、またはbuzを使用しないでください。これらは、たとえばコードのみのプレースホルダー名です。説明的な変数名を使用してください。これらの背後に隠された意味はありません(これまでに見たことがない場合)。

コードを混在させないでください。混合する場合は、懸念事項を可能な限り分離してください。エスケープ動作はjQueryAPIに文書化されていますが、PHPからのエスケープの複雑さのさらに別のレイヤーを追加すると、この苛立たしい状況に陥ります。これを行うことで、将来この痛みを回避できます。

このような入力値に名前と配列を使用することは、実際にはまったく理想的ではありません。jQueryとそれが構築されているネイティブDOMの両方のAPIのいくつかを読んで、より良い方法を見つけることができるかどうかを確認してください。それが存在します。タグウィキをチェックしてください、私はそれに素晴らしいコンテンツがあることを確認するために個人的に時間を費やしました。

最後に、私はこれをテストしたり、実行されていることを検証したりしませんでしたが、コード構造はあなたが従うべきものです。私はあなたのためにコードを書いているのではありません。あなたが6ヶ月でこれを維持しなければならないときにあなたの髪を無傷のままにする方法でこれを成し遂げるための構造をあなたに示しています。

幸運を。

于 2012-08-22T03:19:55.977 に答える
0

jQueryをよりよく使用するための重要なアドバイスにもかかわらず、より良いPHPも使用し、コンテキストの切り替えをあちこちで回避するのはどうでしょうか。それは厄介で読みづらく、(あなたの質問が示すように)句読点エラーにつながる可能性があります。

<?php

  $fmt="\$('input[name=\"product_description[%s][%s]]\"').val(data.items[0]['volumeInfo']['%s']);\n";

  foreach ($languages as $language) {
    printf($fmt, $language["language_id"], "name", "title");
    printf($fmt, $language["language_id"], "description", "description");
  }

?>

もちろん、テストされていません。

于 2012-08-19T19:31:58.170 に答える