Usando la interfaz de usuario jQuery integrada en mi tema

25

Cada página de mi tema necesitará usar jquery UI. Sé que está incluido con Drupal 7, pero realmente no puedo descifrar la documentación demasiado técnica de Drupal. Parece que la única forma de hacerlo es con el archivo template.php. Pero como no entiendo ese archivo, estoy tratando de evitar hacerlo de esa manera.

¿Hay alguna otra manera, o debería probar el archivo template.php?

Ben
fuente
¿Que estás tratando de hacer? Todas las funciones de la interfaz de usuario jquery y las que no deberían estar disponibles para usted. ¿Ejecutar código JS personalizado en cada página? Ejecutarlo en una página específica? un evento especifico? Hay muchas maneras de hacer que JS se ejecute, a saber, drupal_add_js
LSU_JBob
Estoy tratando de usar .datepicker () en algunos campos que aparecen en cada página de mi tema. Quizás más cosas más tarde también.
Ben
@Ben Recuerde otorgar la recompensa si una respuesta resuelve su problema.
googletorp
@googletorp Lo siento, mi primera recompensa. Recompensa otorgada.
Ben
Siento que muchas de las respuestas omiten el paso final, que una vez que incluya el drupal_add_library ('sistema', 'ui.button') o lo que sea, debe agregar una o dos líneas de javascript a su tema que realmente invoca dicho enchufar.
Ryan Price

Respuestas:

36

Agregar JS a una página realmente no es tan difícil, aunque necesite usar php.

Para archivos JS normales, podría hacer algo como esto

drupal_add_js($path_to_js)

Sin embargo, Drupal ha registrado jQuery UI en bibliotecas, lo que facilita la adición de archivos JS y CSS para ciertos complementos de jQuery UI. Esto se puede hacer usando

drupal_add_library($module, $library);

Todos los complementos de jQuery UI existen en el módulo del sistema, por lo que podría hacer

drupal_add_library('system', 'ui');

o

drupal_add_library('system', 'ui.accordion');

Algunos de estos complementos tienen dependencias porque usan otros complementos. Drupal maneja esto de manera muy inteligente e incluirá los componentes necesarios.

Puede ver la lista completa de complementos de jQuery aquí . Está formateado como una matriz PHP, pero generalmente la convención de nomenclatura es ui.PLUGIN-NAME.

Si necesita agregar el JS en cada página, simplemente puede agregar un enlace de página de preproceso y agregarlos allí. Esto se vería así en el archivo template.php.

function NAME_OF_THEME_preprocess_page(&$variables) {
  drupal_add_library('system', 'ui');
  drupal_add_library('system', 'ui.accordion');
  drupal_add_library('system', 'effects.highlight');
}
googletorp
fuente
Intenté agregar exactamente lo que tienes aquí (pero usando el nombre de mi tema en lugar de NAME_OF_THEME) a ​​template.php y no funcionó. ¿Algunas ideas? Esto es lo que tengo: function nocturnal_preprocess_page(&$variables) { drupal_add_library('system', 'ui'); drupal_add_library('system', 'ui.datepicker'); }
Ben
@ben Debe borrar el caché cada vez que agrega una nueva función de enlace o preproceso. Intenta borrar el caché. También necesita una forma de probar si funciona, ya que solo está agregando archivos JS que no harán nada por sí mismos.
googletorp
Borré la memoria caché y debería estar funcionando en algunos campos de fecha que anteriormente usaban una interfaz de usuario jquery referenciada manualmente. Todavía depurando, pero no puedo encontrar nada malo hasta ahora.
Ben
@Ben El primer paso es mirar la fuente y ver si los archivos se han incluido (deshabilitar la agregación JS si está activado)
googletorp
3
@googletorp: ¿Podría explicar un poco la diferencia entre drupal_add_library('system', 'ui');y drupal_add_library('system', 'ui.accordion');? ¿El primero está buscando todo o solo el núcleo? ¿Necesito una línea para cada complemento que uso?
Jarl
4

¿Has probado el módulo date_popup ? funciona bien con el formulario API

LSU_JBob
fuente
No quiero un módulo porque el formulario que lo necesita es muy complejo y requiere una codificación personalizada. Está codificado en la plantilla para el tema. Estoy tratando de encontrar la mejor manera de utilizar la interfaz de usuario jquery que se incluye con Drupal. La única forma en que puedo hacer que funcione es ponerlo en la carpeta de mi tema y vincularlo allí. Pero dado que estoy ejecutando varios sitios en una instalación de Drupal, y todos estos sitios necesitarán una interfaz de usuario jQuery, solo quería usar la interfaz de usuario jQuery integrada para evitar el trabajo duplicado.
Ben
deberías poder llamar a cualquier elemento jquery ui desde cualquier sitio y agregarlo, está en drupal core. ¿El formulario está construido con la API de formulario?
LSU_JBob
2
¿Por qué el formulario está integrado en los archivos de plantilla? eso no es muy drupaly ... si no está utilizando el formulario API, se está perdiendo algunos de los beneficios, como la seguridad incorporada de los ataques de inyección SQL. Recomiendo encarecidamente que saque sus formularios de los archivos de plantilla y escriba un módulo personalizado donde realice los formularios utilizando la API de formularios. Intenta no ser un vaquero. En cualquier caso, puede hacer referencia a javascript desde cualquier lugar usando drupal_add_js, algo así como drupal_add_js ('/ misc / ui / jquery.ui.core.min.js', 'file'); Y drupal_add_js ('/ misc / ui / jquery.ui.datepicker.js', 'file');
LSU_JBob
3
Cree el formulario en un módulo personalizado utilizando la API de formulario, luego, en los archivos tpl, llame a render (drupal_get_form ('form_id')); Prometo que la API del formulario, tal vez con algunos JavaScript personalizados, puede manejar cualquier requisito complejo que tenga. Siento que solo te estás haciendo las cosas más difíciles tratando de incluir toda esta funcionalidad en un archivo tpl. Esa es técnicamente la capa del tema, por lo que no es una buena práctica dejar grandes trozos de código de fondo funcional en ellos.
LSU_JBob
3
Creo que está diciendo CREAR un módulo. Las cosas funcionales, como las formas, pertenecen a los módulos. La API de formulario le permite crear cualquier tipo de formulario que pueda imaginar en su propio módulo personalizado. El tema debe ser independiente de la funcionalidad en la mayoría de los casos. Eso le dará más flexibilidad en el futuro.
Jonathan Rowny
4
  1. Refactorice su formulario codificado en el archivo .tpl en una implementación de API de formulario. Como dijo @LSU_JBob, no hay ninguna razón por la que deba crear un formulario sin usar FAPI. Le recomiendo que lea la Guía de inicio rápido de Form API y marque la página de referencia de Form API .
  2. Una vez que haya creado su formulario y pueda enviarle valores, procesarlo, etc., descargue y lea el código en el módulo Contribución de fecha . La fecha se utiliza para proporcionar el tipo de ventana emergente de fecha que desea crear, pero para CCK en D6 y Core Fields en D7. Aunque no está buscando trabajar con campos, el módulo Fecha usa la interfaz de usuario de JQuery para lograr lo que está tratando de hacer. Este módulo debería darle un ejemplo sólido.
barista aficionado
fuente
Gracias. Esos enlaces son útiles. Realmente no me gusta entrar en PHP, pero supongo que tengo que hacer exactamente lo que quiero hacer en este caso. Probablemente lo guardaré en el archivo tpl por el bien del tiempo, ya que no tengo tiempo para aprender Drupal PHP en este momento. Buen consejo de todos sin embargo.
Ben
3

Gracias googletorppor responder esto.

Solo para agregar, si las cosas aún no están muy claras relacionadas con la habilitación de complementos de IU .

Tenga en cuenta que cuando mencione: drupal_add_library('system', 'ui');
Esto NO habilitará todos los complementos de la interfaz de usuario automáticamente.

Puede encontrar la lista de complementos de jquery ui disponibles en drupal 7 aquí: /misc/ui/

Para habilitar un complemento perticular, por ejemplo:, jquery.ui.slider.min.jsnecesita agregar esta línea:

drupal_add_library('system', 'ui.slider');

Espero que esto sea útil.

Sumoanand
fuente
2

Tuve este problema recientemente. Alguien me dio su módulo personalizado para forzar la carga de la interfaz de usuario de JQuery en cada página. Puedes recrearlo simplemente. Primero, instale jquery_update y asegúrese de que esté funcionando. Luego, crea y habilita este módulo:

Haga una carpeta en la ruta / a / módulos llamada 'jquery_force'.

En el interior, agregue dos archivos:

jquery_force.info :

name = JQuery UI Force
description = Forces JQuery UI to always load
dependencies[] = jquery_update
package = User Interface
core = 7.x
files[] = jquery_force.module

jquery_force.module :

<?php
/**
 * @file jquery_force.module
 * TODO: Enter file description here.
 */

/**
 * Implements hook_init().
 */
function jquery_force_init() {
    drupal_add_library('system', 'ui');
}
mtro
fuente
2

Agregar un gancho de preproceso en el template.phparchivo no funcionó para mí.

Simplemente pongo drupal_add_library('system', 'ui');en el template.phparchivo por sí mismo, funciona.

usuario17418
fuente