Il est d’ordinaire peu recommandé de modifier la base d’un gestionnaire de contenu à l’aide de requêtes MySql. Cependant, cela rend parfois possible et rapide des manipulations inhabituelles, qui auraient été “galère” voire impossible autrement. Il convient en premier lieu de tester les requêtes sur une installation en local,
Les modifications envisagées concernent ici principalement les tables “resource”, “item_item_set”, “value”, “property”, “fulltext_search” d’Omeka S. Le diagramme du modèle entité-association – le MCD 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 :

Trois items et une collection sont créés dans une installation fraiche à l’aide de l’interface d’administration. Si on s’intéresse au contenu des tables suite à cette création, on a sous phpMyAdmin :




Maintenant que ces données de test sont en place, il devient possible de faire quelques exercices d’affichage des métadonnées. Des exemples de création et modification sont ensuite proposés.
1. Affichage de contenus
1.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

1.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

1.3 Afficher en plus le label
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

1.4 Afficher les champs Date renseignés
2 syntaxes pour les jointures internes. 1.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
1.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

1.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

2. Modification de contenus
Une fois que la 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. 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 indexe 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.
2.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)
2.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'
2.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'
2.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