]> git.joonet.de Git - adminer.git/commitdiff
Improved plugin to display JSON values as the table in edit form
authorZemistr <zemistr@gmail.com>
Thu, 18 Sep 2014 10:09:54 +0000 (12:09 +0200)
committerJakub Vrana <jakub@vrana.cz>
Thu, 18 Sep 2014 16:38:28 +0000 (09:38 -0700)
plugins/json-column.php

index 2bb097705091e9783f65c017eb10dd21a3d2b9b1..1343114e90520a2d313c2a7cda3a9f44cebae9e2 100644 (file)
@@ -3,19 +3,46 @@
 /** Display JSON values as table in edit
 * @link http://www.adminer.org/plugins/#use
 * @author Jakub Vrana, http://www.vrana.cz/
+* @author Martin Zeman (Zemistr), http://www.zemistr.eu/
 * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
 * @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other)
 */
 class AdminerJsonColumn {
-       
-       function editInput($table, $field, $attrs, $value) {
-               if (substr($value, 0, 1) == '{' && ($json = json_decode($value, true))) {
-                       echo "<table cellspacing='0'>";
-                       foreach ($json as $key => $val) {
-                               echo "<tr><th>" . h($key) . "<td><code class='jush-js'>" . h(json_encode($val)) . "</code>";
+       private function _testJson($value) {
+               if ((substr($value, 0, 1) == '{' || substr($value, 0, 1) == '[') && ($json = json_decode($value, true))) {
+                       return $json;
+               }
+               return $value;
+       }
+
+       private function _buildTable($json) {
+               echo '<table cellspacing="0" style="margin:2px">';
+               foreach ($json as $key => $val) {
+                       echo '<tr>';
+                       echo '<th>' . h($key) . '</th>';
+                       echo '<td>';
+                       if (is_scalar($val) || $val === null) {
+                               if (is_bool($val)) {
+                                       $val = $val ? 'true' : 'false';
+                               } elseif ($val === null) {
+                                       $val = 'null';
+                               } elseif (!is_numeric($val)) {
+                                       $val = '"' . h(addcslashes($val, "\r\n\"")) . '"';
+                               }
+                               echo '<code class="jush-js">' . $val . '</code>';
+                       } else {
+                               $this->_buildTable($val);
                        }
-                       echo "</table>";
+                       echo '</td>';
+                       echo '</tr>';
                }
+               echo '</table>';
        }
 
+       function editInput($table, $field, $attrs, $value) {
+               $json = $this->_testJson($value);
+               if ($json !== $value) {
+                       $this->_buildTable($json);
+               }
+       }
 }