Pasar al contenido principal
×

Bug crítico del módulo Download Count con Drupal 8.9.x.

El error sucede cuando se agregan nuevos nodos con campos asociados al sistema de archivos privados.

Texto Equipo Pixel

Esta solución aplica para Drupal 8.9.6 y la versión del módulo 8.x-1.0-alpha1 o en donde la estructura del archivo download_count.module sea similar.

El problema es que cuando Drupal intenta guardar un nodo con un campo de archivos perteneciente al sistema privado, se genera el evento de registrar una descarga dentro del módulo.

En otras palabras, el sistema busca registrar la descarga de un archivo de un nodo que aún no existe, lo cual genera un error como el siguiente: "Drupal\Core\Database\IntegrityConstraintViolationException: SQLSTATE[23502]: Not null violation: 7 ERROR: null value in column "type" violates not-null constraint DETAIL".

Para evitar esta situación no manejada por el módulo, basta añadir un control del tipo ISSET para las variables generadas a partir de la existencia del nodo $entity_type o $entity_id. Para una mejor comprensión, ubique las líneas resaltadas en negrilla en el siguiente código.

if(isset($entity_type)) {
        $connection = Database::getConnection();
        $connection->insert('download_count')
          ->fields([
            'fid' => $entity->id(),
            'uid' => $account->id(),
            'type' => $entity_type,
            'id' => $entity_id,
            'ip_address' => $ip,
            'referrer' => $referrer,
            'timestamp' => $time,
          ])
          ->execute();
    
        $flood->register('download_count-fid_' . $entity->id(), $flood_window);
    
        Drupal::logger('download_count')
          ->notice('%file was downloaded by user #%uid from %ip', [
            '%file' => $entity->getFilename(),
            '%uid' => $account->id(),
            '%ip' => $ip,
          ]);
    
        if (Drupal::moduleHandler()->moduleExists('rules')) {
          $host_entity = Drupal::entityTypeManager()
            ->getStorage($entity_type)
            ->load($entity_id);
          if (function_exists('rules_invoke_event')) {
            rules_invoke_event('download_count_file_download', $entity, $account, $host_entity);
          }
        }
}

El texto remarcado es la adición del bloque de tipo IF para el respectivo control.

Esta solución se aplica al archivo download_count.module dentro del módulo.

Una vez aplicado el parche, el aviso no solo desaparece, sino que el sistema de contabilización funciona normalmente tanto para archivos nuevos como para los existentes en el sistema privado.

Ver más detalles en: https://www.drupal.org/project/download_count/issues/3162900