it-swarm-es.com

Cómo mantener el archivo subyacente al eliminar un valor de Filefield

Tengo un tipo de contenido con un FileField (imagen, en particular). Cuando se elimina uno de estos valores, entonces Drupal también elimina el archivo subyacente (siempre que ningún otro nodo haga referencia al mismo archivo).

No quiero que se eliminen los archivos subyacentes, quiero que permanezcan en el sistema de archivos. ¿Hay algún gancho u otras técnicas que pueda usar para asegurarme de que permanezca después de que se elimine su valor de FileField?

4
Greg

Es un truco feo, pero esta es la forma más simple que encontré para evitar que se elimine un archivo. Funciona enganchando file_delete y luego eliminando la propiedad uri de la $file variable. Sin la uri, Drupal no puede eliminar el archivo.

// Think twice before using this ugly hack.
// It probably breaks something and kills kittens.
function mymodule_file_delete($file) {
  $path = drupal_realpath($file->uri);
  if (!is_dir($path) && is_file($path)) {
    if (preg_match('/insert_regex_here/', $path)) {
      $file->uri = NULL;
    }
  }
}

Las otras alternativas que consideré fueron:

  • Hackear núcleo
    Aunque piratear el núcleo es un tabú, sería una solución más limpia que el anzuelo que uso arriba.
  • Usando file_usage_add () en cada archivo que quiero retener
    No se ajusta muy bien a mi caso de uso: decenas de miles de archivos creados y eliminados independientemente de Drupal. Sincronizando todos esos archivos con file_usage_add sería desalentador.
  • Use el módulo Media para hacer referencia a las rutas de archivo
    Los medios parecen exagerados y aún no son estables. Además, no estoy seguro de si haría lo que necesito.
0
Greg
0
Daniel Nitsche