You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
244 lines
12 KiB
244 lines
12 KiB
{% 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-light table-striped w-auto"> |
|
<thead class="table-light"> |
|
<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-light table-striped table-hover table-sm w-auto"> |
|
<thead class="table-light"> |
|
<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 %}
|
|
|