Drupal: mon_module.module
/**
* Dans robots.txt on a ajouté /sites/default/files/documents/non_indexes.
* Idée ici c'est de contrôler l'emplacement du fichier selon l'option méta.
* Type 'hub' déplacer fichier dans et en dehors de documents/non_indexes
*
*/
function mon_module_media_presave(MediaInterface $media) {
if (Outils::nePasIndexerMedia($media, 'hub', 'field_media_file_1', TRUE)) {
Outils::ecrireMessage('media id: ' . $media->id() . ' basculé vers non_indexes', Outils::MODE_DEBOGAGE);
}
}
/**
* Implements hook_form_media_hub_add_form_alter().
*/
function mon_module_form_media_hub_add_form_alter(&$form, FormStateInterface $form_state, $form_id) {
Outils::attacherValidationMediaHub($form, $form_id, '_validateur_hub');
}
/**
* Implements hook_form_media_hub_edit_form_alter().
*/
function mon_module_form_media_hub_edit_form_alter(&$form, FormStateInterface $form_state, $form_id) {
Outils::attacherValidationMediaHub($form, $form_id, '_validateur_hub');
}
/**
* Implements hook_form_media_hub_form_alter().
*/
function mon_module_form_media_hub_form_alter(&$form, FormStateInterface $form_state, $form_id) {
Outils::attacherValidationMediaHub($form, $form_id, '_validateur_hub');
}
/**
* Valider si le fichier existe dans l'endroit cherché.
*
* $fichier \Drupal\file\FileInterface $fichier
* L'objet fichier à valider.
*
* @return array
* Tableau d'erreurs.
*/
function _validateur_hub(FileInterface $fichier) {
$errors = [];
Outils::ecrireMessage("_validateur_hub appelé correctement.", Outils::MODE_DEBOGAGE);
$chercheDans = 'documents/non_indexes';
if (Outils::fichierExiste($fichier)) {
$msg = t("Fichier existe déjà dans $chercheDans");
Outils::ecrireMessage($msg, Outils::MODE_DEBOGAGE);
// Desactiver validation forcé.
$errors[] = $msg;
} else {
$msg = t("Fichier n'a pas été trouvé dans $chercheDans");
Outils::ecrireMessage($msg, Outils::MODE_DEBOGAGE);
}
return $errors;
}
classe: Outils.php
<?php
namespace Drupal\mon_module;
use Drupal\media\MediaInterface;
use Drupal\Core\File\FileSystemInterface;
use Drupal\file\FileInterface;
/**
* Outils pour mon_module.
*/
class Outils {
// Mode débogage est désactivé, au cas de développement, bascule à TRUE.
const MODE_DEBOGAGE = FALSE;
/**
* Journaliser un message vers dblog (drush wd-show va dévoiler les messages).
*
* $message (string)
* Le message à diffuser.
*
* $depistage (bool)
* Avec TRUE, ça va écrire le message peu-importe.
*
*/
public static function ecrireMessage($message, $depistage = FALSE) {
if ($depistage) {
\Drupal::logger('Outils')->notice($message);
}
}
/**
* Ajouter un méthode de validation pour le form edit/add du média hub.
*
* $form (form)
* l'Array du form.
*
* $form_id (string)
* Le form_id qu'on examine.
*
* $validateur (string)
* Le nom du méthode qu'on va appeler.
*
*/
public static function attacherValidationMediaHub(&$form, $form_id, $validateur = '_validateur_hub') {
switch ($form_id) {
case 'media_hub_form':
case 'media_hub_add_form':
case 'media_hub_edit_form':
$form['field_media_file_1']['widget'][0]['#upload_validators'][$validateur] = [];
if (isset($form['field_media_file_1']['widget'][1])) {
$form['field_media_file_1']['widget'][1]['#upload_validators'][$validateur] = [];
}
if (isset($form['field_media_file_1']['widget'][2])) {
$form['field_media_file_1']['widget'][2]['#upload_validators'][$validateur] = [];
}
if (isset($form['field_media_file_1']['widget'][3])) {
$form['field_media_file_1']['widget'][3]['#upload_validators'][$validateur] = [];
}
break;
}
Outils::ecrireMessage('Validateur attaché auprès de ' . $form_id, self::MODE_DEBOGAGE);
}
/**
* Valider si le fichier existe dans l'endroit cherché.
*
* $fichier \Drupal\file\FileInterface $fichier
* L'objet fichier à valider.
*
* @return bool
* Si fichier est trouvé dans $chercheDans retourne vrai.
*/
public static function fichierExiste(FileInterface $fichier) {
$cherche_dans = 'documents/non_indexes';
$cherche_partiel = 'non_indexes';
$nom_du_fichier = $fichier->getFilename();
$fichier_existe = FALSE;
Outils::ecrireMessage($nom_du_fichier, self::MODE_DEBOGAGE);
if (strpos($nom_du_fichier, $cherche_partiel . '/') > 0) {
// Ne cherche pas cette fois, drupal l'a déjà fait.
Outils::ecrireMessage("Ne cherche pas cette fois, drupal l'a déjà fait.", self::MODE_DEBOGAGE);
return $fichier_existe;
}
if (strpos($nom_du_fichier, 'rivate://') > 0) {
// Les fichiers privés ne sont pas dans la portée pour cette demande.
Outils::ecrireMessage("Les fichiers privés ne sont pas dans la portée pour cette demande.", self::MODE_DEBOGAGE);
return $fichier_existe;
}
$fin_chemin = strrpos($nom_du_fichier, '/');
$nom_du_fichier = substr($nom_du_fichier, $fin_chemin);
$cherche_dans_drupal = 'public://' . $cherche_dans . "/" . $nom_du_fichier;
Outils::ecrireMessage("Cherche dans drupal: " . $cherche_dans_drupal, self::MODE_DEBOGAGE);
if (file_exists($cherche_dans_drupal)) {
$fichier_existe = TRUE;
}
$position_extension = strrpos($nom_du_fichier, '.');
Outils::ecrireMessage("Position extension: " . $position_extension, self::MODE_DEBOGAGE);
$extension = substr($nom_du_fichier, $position_extension);
Outils::ecrireMessage("Extension: " . $extension, self::MODE_DEBOGAGE);
if ($fichier_existe && strlen($extension) > 1) {
$fichier_existe = false;
$uri_du_nouveau = str_replace($extension, "_" . $extension, $nom_du_fichier);
$uri_du_nouveau = str_replace("_", "__", $nom_du_fichier);
$cherche_encore_dans_drupal = 'public://' . $cherche_dans . "/" . $uri_du_nouveau;
Outils::ecrireMessage("Cherche encore dans drupal: " . $cherche_encore_dans_drupal, self::MODE_DEBOGAGE);
if (file_exists($cherche_encore_dans_drupal)) {
$fichier_existe = TRUE;
}
}
if ($fichier_existe && strlen($extension) > 1) {
$fichier_existe = false;
$uri_du_nouveau = str_replace($extension, "_7" . $extension, $nom_du_fichier);
$cherche_encore_dans_drupal = 'public://' . $cherche_dans . "/" . $uri_du_nouveau;
Outils::ecrireMessage("Cherche encore dans drupal: " . $cherche_encore_dans_drupal, self::MODE_DEBOGAGE);
if (file_exists($cherche_encore_dans_drupal)) {
$fichier_existe = TRUE;
}
}
if ($fichier_existe && strlen($extension) > 1) {
$fichier_existe = false;
$uri_du_nouveau = str_replace($extension, "_8" . $extension, $nom_du_fichier);
$cherche_encore_dans_drupal = 'public://' . $cherche_dans . "/" . $uri_du_nouveau;
Outils::ecrireMessage("Cherche encore dans drupal: " . $cherche_encore_dans_drupal, self::MODE_DEBOGAGE);
if (file_exists($cherche_encore_dans_drupal)) {
$fichier_existe = TRUE;
}
}
if ($fichier_existe && strlen($extension) > 1) {
$fichier_existe = false;
$uri_du_nouveau = str_replace($extension, "_9" . $extension, $nom_du_fichier);
$cherche_encore_dans_drupal = 'public://' . $cherche_dans . "/" . $uri_du_nouveau;
Outils::ecrireMessage("Cherche encore dans drupal: " . $cherche_encore_dans_drupal, self::MODE_DEBOGAGE);
if (file_exists($cherche_encore_dans_drupal)) {
$fichier_existe = TRUE;
}
}
return $fichier_existe;
}
/**
* Déplacer le fichier dans non_indexes ou remet le fichier à l'origine.
*
* $media (MediaInterface)
* l'Objet média.
*
* $bundle (string)
* Le type de média, pour l'instant 'hub' par défaut.
*
* $champ_fichier (string)
* Le nom du champ, pour l'instant 'field_media_file_1' par défaut.
*
* $ne_pas_indexer (bool)
* Mettre dans non_indexes [vrai] ou de retirer de non_indexes [faux].
*
* @return bool
* Si objet media est valide et critères sont valide, retourne vrai.
*/
public static function nePasIndexerMedia(MediaInterface $media = NULL, $bundle = 'hub', $champ_fichier = 'field_media_file_1', $ne_pas_indexer = TRUE) {
if (!isset($media) || !is_object($media)) {
return FALSE;
}
if (strtolower($media->bundle()) == $bundle) {
if ($media->hasField($champ_fichier)) {
$ne_pas_indexer = TRUE;
if ($ne_pas_indexer) {
$fichier = $media->get($champ_fichier)->entity;
if (empty($fichier) || empty($fichier->getFileUri())) {
// Rien à faire ici.
return TRUE;
}
$uri_du_fichier = $fichier->getFileUri();
if (stripos($uri_du_fichier, 'non_indexes') > 0) {
// Rien à faire ici.
return TRUE;
}
$uri_du_chemin = 'public://documents/non_indexes';
\Drupal::service('file_system')->prepareDirectory($uri_du_chemin, FileSystemInterface::CREATE_DIRECTORY);
$non_indexes = str_replace('documents/', 'documents/non_indexes/', $uri_du_fichier);
if (file_exists($non_indexes)) {
$position_extension = strrpos($non_indexes, '.');
$extension = substr($non_indexes, $position_extension);
if (strlen($extension) > 1) {
$uri_du_nouveau = str_replace($extension, "_" . $extension, $uri_du_fichier);
$uri_du_nouveau = str_replace("_", "__", $uri_du_fichier);
$non_indexes = str_replace('documents/', 'documents/non_indexes/', $uri_du_nouveau);
}
}
if (file_exists($non_indexes)) {
$position_extension = strrpos($non_indexes, '.');
$extension = substr($non_indexes, $position_extension);
if (strlen($extension) > 1) {
$uri_du_nouveau = str_replace($extension, "_7" . $extension, $uri_du_fichier);
$non_indexes = str_replace('documents/', 'documents/non_indexes/', $uri_du_nouveau);
}
}
if (file_exists($non_indexes)) {
$position_extension = strrpos($non_indexes, '.');
$extension = substr($non_indexes, $position_extension);
if (strlen($extension) > 1) {
$uri_du_nouveau = str_replace($extension, "_8" . $extension, $uri_du_fichier);
$non_indexes = str_replace('documents/', 'documents/non_indexes/', $uri_du_nouveau);
}
}
if (file_exists($non_indexes)) {
$position_extension = strrpos($non_indexes, '.');
$extension = substr($non_indexes, $position_extension);
if (strlen($extension) > 1) {
$uri_du_nouveau = str_replace($extension, "_9" . $extension, $uri_du_fichier);
$non_indexes = str_replace('documents/', 'documents/non_indexes/', $uri_du_nouveau);
}
}
if (!file_exists($non_indexes)) {
\Drupal::service('file.repository')->move($fichier, $non_indexes, FileSystemInterface::EXISTS_REPLACE);
$fichier->setFileUri($non_indexes);
$media->set($champ_fichier, $fichier);
}
}
elseif (!$ne_pas_indexer) {
// L'autre sens, remet le fichier dans le chemin sans restriction.
$fichier = $media->get($champ_fichier)->entity;
if (empty($fichier) || empty($fichier->getFileUri())) {
// Rien à faire ici.
return TRUE;
}
$uri_du_fichier = $fichier->getFileUri();
$uri_recherche_non_permis = 'public://documents/non_indexes/';
$uri_recherche_permis = 'public://documents/';
\Drupal::service('file_system')->prepareDirectory($uri_recherche_permis, FileSystemInterface::CREATE_DIRECTORY);
$permise = str_replace($uri_recherche_non_permis, $uri_recherche_permis, $uri_du_fichier);
if ($uri_du_fichier != $permise && file_exists($uri_du_fichier)) {
// Fichier existant.
\Drupal::service('file.repository')->move($fichier, $permise, FileSystemInterface::EXISTS_REPLACE);
$fichier->setFileUri($permise);
$media->set($champ_fichier, $fichier);
}
}
return TRUE;
}
}
return FALSE;
}
}