Skip to content

Commit

Permalink
Add diacritics setting
Browse files Browse the repository at this point in the history
  • Loading branch information
melaniekung committed Jul 19, 2023
1 parent c741f38 commit bec7038
Show file tree
Hide file tree
Showing 5 changed files with 200 additions and 1 deletion.
106 changes: 106 additions & 0 deletions apps/qubit/modules/settings/actions/diacriticsAction.class.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
<?php
/*
* This file is part of the Access to Memory (AtoM) software.
*
* Access to Memory (AtoM) is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Access to Memory (AtoM) is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Access to Memory (AtoM). If not, see <http://www.gnu.org/licenses/>.
*/

class SettingsDiacriticsAction extends SettingsEditAction
{
// Arrays not allowed in class constants
public static $NAMES = [
'diacritics',
];

public function earlyExecute()
{
parent::earlyExecute();

$this->updateMessage = $this->i18n->__('Diacritics settings saved.');

$this->settingDefaults = [
'diacritics' => QubitSetting::getByName('diacritics')->getValue(['sourceCulture' => true]),
];
}

public function execute($request)
{
DefaultEditAction::execute($request);

if ($request->isMethod('post')) {
$this->form->bind($request->getPostParameters(), $request->getFiles());

if ($this->form->isValid()) {
// Check that a diacritics mapping yaml file is uploaded when enabling
if (0 === intval($request->getPostParameters()['diacritics']) || (1 === intval($request->getPostParameters()['diacritics']) && 0 !== $request->getFiles()['mappings']['size'])) {
$this->processForm($request);
$this->uploadDiacritics($request);
} else {
$this->getUser()->setFlash('error', $this->context->i18n->__('Error: Unable to upload diacritics mapping.'));
}

$this->redirect(['module' => 'settings', 'action' => 'diacritics']);
}
}
}

public function processForm($request)
{
sfConfig::set('app_diacritics', $request->getPostParameters()['diacritics']);
QubitSetting::findAndSave('diacritics', $request->getPostParameters()['diacritics'], ['sourceCulture' => true]);
}

public function uploadDiacritics($request)
{
$file = $request->getFiles('mappings');
$diacriticsMappingPath = sfConfig::get('sf_plugins_dir').DIRECTORY_SEPARATOR.'arElasticSearchPlugin'.DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'diacritics_mapping.yml';

if (1 === (int) $request->getPostParameters()['diacritics']) {
if ('application/x-yaml' === $request->getFiles()['mappings']['type']) {
// Move uploaded file to replace diacritics_mapping.yml.
try {
$file = Qubit::moveUploadFile($file);
} catch (sfException $e) {
$this->getUser()->setFlash('error', $e->getMessage());
}

// Replace /config/diacritics_mapping.yml with uploaded file
$uploadMappingPath = $file['tmp_name'];
$diacriticsMappings = file_get_contents($uploadMappingPath);
file_put_contents($diacriticsMappingPath, $diacriticsMappings);
$this->getUser()->setFlash('notice', $this->context->i18n->__('Diacritics setting updated. Rebuild the search index for the changes to be applied.'));
} else {
QubitSetting::findAndSave('diacritics', 0, ['sourceCulture' => true]);
$this->getUser()->setFlash('error', $this->context->i18n->__('Error: Unable to upload diacritics mapping. Must be a YAML file.'));
}
} else {
// Reset diacritics yaml when disabling the setting
unlink($diacriticsMappingPath);
}
}

protected function addField($name)
{
switch ($name) {
case 'diacritics':
$this->form->setDefault($name, $this->settingDefaults[$name]);
$this->form->setWidget($name, new sfWidgetFormSelectRadio(['choices' => [0 => $this->i18n->__('Disabled'), 1 => $this->i18n->__('Enabled')]], ['class' => 'radio']));
$this->form->setValidator($name, new sfValidatorChoice(['choices' => [1, 0]]));
$this->form->setWidget('mappings', new sfWidgetFormInputFile());
$this->form->setValidator('mappings', new sfValidatorFile());

break;
}
}
}
4 changes: 4 additions & 0 deletions apps/qubit/modules/settings/actions/menuComponent.class.php
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,10 @@ public function execute($request)
'label' => $i18n->__('Default template'),
'action' => 'template',
],
[
'label' => $i18n->__('Diacritics'),
'action' => 'diacritics',
],
[
'label' => $i18n->__('Digital object derivatives'),
'action' => 'digitalObjectDerivatives',
Expand Down
57 changes: 57 additions & 0 deletions apps/qubit/modules/settings/templates/diacriticsSuccess.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
<?php decorate_with('layout_2col.php'); ?>

<?php slot('sidebar'); ?>

<?php echo get_component('settings', 'menu'); ?>

<?php end_slot(); ?>

<?php slot('title'); ?>
<h1><?php echo __('Diacritics settings'); ?></h1>
<?php end_slot(); ?>

<?php slot('content'); ?>

<div class="alert alert-info">
<p><?php echo __('Please rebuild the search index after uploading diacritics mappings.'); ?></p>
<pre>$ php symfony search:populate</pre>
</div>

<?php echo $form->renderGlobalErrors(); ?>

<?php echo $form->renderFormTag(url_for(['module' => 'settings', 'action' => 'diacritics']), ['method' => 'post']); ?>

<?php echo $form->renderHiddenFields(); ?>

<div id="content">

<table class="table sticky-enabled">
<thead>
<tr>
<th width="30%"><?php echo __('Name'); ?></th>
<th><?php echo __('Value'); ?></th>
</tr>
</thead>
<tbody>
<tr>
<td><?php echo __('Diacritics'); ?></td>
<td><?php echo $form->diacritics; ?></td>
</tr>
<tr>
<td><?php echo __('Mappings YAML'); ?></td>
<td>
<span><?php echo __('YAML file containing char_filter mappings.'); ?></span></br>
<?php echo $form->mappings; ?><br/>
</td>
</tr>
</tbody>
</table>
</div>

<section class="actions">
<input class="btn atom-btn-outline-success" type="submit" value="<?php echo __('Save'); ?>"/>
</section>

</form>

<?php end_slot(); ?>
5 changes: 5 additions & 0 deletions data/fixtures/settings.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1351,6 +1351,11 @@ QubitSetting:
Qubit_Settings_defaultArchivalDescriptionBrowseView:
name: default_archival_description_browse_view
value: table
Qubit_Settings_diacritics:
name: diacritics
editable: 1
deleteable: 0
value: 0
Qubit_Settings_digitalObjectDerivativesPdfPageNumber:
name: digital_object_derivatives_pdf_page_number
value: 1
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,22 @@ public static function loadMappings()
return $esMapping;
}

public function loadDiacriticsMappings()
{
// Find diacritics_mapping.yml
$diacriticsFinder = sfFinder::type('file')->name('diacritics_mapping.yml');
$diacriticsFiles = array_unique(array_merge(
$diacriticsFinder->in(sfConfig::get('sf_config_dir')),
$diacriticsFinder->in(ProjectConfiguration::getActive()->getPluginSubPaths('/config'))
));

if (!count($diacriticsFiles)) {
throw new sfException('You must create a diacritics_mapping.yml file.');
}

return sfYaml::load(array_shift($diacriticsFiles));
}

/**
* Optimize index.
*
Expand Down Expand Up @@ -468,6 +484,12 @@ public static function modelClassFromQubitObjectClass($className)
*/
protected function initialize()
{
if (sfConfig::get('app_diacritics')) {
$this->config['index']['configuration']['analysis']['char_filter']['diacritics_lowercase'] = $this->loadDiacriticsMappings();
}

$this->loadMappings();

try {
$this->index->open();
} catch (Exception $e) {
Expand All @@ -479,7 +501,12 @@ protected function initialize()
&& isset($this->config['index']['configuration']['analysis']['char_filter']['strip_md'])
) {
foreach ($this->config['index']['configuration']['analysis']['analyzer'] as $key => $analyzer) {
$this->config['index']['configuration']['analysis']['analyzer'][$key]['char_filter'] = ['strip_md'];
$filters = ['strip_md'];
if (sfConfig::get('app_diacritics')) {
$filters = array_merge($filters, ['diacritics_lowercase']);
}

$this->config['index']['configuration']['analysis']['analyzer'][$key]['char_filter'] = $filters;
}
}

Expand Down

0 comments on commit bec7038

Please sign in to comment.