Le logiciel Omeka S se montre conçu pour héberger simultanément plusieurs sites web dédiés à la valorisation de documents numérisés (texte, image, son, vidéo), ou bien à l’élaboration de bases de données d’intérêt pour l’histoire (bases de personnes, d’organisations, d’instruments, etc.). Il est possible d’interagir avec une application Omeka S à l’aide de PhpMyAdmin et MySql directement. De telles manipulations rendent parfois possible et rapide des modifications globales. Inutile de préciser que ce genre de manœuvre doit être faite avec précautions, surtout lorsqu’un site se trouve en production et référence un nombre d’items. Il est fortement conseillé en premier lieu de tester les requêtes sur une installation en local, de sauvegarder préalablement les contenus de la base de production. Voici ici les résultats de tests rapides.
- Le modèle conceptuel de données
- Affichage de contenus
- 2.1 Afficher les items de la collection « item_set_id = 2 »
- 2.2 Afficher les éléments de l’item 1
- 2.3 Afficher en plus le label
- 2.4 Afficher les champs Date renseignés
- 2.5 Afficher les items contenant au moins un champs Date renseigné
- Modification des contenus
- 3.1 Ajouter un élément « date » de valeur « 1905 » à l’item 1
- 3.2 Changer pour l’item 1 la valeur du champs Date « 1905 » en « 1906 »
- 3.3 Changer tous les champs Date de valeur « 1906 » en valeur « 1906 CA »
- 3.4 Fabriquer un identifiant
- Pour aller plus loin
1. Le modèle conceptuel de données
Le diagramme du modèle entité-association – le MCD (modèle conceptuel de données) pour reprendre la terminologie Merise – peut être aisément rétro-ingénieré avec le logiciel MySQL WorkBench. On obtient alors le schéma suivant :

Les modifications envisagées concernent ici principalement les tables « resource », « item_item_set », « value », « property », « fulltext_search » d’Omeka S. Trois items et une collection sont créés dans une installation fraiche à l’aide de l’interface d’administration classique. Si on s’intéresse au contenu des tables suite à cette création, on a sous phpMyAdmin pour la table « resource » :

Alors que « title » donne le libellé du titre, le type de ressource (item ou collection) est spécifié dans « resource_type ».

L’appartenance d’un item à une collection est donné par la table « item_item_set ». Les items 1 et 3 de « resource » appartiennent à la collection, l’item 4 de « resource » est sans collection.

Les métadonnées sont stockées et qualifiées les unes à la suite des autres dans la table « value ». Dans cet exemple, l’item 1 identifié par « resource_id » admet comme éléments : Titre, « Voici un document »; Date, « 2018 », « 2019 »; Description , « Description de mon document ». Le code de la propriété stocké dans « property_id » est verbalisé dans la table « property ».

Dans « property », le champs Dublin Core « Date » est identifié par son id de valeur 7, qui admet un libellé invariable (local_name) et un libellé possible à personaliser (local_name). Bon voilà, pas très compliqué.
2. Affichage de contenus
Maintenant que les données de test sont en place, il devient possible de faire quelques exercices de recherche et d’affichage.
2.1 Afficher les items de la collection « item_set_id = 2 »
SELECT resource.id, resource.title, item_item_set.item_set_id
FROM resource, item_item_set
WHERE resource.id = item_item_set.item_id
AND item_item_set.item_set_id = 2

2.2 Afficher les éléments de l’item 1
SELECT value.resource_id, value.property_id, value.value
FROM value
WHERE value.resource_id = 1

2.3 Afficher en plus le libellé Dublin Core
SELECT value.resource_id, property.local_name, property.label, value.value
FROM value, property
WHERE value.property_id = property.id
AND value.resource_id = 1

2.4 Afficher les champs Date renseignés
2 syntaxes pour les jointures internes.
2.4.1 Syntaxe sans JOIN
SELECT resource.id, resource.title, value.value
FROM resource, value
WHERE resource.id = value.resource_id
AND value.property_id = 7
2.4.2 Syntaxe avec JOIN
SELECT resource.id, resource.title, value.value
FROM resource
INNER JOIN value ON resource.id = value.resource_id
WHERE value.property_id = 7

2.5 Afficher les items contenant au moins un champs Date renseigné
SELECT resource.id, resource.title, value.value
FROM resource
JOIN value ON resource.id = value.resource_id
WHERE value.property_id = 7
GROUP BY resource.title

3. Modification des contenus
Une fois qu’une requête MySql est jouée, il convient de mettre à jour l’index du moteur de recherche. Modifiez pour cela dans un premier temps le fichier « local.config.php » selon les indications de ManOnDaMoon dans le forum de discussion d’Omeka S. Puis, dans l’interface admin/paramètres généraux, cochez « Indexer la recherche en texte intégral » et sauvegarder. Cette action lance en tâche de fond « Omeka\Job\IndexFulltextSearch ». L’index ainsi mis à jour est contenu dans la table « fulltext_search ». Le moteur a indexé les nouveautés.
Suivez cette partie du tutoriel à vos risques et périls ! Essayez en dev, procédez à une sauvegarde de la prod, et let’s go.
3.1 Ajouter un élément « date » de valeur « 1905 » à l’item 1
INSERT INTO value (resource_id, property_id, value_resource_id, type, lang, value, uri, is_public)
VALUES (1, 7, NULL, literal, NULL, 1905, NULL, 1)
3.2 Changer pour l’item 1 la valeur du champs Date « 1905 » en « 1906 »
UPDATE value SET value.value = '1906'
WHERE resource_id = 1
AND property_id = 7
AND value.value = '1905'
3.3 Changer tous les champs Date de valeur « 1906 » en valeur « 1906 CA »
UPDATE value SET value.value = '1906 CA'
WHERE resource_id = 1
AND value.value = '1906'
3.4 Fabriquer un identifiant
Fabriquer un identifiant contenant le préfixe « HP », la « Date » et le terme fixe « ID ». Le stocker dans le champs Dublin Core « Identifiant » (10 dans la table « property »)
INSERT INTO value (resource_id, property_id, value_resource_id, type, lang, value, uri, is_public)
SELECT resource.id, 10, NULL, 'literal', NULL, 'ID', NULL, 1
FROM resource
4. Pour aller plus loin
- Mémento de requêtes SQL pour Omeka Classic, 2022 par Jean-Baptiste Pressac : Lien
- Science in the Making, Tom Crane, Medium, 2017, 2019