245 lines
11 KiB
Twig
245 lines
11 KiB
Twig
|
{% extends 'table/page_with_secondary_tabs.twig' %}
|
||
|
|
||
|
{% block content %}
|
||
|
<form method="post" action="{{ url('/table/relation') }}">
|
||
|
{{ get_hidden_inputs(db, table) }}
|
||
|
{# InnoDB #}
|
||
|
{% if is_foreign_key_supported(tbl_storage_engine) %}
|
||
|
<fieldset class="pma-fieldset mb-3">
|
||
|
<legend>{% trans 'Foreign key constraints' %}</legend>
|
||
|
<div class="table-responsive-md jsresponsive">
|
||
|
<table class="relationalTable table table-striped w-auto">
|
||
|
<thead>
|
||
|
<tr>
|
||
|
<th>{% trans 'Actions' %}</th>
|
||
|
<th>{% trans 'Constraint properties' %}</th>
|
||
|
{% if tbl_storage_engine|upper == 'INNODB' %}
|
||
|
<th>
|
||
|
{% trans 'Column' %}
|
||
|
{{ show_hint('Creating a foreign key over a non-indexed column would automatically create an index on it. Alternatively, you can define an index below, before creating the foreign key.'|trans) }}
|
||
|
</th>
|
||
|
{% else %}
|
||
|
<th>
|
||
|
{% trans 'Column' %}
|
||
|
{{ show_hint('Only columns with index will be displayed. You can define an index below.'|trans) }}
|
||
|
</th>
|
||
|
{% endif %}
|
||
|
<th colspan="3">
|
||
|
{% trans 'Foreign key constraint' %}
|
||
|
({{ tbl_storage_engine }})
|
||
|
</th>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<th></th>
|
||
|
<th></th>
|
||
|
<th></th>
|
||
|
<th>{% trans 'Database' %}</th>
|
||
|
<th>{% trans 'Table' %}</th>
|
||
|
<th>{% trans 'Column' %}</th>
|
||
|
</tr></thead>
|
||
|
{% set i = 0 %}
|
||
|
{% if existrel_foreign is not empty %}
|
||
|
{% for key, one_key in existrel_foreign %}
|
||
|
{# Foreign database dropdown #}
|
||
|
{% set foreign_db = one_key['ref_db_name'] is defined
|
||
|
and one_key['ref_db_name'] is not null
|
||
|
? one_key['ref_db_name'] : db %}
|
||
|
{% set foreign_table = false %}
|
||
|
{% if foreign_db %}
|
||
|
{% set foreign_table = one_key['ref_table_name'] is defined
|
||
|
and one_key['ref_table_name'] is not null
|
||
|
? one_key['ref_table_name'] : false %}
|
||
|
{% endif %}
|
||
|
{% set unique_columns = [] %}
|
||
|
{% if foreign_db and foreign_table %}
|
||
|
{% set table_obj = table_get(foreign_table, foreign_db) %}
|
||
|
{% set unique_columns = table_obj.getUniqueColumns(false, false) %}
|
||
|
{% endif %}
|
||
|
{% include 'table/relation/foreign_key_row.twig' with {
|
||
|
'i': i,
|
||
|
'one_key': one_key,
|
||
|
'column_array': column_array,
|
||
|
'options_array': options_array,
|
||
|
'tbl_storage_engine': tbl_storage_engine,
|
||
|
'db': db,
|
||
|
'table': table,
|
||
|
'url_params': url_params,
|
||
|
'databases': databases,
|
||
|
'foreign_db': foreign_db,
|
||
|
'foreign_table': foreign_table,
|
||
|
'unique_columns': unique_columns
|
||
|
} only %}
|
||
|
{% set i = i + 1 %}
|
||
|
{% endfor %}
|
||
|
{% endif %}
|
||
|
{% include 'table/relation/foreign_key_row.twig' with {
|
||
|
'i': i,
|
||
|
'one_key': [],
|
||
|
'column_array': column_array,
|
||
|
'options_array': options_array,
|
||
|
'tbl_storage_engine': tbl_storage_engine,
|
||
|
'db': db,
|
||
|
'table': table,
|
||
|
'url_params': url_params,
|
||
|
'databases': databases,
|
||
|
'foreign_db': foreign_db,
|
||
|
'foreign_table': foreign_table,
|
||
|
'unique_columns': unique_columns
|
||
|
} only %}
|
||
|
{% set i = i + 1 %}
|
||
|
<tr>
|
||
|
<th colspan="6">
|
||
|
<a class="formelement clearfloat add_foreign_key" href="">
|
||
|
{% trans '+ Add constraint' %}
|
||
|
</a>
|
||
|
</th>
|
||
|
</tr>
|
||
|
</table>
|
||
|
</div>
|
||
|
</fieldset>
|
||
|
{% endif %}
|
||
|
|
||
|
{% if relation_parameters.relationFeature is not null %}
|
||
|
{% if default_sliders_state != 'disabled' and is_foreign_key_supported(tbl_storage_engine) %}
|
||
|
<div class="mb-3">
|
||
|
<button class="btn btn-sm btn-secondary" type="button" data-bs-toggle="collapse" data-bs-target="#internalRelationships" aria-expanded="{{ default_sliders_state == 'open' ? 'true' : 'false' }}" aria-controls="internalRelationships">
|
||
|
{% trans 'Internal relationships' %}
|
||
|
</button>
|
||
|
</div>
|
||
|
<div class="collapse mb-3{{ default_sliders_state == 'open' ? ' show' }}" id="internalRelationships">
|
||
|
{% endif %}
|
||
|
|
||
|
<fieldset class="pma-fieldset">
|
||
|
<legend>
|
||
|
{% trans 'Internal relationships' %}
|
||
|
{{ show_docu('config', 'cfg_Servers_relation') }}
|
||
|
</legend>
|
||
|
<table class="relationalTable table table-striped table-hover table-sm w-auto">
|
||
|
<thead>
|
||
|
<tr>
|
||
|
<th>{% trans 'Column' %}</th>
|
||
|
<th>
|
||
|
{% trans 'Internal relation' %}
|
||
|
{% if is_foreign_key_supported(tbl_storage_engine) %}
|
||
|
{{ show_hint('An internal relation is not necessary when a corresponding FOREIGN KEY relation exists.'|trans) }}
|
||
|
{% endif %}
|
||
|
</th>
|
||
|
</tr>
|
||
|
</thead>
|
||
|
<tbody>
|
||
|
{% set saved_row_cnt = save_row|length - 1 %}
|
||
|
{% for i in 0..saved_row_cnt %}
|
||
|
{% set myfield = save_row[i]['Field'] %}
|
||
|
{# Use an md5 as array index to avoid having special characters
|
||
|
in the name attribute (see bug #1746964 ) #}
|
||
|
{% set myfield_md5 = column_hash_array[myfield] %}
|
||
|
|
||
|
{% set foreign_table = false %}
|
||
|
{% set foreign_column = false %}
|
||
|
|
||
|
{# Database dropdown #}
|
||
|
{% if existrel[myfield] is defined %}
|
||
|
{% set foreign_db = existrel[myfield]['foreign_db'] %}
|
||
|
{% else %}
|
||
|
{% set foreign_db = db %}
|
||
|
{% endif %}
|
||
|
|
||
|
{# Table dropdown #}
|
||
|
{% set tables = [] %}
|
||
|
{% if foreign_db %}
|
||
|
{% if existrel[myfield] is defined %}
|
||
|
{% set foreign_table = existrel[myfield]['foreign_table'] %}
|
||
|
{% endif %}
|
||
|
{% set tables = dbi.getTables(foreign_db) %}
|
||
|
{% endif %}
|
||
|
|
||
|
{# Column dropdown #}
|
||
|
{% set unique_columns = [] %}
|
||
|
{% if foreign_db and foreign_table %}
|
||
|
{% if existrel[myfield] is defined %}
|
||
|
{% set foreign_column = existrel[myfield]['foreign_field'] %}
|
||
|
{% endif %}
|
||
|
{% set table_obj = table_get(foreign_table, foreign_db) %}
|
||
|
{% set unique_columns = table_obj.getUniqueColumns(false, false) %}
|
||
|
{% endif %}
|
||
|
|
||
|
<tr>
|
||
|
<td class="align-middle">
|
||
|
<strong>{{ myfield }}</strong>
|
||
|
<input type="hidden" name="fields_name[{{ myfield_md5 }}]"
|
||
|
value="{{ myfield }}">
|
||
|
</td>
|
||
|
|
||
|
<td>
|
||
|
{% include 'table/relation/relational_dropdown.twig' with {
|
||
|
'name': 'destination_db[' ~ myfield_md5 ~ ']',
|
||
|
'title': 'Database'|trans,
|
||
|
'values': databases,
|
||
|
'foreign': foreign_db
|
||
|
} only %}
|
||
|
|
||
|
{% include 'table/relation/relational_dropdown.twig' with {
|
||
|
'name': 'destination_table[' ~ myfield_md5 ~ ']',
|
||
|
'title': 'Table'|trans,
|
||
|
'values': tables,
|
||
|
'foreign': foreign_table
|
||
|
} only %}
|
||
|
|
||
|
{% include 'table/relation/relational_dropdown.twig' with {
|
||
|
'name': 'destination_column[' ~ myfield_md5 ~ ']',
|
||
|
'title': 'Column'|trans,
|
||
|
'values': unique_columns,
|
||
|
'foreign': foreign_column
|
||
|
} only %}
|
||
|
</td>
|
||
|
</tr>
|
||
|
{% endfor %}
|
||
|
</tbody>
|
||
|
</table>
|
||
|
</fieldset>
|
||
|
{% if default_sliders_state != 'disabled' and is_foreign_key_supported(tbl_storage_engine) %}
|
||
|
</div>
|
||
|
{% endif %}
|
||
|
{% endif %}
|
||
|
|
||
|
{% if relation_parameters.displayFeature is not null %}
|
||
|
{% set disp = get_display_field(db, table) %}
|
||
|
<fieldset class="pma-fieldset">
|
||
|
<label>{% trans 'Choose column to display:' %}</label>
|
||
|
<select name="display_field">
|
||
|
<option value="">---</option>
|
||
|
{% for row in save_row %}
|
||
|
<option value="{{ row['Field'] }}"
|
||
|
{%- if disp is defined and row['Field'] == disp %}
|
||
|
selected="selected"
|
||
|
{%- endif %}>
|
||
|
{{ row['Field'] }}
|
||
|
</option>
|
||
|
{% endfor %}
|
||
|
</select>
|
||
|
</fieldset>
|
||
|
{% endif %}
|
||
|
|
||
|
<fieldset class="pma-fieldset tblFooters">
|
||
|
<input class="btn btn-secondary preview_sql" type="button" value="{% trans 'Preview SQL' %}">
|
||
|
<input class="btn btn-primary" type="submit" value="{% trans 'Save' %}">
|
||
|
</fieldset>
|
||
|
</form>
|
||
|
|
||
|
<div class="modal fade" id="previewSqlModal" tabindex="-1" aria-labelledby="previewSqlModalLabel" aria-hidden="true">
|
||
|
<div class="modal-dialog">
|
||
|
<div class="modal-content">
|
||
|
<div class="modal-header">
|
||
|
<h5 class="modal-title" id="previewSqlModalLabel">{% trans 'Loading' %}</h5>
|
||
|
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="{% trans 'Close' %}"></button>
|
||
|
</div>
|
||
|
<div class="modal-body">
|
||
|
</div>
|
||
|
<div class="modal-footer">
|
||
|
<button type="button" class="btn btn-secondary" id="previewSQLCloseButton" data-bs-dismiss="modal">{% trans 'Close' %}</button>
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
{% endblock %}
|