P. 1
PFC_0

PFC_0

|Views: 38|Likes:
Publicado porunipfc

More info:

Published by: unipfc on Jun 30, 2011
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

11/14/2013

pdf

text

original

Sections

Documentaci´n del Proyecto Fin de Carrera o Dise˜o e Implementaci´n de Gestor de n o Documentos con Drupal

Ignacio Varela Andr´s e Patricia Fern´ndez Garc´ a ıa Tutores: Enrique Alegre Guti´rrez y Diego Garc´a Ord´s e ı a Escuela de Ingenier´ Industrial e Inform´tica ıas: a Universidad de Le´n o Convocatoria: Junio 2011 31 de mayo de 2011

UNIVERSIDAD DE LEÓN Escuela de Ingeniería Informática de León

El presente Proyecto de Fin de Carrera cuyo título es “Diseño e Implementación de Gestor de Documentos con Drupal” ha sido realizado por Dña. Patricia Fernández García y D. Ignacio Varela Andrés, alumnos de la Escuela Universitaria de Ingeniería Informática de León, con el fin de obtener el título de Ingeniero en Informática por la Universidad de León. León, Junio de 2011
Vº Bº Oficina Técnica:

Firmado: Manuel Castejón

Vº Bº Directores de Proyecto:

Firmado: Enrique Alegre Gutiérrez

Firmado: Diego García Ordás

Autores:

Firmado: Patricia Fernández García

Firmado: Ignacio Varela Andrés

´ Indice general
1. Objetivos del Proyecto 1.1. Motivaci´n y Objetivos o 7 7 9 9 11 12 12 13 13 13 14 15 15 15 16 16 17 17 18 19 19 21 23 24 24 26 26 27 27 28 28

. . . . . . . . . . . . . . . . . . . . .

2. Drupal 2.1. Introducci´n . . . . . . . . . . . . . . . . o 2.2. Funcionalidades . . . . . . . . . . . . . . 2.2.1. Gesti´n de Usuarios . . . . . . . o 2.2.2. Gesti´n de Contenido . . . . . . o 2.2.3. Blogging . . . . . . . . . . . . . . 2.2.4. Plataforma . . . . . . . . . . . . 2.2.5. Administraci´n y An´lisis . . . . o a 2.2.6. Caracter´ ısticas de Comunidad . . 2.2.7. Rendimiento y escalabilidad . . . 2.3. Comunidad . . . . . . . . . . . . . . . . 2.3.1. Descargas . . . . . . . . . . . . . 2.3.2. Crear la base de datos de Drupal 2.3.3. Actualizaci´n de Drupal . . . . . o 2.3.4. Crear cuenta de administrador . 2.3.5. Crear un nuevo bloque . . . . . . 2.3.6. Migraci´n del sitio web . . . . . o 2.4. Caracter´ ısticas y M´dulos . . . . . . . . o 2.4.1. Caracter´ ısticas . . . . . . . . . . 2.4.2. M´dulos de inter´s . . . . . . . . o e 2.5. Sitios realizados . . . . . . . . . . . . . . 3. Funcionalidades y soluciones adoptadas 3.1. Funcionalidades . . . . . . . . . . . . . . 3.2. Fases del desarrollo del proyecto . . . . 3.2.1. Primera Fase . . . . . . . . . . . 3.2.2. Segunda Fase . . . . . . . . . . . 3.2.3. Tercera Fase . . . . . . . . . . . 3.2.4. Cuarta Fase . . . . . . . . . . . . 3.2.5. Quinta Fase . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

2

3.3. M´dulos utilizados . . . . . o 3.3.1. M´dulos primarios . o 3.3.2. M´dulos secundarios o 3.4. Roles en nuestro proyecto .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

29 29 29 32 34 34 34 36 38 39

4. Indexaci´n de documentos o 4.1. Problema de la b´squeda e indexaci´n y su soluci´n . . u o o 4.1.1. Estudio e implementaci´n realizado por Patricia o 4.1.2. Estudio e implementaci´n realizado por Ignacio . o 4.1.3. Conclusiones obtenidas por los alumnos . . . . . 4.2. Interfaz de usuario . . . . . . . . . . . . . . . . . . . . .

. . . . .

. . . . .

. . . . .

5. Conclusiones y l´ ıneas futuras 56 5.1. Conclusiones . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 5.2. L´ ıneas futuras . . . . . . . . . . . . . . . . . . . . . . . . . . . 57

3

´ Indice de figuras
4.1. 4.2. 4.3. 4.4. 4.5. 4.6. 4.7. 4.8. 4.9. Screen de la pantalla del Login . . . . . . . . . . . . . . . . . Pantallazo de la p´gina principal . . . . . . . . . . . . . . . . a Inicio alternativo . . . . . . . . . . . . . . . . . . . . . . . . . Barra de enlaces primarios . . . . . . . . . . . . . . . . . . . . Barra de enlaces secundarios . . . . . . . . . . . . . . . . . . Icono de ayuda . . . . . . . . . . . . . . . . . . . . . . . . . . Enlace a la secci´n de creaci´n de nodos para PDF’s . . . . . o o Enlace a la secci´n de creaci´n de nodos para DOC’s . . . . . o o Enlace a la secci´n de creaci´n de contenidos para archivos o o comprimidos . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.10. Enlace a la secci´n de creaci´n de contenidos de Documentos o o Online . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.11. Pantalla de creaci´n del nodo para un archivo PDF . . . . . . o 4.12. Pantalla de creaci´n del nodo para un archivo DOC . . . . . o 4.13. Pantalla de creaci´n del nodo para un archivo comprimido . . o 4.14. Pantalla de creaci´n del nodo para un archivo Online . . . . . o 4.15. Organizaci´n de los documentos PDF . . . . . . . . . . . . . o 4.16. Organizaci´n de los documentos de texto . . . . . . . . . . . o 4.17. Organizaci´n de los documentos comprimidos . . . . . . . . . o 4.18. Organizaci´n de los documentos Online . . . . . . . . . . . . o 4.19. Pantalla de b´squeda simple . . . . . . . . . . . . . . . . . . . u 4.20. Pantalla de b´squeda avanzada . . . . . . . . . . . . . . . . . u 4.21. Ejemplo de b´squeda avanzada . . . . . . . . . . . . . . . . . u 4.22. Screen del bot´n del Cron . . . . . . . . . . . . . . . . . . . . o 4.23. Imagen de la ventana emergente citada . . . . . . . . . . . . . 5.1. Subida m´ltiple de archivos . . . . . . . . . . . . . . . . . . . u 5.2. Herramienta para dar soporte a la indexaci´n de otras exteno siones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 40 41 41 41 41 42 42 43 43 44 45 46 47 48 48 49 49 50 50 51 52 52 58 58

4

Resumen
En este proyecto se ha realizado el dise˜o, desarrollo e implementaci´n de n o un sitio web con capacidades de gesti´n documental. Entre sus caracter´ o ısticas remarcamos la capacidad de creaci´n de nodos asociados a archivos de o diferentes formatos, as´ como la organizaci´n autom´tica de los mismos. Los ı o a archivos almacenados en los nodos poseen todas las capacidades de gesti´n o asociadas como son: visualizaci´n, descarga y edici´n. o o Para dotar al proyecto con funcionalidades a˜adidas se han implemenn tado capacidades a˜adidas de visualizaci´n online mediante herramientas n o externas (m´dulo iPaper), que nos permiten un visionado avanzado de los o documentos, sin necesidad de descargarlos en nuestra m´quina. Pudiendo a incluso buscar dentro de ellos, seleccionar fragmentos de texto e incluso diferentes modos de visi´n para adecuarnos a las necesidades de cada moo mento. El sitio web est´ ideado para soportar un tr´fico multiusuario con caa a pacidades para restringir el acceso a ciertos contenidos o eliminaci´n de o privilegios para determinadas acciones. Como capacidad estrella del sitio web se implement´ la indexaci´n de o o documentos autom´ticos de tipo PDF mediante la modificaci´n e inclusi´n a o o de herramientas externas como Search files o Pdftotext. De esta forma, todo archivo con dicha extensi´n ser´ procesado por el sitio web realizando la o a nombrada indexaci´n autom´tica. o a Con la ultima funcionalidad implementada podremos usar el motor de ´ b´squeda de nuestro sitio web de dos formas independientes. La primera u ser´ la m´s b´sica centr´ndonos unicamente en los nodos creados por los ıa a a a ´ usuarios y la segunda por otro lado, permitir´ una b´squeda avanzada denıa u tro de los archivos enlazados a los nodos de tipo PDF.

5

Abstract
In this project we had performed design, development and implementation of a website with document management capacity. Among features, note the capacity of node creation, associated with files of different formats, as well as the automatic organization of them. The files stored in nodes has all management capacities associated, as: visualization, download and edition. To give added functionality to the project, have been made other capacities of online visualization with external tools (iPaper module), that allows us an advanced view of the documents without download them in our machine. We can search inside of them, select text fragments and use different view modes. The website supports a multiuser traffic with capacities to restrict the content access or remove the permissions for some actions. The best quality of the website is the automatic indexing of PDF format files, with the modification and inclusion of external tools, as: search files module or Pdftotext tool. Thus, any file with this format will be processed for the website doing the automatic indexing. With the latest functionality implemented, we’ll be able to use the search engine of our website in two different ways. On the one hand we have the basic one: a search in nodes created by users. On the other hand we allows an advance search in the node attached files of PDF format.

6

Cap´ ıtulo 1

Objetivos del Proyecto
1.1. Motivaci´n y Objetivos o

Situaci´n actual, los departamentos de empresas o universidad consultan o y generan muchos documentos. Por ello ser´ conveniente disponer de una ıa herramienta web que actuara como almac´n -contenedor- de esos documene tos y al mismo tiempo dotarla de capacidades de consulta a partir de la indexaci´n de los contenidos de los documentos depositados. o A su vez puede ser interesante para el alumnado permitiendo consultas de material sin necesidad de recurrir a las bibliotecas de los centros o a personal encargado de los art´ ıculos.

Objetivos concretos: Desarrollar un sitio web: Proceso de dise˜o e implementaci´n para n o crear un sitio web acorde a las necesidades del proyecto sobre el que trabajamos. Gestor utilizado: Drupal: Debido a las capacidades de este gestor y a su forma modular se ha elegido como mejor opci´n para desarrollar el o proyecto. Capacidad de almacenamiento: Partiendo de un servidor para el almacenamiento f´ ısico de los archivos daremos capacidad de alojar archivos de diferentes formatos y extensiones para su organizaci´n e indexado o en el caso del PDF.

7

Consulta e indexaci´n: Indexaci´n autom´tica de archivos con exteno o a si´n .PDF. o Multiusuario: Todo el sistema se basar´ en una organizaci´n de usuaa o rios que permitan registrarse e identificarse a los diferentes integrantes de posibles departamentos u organizaciones que dan uso de este gestor.

8

Cap´ ıtulo 2

Drupal
2.1. Introducci´n o

Drupal es un sistema de gesti´n de contenidos modular (hecho mediante o m´dulos) y muy configurable. o Es un programa de c´digo abierto, con licencia GNU/GPL (GNU Public o License), escrito en lenguaje PHP (PHP Hypertext Pre-processor), desarrollado y mantenido por una activa comunidad de usuarios. Este gestor destaca por la calidad de su c´digo y de las p´ginas generadas o a y se le da un ´nfasis especial a la usabilidad del mismo y a la consistencia e de todo el sistema. El dise˜o de Drupal es especialmente id´neo para construir y gestion o nar comunidades en Internet. No obstante, su flexibilidad y adaptabilidad, as´ como la gran cantidad de m´dulos adicionales disponibles, hace que sea ı o adecuado para realizar muchos tipos diferentes de sitio web. El sitio principal de desarrollo y coordinaci´n de Drupal es drupal.org, o en el que participan activamente varios miles de usuarios de todo el mundo. Drupal es un sistema de gesti´n de contenido para la web. El texto y o los enlaces entre el contenido son almacenados en una base de datos, y las p´ginas se construyen din´micamente para ser presentadas al usuario en resa a puesta a una “petici´n web”mediante un navegador. o El contenido en Drupal se almacena como nodos. Un nodo es un objeto de contenido gen´rico, que se puede corresponder con una “p´gina”, un e a “art´ ıculo”, una “entrada de blog”, etc...

9

A algunos tipos de nodo, dependiendo de la configuraci´n, los usuarios o pueden a˜adir comentarios (los comentarios no se consideran como nodos). n Los nodos o los comentarios pueden necesitar ser aprobados por un administrador antes de ser publicados. La presentaci´n y el dise˜ o de las p´ginas son gestionadas mediante o n a Temas intercambiables. La presentaci´n est´ndar de una p´gina de drupal o a a (el tema), consiste en tres columnas. La columna del centro es la “Columna de contenido”, en la cual, la m´s t´ a ıpica muestra res´menes de los nodos u publicados m´s recientemente por orden de fecha. a Por ejemplo, si hace click en uno de los res´menes, el contenido completo u del nodo es mostrado en la columna central. Las columnas izquierda y derecha se llaman normalmente “barras laterales”, las cuales pueden mostrar “bloques” o informaci´n relacionada. o Los bloques a menudo contienen enlaces para navegar hacia otros nodos. Por ejemplo, puede haber bloques mostrando los ultimos art´ ´ ıculos enviados o los m´s populares. a Para nuevas instalaciones, se muestran el bloque de inicio de sesi´n y el o bloque de navegaci´n que contiene un men´ de acciones que se pueden llevar o u a cabo. Diferentes men´s pueden ser mostrados en el bloque de navegaci´n, deu o pendiendo de lo que est´ haciendo y de qu´ privilegios o permisos (roles) e e tenga el usuario. Los bloques tambi´n pueden aparecer o no dependiendo de en qu´ parte e e del sitio web est´ y de qu´ acciones est´ realizando, aparte de los privilegios e e a que tenga. Por ejemplo, el bloque de inicio de sesi´n no aparece si la sesi´n ya ha o o sido iniciada, o el de “art´ ıculos m´s recientes” puede no mostrarse si no hay a art´ ıculos disponibles. El administrador puede habilitar/deshabilitar distintos bloques siguiendo las opciones de Administrar – Bloques. Los nodos se pueden clasificar en categor´ ıas, tambi´n llamadas taxoe nom´ ıas. Los foros son un ejemplo de nodos de contenido organizados por categor´ las cuales pueden ser jer´rquicas lo que significa que una categor´ ıa, a ıa “padre” contiene m´ltiples categor´ “hijos”. u ıas

10

A menudo, nuevas funcionalidades son implementadas en Drupal como m´dulos. Una vez que un administrador a˜ade un archivo o carpeta de o n un m´dulo en el subdirectorio “m´dulos”, la opci´n de utilizar el m´dulo o o o o aparece en la secci´n Administrar – M´dulos. o o Si el administrador activa ese m´dulo, las funcionalidades asociadas con o ´l se activan y aparecen en la secci´n correspondiente de Drupal. e o Un m´dulo puede definir un nuevos tipos de nodos, crear nuevas opciones o en el men´ o proporcionar nuevos bloques que estar´n disponibles para u a mostrar en las barras laterales.

2.2.

Funcionalidades

1. Ayuda online. Se trata de un robusto sistema de ayuda online y p´ginas de ayuda para los m´dulos del ”n´cleo”, tanto para usuarios como a o u para administradores. 2. B´ squeda. Todo el contenido en Drupal es totalmente indexado en u tiempo real y se puede consultar en cualquier momento. 3. C´digo abierto. El c´digo fuente de Drupal est´ disponible de mao o a nera libre bajo los t´rminos de la licencia GNU/GPL. Al contrario que otros e sistemas de blogs, es posible extender o adaptar Drupal seg´n las necesidau des. 4. M´dulos. La comunidad de Drupal ha proporcionado muchos m´duo o los que disponen de funcionalidades como “p´gina de categor´ a ıas”, “mensajes privados”, “bookmarks”, etc. 5. Personalizaci´n. Un robusto entorno de personalizaci´n est´ impleo o a mentado en el n´cleo de Drupal. Tanto el contenido como la presentaci´n u o pueden ser individualizados de acuerdo las preferencias definidas por el usuario. 6. URLs limpias. Drupal usa el mod–rewrite de Apache para crear URLs que son manejables por los usuarios y los motores de b´squeda. u

11

2.2.1.

Gesti´n de Usuarios o

Autenticaci´n de usuarios. o Los usuarios se pueden registrar e iniciar sesi´n de forma local o utilio zando un sistema de autenticaci´n externo. o Permisos basados en roles. Los administradores de Drupal no tienen que establecer permisos para cada usuario. En lugar de eso, pueden asignar permisos a un “rol” y agrupar los usuarios por roles.

2.2.2.

Gesti´n de Contenido o

Control de versiones. El sistema de control de versiones de Drupal permite seguir y llevar al d´ las sucesivas actualizaciones del contenido: qu´ se ha cambiado, la hora ıa e y la fecha, qui´n lo ha cambiado, y dem´s. e a Tambi´n permite mantener comentarios sobre los sucesivos cambios o e deshacer los cambios recuperando una versi´n anterior. o Enlaces permanentes (Permalinks). Todo el contenido creado en Drupal tiene un enlace permanente asociado a ´l para que pueda ser enlazado externamente sin temor de que el enlace e falle en el futuro. Objetos de Contenido (Nodos). El contenido creado en Drupal es, funcionalmente, un objeto (un nodo). Esto permite un tratamiento uniforme de la informaci´n, como una misma o cola de moderaci´n para env´ de diferentes tipos, promocionar cualquiera o ıos de estos objetos a la p´gina principal o permitir comentarios (si se desea) a sobre cada objeto. Plantillas (Templates). El sistema de temas de Drupal separa el contenido de la presentaci´n o permitiendo controlar o cambiar f´cilmente el aspecto del sitio web. a

12

2.2.3.

Blogging

Agregador de noticias. Drupal incluye un potente Agregador de Noticas para leer y publicar enlaces a noticias de otros sitios web. Incorpora un sistema de cach´ en la e base de datos, con temporizaci´n configurable. o Soporte de Blogger API. La API de Blogger permite que un sitio Drupal sea actualizado utilizando diversas herramientas, que pueden ser “herramientas web” o “herramientas de escritorio” que proporcionen un entorno de edici´n m´s manejable. o a

2.2.4.

Plataforma

Independencia de la base de datos. Aunque la mayor parte de las instalaciones de Drupal utilizan MySQL, existen otras opciones. Drupal incorpora una “capa de abstracci´n de base o de datos” que actualmente est´ implementada y mantenida para MySQL y a PostgresSQL, aunque permite incorporar f´cilmente soporte para otras baa ses de datos. Multiplataforma. Drupal ha sido dise˜ado desde el principio para ser multiplataforma. n Puede funcionar con Apache o Microsoft IIS como servidor web y en sistemas como Linux, BSD, Solaris, Windows y Mac OS X. Por otro lado, al estar implementado en PHP, es totalmente portable. Multiples idiomas y Localizaci´n. o Drupal est´ pensado para una audiencia internacional y proporciona a opciones para crear un portal multiling¨e. Todo el texto puede ser f´cilmente u a traducido utilizando una interfaz web, importando traducciones existentes o integrando otras herramientas de traducci´n. o

2.2.5.

Administraci´n y An´lisis o a

Administraci´n v´ Web. o ıa La administraci´n y configuraci´n del sistema se puede realizar enterao o mente con un navegador y no precisa de ning´n software adicional. u

13

An´lisis, Seguimiento y Estad´ a ısticas. Drupal puede mostrar en las p´ginas web de administraci´n informes a o sobre enlaces entrantes, popularidad del contenido, o de c´mo los usuarios o navegan por el sitio. Registros e Informes. Toda la actividad y los sucesos del sistema son capturados en un “registro de eventos”, que puede ser visualizado por un administrador.

2.2.6.

Caracter´ ısticas de Comunidad

Comentarios enlazados. Drupal proporciona un potente modelo de comentarios enlazados que posibilita seguir y participar f´cilmente en la discusi´n sobre el comentario a o publicado. Los comentarios son jer´rquicos, como en un grupo de noticias o a un foro. Encuestas. Drupal incluye un m´dulo que permite a los administradores y/o usuao rios crear encuestas online totalmente configurables. Foros de discusi´n. o Drupal incorpora foros de discusi´n para crear sitios comunitarios vivos o y din´micos. a Libro Colaborativo. Esta caracter´ ıstica es unica de Drupal y permite crear un proyecto a ser ´ escrito y que otros usuarios contribuyan contenido. El contenido se organiza en p´ginas de f´cil navegaci´n. a a o

14

2.2.7.

Rendimiento y escalabilidad

Control de congesti´n. o Drupal incorpora un mecanismo de control de congesti´n que permite o habilitar y deshabilitar determinados m´dulos o bloques dependiendo de la o carga del servidor. Este mecanismo es totalmente configurable y ajustable. Sistema de Cache. El mecanismo de cach´ elimina consultas a la base de datos incremene tando el rendimiento y reduciendo la carga del servidor.

2.3.

Comunidad

Aunque el desarrollo de Drupal se centraliza en drupal.og (Ingl´s) existen, e adem´s de Drupal Hispano, varias comunidades o grupos de usuarios sobre a Drupal en Espa˜ol. n

2.3.1.

Descargas

Si queremos disponer del contenido de Drupal, podemos hacerlo a trav´s e del siguiente enlace: http://drupal.org/project Otras direcciones utiles son: ´ La ultima versi´n estable de Drupal: ´ o http://drupal.org/project/drupal Todos los m´dulos clasificados por categor´ o ıa: http://drupal.org/project/modules Plantillas para cambiar el aspecto de tu sitio web: http://drupal.org/project/themes Archivo de traducci´n para cargar en Drupal: o http://drupal.org/project/es Instalaciones preconfiguradas para ahorrar tiempo: http://drupal.org/project/Installation+profiles

15

2.3.2.

Crear la base de datos de Drupal

Estas instrucciones son para MySQL. Si est´ usando otra base de datos, a revise la documentaci´n de ´sta. En los siguientes ejemplos, “user” es un o e usuario de ejemplo de MySQL que tiene los privilegios de Crear. Usted debe utilizar los nombres apropiados para su sistema. Lo primero, es crear una nueva base de datos para su sitio Drupal: mysqladmin –u user –p create drupal MySQL pedir´ la contrase˜a para el usuario user y luego crear´ los ara n a chivos iniciales de la base de datos. Luego deber´ ingresar y establecer los a permisos de acceso a la base de datos: mysql –u user –p Nuevamente se preguntar´ la contrase˜a para el usuario user. En la cona n sola, ingrese el siguiente comando: GRAN T ALL P RIV ILEGES ON drupal. ∗ T O user@localhost IDEN T IF IED BY pass Donde: - drupal es el nombre de su base de datos; - user@localhost es el id de usuario de la cuenta de MySQL de su servidor web; - pass es la contrase˜a requerida para ingresar como usuario en MySQL. n Si los datos son correctos, MySQL responder´: Query OK, 0 rows affected a

2.3.3.

Actualizaci´n de Drupal o

Cada pocos meses aparece una nueva versi´n de Drupal. Para corregir o posibles problemas de seguridad y aprovechar las nuevas funcionalidades, se recomienda tener actualizado el sitio a la ultima versi´n. ´ o Nota: Antes de iniciar la actualizaci´n se recomienda leer esta p´gina o a hasta el final y estar seguro de haber entendido todos los pasos. Una actualizaci´n incompleta o realizada incorrectamente puede hacer que el sitio web o deje de funcionar.

16

Los pasos para actualizar una instalaci´n de Drupal son: o Hacer una copia de seguridad de los archivos del sitio web y de la base de datos. Descargar y descomprimir los nuevos archivos en la carpeta correspondiente del servidor. Ejecutar el script update.php que actualizar´ la base de datos. a

2.3.4.

Crear cuenta de administrador

Pasos para poder crear una cuenta de administrador, pues es imprescindible. Inicie sesi´n en su sitio. o Seleccione Administer, User Management, Usuarios y pulse Add user. En Nombre de usuario: escriba el nombre del Nuevo usuario. En Direcci´n de correo: escriba la direcci´n e-mail del usuario. o o En Contrase˜a: escriba una contrase˜a con m´s de 6 caracteres (letras n n a y n´meros). u En Confirmar contrase˜a: vuelva a escribir la contrase˜a anterior. n n Seleccione la opci´n, Notificar el usuario de la cuenta nueva. o Pulse el bot´n Crear cuenta nueva. o Nota: La cuenta del nuevo usuario se ha creado correctamente, pero sin privilegios de administrador.

2.3.5.

Crear un nuevo bloque

Pasos para poder crear un nuevo bloque en nuestra versi´n de Drupal. o 1. Inicie sesi´n en su sitio. o 2. Seleccione Administer, Site building, Blocks y pulse Add block. 3. En el men´ superior seleccione Add block, se mostrara una p´gina con u a la informaci´n que debe insertar. o 4. En Descripci´n del bloque: inserte una breve informaci´n sobre el bloo o que (ej. Novedades) 17

5. En T´ ıtulo del bloque: inserte un nombre para el bloque (ej. Novedades). 6. En el cuerpo del bloque: inserte un contenido para el bloque (similar a una historia o p´gina). a 7. En Opciones de visibilidad personalizadas: marque una de las opciones (ej. Los usuarios no pueden controlar la visibilidad de este bloque). 8. En Mostrar el bloque en roles espec´ ıficos: no marque ninguna opci´n o si desea que todos vean el bloque. 9. En Mostrar el bloque en p´ginas especificadas: escriba el node de las a p´ginas en las que desea ver/ocultar el bloque (ej. seleccione la opci´n a o Mostrar solamente en las p´ginas de esta lista, y en el cuadro de texto a escriba node/1 para visualizar el bloque solo en la pagina de inicio). Nota: para ver el node, seleccione la p´gina, en la barra URL de su a explorador web se mostrara la direcci´n de la p´gina, siendo la ultima o a ´ expresi´n el node/1 o 10. Pulse el bot´n Salvar el bloque. o

2.3.6.

Migraci´n del sitio web o

Esto es una peque˜a gu´ de como migrar un sitio web basado en Drupal n ıa de un servidor a otro.

Comprobaci´n de servidores, versiones de PHP y MySQL, m´dulos de o o Apache, conectividad, etc. Subida del c´digo al servidor y creaci´n de un sitio de prueba con o o el mismo c´digo y una copia ”en caliente” de la base de datos para o comprobar que todo funciona. Anuncio del evento a los usuarios, con fechas previstas y tiempo estimado de parada. Parada del sitio web original. Puesto en ”modo mantenimiento”. Volcado de la base de datos y copia de los archivos. Puesta online del viejo sitio web en modo est´tico -sin permitir inicio a de sesi´n ni publicaci´n. o o Carga de la nueva base de datos y puesta en marcha del nuevo sitio en ”modo mantenimiento”(S´lo administradores). o Pruebas del nuevo sitio web. 18

Cambio del ”modo mantenimiento.al modo normal de funcionamiento. Cambio del DNS, redireccionando el dominio al nuevo servidor.

2.4.
2.4.1.

Caracter´ ısticas y M´dulos o
Caracter´ ısticas
Book: Libros colaborativos o escritura de documentaci´n o

Los libros organizan los contenidos en una estructura jer´rquica anidada. a Son particularmente pr´cticos para manuales, preguntas frecuentes, entre a otros, permitiendo agregar cap´ ıtulos, secciones, etc. a Un libro es simplemente una colecci´n de nodos que est´n enlazados eno tre ellos. Esos nodos son usualmente del tipo p´gina de libro, pero se pueden a incluir nodos de cualquier tipo en el ´ ındice de un libro. Cada nodo en el libro tiene un nodo padre que lo ”contiene”. De esta manera el m´dulo libro estao blece su jerarqu´ En un nivel dado de la jerarqu´ un libro puede contener ıa. ıa, muchos nodos. Todos estos nodos son organizados de acuerdo al peso que se les haya asignado. Las p´ginas de libro contienen un campo registro de mensajes que le a ayuda a los usuarios a entender las razones que lo motivaron a editar una p´gina de libro. Cada versi´n editada de una p´gina de libro es guardada a o a como una nueva revisi´n de un nodo. Esta caracter´ o ıstica hace f´cil volver a a la versi´n anterior de una p´gina. o a Como cualquier otro tipo de nodo, la edici´n y adici´n de nodos puede o o estar sujeta a moderaci´n, dependiendo de su configuraci´n. o o Para agregar un nuevo nodo en el libro, utilice el v´ ınculo crear contenido– p´gina de libro (create content–page). a

19

Comment: Sistema de comentarios Cuando se habilita, el m´dulo comentarios de Drupal crea un grupo de o discusi´n para cada nodo. Los usuarios pueden publicar sus comentarios pao ra discutir sobre un tema del foro, publicaciones de diarios, art´ ıculos, p´ginas a de libro, etc. Un administrador tiene permisos para comentar grupos de usuarios, y los usuarios pueden (opcionalmente) editar el ultimo comentario, asumiendo ´ que nadie m´s ha comentado desde su publicaci´n. Control del usuario sobre a o el despliegue de comentarios. Adjunto a cada grupo de comentarios (comment board) hay un panel de control para personalizar la forma en que se muestran los comentarios. Los usuarios pueden controlar el orden cronol´gico de los comentarios (primero o o ultimo al comienzo) y el n´mero de comentarios que aparecer´ por cada ´ u a p´gina. a Otras configuraciones adicionales son: Lista plana: Despliega los comentarios en orden cronol´gico sin hilos. o Lista hebrada: Despliega los comentarios agrupados de acuerdo a conversaciones. Colapsada: Despliega solo el t´ ıtulo para cada comentario. Expandida: Despliega el t´ ıtulo y el texto para cada comentario. Cuando un usuario selecciona Guardar Configuraci´n, los comentarios o se muestran con la nueva configuraci´n del usuario. Los administradores o pueden establecer opciones por defecto para el panel de control, junto con los otros valores por defecto, en administrar–comentarios–configuraci´n. o

20

2.4.2.

M´dulos de inter´s o e

En esta secci´n comentamos los m´dulos de referencia y su funcionalio o dad asociada para una mejor comprensi´n de los mismos. No entraremos en o los instalados por defecto en Drupal (Core). Attachment: M´dulo interesante para adjuntar archivos a cada nodo, mejora sensio blemente el que trae instalado Drupal (upload). Con el m´dulo attachement o podremos adjuntar m´s de un archivo a cada nodo, adem´s podremos incluir a a una descripci´n y un t´ o ıtulo para cada fichero adjunto. Requiere instalar una tabla en la base de datos y usar otro m´dulo de manejos de archivos llamao do Filemanager, ´ste tambi´n requiere a˜adir una nueva tabla a la base de e e n datos. Print: M´dulo que a˜ade un enlace a cada nodo con la opci´n para imprimir. Se o n o puede modificar el aspecto de la p´gina imprimible modificando el archivo a print.tpl. Paging: M´dulo que permite romper nodos en varias p´ginas, muy util cuando o a ´ tengamos nodos con mucho contenido, se debe usar el identificador. Este m´dulo no necesita configuraci´n. o o AdminBlock: M´dulo que nos avisa cuando tengamos contenido pendiente de aprobao ci´n. o Notify: M´dulo que notifica por e-mail sobre contenido nuevo publicado en la o p´gina. Requiere crear una tabla en la base de datos. a

21

SiteMenu:

M´dulo capaz de crea un men´ con los t´rminos de cada categor´ muy o u e ıa, util si tu p´gina est´ toda estructurada con taxonom´ Se debe establecer ´ a a ıas. el permiso de uso de este m´dulo en control de acceso. o

Taxonomy Menu:

M´dulo que muestra un men´ con cada categor´ y t´rminos que tengao u ıa e mos.

FeedBack:

M´dulo capaz de crear un formulario de contacto para los visitantes de o vuestra Web, muy util. Se debe establecer el permiso de uso de este m´dulo ´ o en control de acceso.

Taxonomy Image:

M´dulo que crea una imagen para cada t´rmino de la taxonom´ El uso o e ıa. de este m´dulo es algo m´s complejo pues requiere modificar el tema que se o a emplee.

TinyMCE:

Editor WYSIWYG.

UrlFilter:

M´dulo que crea un filtro de contenidos para que todos los enlaces y dio recciones de e-mail publicados en los nodos sean clikeables autom´ticamente. a

22

MetaTags:

A˜ade meta tags din´micamente a tus posts. n a

Draft:

Guarda borradores de manera autom´tica por si hay alg´n “accidente” a u mientras crear o editas un nodo.

ServiceLinks:

Permite a˜adir iconos para crear enlaces a donde queramos. n

2.5.

Sitios realizados

En este apartado del proyecto nombramos una serie de sitios web que han sido realizados con nuestro mismo gestor de contenidos y donde se podr´n a observar algunos ejemplos. http://www.unileon.es http://www.noteolvidare.org http://www.ubuntu.com/ http://appdeveloper.intel.com/en-us/ http://www.mtv.co.uk/ http://www.whitehouse.gov/ http://www.amnesty.dk/ http://www.universalmusic.com/ http://www.michaeljackson.com/es/home

23

Cap´ ıtulo 3

Funcionalidades y soluciones adoptadas
3.1. Funcionalidades

La idea general de nuestro proyecto es dar un soporte virtual a todos aquellos archivos de inter´s para los diferentes departamentos organizados e de una forma autom´tica por nuestro gestor de contenidos. Se trabajar´ con a a Drupal 6.x. Cada usuario podr´ aportar, editar y/o borrar, todos y cada uno de los a archivos subidos en nuestro sitio web. Esto se puede restringir a diferentes roles para dar as´ un mayor control en funci´n del cargo que desempe˜e el ı o n usuario, por ejemplo: se podr´ dar acceso a los archivos para una consulta ıa por parte de un alumno y restringirle la modificaci´n de los diferentes cono tenidos. Por otro lado, un profesor encargado de un ´rea podr´ desempe˜ar pr´ctia ıa n a camente las funciones de administrador, pero sin correr el riesgo de da˜ar n la estructura general de la p´gina. a Entrando en m´s detalle, en cuanto a las funcionalidades, podremos citar a las siguientes: Multiformato: El sitio web permitir´ alojar todos los archivos indea pendientemente de su formato, y adem´s har´ una gesti´n y organizaa a o ci´n de los formatos m´s importantes y utilizados para llevar a cabo o a acciones avanzadas. Estos formatos est´n pensados para dar soporte a a la funci´n principal de la p´gina, que se concibi´ con el prop´sito o a o o de simular un archivo virtual para art´ ıculos cient´ ıficos, libros, ensayos, trabajos, etc.

24

Independiente del equipo f´ ısico y su software: Esta idea se plante´ por la creciente extensi´n de herramientas online que nos permitan o o trabajar sin importar el lugar en el que nos encontremos, y de las caracter´ ısticas internas del equipo. S´lo es necesario tener un navegador o correctamente actualizado y por ende, una conexi´n a internet. De este o modo podremos trabajar y desempe˜ar todas las funcionalidades del n entorno sin preocuparnos de incompatibilidades o herramientas externas, que dificultan en algunos casos el proceso. Organizaci´n autom´tica: Para evitar involucrar a terceros en el o a proceso de mantenimiento de la web, m´s all´ de la actualizaci´n y soa a o porte para usuarios, todos los procesos de organizaci´n y ordenaci´n o o se realizan autom´ticamente siguiendo unos criterios ya fijados. Tenea mos as´ acceso en todo momento a listas organizadas por tipo, nombre, ı fecha o tema donde podremos acceder a los documentos o archivos enlazados a dicho nodo o incluso editarlos evitando as´ la necesidad de ı volver a crearlos. Visionado online: Otra caracter´ ıstica novedosa del proyecto es la capacidad de visualizar o incluso buscar, copiar, etc, dentro de los documentos sin la necesidad de descargarlos en la m´quina en la que nos a encontremos, sino que podremos utilizar la propia web para este fin. Esta herramienta es completamente visual e interactiva con el usuario, adem´s de ser intuitiva y de f´cil uso. a a Esta caracter´ ıstica la hemos desarrollado para los documentos de texto en cualquier formato y en especial para los documentos PDF a˜adi´ndon e les una indexaci´n autom´tica en nuestro servidor. Lo cual le dar´ una o a a caracter´ ıstica vital para otra funcionalidad tratada m´s adelante. a Herramienta de indexado: Como es habitual el dominio lleva a cabo tareas peri´dicas de indexado cada cierto n´mero de horas (variao u ble dependiendo de la configuraci´n que le queramos dar). Esto evita o tener que realizar un mantenimiento innecesario y ayudar al administrador en su tarea de dar soporte a la p´gina, pero en algunos casos a es necesario tener la posibilidad de realizar un indexado inmediato de los nuevos elementos. Para ello, hemos desarrollado un elemento para ciertos usuarios que les permitir´ realizar esta labor en cualquier a momento, y tener de inmediato actualizadas las listas o incluidos los nuevos t´rminos en las b´squedas realizadas. e u

25

B´ squedas: Para aumentar las capacidades b´sicas de b´squeda denu a u tro de los elementos alojados en nuestro servidor hemos trabajado en una herramienta adicional que nos permitir´ no s´lo buscar en los noa o dos creados por los usuarios (t´ ıtulos, comentarios, palabras clave, etc.), sino que nos dar´ la oportunidad de realizar b´squedas dentro de los a u archivos enlazados por los usuarios en formato PDF. Seguimiento de las diferentes categor´ ıas: En algunas ocasiones puede ser interesante para ciertos usuarios recibir avisos cuando nuevo material es alojado en la p´gina, para ello tenemos a nuestro alcance a la funcionalidad de suscribirnos a las diferentes secciones que abarca nuestro archivo y recibir as´ avisos instant´neos v´ e-mail, para aqueı a ıa llos usuarios que precisen un control m´s avanzado de lo que se publica. a

3.2.

Fases del desarrollo del proyecto

A continuaci´n relataremos las fases por las que atraves´ el proceso de o o creaci´n de este proyecto. A todas estas fases sumaremos una depuraci´n o o constante del entorno que en un punto intermedio del proyecto tuvo que ser reiniciado para dar una mayor flexibilidad al website.

3.2.1.

Primera Fase

En primer lugar llevamos a cabo una labor de estudio sobre software ya existente que ya llevaban a cabo la gesti´n de documentos de un usuario. o Una vez localizados estos, estudiamos las caracter´ ısticas que ofrec´ paıan ra decidir si podr´ ser utiles en el entorno en el que pens´bamos trabajar, ıan ´ a as´ como asimilar las carencias de estos y ofrecer unos servicios adicionales ı que aumentaran su atractivo conllevando una mejora del servicio, que ya daba este software. Podremos citar como ejemplos de software sobre el que investigamos los siguientes: Aigaion y Bebop (Open source), Biblioscape, Bibus y Pybliographer (otros ejemplos de c´digo abierto) y Bookends. o

26

3.2.2.

Segunda Fase

En esta fase realizamos el salto de las funcionalidades seleccionadas en la primera parte del proyecto, a la pre-configuraci´n y selecci´n de las difereno o tes herramientas necesarias para incluir ´stas utilidades en nuestro website. e Este proceso se alargar´ a las siguientes fases debido a los per´ ıa ıodos comunes dentro de un proyecto de ensayo y error. Adem´s de la depuraci´n a o final, una vez conseguido nuestro prop´sito. o A mayores se realiz´ una pre-configuraci´n de los motores de vistas y o o b´squedas que organizar´ nuestros contenidos, as´ como una primera disu ıan ı tribuci´n de los bloques necesarios para el usuario. o

3.2.3.

Tercera Fase

Una vez superado el primer tramo del proyecto nos centramos en las funcionalidades de las de dif´ soluci´n pero que a su vez podr´ considerarse ıcil o ıan las que dan un matiz diferente y atractivo a nuestro proyecto. Adem´s, en esta parte tuvimos que lidiar con ciertos problemas asociados a al servidor en el que nos alojamos (Windows Server 2003). Algunas de las herramientas externas que necesit´bamos incluir en el servidor eran incoma patibles y fueron necesarias algunas modificaciones en el c´digo, as´ como o ı versiones espec´ ıficas para conseguir un correcto funcionamiento de las utilidades intermedias. Todo ello, para resolver el problema de indexaci´n de documentos del o que hablamos anteriormente. Como necesit´bamos un estudio preliminar para definir cual ser´ la fora ıa ma m´s adecuada de abordar el problema, volvimos a realizar un estudio a de los diferentes caminos que pod´ ıamos seguir. Para ello, cada uno de los integrantes del grupo realiz´ un an´lisis en profundidad de las diferentes heo a rramientas que nos podr´ ayudar a resolver el problema. Citaremos como ıan objetos del estudio los siguientes: Swish-e: Herramienta externa que permite el indexado. Pdf2Text: M´dulo desarrollado por la comunidad de Drupal para eso ta misma funci´n. o

27

Search Files: Otro de los m´dulos destacados por los usuarios. o PdfToText (incluido en el paquete XPDF): Otra herramienta externa para resolver este problema.

3.2.4.

Cuarta Fase

Es una continuaci´n de la anterior debido a la complejidad y a los cono tinuos problemas que iban surgiendo a medida que avanz´bamos en nuestro a trabajo. En este punto conseguimos dar la funcionalidad que quer´ ıamos con algunas de las herramientas anteriormente citadas, pero continuamos con el resto de ellas para una vez alcanzado el funcionamiento de todas ellas si fuese posible, analizarlas todas en conjunto y decidir cu´l se adapta m´s a a a nuestras exigencias, as´ como analizar la potencia de cada uno de ellos. ı

3.2.5.

Quinta Fase

En esta ultima fase decidimos que la soluci´n m´s factible para resolver ´ o a el problema es la combinaci´n de la herramienta externa PdfToText y el o m´dulo Search Files que resultaron ser el camino ´ptimo para la correcta o o indexaci´n de los documentos. o A todo ello se le suma una depuraci´n de todo lo anterior para dar un o atractivo adicional a la p´gina. Punto a tener en cuenta y que en muchas a ocasiones es lo que falla aunque el proyecto sea bueno.

28

3.3.
3.3.1.

M´dulos utilizados o
M´dulos primarios o

´ Estos m´dulos proveer´n de las funcionalidades principales para nuestro o a proyecto.

CCK (Content Construction Kit)

En el proyecto utilizaremos este m´dulo para proveer a la p´gina de los o a contenidos espec´ ıficos necesarios, o lo que es lo mismo, nos permite crear unos contenidos exclusivos con las funcionalidades que necesitemos. Ejemplo: necesitamos un contenido en el cual podamos a˜adir adem´s n a del cuerpo y el t´ ıtulo que vienen por defecto en una p´gina, otra secci´n para a o la descripci´n del archivo, categor´ y departamento a donde pertenece. o ıa

Views

Con esta herramienta conseguiremos un despliegue de los diferentes campos de los contenidos seg´n nuestras necesidades. Si solo requerimos un lisu tado de los t´ ıtulos de cada archivo, sin mostrar los cuerpos o los ficheros asociados, podremos definir esos criterios y mostrarlos al usuario.

3.3.2.

M´dulos secundarios o

´ Estos m´dulos proveer´n se quedar´n tan solo en dar unas funcionalio a a dades concretas sin llegar a ser imprescindibles para nuestro proyecto.

Panels

Con este m´dulo pretendemos dar una presentaci´n m´s organizada de o o a los contenidos, as´ como mejorar el aspecto de la p´gina. Cada uno de los ı a nodos de la p´gina ir´ incluido en un panel para no perder as´ la armon´ a a ı ıa del dise˜o. n

29

M´dulo asociado al panels: o Chaos tool suite El m´dulo panels necesita para su correcto funcionamiento un m´dulo o o asociado, el cual citaremos pero no especificaremos su funcionalidad ya que no sale del rango de acci´n del panels (no tienen otra utilidad dentro de o nuestra p´gina). a

Backup and Migrate

Con este m´dulo cubriremos los respaldos del servidor de una forma o sencilla y r´pida (aunque se podr´ realizar a trav´s del gestor de bases de a ıa e datos PhpMyAdmin) opinamos que una herramienta espec´ ıfica de Drupal realizar´ una mejor funci´n que la t´cnica manual. a o e

FCKEditor ´ Unicamente utilizado para gestionar de forma sencilla etiquetas HTML, pudiendo cambiar el tipo de texto, caracter´ ısticas del mismo e incluso incluir im´genes, sin tener que recurrir a la edici´n del texto HTML, lo cual podr´ a o ıa suponer errores tipogr´ficos, entre otros. a

IMCE

Este m´dulo nos ha servido para la gesti´n de im´genes asociadas a los o o a archivos que vamos a alojar. Por ejemplo, podr´ ıamos incluir una miniatura de la primera p´gina del PDF o en ausencia de esta, mostrar un icono del a tipo de archivo en cada caso (PDF, .DOC, .DOCX, .TEX, etc).

iPaper

Con este m´dulo pretendemos facilitar una forma de visualizar los docuo mentos sin necesidad de descargar el archivo o disponer de la ultima versi´n ´ o de tu navegador.

30

ImageCache

M´dulo utilizado unicamente para un correcto uso de las diferentes im´geo ´ a nes utilizadas dentro de nuestro servidor y dar una mayor compatibilidad a los diferentes formatos del mercado.

Mail

M´dulo que nos ayud´ a resolver el problema del correo de avisos para los o o usuarios suscritos a las diferentes modalidades de nuestro gestor documental.

Rules

M´dulo en el que nos apoyamos para realizar acciones autom´ticas sin o a la necesidad de ning´n intermediario adicional. u Se basa en una serie de disparadores (triggers) que realizan una funci´n o cuando un evento es registrado, por ejemplo: Acci´n: Se crea un nuevo PDF. o Reacci´n: Se manda un e-mail de aviso a todos los usuarios enlazados a esta o categor´ ıa.

SearchFiles

Este m´dulo est´ combinado con la herramienta externa PdfToText citao a do anteriormente y que nos da la funcionalidad de indexaci´n que ven´ o ıamos buscando desde los inicios del proyecto.

WebForm

Con ´l damos la capacidad al usuario de suscribirse a las diferentes cae tegor´ de las que se compone nuestro gestor documental web. ıas

31

3.4.

Roles en nuestro proyecto

Como hemos citado anteriormente nuestro proyecto est´ dise˜ado de tal a n manera que disponemos de un completo esquema de roles asociados a cada usuario. De esta forma podr´ ser orientado de la manera que m´s convenga a a a cada departamento (posible implementaci´n de este trabajo). As´ podremos o ı distinguir por ejemplo, tres tipos de usuarios:

Usuario del Claustro: Este tipo de usuario ser´ la representaci´n de ıa o todo aquel encargado de alguna secci´n de las asignaturas del deparo tamento y dependiendo de su rango podr´ a˜adir art´ a n ıculos, trabajos o proyectos a la secci´n que le corresponda. Podr´ existir a su vez o ıa un Jefe de departamento que tuviera la posibilidad de a˜adir o editar n todos los contenidos y secciones del mismo. Este tipo de usuarios ser´ tan adaptable como nosotros quisi´ramos. ıa e Tan s´lo habr´ que hacer una modificaci´n de los permisos y tendr´ o ıa o ıa acceso a m´s de una secci´n para su modificaci´n o ampliaci´n si se a o o o tratase por ejemplo, de un usuario involucrado en varias secciones. Usuario de Consulta: Este tipo tendr´ acceso a todos los art´ ıa ıculos que nosotros consider´semos oportuno, pero nunca tendr´ opci´n a a ıa o modificar el contenido del sitio web. De ah´ el nombre de este rol. ı Ejemplos que podr´ ıamos englobar en este tipo de usuarios ser´ ıan: • Alumnos que necesitan acceder a cierta documentaci´n para poo sibles trabajos, proyectos, toma de informaci´n o estudio simpleo mente. • Otro profesorado que no pertenezca al departamento pero que necesite realizar alguna consulta en el material disponible sin que esto conlleve un riesgo para el sitio web en general. Ambos roles citados anteriormente ser´ controlados y administrados ıan por el ultimo usuario que citaremos a continuaci´n. ´ o

32

Usuario de Administraci´n: Este es el ultimo tipo de usuario y o ´ no menos importante es el de administrador. Aparte de las labores de mantenimiento de la web, tiene asociados el control de todos los anteriores, as´ como la creaci´n de nuevos usuarios, modificaci´n, cambio ı o o de permisos, etc., y a mayores tendr´ la posibilidad de desarrollar un ıa nuevo tipo de rol para futuras ampliaciones de funcionalidades de la p´gina. a Este usuario deber´ de conocer correctamente el funcionamiento de ıa Drupal, as´ como la estructura y configuraciones espec´ ı ıficas del sitio web. Por lo tanto, podr´ ıamos decir que ser´ necesario un usuario del ıa alto nivel, no necesariamente relacionado con el departamento, para llevar a cabo todas estas tareas.

33

Cap´ ıtulo 4

Indexaci´n de documentos o
En este cap´ ıtulo de la memoria trataremos de acercar el trabajo realizado y la soluci´n obtenida para realizar esta funcionalidad sobre el sitio web. o

4.1.
4.1.1.

Problema de la b´ squeda e indexaci´n y su u o soluci´n o
Estudio e implementaci´n realizado por Patricia o

Como parte del trabajo se ha conseguido ejecutar una herramienta externa a Drupal llamada pdftotext por medio de la consola de windows. Se ha comprobado que funciona y hecho que por medio del m´dulo (tambi´n o e modificado por mi parte) search files, el cual busca en todo tipo de documentos indexados oblig´ndole a que lo haga con el pdftotext, haga todo tipo a de b´squedas indexadas. u Especificaci´n del Pdftotext: o Pdftotext es una utilidad libre por l´ ınea de comandos para convertir archivos PDF a texto plano. Por ejemplo, extraer datos de texto de archivos encapsulados PDF. Est´ disponible gratis e incluido por defecto con muchas a de las distribuciones Linux, as´ como tambi´n para Windows (como parte ı e de la distribuci´n XPDF). o

34

Especificaci´n del Search files: o Search Files permite la b´squeda en los archivos enlazados a los nodos y u en directorios arbitrarios. El texto es extra´ por aplicaciones externas de ıdo ayuda. Con el fin de extraer texto, este m´dulo llama a las aplicaciones de ayuo da como Cat y Pdftotext. Los administradores de Drupal pueden configurar cualquier aplicaci´n de ayuda que necesiten. Las aplicaciones de ayuda neo cesitan ser instalas en el server y configuradas para imprimir la salida. Modificaci´n del pdftotext: o En este caso se ha tenido que bajar una versi´n especifica que recomeno daban para que funcionase correctamente en el Windows Server 2003. Para que funcione sin problemas se ha tenido que meter en el directorio files de nuestro server. Esta es la ruta: E:\apps\xampp\htdocs\pitia\pfc\sites\default\files\ Para poder ejecutar correctamente la aplicaci´n hay que a˜adir el sio n guiente comando sobre la ruta anterior y todo ello integrarlo en Drupal: $> pdftotext.exe %file% Modificaci´n del search files: o Se ha modificado el archivo search files.module, concretamente en esta funci´n: o function search_files_overview() { $output = ’’; $output .= " Search Files in <ul> <li>Attachments</li> <li>Directories</li> </ul> and extract their content for index and use with Drupal search. <p> <a href=\"search_files/attachments\">Manage Attachments</a><br /> <a href=\"search_files/helpers\">Manage Helpers</a> </p> 35

"; return $output; } Inconvenientes: Hay que pasar el Cron cada vez que subimos un PDF y queremos indexarlo para hacer sus correspondientes b´squedas. Aunque autom´ticamente u a lo haga Drupal cada hora. Otro detalle es que dependiendo del tama˜o el Cron tardar´ m´s en indexar. n a a

4.1.2.

Estudio e implementaci´n realizado por Ignacio o

Este punto del trabajo se ha dedicado al estudio y configuraci´n de los o m´dulos Pdf2text y Swish-e, que a su vez hace uso de la herramienta extero na XPDF. A continuaci´n se har´ un peque˜o resumen de todo el trabajo o a n realizado. Ambos m´dulos en principio deber´ poder resolver nuestro proo ıan blema pero como veremos m´s adelante lo har´n de una forma poco ´ptima a a o o simplemente no lo har´n. a Especificaci´n del Swish-e: o The Swish-E Indexer module is an implementation of of the open source Swish-E Search Engine (http://www.swish-e.org). This module will index uploaded files and will allow users to search over the full text of those documents. The module requires the installation of the Swish-E search engine and several different file filters to support fulltext indexing of various file types. The following file types are currently supported: Microsoft Word - catdoc Microsoft Excel - xls2csv Microsoft Powerpoint - ppthtml PDF - pdftotext RTF - unrtf Especificaci´n del Pdf2text: o This module provide users to upload PDF document in any content type. The uploaded PDF document will automatically convert into plain text in the body field of the content type. This will make it easier for users to edit it and a number of them can be appended on after the other. Besides it, searching will be easy and document need not to be downloaded every

36

time to view it. Trabajo y estudio con Swish-e: En principio esta herramienta parec´ una soluci´n factible y adecuada ıa o para el problema de la b´squeda y la indexaci´n en documentos de tipo u o PDF, se comenz´ la b´squeda y el primer problema que surgi´ fue una o u o inexistencia del m´dulo oficial para la versi´n de Drupal 6.x que es la que o o nosotros utilizamos. S´ exist´ en cambio, una versi´n en desarrollo para ella ı ıa o y se intent´ una pre-configuraci´n de la misma sobre el servidor. Despu´s de o o e su instalaci´n se realiz´ pruebas sin ´xito y decidimos seguir inform´ndonos o o e a sobre el m´dulo. o En pocas b´squedas se comenz´ a notar un problema generalizado del u o m´dulo para los usuarios que intentaron el uso en esta versi´n (6.x). Una o o b´squeda en mayor profundidad nos llev´ a algunos art´ u o ıculos sobre el abandono de este proyecto por los usuarios de la comunidad, centr´ndose en el a m´dulo Search files, el cual implementaba las funcionalidades de Swish-e y o s´ ten´ soporte para nuestra versi´n. ı ıa o Al alcanzar una soluci´n con el Pdf2text y los resultados de mi como pa˜era se consider´ suficiente para decantarnos por una soluci´n factible y n o o o ´ptima para el problema. Trabajo y estudio con Pdf2text: De utilizaci´n m´s simple que los otros con los que nos hemos encontrao a do a lo largo de este problema, parec´ dar una soluci´n parcial al indexado ıa o pero de una forma poco ´ptima a primera vista. o Por defecto, s´lo te permit´ una indexaci´n de los PDF’s que tuvieran o ıa o un m´ximo de 3MB. Obviamente, no podr´ a ıamos hacer uso del m´dulo para o este fin. Como alternativa y viendo que el resultado para los PDF’s menores de 3MB era aceptable, ya que creaba nodos con toda la informaci´n del doo cumento, se decidi´ intentar realizar una modificaci´n del c´digo del propio o o o m´dulo para eliminar esta restricci´n. o o

37

Sobre el archivo pdf2text.module modificamos las siguientes l´ ıneas de c´digo: o function pdf2text_file_limits($user) { return array( ’extensions’ => ’pdf’, ’file_size’ => 1048576 * 1000, ’user_size’ => 1048576 * 1000, ’resolution’ => 0, // zero for no limit ); } Con esto conseguimos aumentar el l´ ımite de los PDF’s a 1GB, partiendo de la base de que no habr´ documentos mayores a ese tama˜o en nuestro ıa n servidor. Aun as´ si hubiera sido viable este tama˜o se podr´ haber vuelto ı, n ıa a modificar para las cantidades necesarias. El problema surgi´ con el tiempo de procesado, pues descubrimos que o la limitaci´n de memoria no era aleatoria sino que a partir de ese tama˜o o n el tiempo de conversi´n aumentaba exponencialmente. Para probarlo se utio lizaron archivos de 5, 10 e incluso 60MB para poder hacernos una idea, y el resultado fue: tiempos de procesados superiores a los 30 minutos para documentos de estos tama˜os, alcanzando incluso la hora con el de 60MB. n Inconvenientes: Aunque se consigui´ llegar a una soluci´n parcial con el Pdf2text consio o deramos que no es viable por la poca optimizaci´n en el proceso. El Swish-e o podr´ haber sido una soluci´n pero este proyecto evolucion´ a trav´s del ıa o o e Search files y dej´ de ser actualizado y mantenido por los creadores. o

4.1.3.

Conclusiones obtenidas por los alumnos

Despu´s de el trabajo realizado opinamos que la opci´n de search files e o y pdftotext es la opci´n m´s ´ptima para el servidor, debido a la r´pida o a o a indexaci´n que realiza compar´ndola con la otra opci´n. o a o Aunque requiere una configuraci´n bastante extensa, una vez conseguida o resulta una soluci´n ´ptima. o o Creemos que es m´s correcto indexar todos los ficheros adjuntos de tipo a PDF antes que una carpeta espec´ ıfica, al no poder tener ambas opciones.

38

4.2.

Interfaz de usuario

En esta secci´n vamos a explicar de un modo gr´fico los componentes o a m´s implicados en nuestro proyecto. a Para comenzar dirigi´ndonos a la direcci´n http://pitia.unileon.es/ e o pfc, sin haber hecho un login previo nos redireccionar´ a la siguiente pana talla en la que los diferentes usuarios podr´n acceder a su cuenta, as´ como a ı a la recuperaci´n de su contrase˜a si ´sta ha sido extraviada. o n e

Figura 4.1: Screen de la pantalla del Login

39

Una vez realizada la identificaci´n del usuario, nos enlazar´ con la p´gio a a na principal, la cual variar´ dependiendo de los privilegios que ostente el a usuario registrado (en este caso la screen mostrar´ los elementos visibles ıa para un usuario de tipo profesor del departamento).

Figura 4.2: Pantallazo de la p´gina principal a

40

Ahora realizaremos un breve recorrido por los elementos de navegaci´n de la web. o En primer lugar, en la esquina superior izquierda, justo debajo de los enlaces secundarios se encuentra el logo identificativo de nuestro proyecto, que a su vez hemos dotado de la capacidad de redireccionamiento a la p´gina a principal (home).

Figura 4.3: Inicio alternativo En segundo lugar, tendremos la barra de accesos primarios, en la que adem´s de contar con un bot´n de inicio alternativo o primario, contaremos a o con todas las organizaciones (listas) de documentos que posteriormente explicaremos. Cuenta a su vez con un ultimo elemento que da acceso al formulario de ´ suscripci´n anteriormente explicado. o

Figura 4.4: Barra de enlaces primarios Y en tercer lugar, tendremos una segunda barra de navegaci´n con eleo mentos de ayuda sobre el proyecto, as´ como un elemento de desconexi´n. ı o

Figura 4.5: Barra de enlaces secundarios Como elemento adicional contaremos con el acceso de ayuda de la p´gina a web.

Figura 4.6: Icono de ayuda 41

En este punto haremos menci´n de los elementos de creaci´n de nueo o vos contenidos de documentos o ficheros. Situados en la parte central del sitio web, en nuestra p´gina de inicio, a comenzamos con un enlace a la creaci´n de nuevos nodos para documentos o PDF, los cuales ser´n indexados para b´squedas avanzadas. a u

Figura 4.7: Enlace a la secci´n de creaci´n de nodos para PDF’s o o Situado a la derecha del primero encontraremos el enlace para la subida de nuevos documentos con extensi´n de texto editable (.DOC, .ODT, .TXT, o etc.).

Figura 4.8: Enlace a la secci´n de creaci´n de nodos para DOC’s o o

42

En la esquina inferior izquierda de este conjunto de bloques, tendremos adem´s la posibilidad de enlazar archivos comprimidos a nuestro servidor. a

Figura 4.9: Enlace a la secci´n de creaci´n de contenidos para archivos como o primidos Por ultimo y como herramienta adicional, ponemos al alcance del usua´ rio un sistema de enlazado para todo tipo de documentos de texto, que nos permitir´n realizar una vista sobre la propia web del mismo. a

Figura 4.10: Enlace a la secci´n de creaci´n de contenidos de Documentos o o Online

43

Siguiendo los enlaces de los bloques centrales explicados en el punto anterior, tenemos acceso al propio sistema de creaci´n de cada uno de ellos. o Partiendo, en primer lugar, de la creaci´n de tipos PDF llegar´ o ıamos a una secci´n como la que mostramos en la siguiente captura de pantalla. o En ella tendremos un total de 6 elementos, empezando por el t´ ıtulo del documento (obligatorio), seguido de un campo body (opcional), en el cual podemos a˜adir informaci´n de inter´s que creamos conveniente, un desn o e plegable para enlazar el documento en cuesti´n (File attachments) y sobre o el que se realizar´ la indexaci´n. Como siguiente elemento tendremos un a o campo keywords para las palabras clave, un elemento desplegable con las categor´ disponibles y la opci´n adicional y de enlazar el archivo para su ıas o vista online.

Figura 4.11: Pantalla de creaci´n del nodo para un archivo PDF o

44

Siguiendo el orden de los bloques anteriores llegamos a la secci´n para o la creaci´n de elementos DOC. o En ´l tenemos 5 campos similares al anterior cambiando unicamente en e ´ el campo Linked file que corresponder´ al lugar donde deberemos hacer un ıa upload de nuestro archivo. Y carece del elemento de vista Online, ya que esa opci´n se da en el bloque de Online. o

Figura 4.12: Pantalla de creaci´n del nodo para un archivo DOC o

45

Continuamos con el an´lisis de creaci´n de elementos de nuestro sitio a o web. El tercer elemento de nuestros bloques, nos da la opci´n de crear un o nodo similar al citado justo encima pero en este caso, para archivos con extensiones de elementos comprimidos (.ZIP, .TAR, .TAR-GZ, .RAR, etc.).

Figura 4.13: Pantalla de creaci´n del nodo para un archivo comprimido o

46

En el ultimo caso, tenemos la posibilidad, como hemos ido anunciando, ´ de crear elementos Online para su visionado desde nuestro sitio web. Adem´s de los campos body y title, disponibles en el resto de creaciones a de nodos tenemos los siguientes: 3 campos opcionales y solo rellenables en el caso en el que queramos incluir un documento ya existente en nuestro repositorio (en la mayor´ de los casos ser´ un documento nuevo y obviaremos ıa a estos campos, releg´ndolos a situaciones muy espec´ a ıficas). Por ultimo, tenemos un campo denominado File attachments similar a ´ los citados anteriormente pero no s´lo realizar´ un enlazado del archivo, sino o a que crear´ una vista online del mismo, similar a la explicada en la creaci´n a o de nodos de tipo PDF.

Figura 4.14: Pantalla de creaci´n del nodo para un archivo Online o

47

Ahora entramos en la secci´n de nuestros motores de vistas, los cuales o realizan la organizaci´n autom´tica de todos los contenidos creados por los o a bloques anteriores. Disponemos de una vista para los elementos asociados a documentos .PDF, ordenados alfab´ticamente por el campo t´ e ıtulo (´sta ordenaci´n puee o de ser variada seg´n convenga para ajustarse a nuestras necesidades o lo que u es lo mismo, esta vista est´ ordenada orientativamente). a A su vez, disponemos de otro campo editable (category), as´ como un ı enlace a la edici´n de borrado, editado y archivo enlazado en cada nodo. o

Figura 4.15: Organizaci´n de los documentos PDF o Similar al citado PDF, unicamente difiere en el tipo de documento. ´

Figura 4.16: Organizaci´n de los documentos de texto o

48

Aqu´ mostramos un ejemplo de vista de archivos comprimidos. ı

Figura 4.17: Organizaci´n de los documentos comprimidos o Otro ejemplo de vista para mostrar los documentos Online de nuestra web.

Figura 4.18: Organizaci´n de los documentos Online o

49

Elemento importante dentro de nuestra estructura general es el apartado relacionado con las b´squedas, diferenciando en estos dos tipos principales: u B´squedas enlazadas a los elementos propios del sitio web, tom´ndose u a estos como todas aquellas palabras introducidas por el usuario al crear un nuevo nodo (campos body, title, keywords, category, etc.). En la siguiente imagen mostramos el elemento de b´squeda simple de u nuestra web. Para utilizarlo tan s´lo necesitamos introducir la palabra o o palabras a buscar en el espacio reservado en gris.

Figura 4.19: Pantalla de b´squeda simple u Por otra parte, tenemos una b´squeda espec´ u ıfica dise˜ada por los inten grantes del proyecto accediendo desde el bloque anterior. Tan s´lo debemos o pulsar la palabra here presente debajo del cajet´ sobre el que especificamos ın las palabras de la b´squeda simple. De esta forma ser´ u ıamos redireccionados al siguiente elemento representado por la captura de pantalla inferior. En ´l sobre la pesta˜a Attachments tendremos un modelo similar al ane n terior en el cual debemos introducir las palabras a buscar pero en este caso no en el contenido creado sino en los archivos enlazados de tipo PDF.

Figura 4.20: Pantalla de b´squeda avanzada u

50

Como ejemplo de salida de b´squeda avanzada tenemos la siguiente capu tura. En ella vemos un listado de los archivos enlazados que contienen las palabras especificadas en la b´squeda, las cuales enlazan con el propio aru chivo. Adem´s al pie de cada elemento mostrado en la b´squeda disponemos a u de la autor´ del nodo, as´ como un enlace al nodo en cuesti´n (para modiıa ı o ficarlo, editarlo o visualizarlo). Estas b´squedas tienen como caracter´ u ıstica principal una ordenaci´n por o aparici´n de la palabra especificada en la b´squeda, es decir, un documento o u con m´s repeticiones de la palabra que otro tendr´ una posici´n superior a ıa o en el listado.

Figura 4.21: Ejemplo de b´squeda avanzada u

51

En la parte superior izquierda de la web tenemos un bot´n llamado o Cron, el cual sirve para indexar inmediatamente los documentos PDF reci´n subidos a la p´gina. e a Debemos saber que hemos configurado que la propia p´gina web haa ga el Cron (indexado) autom´ticamente cada hora, pero en caso de que el a usuario por el motivo que sea, quiere hacer una b´squeda dentro del docuu mento, ha de indexarlo ipso facto y para ello es necesario hacer uso del Cron.

Figura 4.22: Screen del bot´n del Cron o En el momento que pinchemos en esta parte y haya realizado correctamente el indexado (tardar´ acorde al tama˜o del documento), nos saldr´ una a n a ventana emergente como la siguiente dici´ndonos que el indexado ha sido e realizado con ´xito y ya podr´ e ıamos hacer uso de las b´squedas. u

Figura 4.23: Imagen de la ventana emergente citada 52

Nos ha parecido util crear una solicitud en la que cada usuario, cuando ´ desee, puede registrarse y apuntarse en la categor´ de la que m´s desee estar ıa a al tanto de las subidas, o del tipo de documento que se suba, y as´ recibir ı un correo de aviso, en la direcci´n que nos proporcione, de tal evento. o

53

Como parte a˜adida a la p´gina, hemos creado un contenido en el que n a explique al usuario que desee saberlo, las caracter´ ısticas del sitio a modo de ayuda si la necesitase. En este apartado explicamos todas y cada una de las actividades, funciones y controles de las que est´ disponible la p´gina web. a a

54

Por ultimo, proporcionamos al usuario como en cualquier otra p´gina un ´ a mapa del sitio, para saber en todo momento a que lugares/contenidos es capaz de acceder, as´ como un enlace directo al sitio en cuesti´n, sin tener ı o que estar navegando por la web hasta llegar a nuestro destino.

55

Cap´ ıtulo 5

Conclusiones y l´ ıneas futuras
5.1. Conclusiones

Habiendo finalizado el proyecto y profundizado ampliamente en las capacidades de gesti´n en Drupal, hemos apreciado la potencia que puede llegar o a desarrollar este entorno con una combinaci´n de distintas herramientas. o En nuestro caso hemos dotado al sitio web con capacidades autom´ticas a de organizaci´n, dando al usuario la libertad de centrarse tan s´lo en su o o trabajo evitando as´ las tareas engorrosas de mantenimiento y gesti´n del ı o mismo. Sobre los m´dulos y herramientas externas utilizados remarcaremos la o gran optimizaci´n de indexaci´n obtenida y sobretodo la eficiencia de ejeo o cuci´n de Pdftotext. No obstante, consideramos alguna de las partes de su o configuraci´n y enlazado demasiado complicadas como para plantearse moo dificaciones a la ligera en este campo. Se podr´ tener en mente tan s´lo una ıa o ampliaci´n de las capacidades mediante otras herramientas externas como o explicaremos en puntos siguientes. Aunque no podamos ver si este proyecto ocupar´ un lugar real el alg´n a u departamento o secci´n de la universidad, creemos a ciencia cierta, que tiene o las capacidades necesarias para ser una herramienta de gran utilidad haciendo un correcto uso de ella. Como experiencia personal podemos afirmar que en algunas ocasiones, a lo largo de nuestro aprendizaje, hemos echado en falta una plataforma que englobase todas estas caracter´ ısticas. Por lo tanto, recomendamos tener este trabajo en cuenta y evitar que acabe engrosando simplemente los archivos de proyectos de la escuela.

56

5.2.

L´ ıneas futuras

Habiendo llegado al punto de desarrollo actual del proyecto, nos dimos cuenta que cabe la posibilidad de llegar a implantar el gestor de manera real en alg´n ´mbito de la universidad. Por lo tanto, quisimos aportar nuestro u a conocimiento para solucionar este problema en la p´gina web: a

Carga m´ ltiple de archivos: Si en alg´n momento este gestor llega u u a utilizarse de una manera prol´ ıfera y abundante, podr´ darse el caso a en el que se necesite una actualizaci´n constante y a gran escala de o contenidos, como puede ser la subida simult´nea de un gran n´mero a u de archivos. En el estado actual en el que est´ la web, la indexaci´n se realiza a o mediante distintas herramientas, pero s´lo en el caso de una creaci´n o o individual de cada nodo. A peque˜a escala esto no es una traba pero n orientado al caso antes citado, si podr´ llegar a serlo. ıa Soluci´n encontrada: Para solventarlo utilizamos el m´dulo CCK o o junto con search files y la herramienta externa PdfToText. Con el primero creamos un campo m´ltiple de carga de archivos que u soluciona la primera parte del problema, pero posteriormente realizamos una modificaci´n en el search files para que acepte estos campos o como objetivos de la indexaci´n. En principio, s´lo ten´ en consideo o ıa raci´n el campo file attachments para este fin. o

57

Con esto damos pie a siguientes mejoras para la indexaci´n del resto o de documentos, no s´lo de tipo PDF. As´ conseguimos dar soporte a o ı un mayor abanico de posibilidades y mayor eficacia para el usuario.

Figura 5.1: Subida m´ltiple de archivos u Como inicio del estudio para resolverlo, citamos la herramienta que engloba PdfToText, pero que da soporte a otras extensiones.

Figura 5.2: Herramienta para dar soporte a la indexaci´n de otras extensioo nes

58

Funcionalidad de edici´n de texto online a˜ adida: En el estudio o n inicial de documentaci´n sobre las funcionalidades de software de tero ceros y sitios web similares al nuestro, encontramos un ejemplo muy interesante para futuros estudios de mejora del sitio web. El que m´s nos llamo la atenci´n fue el encontrado en el gestor docua o mental online documany. En ´l tenemos la opci´n de editar en l´ e o ınea nuestros documentos y guardar los cambios sin tener que descargar en ning´n momento el documento ni herramientas adicionales en nuestra u m´quina. a Esta mejora dar´ un recurso excepcional en nuestro entorno educativo ıa llegando incluso a un ahorro de costes en licencias de nuestros equipos. Mejora del servidor: Todo el proyecto ha sido realizado en un servidor con caracter´ ısticas acordes a las pruebas b´sicas para su implea mentaci´n. Para una puesta en marcha real del proyecto, consideramos o que es aconsejable un servidor propio para un trafico medio/alto del sitio. Un proceso fluido de trabajo es fundamental para el ´xito de una e plataforma de este estilo. Estas son algunas de las mejoras que se nos ocurren si en alg´n momento u se decide continuar con el desarrollo del proyecto.

59

Bibliograf´ ıa
[1] Angela Byron, Addison Berry, Nathan Haug, Jeff Eaton Using Drupal, Grupo Anaya Comercial, 2009. [2] John K. VanDyk Pro Drupal Development, Editorial Board, 2008. [3] Greg James Knaddison Cracking Drupal: A Drop in the Bucket, Editorial Ilustrada, 2009. [4] http://www.drupal.org [5] http://drupal.org.es/ [6] http://drupal.org.es/drupal [7] http://www.drupalweb.com/ [8] http://drupalmania.com/ [9] http://www.documany.com

60

Anexos
C´digo editado de los m´dulos Search files y pdf2text modificados en la o o fase de indexaci´n autom´tica de documentos o a

C´digo Search Files o
C´digo completo de la modificaci´n realizada en el archivo search files.module: o o <?php // $Id: search_files.module,v 1.19.2.24 2009/08/30 21:23:30 thl Exp $ /** * @file * Used to index files in attachments and directories */ /** * Implementation of hook_menu(). * * @return $items = array of menu items */ function search_files_menu() { $items = array(); $items[’admin/settings/search_files’] = array( ’title’ => ’Search Files’, ’description’ => ’Manage searching for files in attachments and directories’, ’page callback’ => ’search_files_overview’, ’access arguments’ => array(’administer search_files configuration’), ’type’ => MENU_NORMAL_ITEM, ); $items[’admin/settings/search_files/helpers’] = array( ’title’ => ’Helpers’, ’description’ => ’List Search Files Helper Applications’, ’page callback’ => ’search_files_helper_list’, ’access arguments’ => array(’administer search_files configuration’), 61

’type’ => MENU_NORMAL_ITEM, ’weight’ => 0, ); $items[’admin/settings/search_files/helpers/list’] = array( ’title’ => ’List’, ’description’ => ’List Search Files Helper Applications’, ’page callback’ => ’search_files_helper_list’, ’access arguments’ => array(’administer search_files configuration’), ’type’ => MENU_DEFAULT_LOCAL_TASK, ’weight’ => 0, ); $items[’admin/settings/search_files/helpers/add’] = array( ’title’ => ’Add’, ’description’ => ’Add Search Files Helper Application’, ’page callback’ => ’drupal_get_form’, ’page arguments’ => array(’search_files_helper_add_form’), ’access arguments’ => array(’administer search_files configuration’), ’type’ => MENU_LOCAL_TASK, ’weight’ => 1, ); $items[’admin/settings/search_files/helpers/autodetect’] = array( ’title’ => ’Autodetect’, ’description’ => ’Autodetect Search Files Helper Application’, ’page callback’ => ’drupal_get_form’, ’page arguments’ => array(’search_files_helper_autodetect’), ’access arguments’ => array(’administer search_files configuration’), ’type’ => MENU_LOCAL_TASK, ’weight’ => 2, ); $items[’admin/settings/search_files/helpers/edit’] = array( ’title’ => ’Edit’, ’description’ => ’Edit Search Files Helper Application’, ’page callback’ => ’drupal_get_form’, ’page arguments’ => array(’search_files_helper_edit’), ’access arguments’ => array(’administer search_files configuration’), ’type’ => MENU_CALLBACK, ); $items[’admin/settings/search_files/helpers/delete’] = array( ’title’ => ’Delete’, ’description’ => ’Delete Search Files Helper Application’, ’page callback’ => ’search_files_helper_confirm_delete’, ’access arguments’ => array(’administer search_files configuration’), ’type’ => MENU_CALLBACK, ); 62

return $items; } /** * generate form to autodetect helper apps * * @return (array) $form */ function search_files_helper_autodetect() { $form[’submit’] = array( ’#type’ => ’submit’, ’#value’ => ’Autodetect’, ); return $form; } function search_files_help($path, $arg) { $output = ’’; switch ($path) { case ’admin/settings/search_files/helpers/autodetect’: $output .= ’this will only work’; $output .= ’<ul>’; $output .= ’ <li>if PHP safemode is disabled (required by this module anyway)</li>’; $output .= ’ <li>if Server running Unix (Linux, BSD, Solaris, ...), not Windows (required "which" tool missing)</li>’; $output .= ’ <li>if search PATH inside Apache/PHP environment is set to include the directories containing the helpers</li>’; $output .= ’</ul>’; break; } return $output; } /** * autodetect helper apps */ function search_files_helper_autodetect_submit($form, &$form_state) { // load sample helper apps into database search_files_install_auto_helper_app_configuration(); drupal_goto(’admin/settings/search_files/helpers/list’); } /** * automatically detect helper apps and configure them 63

* */ function search_files_install_auto_helper_app_configuration() { // safe_mode will inhibit shell_exec() if (search_files_issafemode()) { // load sample helper apps into database search_files_helper_db_add("PDF", "pdf", "/usr/bin/env pdftotext %file% -"); search_files_helper_db_add("Text", "txt", "/usr/bin/env cat %file%"); } else { // test for pdftotext $location = trim(shell_exec(’which pdftotext’)); $location = preg_replace("/^no .*$/", "", $location); if ($location) { search_files_helper_db_add("PDF", "pdf", $location ." %file% -"); drupal_set_message(t(’Helper app pdftotext has been detected and configured’) ); } // test for cat $location = trim(shell_exec(’which cat’)); $location = preg_replace("/^no .*$/", "", $location); if ($location) { search_files_helper_db_add("Text files", "txt", $location ." %file%"); drupal_set_message(t(’Helper app cat has been detected and configured’)); } // test for catdoc $location = trim(shell_exec(’which catdoc’)); $location = preg_replace("/^no .*$/", "", $location); if ($location) { search_files_helper_db_add("Word Documents", "doc", $location ." %file%"); drupal_set_message(t(’Helper app catdoc has been detected and configured’)); } // test for xls2csv $location = trim(shell_exec(’which xls2csv’)); $location = preg_replace("/^no .*$/", "", $location); if ($location) { search_files_helper_db_add("Excel files", "xls", $location ." %file%"); drupal_set_message(t(’Helper app xls2csv has been detected and configured’)); } // test for catppt $location = trim(shell_exec(’which catppt’)); $location = preg_replace("/^no .*$/", "", $location); if ($location) { search_files_helper_db_add("Power Point Presentations", "ppt", $location ." 64

%file%"); drupal_set_message(t(’Helper app catppt has been detected and configured’)); } // test for unrtf $location = trim(shell_exec(’which unrtf’)); $location = preg_replace("/^no .*$/", "", $location); if ($location) { search_files_helper_db_add("Rich Text Format files", "rtf", $location ." %file%"); drupal_set_message(t(’Helper app unrtf has been detected and configured’)); } } } function search_files_overview() { $output = ’’; $output .= " Search Files in <ul> <li>Attachments</li> <li>Directories</li> </ul> and extract their content for index and use with Drupal search. <p> <a href=\"search_files/directories\">Manage Directories</a><br /> <a href=\"search_files/helpers\">Manage Helpers</a> </p> "; return $output; } /** * get an array of helper programs * * @return $helpers = array($helper->extension => $helper->helper_path); */ function search_files_get_helpers() { // Get all the registered helper applications and put them in static variable to eliminate unnecessary db queries // in search_files_nodeapi(). The query log feature of the dev module pointed out that this query was done // many times instead of once. Making $helpers a static variable reduced the number of queries by 25%. static $helpers; 65

if (! isset($helpers)) { $helpers = array(); $result = db_query("SELECT * FROM {search_files_helpers}"); while ($helper = db_fetch_object($result)) { $helpers[$helper->extension] = $helper->helper_path; } } return $helpers; } /** * Check whether we run in PHP safe_mode */ function search_files_issafemode() { return preg_match(’/(1|on)/i’, @ini_get("safe_mode")); } /** * check to make sure the $helper_id is valid (a number greater * than zero) then it fetches the deletion confirmation form, * then returns it * * @return (array) $form */ function search_files_helper_confirm_delete() { $helper_id = arg(5); if ($helper_id > 0 && is_numeric($helper_id)) { return drupal_get_form(’search_files_helper_confirm_delete_form’, $helper_id); } } /** * generate the deletion confirmation form for helper apps and return the form * * @param unknown_type $form_state * @param (int) $helper_id * @return (array) $form */ function search_files_helper_confirm_delete_form(&$form_state, $helper_id) { $helper_name = db_result(db_query("SELECT name FROM {search_files_helpers} WHERE id = %d", $helper_id)); $form = array(); $form[’search_files_helper_id’] = array( ’#type’ => ’hidden’, 66

’#value’ => $helper_id ); $form[’search_files_helper_name’] = array( ’#type’ => ’hidden’, ’#value’ => $helper_name, ); return confirm_form($form, t(’Are you sure you want to delete the %name helper? The text extracted by this helper will remain in the search index until the directory is reindexed.’, array(’%name’ => $helper_name)), ’admin/settings/search_files/helpers/list’, t(’This action cannot be undone.’), t(’Delete’), t(’Cancel’)); }

/** * remove row for the helper app from the search_files_helpers table */ function search_files_helper_confirm_delete_form_submit($form, &$form_state) { $result = db_query("DELETE FROM {search_files_helpers} WHERE id = %d", $form_state drupal_goto(’admin/settings/search_files/helpers/list’); } /** * display a themes table of the current helper apps set up in the system * * @return (string) html table */ function search_files_helper_list() { $output = ’’; $header = array(t(’Helper name’), t(’Extension’), array(’data’ => t(’Operations’), $sql = " SELECT * FROM {search_files_helpers} ORDER BY extension "; $result = db_query($sql); $helpers[] = array(); $destination = drupal_get_destination(); while ($helper = db_fetch_object($result)) { $helpers[] = array($helper->name, $helper->extension, l(t(’Edit’), ’admin/settings/search_files/helpers/edit/’. $helper->id), l(t(’Delete’), ’admin/settings/search_files/helpers/delete/’. $helper->id), 67

array($destination)); } $output .= theme(’table’, $header, $helpers); // safe_mode will inhibit shell_exec() if (search_files_issafemode()) { $output .= t(’<b>WARNING!</b> This server has safe_mode enabled, which inhibits use of helper applications’); } else { $output .= t(’Good. This server has safe_mode disabled, which allows use of helper applications’); } $output .= "<br/>\n"; return $output; } /** * Implementation of hook_perm(). * * @return (array) permissions */ function search_files_perm() { return array(’administer search_files configuration’, ’view search_files results’); } /** * generate form to add a helper app to the system * * @return (array) $form */ function search_files_helper_add_form() { $form[’search_files_name’] = array( ’#type’ => ’textfield’, ’#title’ => t(’Helper name’), ’#size’ => 50, ’#maxlength’ => 50, ’#default_value’ => ’Foo extractor’, ’#required’ => TRUE, ’#description’ => t(’A name for this helper configuration.’), ); $form[’search_files_extension’] = array( 68

’#type’ => ’textfield’, ’#title’ => t(’Extension’), ’#size’ => 10, ’#maxlength’ => 10, ’#default_value’ => ’foo’, ’#required’ => TRUE, ’#description’ => t(’Enter the extension for the files that you want the helper application to process. Do not include the period.’), ); $form[’search_files_helper_path’] = array( ’#type’ => ’textfield’, ’#title’ => t(’Helper path’), ’#size’ => 100, ’#maxlength’ => 255, ’#default_value’ => ’/opt/bin/foo-extract %file%’, ’#validate’ => array(’search_files_helpers_validate_add_edit’ => array()), ’#required’ => TRUE, ’#description’ => t(’Enter the path to the helper application installed on your server. "%file%" is a placeholder for the path of the attachment file and is required. Include any command-line parameters as well (for example, pdftotext requires a - after the file to be processed).’), ); $form[’submit_done’] = array( ’#type’ => ’submit’, ’#value’ => ’Save and Done’, ); $form[’submit’] = array( ’#type’ => ’submit’, ’#value’ => ’Save add another’, ); return $form; } /** * validate the existance of the helper app supplied by the * helper_add or helper_edit form * * @param unknown_type $field */ function search_files_helpers_validate_add_edit($field) { if (!preg_match(’/%file%/’, $field[’#value’])) { form_set_error($field[’#title’], t(’"%field" must contain the token %file%’, array(’%field’ => $field[’#title’]))); } 69

// Check to see if helper app can be found $helper_file = preg_replace(’/\s.+$/’, ’’, $field[’#value’]); if (!file_exists($helper_file)) { form_set_error($field[’#title’], t("Can’t find helper app %helper -please verify it is installed.", array(’%helper’ => $helper_file))); } } /** * fetch the helper add form, alter the form for use as an edit form, * populate the #default_values fields and return the form * * @return unknown */ function search_files_helper_edit() { $sql = " SELECT * FROM {search_files_helpers} WHERE id = %d "; $result = db_fetch_object(db_query($sql, arg(5))); $form = search_files_helper_add_form(); $form[’search_file_id’] = array( ’#type’ => ’value’, ’#value’ => $result->id, ); $form[’search_files_helper_path’][’#value’] = $result->helper_path; $form[’search_files_extension’][’#value’] = $result->extension; $form[’search_files_name’][’#value’]= $result->name; unset($form[’submit_done’]); $form[’submit’][’#value’] = ’Update’; return $form; } /** * update the row in the table search_files_helpers for the given helper app */ function search_files_helper_edit_submit($form, &$form_state) { $sql = " UPDATE {search_files_helpers} SET name = ’%s’, extension = ’%s’, 70

helper_path = ’%s’ WHERE id = %d "; $result = db_query($sql, $form_state[’clicked_button’][’#post’] [’search_files_name’], $form_state[’clicked_button’][’#post’] [’search_files_extension’], $form_state[’clicked_button’][’#post’] [’search_files_helper_path’], $form_state[’values’][’search_file_id’]); if ($result) { drupal_set_message(t(’Helper app %helper_name has been updated’, array(’%helper_name’ => $form_state[’values’][’search_files_name’]))); drupal_goto(’admin/settings/search_files/helpers/list’); } } /** * validates uniqueness of directory */ function search_files_helper_add_form_validate($form, $form_state) { $name = $form_state[’values’][’search_files_name’]; $sql = "SELECT * FROM {search_files_helpers} WHERE name = ’%s’"; $result = db_query($sql, $name); while ($row = db_fetch_object($result)) { form_set_error("search_files_helper", t(’Helper name already in list’)); } $extension = $form_state[’values’][’search_files_extension’]; $sql = "SELECT * FROM {search_files_helpers} WHERE extension = ’%s’"; $result = db_query($sql, $extension); while ($row = db_fetch_object($result)) { form_set_error("search_files_helper", t(’Extension already in list’)); } } /** * insert a row in the search_files_helpers table for the helper * app given by the form */ function search_files_helper_add_form_submit($form, $form_state) { $result = search_files_helper_db_add( $form_state[’values’][’search_files_name’], $form_state[’values’][’search_files_extension’], $form_state[’values’][’search_files_helper_path’] ); if ($result) { 71

drupal_set_message(t(’%helper helper added’, array(’%helper’ => $form_state [’values’][’search_files_name’]))); } if ($form_state[’clicked_button’][’#id’] == ’edit-submit-done’) { drupal_goto(’admin/settings/search_files/helpers/list’); } } /** * insert a row in the search_files_helpers table for the helper app given */ function search_files_helper_db_add($name, $extension, $helper_path) { $sql = "INSERT INTO {search_files_helpers} (name, extension, helper_path) VALUES (’%s’, ’%s’, ’%s’)"; $result = db_query($sql, $name, $extension, $helper_path); return $result; } /** * Get the host system’s character encoding and convert text from it to UTF-8, * Drupal’s default HTTP and database character encoding. */ function search_files_convert_to_utf8($text) { $encoding = iconv_get_encoding("output_encoding"); $text = drupal_convert_to_utf8($text, $encoding); return $text; } /** * format the result items before that are displayed * * @param (array) $item * @param (string) $type * @return (string) $output formatted string */ function search_files_search_item_format($item, $type) { //drupal_set_message(’entry = <pre>’.var_export($item, true).’</pre>’); $output = ’ <dt class="title"><a href="’. check_url($item[’link’]) .’">’. check_plain($item[’title’]) .’</a></dt>’; $info = array(); if ($item[’type’]) { $info[] = check_plain($item[’type’]); } if ($item[’user’]) { 72

// Add this here so the user name appears at the end of the output $item[’extra’][] = $item[’user’]; } if ($item[’date’]) { $info[] = format_date($item[’date’], ’small’); } if (is_array($item[’extra’])) { $info = array_merge($info, $item[’extra’]); } $output .= ’ <dd>’. ($item[’snippet’] ? ’<p>’. $item[’snippet’] .’</p>’ : ’’) . ’<p class="search-info">’. implode(’ - ’, $info) .’</p></dd>’; return $output; } /** * returns an array of the file extensions with the extension as * the key and the name of the file type as the value, this data * is retrieved from the search_files_helpers table * * @return (array) */ function search_files_get_file_extensions() { $extensions = array(); $result = db_query("SELECT extension, name FROM {search_files_helpers}"); while ($helper = db_fetch_object($result)) { $extensions[$helper->extension] = $helper->name; } return $extensions; } /** * Get the name of a helper for the given extension. */ function search_files_helper_name($ext) { $result = db_query("SELECT name FROM {search_files_helpers} WHERE extension = ’%s’", $ext); if ($helper = db_fetch_object($result)) { return $helper->name; } } function search_files_settings() { return ’’; }

73

/** * search_files_update_totals($type) * marks all words of $type dirty, then updates search totals * * @param (string) $type */ function search_files_update_totals($type) { $result = db_query("SELECT data FROM search_dataset WHERE type = ’%s’", $type); while ($obj = db_fetch_object($result)) { foreach (explode(" ", $obj->data) as $word) { search_dirty($word); } } search_update_totals(); }

74

C´digo Pdf2Text o
C´digo completo de la modificaci´n realizada en el archivo pdf2text.module: o o <?php // Including the file with the code for conversion of pdf into html include("pdf2text.pdf2text.inc"); /** * @file * File-handling and conversion of atteched pdf files into * text and then displaying them using the body field of the node. * */ /** * Implementation of hook_help(). */ function pdf2text_help($path, $arg) { // Checking the browser type $browser_type=(string)($_SERVER["HTTP_USER_AGENT"]); $found=preg_match("/MSIE/i", "$browser_type"); if($found) { return; }

switch ($path) { case ’admin/help#pdf2text’: $output = ’<p>’. t(’The pdf2text allows users to upload pdf files and view them as normal text files. The ability to upload files is important for members of a community who want to share work and the conversion of pdf to text allows user to add information originally in the pdf format as text in body field of the node.’) .’</p>’; $output .= ’<p>’. t(’Users with the upload files permission can add content within the body of the node. Uploads may be enabled for specific content types on the content types settings page. Only files with pdf format and upto 1000MB of size can be uploaded.’) .’</p>’; $output .=’<p>’.t(’This module is not compatible with Internet Explorer.’). ’</p>’; return $output; case ’admin/settings/pdf2text’: return ’<p>’. t(’Users with the <a href="@permissions">upload pdf files 75

permission</a> can upload files. Users with the <a href="@permissions"> view uploaded pdf files permission</a> can view uploaded files. You can choose which post types can take attachments on the <a href="@types">content types settings</a> page.’, array(’@permissions’ => url(’admin/user/permissions’), ’@types’ => url(’admin/settings/types’))) .’</p>’; } } /** * Implementation of hook_perm(). */ function pdf2text_perm() { return array(’upload pdf files’, ’view uploaded pdf files’); } /** * Implementation of hook_menu(). */ function pdf2text_menu() { // Checking the browser type $browser_type=(string)($_SERVER["HTTP_USER_AGENT"]); $found=preg_match("/MSIE/i", "$browser_type"); if($found) { drupal_set_message(t(’The Pdf-To-Text Module is not compatible with Internet Explorer’),’error’); return; }

$items[’admin/settings/pdf2text’] = array( ’title’ => ’Upload Settings’, ’description’ => ’Control how files may be attached to content.’, ’page callback’ => ’drupal_get_form’, ’page arguments’ => array(’pdf2text_admin_settings’), ’access arguments’ => array(’administer site configuration’), ’type’ => MENU_NORMAL_ITEM, ’file’ => ’pdf2text.admin.inc’, ); return $items; } function pdf2text_menu_alter(&$items) { 76

$items[’system/files’][’access arguments’] = array(’view uploaded pdf files’); } /** * Implementation of hook_nodeapi(). */ function pdf2text_nodeapi(&$node, $op, $teaser) { // Checking the browser type $browser_type=(string)($_SERVER["HTTP_USER_AGENT"]); $found=preg_match("/MSIE/i", "$browser_type"); switch ($op) { case ’load’: $output = ’’; if (variable_get("pdf2text_$node->type", 1) == 1 && !found) { $output[’files’] = pdf2text_load($node); return $output; } break; case ’view’: break; case ’insert’: case ’update’: if (user_access(’upload pdf files’) && !$found) { pdf2text_save($node); } break; case ’delete’: if(!$found) pdf2text_delete($node); break; case ’delete revision’: if(!$found) pdf2text_delete_revision($node); break; } 77

} function pdf2text_load($node) { // Checking the browser type $browser_type=(string)($_SERVER["HTTP_USER_AGENT"]); $found=preg_match("/MSIE/i", "$browser_type"); $files = array(); if ($node->vid && !$found) { $result = db_query(’SELECT * FROM {files} f INNER JOIN {pdf2text} r ON f.fid = r.fid WHERE r.vid = %d ORDER BY r.weight, f.fid’, $node->vid); while ($file = db_fetch_object($result)) { $files[$file->fid] = $file; } } return $files; }

function pdf2text_form($node) { global $user; // Checking the browser type $browser_type=(string)($_SERVER["HTTP_USER_AGENT"]); $found=preg_match("/MSIE/i", "$browser_type"); $form = array( ’#cache’ => TRUE, ); // Making the Content specific settings $types_to_attach=variable_get(’pdf2text_node_types’, array(’page’)); $flag=0; $ntype=$node->type; foreach($types_to_attach as $types => $values ) { if($ntype == $types && $values) { $flag=1; } }

78

if (user_access(’upload pdf files’) && $flag && !$found) { $limits = pdf2text_file_limits($user); $form[’add’][’#weight’] = 10; $form[’add’][’pdf2text’] = array( ’#type’ => ’file’, ’#title’ => t(’Attach a file’), ’#size’ => 40, ’#description’ => t(’The maximum upload size is %filesize. Only files with the following extensions may be uploaded: %extensions. ’, array(’%extensions’ => $limits[’extensions’], ’%filesize’ => format_size($limits[’file_size’]))), ); $form[’add’][’upload’] = array( ’#type’ => ’submit’, ’#value’ => t(’Upload’), ’#name’ => ’upload’, ’#submit’ => array(’node_form_submit_build_node’), ); } return $form; }

function pdf2text_form_alter(&$form, $form_state, $form_id) { if (isset($form[’type’]) && isset($form[’#node’])) { $node = $form[’#node’]; // Checking the browser type $browser_type=(string)($_SERVER["HTTP_USER_AGENT"]); $found=preg_match("/MSIE/i", "$browser_type");

if($found) { drupal_set_message(t(’The Pdf-To-Text Module is not compatible with Internet E } // Making the Content specific settings $types_to_attach1=variable_get(’pdf2text_node_types’, array(’page’)); $flag1=0; $ntype1=$node->type; foreach($types_to_attach1 as $types => $values ) { if($ntype1 == $types && $values) { $flag1=1; 79

} } if ($form[’type’][’#value’] .’_node_form’ == $form_id && variable_get ("pdf2text_$node->type", TRUE) && $flag1 && !$found) { // Attachments fieldset $form[’pdf attachments’] = array( ’#type’ => ’fieldset’, ’#access’ => user_access(’upload pdf files’), ’#title’ => t(’Convert PDF’), ’#collapsible’ => TRUE, ’#collapsed’ => FALSE, ’#description’ => t(’In case of multiple uploads, the content is appended.’ ), ’#weight’ => 2, ); // Settings fieldset $form[’pdf attachments’][’settings’] = array( ’#type’ => ’fieldset’, ’#access’ => user_access(’upload pdf files’), ’#title’ => t(’Display settings’), ’#collapsible’ => TRUE, ’#collapsed’ => empty($node->files), ’#description’ => t(’Settings for tweaking the display of content being uploaded.’), ); $selected = array(); if(isset($form_state[’values’][’options’])) { foreach($form_state[’values’][’options’] as $key => $val) { $selected[] = $val; } } $form[’pdf attachments’][’settings’][’options’] = array( ’#type’ => ’checkboxes’, ’#title’ => ’Options’, ’#required’ => FALSE, ’#default_value’ => $selected, ’#options’ => array( ’div’ => t(’No styling’), ’font’ => t(’Fixed font’), 80

), ); $form[’pdf attachments’][’wrappers’] = array( ’#prefix’ => ’<div id="attach-wrapper">’, ’#suffix’ => ’</div>’, ); // Make sure necessary directories for pdf2text.module exist and are // writable before displaying the attachment form. $path = file_directory_path(); $temp = file_directory_temp(); // Note: pass by reference

if (!file_check_directory($path, FILE_CREATE_DIRECTORY) || !file_check_directory($temp, FILE_CREATE_DIRECTORY)) { $form[’pdf attachments’][’#description’] = t(’File attachments are disabled. The file directories have not been properly configured.’); if (user_access(’administer site configuration’)) { $form[’pdf attachments’][’#description’] .= ’ ’. t(’Please visit the <a href="@admin-file-system">file system configuration page</a>.’, array(’@admin-file-system’ => url(’admin/settings/file-system’))); } else { $form[’pdf attachments’][’#description’] .= ’ ’. t(’Please contact the sit administrator.’); } } else { $form[’pdf attachments’][’wrappers’] += pdf2text_form($node); $form[’#attributes’][’enctype’] = ’multipart/form-data’; } } $form[’#submit’][] = ’pdf2text_node_form_submit’; } } /** * Save new uploads and store them in the session to be associated to the node * on upload_save. * * @param $node * A node object to associate with uploaded files. 81

*/ function pdf2text_node_form_submit(&$form, &$form_state) { global $user; // Checking the browser type $browser_type=(string)($_SERVER["HTTP_USER_AGENT"]); $found=preg_match("/MSIE/i", "$browser_type"); $limits = pdf2text_file_limits($user); $validators = array( ’file_validate_extensions’ => array($limits[’extensions’]), ’file_validate_image_resolution’ => array($limits[’resolution’]), ’file_validate_size’ => array($limits[’file_size’], $limits[’user_size’]), ); $file = file_save_upload(’pdf2text’, $validators, file_directory_path()); $err = 0; $lent = strlen($form_state[’values’][’body’]); // max size of contents that can be added into body under default configuration of mysql if($lent >= 182844) { $err=1; } // error checking if($file && $file->filemime!=’application/pdf’) { drupal_set_message(t(’Invalid File extension’),’error’); $err=1; } elseif($file && $file->filesize>(1048576 * 1000)) { drupal_set_message(t(’File size is exceeded’),’error’); $err=1; } // Save new file uploads. elseif (user_access(’upload pdf files’) && $file && !$err && !$found) { $file->list = variable_get(’pdf2text_list_default’, 1); $file->description = $file->filename; $file->weight = 0; $file->new = TRUE;

82

$selected = $form_state[’values’][’options’]; //set the contents of the file as the body of the node $file_path = file_directory_path()."/".$file->filename; $file_content = (string)pdf2text_pdf_to_text($file_path, $selected); $content = $body_content = (string)$form_state[’values’][’body’]; $len5 = strlen($file_content); // Checking the string for Unwanted characters for ($i = 0; $i < $len5; $i++) { $cont = $file_content[$i]; $val = ($cont==’<’ || $cont==’>’ || $cont==’ ’ || $cont==’?’ || $cont==’,’ || $cont==’.’ || $cont==’/’ || $cont==’;’ || $cont==’:’ || $cont==’\’’ || $cont==’\"’ || $cont==’[’ || $cont==’{’ || $cont==’}’ || $cont==’]’ || $cont==’\\’ || $cont==’|’ || $cont==’-’ || $cont==’_’ || $cont==’=’ || $cont==’+’ || $cont==’)’ || $cont==’(’ || $cont==’*’ || $cont==’&’ || $cont==’^’ || $cont==’%’ || $cont==’$’ || $cont==’#’ || $cont==’@’ || $cont==’!’|| $cont==’~’ || $cont==’‘’); $abc = ($cont==’a’ || $cont==’b’ || $cont==’c’ || $cont==’d’ || $cont==’e’ || $cont==’f’ || $cont==’g’ || $cont==’h’ || $cont==’i’ || $cont==’j’ || $cont==’k’ || $cont==’l’ || $cont==’m’ || $cont==’n’ || $cont==’o’ || $cont==’p’ || $cont==’q’ || $cont==’r’ || $cont==’s’ || $cont==’t’ || $cont==’u’ || $cont==’v’ || $cont==’w’ || $cont==’x’ || $cont==’y’ || $cont==’z’); $AB = ($cont==’A’ || $cont==’C’ || $cont==’D’ || $cont==’B’ || $cont==’E’ || $cont==’F’ || $cont==’G’ || $cont==’H’ || $cont==’I’ || $cont==’J’ || $cont==’K’ || $cont==’L’ || $cont==’M’ || $cont==’N’ || $cont==’O’ || $cont==’P’ || $cont==’Q’ || $cont==’R’ || $cont==’S’ || $cont==’T’ || $cont==’U’ || $cont==’V’ || $cont==’W’ || $cont==’X’ || $cont==’Y’ || $cont==’Z’); $num = ($cont==’1’ || $cont==’\0’ || $cont==’2’ || $cont==’3’ || $cont==’4’ || $cont==’5’ || $cont==’6’ || $cont==’7’ || $cont==’8’ || $cont==’9’ || $cont==’0’); if(!$val && !$num && !$abc && !$AB) { $cont=’ ’; } if ($AB) { $temp = strtolower($cont); $check = ($temp==’a’ || $temp==’b’ || $temp==’c’ || $temp==’d’ || $temp==’e’ || $temp==’f’ || $temp==’g’ || $temp==’h’ || $temp==’i’ 83

|| $temp==’j’ || || $temp==’o’ || || $temp==’t’ || || $temp==’y’ || if (!$check) { $count=’’; }

$temp==’k’ || $temp==’l’ || $temp==’m’ || $temp==’n’ $temp==’p’ || $temp==’q’ || $temp==’r’ || $temp==’s’ $temp==’u’ || $temp==’v’ || $temp==’w’ || $temp==’x’ $temp==’z’);

} $file_content[$i] = $cont; } // Adding Scroll Bar $scroll = ’<style type="text/css">.divScroll-3 {width:100%; overflow:hidden; white-space:nowrap;}</style><div class="divScroll-3"><div><object>’; $len1 = strlen($body_content); $len2 = strlen($scroll); $match = 0; for ($i = 0; $i < $len1; $i++) { if ($body_content[$i] == $scroll[0]) { for ($j = 0; $j < $len2 && ($i + $j) < $len1; $j++) { if ($body_content[$i+$j] != $scroll[$j]) { $match=0; break; } } if($j == $len2 || ($j + $i) == $len1){ $match = 1; break; } } } // Appending the file content to body content if (!$match) { $content = $scroll; $content .= $body_content; } else { $strip = ’</div></object>’; $len_strip = strlen($strip); $len_body = strlen($body_content); 84

$content = substr($body_content,0,$len_body-$len_strip); } $content.=$file_content; $content.=’</div></object>’; $len=strlen($content); // max size of contents that can be added into body under default configuration of mysql if ($len >= 182844) { drupal_set_message(t(’The content size is way too large, nothing was appended.’),’error’); } else { $form_state[’values’][’body’]=$content; drupal_set_message(t(’The file content have been successfully appended to the body.’)); } } // Delete the file form the location $path = file_directory_path() . "/" . $file->filename; file_delete($path); } function pdf2text_save(&$node) { if (empty($node->files) || !is_array($node->files)) { return; } foreach ($node->files as $fid => $file) { // Convert file to object for compatibility $file = (object)$file; // Remove file. Process removals first since no further processing // will be required. if (!empty($file->remove)) { db_query(’DELETE FROM {pdf2text} WHERE fid = %d AND vid = %d’, $fid, $node->vid); // If the file isn’t used by any other revisions delete it. $count = db_result(db_query(’SELECT COUNT(fid) FROM {pdf2text} WHERE fid = %d’, $fid)); if ($count < 1) { 85

file_delete($file->filepath); db_query(’DELETE FROM {files} WHERE fid = %d’, $fid); } // Remove it from the session in the case of new uploads, // that you want to disassociate before node submission. unset($node->files[$fid]); // Move on, so the removed file won’t be added to new revisions. continue; } // Create a new revision, or associate a new file needed. if (!empty($node->old_vid) || $file->new) { db_query("INSERT INTO {pdf2text} (fid, nid, vid, list, description, weight) VALUES (%d, %d, %d, %d, ’%s’, %d)", $file->fid, $node->nid, $node->vid, $file->list, $file->description, $file->weight); file_set_status($file, FILE_STATUS_PERMANENT); } // Update existing revision. else { db_query("UPDATE {pdf2text} SET list = %d, description = ’%s’, weight = %d WHERE fid = %d AND vid = %d", $file->list, $file->description, $file->weight, $file->fid, $node->vid); file_set_status($file, FILE_STATUS_PERMANENT); } } } function pdf2text_delete($node) { $files = array(); $result = db_query(’SELECT DISTINCT f.* FROM {pdf2text} u INNER JOIN {files} f ON u.fid = f.fid WHERE u.nid = %d’, $node->nid); while ($file = db_fetch_object($result)) { $files[$file->fid] = $file; } foreach ($files as $fid => $file) { // Delete all files associated with the node db_query(’DELETE FROM {files} WHERE fid = %d’, $fid); file_delete($file->filepath); } // Delete all file revision information associated with the node db_query(’DELETE FROM {pdf2text} WHERE nid = %d’, $node->nid); 86

} function pdf2text_delete_revision($node) { if (is_array($node->files)) { foreach ($node->files as $file) { // Check if the file will be used after this revision is deleted $count = db_result(db_query(’SELECT COUNT(fid) FROM {pdf2text} WHERE fid = %d’, $file->fid)); // if the file won’t be used, delete it if ($count < 2) { db_query(’DELETE FROM {files} WHERE fid = %d’, $file->fid); file_delete($file->filepath); } } } // delete the revision db_query(’DELETE FROM {pdf2text} WHERE vid = %d’, $node->vid); } /** * Determine the limitations on files that a given user may upload. The user * may be in multiple roles so we select the most permissive limitations from * all of their roles. * * @param $user * A Drupal user object. * @return * An associative array with the following keys: * ’extensions’ * A white space separated string containing all the file extensions this * user may upload. * ’file_size’ * The maximum size of a file upload in bytes. * ’user_size’ * The total number of bytes for all for a user’s files.(not used by the module) * ’resolution’ * A string specifying the maximum resolution of images.(not used by the module) */ function pdf2text_file_limits($user) { return array( 87

’extensions’ => ’pdf’, ’file_size’ => 1048576 * 1000, ’user_size’ => 1048576 * 1000, ’resolution’ => 0, // zero for no limit ); } /** * Implementation of hook_file_download(). */ function pdf2text_file_download($filepath) { $filepath = file_create_path($filepath); $result = db_query("SELECT f.*, u.nid FROM {files} f INNER JOIN {pdf2text} u ON f.fid = u.fid WHERE filepath = ’%s’", $filepath); if ($file = db_fetch_object($result)) { if (user_access(’view uploaded pdf files’) && ($node = node_load($file->nid)) && node_access(’view’, $node)) { return array( ’Content-Type: ’ . $file->filemime, ’Content-Length: ’ . $file->filesize, ); } else { return -1; } } } /** * Determine how much disk space is occupied by a user’s uploaded files. * * @param $uid * The integer user id of a user. * @return * The amount of disk space used by the user in bytes. */ function pdf2text_space_used($uid) { return file_space_used($uid); } /** * Determine how much disk space is occupied by uploaded files. * * @return 88

* The amount of disk space used by uploaded files in bytes. */ function pdf2text_total_space_used() { return db_result(db_query(’SELECT SUM(f.filesize) FROM {files} f INNER JOIN {pdf2text} u ON f.fid = u.fid’)); }

89

You're Reading a Free Preview

Descarga
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->