Exemple de validation

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;

  }

}