it-swarm-es.com

¿No se incluyen los "archivos []" de custom_module.info en los envíos de formularios?

Tengo un módulo que estoy trasladando a Drupal 7 (específicamente, Taxonomy Views Integrator ) y hay 2 archivos de inclusión tvi.admin.inc Que were incluido a través del archivo .info del módulo:

files[] = includes/tvi.admin.inc

El tvi.admin.inc Alberga las funciones que utiliza tvi.module 'S hook_form_alter(), incluida la validación & enviar funciones

Aunque las modificaciones realizadas con hook_form_alter() funcionan correctamente, después de enviar las funciones de validación y envío en tvi.admin.inc No están disponibles y arroja un error de función no declarado.

p.s.

He comprobado el problema inicial para el registro extendido del módulo .info a través de: http://drupal.org/node/224333#registry y dice lo siguiente que ¡mayo danos una respuesta:

Los archivos que contienen solo funciones no necesitan estar listados en el archivo .info.

Como solución alternativa,

Ahora uso module_load_include() para cargar el tvi.admin.inc En la parte superior de tvi.module Que, en el envío del formulario, todavía incluye el inc y, por lo tanto, las funciones de validación/envío.

6
electblake

Los archivos enumerados en . Los archivos de información no se incluyen automáticamente cuando se carga el módulo; se cargan cuando un módulo intenta crear un objeto para una clase que PHP no encuentra. En ese caso, una devolución de llamada registrada con spl_autoload_register () verificará el contenido del registro Drupal registro para encontrar qué archivo necesita cargarse para permitir la creación del objeto.

La única forma de cargar un archivo que contiene una función es usar module_load_include().
En el caso específico, donde la función a cargar es un controlador de validación de formulario (o un controlador de envío de formulario) que se agrega a un formulario alterado con hook_form_alter() (o hook_form_FORM_ID_alter()), Prefiero mantener los controladores de formulario en el mismo archivo que contiene la implementación de enlace. Técnicamente, el archivo es cargado por hook_form_alter() cuando no es necesario, ya que los manejadores de formularios se utilizan después de que se haya enviado el formulario; Hasta ahora, el código funcionó, pero no se dice que no funcionaría en futuras versiones de Drupal.

Drupal 7 permite que los módulos implementen hook_hook_info () , que se utiliza desde Drupal para saber en qué archivos están definidas las implementaciones de hook. El módulo del sistema define su propia implementación, que contiene el siguiente código:

function system_hook_info() {
  $hooks['token_info'] = array(
    'group' => 'tokens',
  );
  $hooks['token_info_alter'] = array(
    'group' => 'tokens',
  );
  $hooks['tokens'] = array(
    'group' => 'tokens',
  );
  $hooks['tokens_alter'] = array(
    'group' => 'tokens',
  );

  return $hooks;
}

Con esta implementación del gancho, cuando Drupal está buscando el archivo que contiene la implementación de hook_tokens() para el módulo custom.module, buscará el archivo custom.tokens .inc contenido en el directorio donde está instalado el módulo custom.module.
Los módulos de terceros pueden implementar su propia hook_hook_info(), pero debe recordarse que están modificando donde Drupal busca el gancho implementado por otros módulos también, lo que significa que al cambiar el grupo por hook_token_alter() cambia los archivos donde Drupal busca cualquier implementación de hook_token_alter().

Es posible usar hook_hook_info() para mantener algunos enlaces en un archivo que es diferente del archivo del módulo, usando una implementación similar a la siguiente:

function custom_hook_info() {
  return array(
    'form_alter' => array(
      'group' => 'form',
    ),
  );
}

Lo que informé antes sigue siendo válido; las versiones futuras de Drupal podrían dejar de funcionar porque no encontrarían dónde están los manejadores de formularios, aunque sepan dónde encontrar la implementación de hook_form_alter().
Esta es la razón por la que sigo para poner la implementación de hook_form_alter() (o hook_form_FORM_ID_alter()) y todos los controladores de formularios relacionados en el archivo del módulo.

16
kiamlaluno

Solo las clases se rastrean y se incluyen automáticamente. Todo lo demás necesita ser incluido manualmente.

Además, no estoy realmente seguro de lo que está haciendo aquí, no necesita modificar sus propios formularios. En segundo lugar, las devoluciones de llamada _submit ()/_ validate () deben estar en el mismo archivo que la función de formulario en sí, entonces no es necesario incluirlas manualmente.

2
Berdir