mirror of
https://github.com/vrana/adminer.git
synced 2025-08-29 17:19:52 +02:00
Refactor and fix the plugin AdminerEditForeign
Thanks to Amunak (https://github.com/adminerevo/adminerevo/pull/86).
This commit is contained in:
@@ -1,43 +1,75 @@
|
||||
<?php
|
||||
|
||||
/** Select foreign key in edit form
|
||||
* @link https://www.adminer.org/plugins/#use
|
||||
* @author Jakub Vrana, https://www.vrana.cz/
|
||||
* @license https://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
|
||||
* @license https://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other)
|
||||
*/
|
||||
class AdminerEditForeign {
|
||||
var $_limit;
|
||||
|
||||
function __construct($limit = 0) {
|
||||
$this->_limit = $limit;
|
||||
* @link https://www.adminer.org/plugins/#use
|
||||
* @author Jakub Vrana, https://www.vrana.cz/
|
||||
* @license https://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
|
||||
* @license https://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other)
|
||||
*/
|
||||
class AdminerEditForeign
|
||||
{
|
||||
private $limit;
|
||||
private $foreignTables = [];
|
||||
private $foreignOptions = [];
|
||||
|
||||
/**
|
||||
* @param int $limit
|
||||
*/
|
||||
function __construct($limit = 0)
|
||||
{
|
||||
$this->limit = $limit;
|
||||
}
|
||||
|
||||
function editInput($table, $field, $attrs, $value) {
|
||||
static $foreignTables = array();
|
||||
static $values = array();
|
||||
$foreignKeys = &$foreignTables[$table];
|
||||
if ($foreignKeys === null) {
|
||||
$foreignKeys = column_foreign_keys($table);
|
||||
|
||||
/**
|
||||
* @param string $table
|
||||
* @param array $field
|
||||
* @param string $attrs
|
||||
* @param string|null $value
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function editInput($table, array $field, $attrs, $value)
|
||||
{
|
||||
if (!isset($this->foreignTables[$table])) {
|
||||
$this->foreignTables[$table] = column_foreign_keys($table);
|
||||
}
|
||||
foreach ((array) $foreignKeys[$field["field"]] as $foreignKey) {
|
||||
if (count($foreignKey["source"]) == 1) {
|
||||
$target = $foreignKey["table"];
|
||||
$id = $foreignKey["target"][0];
|
||||
$options = &$values[$target][$id];
|
||||
if (!$options) {
|
||||
$column = idf_escape($id);
|
||||
if (preg_match('~binary~', $field["type"])) {
|
||||
$column = "HEX($column)";
|
||||
}
|
||||
$options = array("" => "") + get_vals("SELECT $column FROM " . table($target) . " ORDER BY 1" . ($this->_limit ? " LIMIT " . ($this->_limit + 1) : ""));
|
||||
if ($this->_limit && count($options) - 1 > $this->_limit) {
|
||||
return;
|
||||
}
|
||||
$foreignKeys = $this->foreignTables[$table];
|
||||
|
||||
if (empty($foreignKeys[$field["field"]])) {
|
||||
return "";
|
||||
}
|
||||
|
||||
foreach ($foreignKeys[$field["field"]] as $foreignKey) {
|
||||
if (count($foreignKey["source"]) != 1) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$target = $foreignKey["table"];
|
||||
$id = $foreignKey["target"][0];
|
||||
|
||||
if (!isset($this->foreignOptions[$target][$id])) {
|
||||
$column = idf_escape($id);
|
||||
if (preg_match('~binary~', $field["type"])) {
|
||||
$column = "HEX($column)";
|
||||
}
|
||||
|
||||
$values = get_vals("SELECT $column FROM " . table($target) . " ORDER BY 1" .
|
||||
($this->limit ? " LIMIT " . ($this->limit + 1) : ""));
|
||||
|
||||
if ($this->limit && count($values) > $this->limit) {
|
||||
$this->foreignOptions[$target][$id] = false;
|
||||
} else {
|
||||
$this->foreignOptions[$target][$id] = ["" => ""] + $values;
|
||||
}
|
||||
}
|
||||
|
||||
if ($options = $this->foreignOptions[$target][$id]) {
|
||||
return "<select$attrs>" . optionlist($options, $value) . "</select>";
|
||||
} else {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
return "";
|
||||
}
|
||||
|
||||
}
|
||||
|
Reference in New Issue
Block a user