Dies ist meine erste Frage zu StackOverflow und ich betrachte mich als Anfänger (Autodidakt). Bitte bei mir tragen.

Das folgende Skript funktioniert auf der Seite, wenn es nicht in PHP-Tags eingeschlossen ist.

<script>
  var json = '{"submitted_values":{"15":{"15.1":"123"}}}';
var obj = JSON.parse(json);

function printValues(obj) {
  for (var k in obj) {
    if (obj[k] instanceof Object) {
      printValues(obj[k]);
    } else {
      document.write(obj[k]);
    };
  }
};
document.write(obj["submitted_values"]["15"]["15.1"]);
</script>

Das gleiche Skript funktioniert nicht auf der Seite, wenn es in PHP-Tags eingeschlossen ist und wiedergegeben wird.

Es stürzt tatsächlich die Website ab.

Die zweite Zeile var json = '{"submitted_values":{"15":{"15.1":"123"}}}'; im nächsten Codeblock führt zu syntax error, unexpected ':'.

<?php echo '<script>
  var json = '{"submitted_values":{"15":{"15.1":"123"}}}';
var obj = JSON.parse(json);

function printValues(obj) {
  for (var k in obj) {
    if (obj[k] instanceof Object) {
      printValues(obj[k]);
    } else {
      document.write(obj[k]);
    };
  }
};
document.write(obj["submitted_values"]["15"]["15.1"]);
</script>'; ?>

Im Folgenden wird beschrieben, was ich zum Arbeiten bringen möchte.

Der Test besteht aus einer Tabellenzeile mit drei Spalten.

Spalte 1 im nächsten Codeblock ist das Skript von oben und funktioniert natürlich nicht.

Spalte 2 funktioniert und führt zu einer Zeichenfolge, in der document.write(obj["submitted_values"]["15"]["15.1"]); im Skript funktioniert. Ich habe eine tatsächliche (aufwändige, verschachtelte) Zeichenfolge getestet, und sie funktioniert nur, wenn sie sich außerhalb von PHP-Tags befindet.

Spalte 3 ist das Skript von oben, wobei jedoch '{"submitted_values":{"15":{"15.1":"123"}}}' durch ' . esc_html($incomplete_submission->submission) . ' ersetzt wird.

Col 3 ist das, was ich letztendlich im WordPress-Plugin arbeiten möchte.

Wenn dies möglich ist, wird jemand freundlicherweise von echo '<!-- Col 3 --><td><script> in den folgenden Codeblock kopieren, den Code so ändern, dass er funktioniert, und alles in eine Antwort einfügen?

Ich bitte darum, dass das Ganze eingefügt wird, weil es Ihnen möglicherweise zusätzliches Hin und Her erspart.

Vielen Dank!

<?php
foreach ($incomplete_submissions as $incomplete_submission)
{
 echo '<!-- Row --><tr>';
 echo '<!-- Col 1 --><td><script>
    var json = '{"submitted_values":{"15":{"15.1":"123"}}}';
var obj = JSON.parse(json);

function printValues(obj) {
    for (var k in obj) {
        if (obj[k] instanceof Object) {
            printValues(obj[k]);
        } else {
            document.write(obj[k]);
        };
    }
};
document.write(obj["submitted_values"]["15"]["15.1"]);
</script></td>';
    echo '<!-- Col 2 --><td>' . esc_html($incomplete_submission->submission) . '</td>';
    echo '<!-- Col 3 --><td><script>
    var json = ' . esc_html($incomplete_submission->submission) . ';
var obj = JSON.parse(json);

function printValues(obj) {
    for (var k in obj) {
        if (obj[k] instanceof Object) {
            printValues(obj[k]);
        } else {
            document.write(obj[k]);
        };
    }
};
document.write(obj["submitted_values"]["15"]["15.1"]);
</script></td>';
    echo '</tr>';
   }
?>
1
Tom Usher 24 Feb. 2020 im 04:44

3 Antworten

Beste Antwort

Vielen Dank an alle, die versucht haben zu helfen.

So geht's:

echo '<!-- Col 3 --><td>';
?>
<script>
var json = '<?php echo $incomplete_submission->submission; ?>';
var obj = JSON.parse(json);

function printValues(obj) {
    for (var k in obj) {
        if (obj[k] instanceof Object) {
            printValues(obj[k]);
        } else {
            document.write(obj[k]);
        };
    }
};
document.write(obj["submitted_values"]["15"]["15.1"]); </script>
<?php
echo '</td>';
-1
Tom Usher 26 Feb. 2020 im 01:44

Dank des Kommentars von @cbroe können Sie den folgenden Code verwenden, nachdem Sie die Variable $ myJson mit Ihrer eigenen festgelegt haben, und ihn im WordPress-Plugin verwenden, um das Problem zu lösen:

<script>
    function printValues(jsonString) {
        var obj = JSON.parse(jsonString);
        for (var k in obj) {
            if (obj[k] instanceof Object) {
                printValues(obj[k]);
            } else {
                document.write(obj[k]);
            };
        }
    };
</script>
<?php
    $myJson = '{"submitted_values":{"15":{"15.1":"123"}}}';
    foreach ($incomplete_submissions as $incomplete_submission)
    {
        ?>
        <tr><!-- Row -->
            <td><!-- Col 1 -->
                <script>
                    var jsonString = <?php echo $myJson; ?>;
                    printValues(jsonString);
                </script>
            </td>
            <td><!-- Col 2 -->
                <?php echo esc_html($incomplete_submission->submission); ?>
            </td>
            <td><!-- Col 3 -->
                <script>
                    var jsonString = <?php echo wp_json_encode($incomplete_submission->submission); ?>;
                    printValues(jsonString);
                </script>
            </td>
        </tr>
        <?php
    }
?>
0
Seyed Morteza 24 Feb. 2020 im 12:04

PHP verfügt über Heredoc- und Nowdoc-Zeichenfolgen, mit denen sich mehrzeilige Zeichenfolgen in PHP am besten verarbeiten lassen.

http://php.net/manual/en/language.types.string.php#language.types.string.syntax.heredoc

Sie können Ihr Problem mithilfe der folgenden Zeichenfolge lösen:

<?php echo <<<EOD
    <script>
        var json = '{"submitted_values":{"15":{"15.1":"123"}}}';
        var obj = JSON.parse(json);

        function printValues(obj) {
          for (var k in obj) {
            if (obj[k] instanceof Object) {
              printValues(obj[k]);
            } else {
              document.write(obj[k]);
            };
          }
        };
        printValues(obj);
    </script>
EOD; 
?>

Beachten Sie, dass das End-Token EOD überhaupt nicht eingerückt werden darf, da PHP dies sonst nicht bestätigt. Außerdem müssen Sie nicht "EOD" verwenden. Es kann eine beliebige Zeichenfolge sein.

0
Seyed Morteza 24 Feb. 2020 im 11:11