497 lines
23 KiB
Twig
497 lines
23 KiB
Twig
<div class="container">
|
|
<h2 class="my-3">
|
|
{{ get_image('b_export', t('Export')) }}
|
|
{% block title %}{% endblock %}
|
|
</h2>
|
|
|
|
{{ page_settings_error_html|raw }}
|
|
{{ page_settings_html|raw }}
|
|
|
|
{{ include('components/flash_messages.twig', with_context = false) }}
|
|
|
|
{% block message %}{% endblock %}
|
|
|
|
{% if templates.is_enabled %}
|
|
<div class="card mb-3">
|
|
<div class="card-header">{{ t('Export templates:') }}</div>
|
|
<div class="card-body row gy-3">
|
|
<form method="post" action="{{ url('/export/template/create') }}" class="col-12 col-md disableAjax">
|
|
<fieldset>
|
|
<legend>{{ t('New template:') }}</legend>
|
|
<div class="row g-3 align-items-center">
|
|
<div class="col-auto">
|
|
<label for="templateName" class="col-form-label">{{ t('Template name') }}</label>
|
|
</div>
|
|
<div class="col-auto">
|
|
<input class="form-control" type="text" name="templateName" id="templateName" maxlength="64" placeholder="{{ t('Template name') }}" required>
|
|
</div>
|
|
<div class="col-auto">
|
|
<input class="btn btn-secondary" type="submit" name="createTemplate" id="createTemplate" value="{{ t('Create') }}">
|
|
</div>
|
|
</div>
|
|
</fieldset>
|
|
</form>
|
|
|
|
<form method="post" id="existingTemplatesForm" class="col-12 col-md disableAjax">
|
|
<fieldset>
|
|
<legend>{{ t('Existing templates:') }}</legend>
|
|
<div class="row g-3 align-items-center">
|
|
<div class="col-auto">
|
|
<label for="template" class="col-form-label">{{ t('Template:') }}</label>
|
|
</div>
|
|
<div class="col-auto">
|
|
<select class="form-select" name="template" id="template" required>
|
|
<option value="">-- {{ t('Select a template') }} --</option>
|
|
{% for template in templates.templates %}
|
|
<option value="{{ template.getId() }}"{{ template.getId() == templates.selected ? ' selected' }}>
|
|
{{ template.getName() }}
|
|
</option>
|
|
{% endfor %}
|
|
</select>
|
|
</div>
|
|
<div class="col-auto">
|
|
<input class="btn btn-secondary" type="submit" formaction="{{ url('/export/template/update') }}" name="updateTemplate" id="updateTemplate" value="{{ t('Update') }}">
|
|
</div>
|
|
<div class="col-auto">
|
|
<input class="btn btn-secondary" type="submit" formaction="{{ url('/export/template/delete') }}" name="deleteTemplate" id="deleteTemplate" value="{{ t('Delete') }}">
|
|
</div>
|
|
</div>
|
|
</fieldset>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
|
|
{% if sql_query is not empty %}
|
|
<div class="card mb-3">
|
|
<div class="card-header">
|
|
{{ t('SQL query:', notes = 'Title of the option on the Export page') }}
|
|
</div>
|
|
<div class="card-body">
|
|
<div id="sqlqueryform">
|
|
<input class="btn btn-secondary" type="submit" id="showsqlquery" value="{{ t('Show SQL query', notes = 'Button to show the SQL query on the export page') }}">
|
|
</div>
|
|
<div class="d-none"></div>
|
|
</div>
|
|
</div>
|
|
<div class="modal fade" id="showSqlQueryModal" tabindex="-1" aria-labelledby="showSqlQueryModalLabel" aria-hidden="true">
|
|
<div class="modal-dialog">
|
|
<div class="modal-content">
|
|
<div class="modal-header">
|
|
<h5 class="modal-title" id="showSqlQueryModalLabel">{{ t('Loading') }}</h5>
|
|
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="{{ t('Close') }}"></button>
|
|
</div>
|
|
<div class="modal-body">
|
|
<div id="export_sql_modal_content">
|
|
<pre><code class="sql" dir="ltr">{{ sql_query }}</code></pre>
|
|
</div>
|
|
</div>
|
|
<div class="modal-footer">
|
|
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">{{ t('Close') }}</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
|
|
<form method="post" action="{{ url('/export') }}" name="dump" class="disableAjax">
|
|
{{ get_hidden_inputs(hidden_inputs) }}
|
|
|
|
{% if export_method != 'custom-no-form' %}
|
|
<div class="card mb-3" id="quick_or_custom">
|
|
<div class="card-header">{{ t('Export method:') }}</div>
|
|
<div class="card-body">
|
|
<div class="form-check">
|
|
<input class="form-check-input" type="radio" name="quick_or_custom" value="quick" id="radio_quick_export"{{ export_method == 'quick' ? ' checked' }}>
|
|
<label class="form-check-label" for="radio_quick_export">{{ t('Quick - display only the minimal options') }}</label>
|
|
</div>
|
|
<div class="form-check">
|
|
<input class="form-check-input" type="radio" name="quick_or_custom" value="custom" id="radio_custom_export"{{ export_method == 'custom' ? ' checked' }}>
|
|
<label class="form-check-label" for="radio_custom_export">{{ t('Custom - display all possible options') }}</label>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
|
|
<div class="card mb-3" id="format">
|
|
<div class="card-header">{{ t('Format:') }}</div>
|
|
<div class="card-body">
|
|
<select class="form-select" id="plugins" name="what" aria-label="{{ t('File format to export') }}">
|
|
{% for option in plugins_choice %}
|
|
<option value="{{ option.name }}"{{ option.is_selected ? ' selected' }} data-is-binary="{{ option.is_binary ? 'true' : 'false' }}">{{ option.text }}</option>
|
|
{% endfor %}
|
|
</select>
|
|
</div>
|
|
</div>
|
|
|
|
{% block selection_options %}{% endblock %}
|
|
|
|
{% if rows is not empty %}
|
|
<div class="card mb-3 d-none" id="rows">
|
|
<div class="card-header">{{ t('Rows:') }}</div>
|
|
<div class="card-body">
|
|
<div class="form-check">
|
|
<input class="form-check-input" type="radio" name="allrows" value="1" id="radio_allrows_1"{{ rows.allrows is null or rows.allrows == 1 ? ' checked' }}>
|
|
<label class="form-check-label" for="radio_allrows_1">{{ t('Dump all rows') }}</label>
|
|
</div>
|
|
<div class="form-check mb-2">
|
|
<input class="form-check-input" type="radio" name="allrows" value="0" id="radio_allrows_0"{{ rows.allrows is not null and rows.allrows == 0 ? ' checked' }}>
|
|
<label class="form-check-label" for="radio_allrows_0">{{ t('Dump some row(s)') }}</label>
|
|
</div>
|
|
<ul class="list-group">
|
|
<li class="list-group-item">
|
|
<label class="form-label" for="limit_to">{{ t('Number of rows:') }}</label>
|
|
<input class="form-control" type="text" id="limit_to" name="limit_to" size="5" value="
|
|
{%- if rows.limit_to is not null -%}
|
|
{{- rows.limit_to -}}
|
|
{%- elseif rows.unlim_num_rows is not empty and rows.unlim_num_rows != 0 -%}
|
|
{{- rows.unlim_num_rows -}}
|
|
{%- else %}
|
|
{{- rows.number_of_rows -}}
|
|
{%- endif -%}" onfocus="this.select()">
|
|
</li>
|
|
<li class="list-group-item">
|
|
<label class="form-label" for="limit_from">{{ t('Row to begin at:') }}</label>
|
|
<input class="form-control" type="text" id="limit_from" name="limit_from" size="5" value="{{ rows.limit_from is not null ? rows.limit_from : 0 }}" onfocus="this.select()">
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
|
|
{% if has_save_dir %}
|
|
<div class="card mb-3 d-none" id="output_quick_export">
|
|
<div class="card-header">{{ t('Output:') }}</div>
|
|
<div class="card-body">
|
|
<div class="form-check form-switch">
|
|
<input class="form-check-input" type="checkbox" role="switch" name="quick_export_onserver" value="saveit" id="checkbox_quick_dump_onserver"{{ export_is_checked ? ' checked' }}>
|
|
<label class="form-check-label" for="checkbox_quick_dump_onserver">
|
|
{{ t('Save on server in the directory <strong>%s</strong>')|format(save_dir|e)|raw }}
|
|
</label>
|
|
</div>
|
|
<div class="form-check form-switch">
|
|
<input class="form-check-input" type="checkbox" role="switch" name="quick_export_onserver_overwrite" value="saveitover" id="checkbox_quick_dump_onserver_overwrite"
|
|
{{- export_overwrite_is_checked ? ' checked' }}>
|
|
<label class="form-check-label" for="checkbox_quick_dump_onserver_overwrite">
|
|
{{ t('Overwrite existing file(s)') }}
|
|
</label>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
|
|
<div class="modal fade" id="renameExportModal" tabindex="-1" aria-labelledby="renameExportModalLabel" aria-hidden="true">
|
|
<div class="modal-dialog modal-xl">
|
|
<div class="modal-content">
|
|
<div class="modal-header">
|
|
<h5 class="modal-title" id="renameExportModalLabel">{{ t('Rename exported databases/tables/columns') }}</h5>
|
|
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="{{ t('Close') }}"></button>
|
|
</div>
|
|
<div class="modal-body overflow-auto">
|
|
<table class="table align-middle mb-3" id="alias_data">
|
|
<thead>
|
|
<tr>
|
|
<th colspan="4">
|
|
{{ t('Defined aliases') }}
|
|
</th>
|
|
</tr>
|
|
</thead>
|
|
|
|
<tbody>
|
|
{% for db, db_data in aliases %}
|
|
{% if db_data.alias is defined and db_data.alias is not null %}
|
|
<tr>
|
|
<th>{{ t('Database', context = 'Alias') }}</th>
|
|
<td>{{ db }}</td>
|
|
<td>
|
|
<input name="aliases[{{ db }}][alias]" value="{{ db_data.alias }}" type="text">
|
|
</td>
|
|
<td>
|
|
<button class="alias_remove btn btn-secondary">{{ t('Remove') }}</button>
|
|
</td>
|
|
</tr>
|
|
{% endif %}
|
|
|
|
{% for table, table_data in db_data.tables ?? [] %}
|
|
{% if table_data.alias is defined and table_data.alias is not null %}
|
|
<tr>
|
|
<th>{{ t('Table', context = 'Alias') }}</th>
|
|
<td>{{ db }}.{{ table }}</td>
|
|
<td>
|
|
<input name="aliases[{{ db }}][tables][{{ table }}][alias]" value="{{ table_data.alias }}" type="text">
|
|
</td>
|
|
<td>
|
|
<button class="alias_remove btn btn-secondary">{{ t('Remove') }}</button>
|
|
</td>
|
|
</tr>
|
|
{% endif %}
|
|
|
|
{% for column, column_name in table_data.columns ?? [] %}
|
|
<tr>
|
|
<th>{{ t('Column', context = 'Alias') }}</th>
|
|
<td>{{ db }}.{{ table }}.{{ column }}</td>
|
|
<td>
|
|
<input name="aliases[{{ db }}][tables][{{ table }}][colums][{{ column }}]" value="{{ column_name }}" type="text">
|
|
</td>
|
|
<td>
|
|
<button class="alias_remove btn btn-secondary">{{ t('Remove') }}</button>
|
|
</td>
|
|
</tr>
|
|
{% endfor %}
|
|
{% endfor %}
|
|
{% endfor %}
|
|
</tbody>
|
|
|
|
{# Empty row for javascript manipulations. #}
|
|
<tfoot class="hide">
|
|
<tr>
|
|
<th></th>
|
|
<td></td>
|
|
<td>
|
|
<input name="aliases_new" value="" type="text">
|
|
</td>
|
|
<td>
|
|
<button class="alias_remove btn btn-secondary">{{ t('Remove') }}</button>
|
|
</td>
|
|
</tr>
|
|
</tfoot>
|
|
</table>
|
|
|
|
<table class="table align-middle">
|
|
<thead>
|
|
<tr>
|
|
<th colspan="4">{{ t('Define new aliases') }}</th>
|
|
</tr>
|
|
</thead>
|
|
<tr>
|
|
<td>
|
|
<label>{{ t('Select database:') }}</label>
|
|
</td>
|
|
<td>
|
|
<select id="db_alias_select">
|
|
<option value=""></option>
|
|
</select>
|
|
</td>
|
|
<td>
|
|
<input id="db_alias_name" placeholder="{{ t('New database name') }}" disabled="1">
|
|
</td>
|
|
<td>
|
|
<button id="db_alias_button" class="btn btn-secondary" disabled="1">{{ t('Add') }}</button>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<label>{{ t('Select table:') }}</label>
|
|
</td>
|
|
<td>
|
|
<select id="table_alias_select">
|
|
<option value=""></option>
|
|
</select>
|
|
</td>
|
|
<td>
|
|
<input id="table_alias_name" placeholder="{{ t('New table name') }}" disabled="1">
|
|
</td>
|
|
<td>
|
|
<button id="table_alias_button" class="btn btn-secondary" disabled="1">{{ t('Add') }}</button>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<label>{{ t('Select column:') }}</label>
|
|
</td>
|
|
<td>
|
|
<select id="column_alias_select">
|
|
<option value=""></option>
|
|
</select>
|
|
</td>
|
|
<td>
|
|
<input id="column_alias_name" placeholder="{{ t('New column name') }}" disabled="1">
|
|
</td>
|
|
<td>
|
|
<button id="column_alias_button" class="btn btn-secondary" disabled="1">{{ t('Add') }}</button>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
</div>
|
|
<div class="modal-footer">
|
|
<button type="button" class="btn btn-secondary" id="saveAndCloseBtn" data-bs-dismiss="modal">
|
|
{{ t('Save & close') }}
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="card mb-3 d-none" id="output">
|
|
<div class="card-header">{{ t('Output:') }}</div>
|
|
<ul class="list-group list-group-flush">
|
|
<li class="list-group-item">
|
|
<div class="form-check form-switch">
|
|
<input class="form-check-input" type="checkbox" role="switch" id="btn_alias_config"{{ has_aliases ? ' checked' }}>
|
|
<label class="form-check-label" for="btn_alias_config">{{ t('Rename exported databases/tables/columns') }}</label>
|
|
</div>
|
|
</li>
|
|
|
|
{% if export_type != 'server' %}
|
|
<li class="list-group-item">
|
|
<div class="form-check form-switch">
|
|
<input class="form-check-input" type="checkbox" role="switch" name="lock_tables" value="y" id="checkbox_lock_tables"
|
|
{{- (not repopulate and is_checked_lock_tables) or lock_tables ? ' checked' }}>
|
|
<label class="form-check-label" for="checkbox_lock_tables">
|
|
{{ t('Use %s statement')|format('<code>LOCK TABLES</code>')|raw }}
|
|
</label>
|
|
</div>
|
|
</li>
|
|
{% endif %}
|
|
|
|
<li class="list-group-item">
|
|
<div class="form-check">
|
|
<input class="form-check-input" type="radio" id="radio_view_as_text" name="output_format" value="astext"{{ repopulate or export_asfile == false ? ' checked' }}>
|
|
<label class="form-check-label" for="radio_view_as_text">{{ t('View output as text') }}</label>
|
|
</div>
|
|
<div class="form-check mb-2">
|
|
<input class="form-check-input" type="radio" name="output_format" value="sendit" id="radio_dump_asfile"{{ not repopulate and is_checked_asfile ? ' checked' }}>
|
|
<label class="form-check-label" for="radio_dump_asfile">{{ t('Save output to a file') }}</label>
|
|
</div>
|
|
<div class="hstack gap-3">
|
|
<div class="vr"></div>
|
|
<ul class="list-group" id="ul_save_asfile">
|
|
{% if has_save_dir %}
|
|
<li class="list-group-item">
|
|
<div class="form-check form-switch">
|
|
<input class="form-check-input" type="checkbox" role="switch" name="onserver" value="saveit" id="checkbox_dump_onserver"{{ is_checked_export ? ' checked' }}>
|
|
<label class="form-check-label" for="checkbox_dump_onserver">
|
|
{{ t('Save on server in the directory <strong>%s</strong>')|format(save_dir|e)|raw }}
|
|
</label>
|
|
</div>
|
|
<div class="form-check form-switch">
|
|
<input class="form-check-input" type="checkbox" role="switch" name="onserver_overwrite" value="saveitover" id="checkbox_dump_onserver_overwrite"
|
|
{{- is_checked_export_overwrite ? ' checked' }}>
|
|
<label class="form-check-label" for="checkbox_dump_onserver_overwrite">
|
|
{{ t('Overwrite existing file(s)') }}
|
|
</label>
|
|
</div>
|
|
</li>
|
|
{% endif %}
|
|
|
|
<li class="list-group-item">
|
|
<div class="row g-3 align-items-center">
|
|
<div class="col-auto">
|
|
<label for="filename_template" class="col-form-label">
|
|
{{ t('File name template:') }}
|
|
{{ show_hint(t('This value is interpreted using the \'strftime\' function, so you can use time formatting strings. Additionally the following transformations will happen: %s Other text will be kept as is. See the FAQ 6.27 for details.')|format(filename_hint)) }}
|
|
</label>
|
|
</div>
|
|
<div class="col-auto">
|
|
<input type="text" class="form-control" name="filename_template" id="filename_template" value="{{ filename_template }}">
|
|
</div>
|
|
<div class="col-auto">
|
|
<div class="form-check form-switch">
|
|
<input class="form-check-input" type="checkbox" role="switch" name="remember_template" id="checkbox_remember_template"{{ is_checked_remember_file_template ? ' checked' }}>
|
|
<label class="form-check-label" for="checkbox_remember_template">
|
|
{{ t('Use this for future exports') }}
|
|
</label>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</li>
|
|
|
|
{% if is_encoding_supported %}
|
|
<li class="list-group-item">
|
|
<div class="row">
|
|
<div class="col-auto">
|
|
<label for="select_charset" class="col-form-label">{{ t('Character set of the file:') }}</label>
|
|
</div>
|
|
<div class="col-auto">
|
|
<select class="form-select" id="select_charset" name="charset">
|
|
{% for charset in encodings %}
|
|
<option value="{{ charset }}"
|
|
{{- (export_charset is empty and charset == 'utf-8') or charset == export_charset ? ' selected' }}>
|
|
{{- charset -}}
|
|
</option>
|
|
{% endfor %}
|
|
</select>
|
|
</div>
|
|
</div>
|
|
</li>
|
|
{% endif %}
|
|
|
|
{% if has_zip or has_gzip %}
|
|
<li class="list-group-item">
|
|
<div class="row">
|
|
<div class="col-auto">
|
|
<label for="compression" class="col-form-label">{{ t('Compression:') }}</label>
|
|
</div>
|
|
<div class="col-auto">
|
|
<select class="form-select" id="compression" name="compression">
|
|
<option value="none">{{ t('None') }}</option>
|
|
{% if has_zip %}
|
|
<option value="zip"
|
|
{{- selected_compression == 'zip' ? ' selected' }}>
|
|
{{ t('zipped') }}
|
|
</option>
|
|
{% endif %}
|
|
{% if has_gzip %}
|
|
<option value="gzip"
|
|
{{- selected_compression == 'gzip' ? ' selected' }}>
|
|
{{ t('gzipped') }}
|
|
</option>
|
|
{% endif %}
|
|
</select>
|
|
</div>
|
|
</div>
|
|
</li>
|
|
{% else %}
|
|
<input type="hidden" name="compression" value="{{ selected_compression }}">
|
|
{% endif %}
|
|
|
|
{% if export_type == 'server' or export_type == 'database' %}
|
|
<li class="list-group-item">
|
|
<div class="form-check form-switch">
|
|
<input class="form-check-input" type="checkbox" role="switch" id="checkbox_as_separate_files" name="as_separate_files" value="{{ export_type }}"
|
|
{{- is_checked_as_separate_files ? ' checked' }}>
|
|
<label class="form-check-label" for="checkbox_as_separate_files">
|
|
{% if export_type == 'server' %}
|
|
{{ t('Export databases as separate files') }}
|
|
{% elseif export_type == 'database' %}
|
|
{{ t('Export tables as separate files') }}
|
|
{% endif %}
|
|
</label>
|
|
</div>
|
|
</li>
|
|
{% endif %}
|
|
</ul>
|
|
</div>
|
|
</li>
|
|
|
|
<li class="list-group-item">
|
|
<label for="maxsize" class="form-label">{{ t('Skip tables larger than:') }}</label>
|
|
<input class="form-control" type="number" id="maxsize" name="maxsize" aria-describedby="maxsizeHelp">
|
|
<div id="maxsizeHelp" class="form-text">{{ t('The size is measured in MiB.') }}</div>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
|
|
<div class="card mb-3 d-none" id="format_specific_opts">
|
|
<div class="card-header">{{ t('Format-specific options:') }}</div>
|
|
<div class="card-body">
|
|
{{ options|raw }}
|
|
</div>
|
|
</div>
|
|
|
|
{% if can_convert_kanji %}
|
|
{# Japanese encoding setting #}
|
|
<div class="card mb-3" id="kanji_encoding">
|
|
<div class="card-header">{{ t('Encoding Conversion:') }}</div>
|
|
<div class="card-body">
|
|
{% include 'encoding/kanji_encoding_form.twig' %}
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
|
|
<div id="submit">
|
|
<input id="buttonGo" class="btn btn-primary" type="submit" value="{{ t('Export') }}" data-exec-time-limit="{{ exec_time_limit }}">
|
|
</div>
|
|
</form>
|
|
</div>
|