2 // vim: set expandtab tabstop=4 softtabstop=4 shiftwidth=4:
3 // +--------------------------------------------------------------------+
5 // +--------------------------------------------------------------------+
6 // | Sistema de Horas Extra - Ministerio de Economía - Argentina |
7 // +--------------------------------------------------------------------+
8 // | Creado: lun abr 22 16:05:33 ART 2002 |
9 // | Autor: Leandro Lucarella <llucar@mecon.gov.ar> |
10 // +--------------------------------------------------------------------+
12 // $URL: http://portal.mecon.ar/svn/he/ramas/carga_inicial/src/lib/HE/lib/hooks.php $
14 // $Date: 2002-10-23 19:09:12 -0300 (mié, 23 oct 2002) $
19 * "Engancha" una página dentro de otra.
21 * Esta función busca por un archivo llamado igual que el script php que
22 * se está ejecutando más un postfijo para incluirlo en la ejecución. De
23 * no encontrarlo, busca uno llamado default-<posfijo>.php en el
24 * directorio actual y/o en el include_path del php.
25 * Por otro lado soporta argumentos variables, que son 'pasados' al hook
26 * en el array $args. De esta manera se pueden parametrizar los hooks.
28 * @param string $nombre Nombre del "gancho". Es el nombre del posfijo
29 * que se le agrega al nombre de archivo antes de
32 * @return mixed Devuelve lo mismo que el archivo incluído.
34 function hook( $nombre ) {
36 // Se pasan todos los argumentos del hook (nótese que de forma similar
37 // al argv[] del sistema, el primer elemento es el nombre del hook
39 $args = func_get_args();
41 list( $dir, $pagina, $extension ) = splitfilename( $_SERVER['SCRIPT_FILENAME'] );
42 if ( is_readable_include( "$pagina-$nombre.php" ) ) {
43 return include "$pagina-$nombre.php";
44 } elseif ( is_readable_include( "default-$nombre.php" ) ) {
45 return include "default-$nombre.php";
46 } elseif ( is_readable_include( "includes/hooks/default-$nombre.php" ) ) {
47 return include "includes/hooks/default-$nombre.php";
53 * "Engancha" una página dentro de otra desde un método de un objeto.
55 * Esta función busca por un archivo llamado igual que el script php que
56 * se está ejecutando más un postfijo para incluirlo en la ejecución. De
57 * no encontrarlo, busca uno llamado default-<class>-<posfijo>.php en el
58 * directorio actual y/o en el include_path del php. <class> es la clase
59 * del objeto o de un objeto padre (obtenido del nombre de la clase según
60 * las recomendaciones de PEAR <http://pear.php.net/>). Se busca primero
61 * un hook que coincida con la clase más específica y luego el de las
63 * Por otro lado soporta argumentos variables, que son 'pasados' al hook
64 * en el array $args. De esta manera se pueden parametrizar los hooks.
66 * @param string $nombre Nombre del "gancho". Es el nombre del posfijo
67 * que se le agrega al nombre de archivo antes de
69 * @param object &$objeto Objeto a usar en el hooko.
71 * @return mixed Devuelve lo mismo que el archivo incluído.
73 function hooko( $nombre, &$objeto ) {
75 // Se pasan todos los argumentos del hook (nótese que de forma similar
76 // al argv[] del sistema, el primer elemento es el nombre del hook
78 $args = func_get_args();
80 // Obtiene el nombre de la clase y sus padres.
81 $c = preg_split( '/_/', get_class( $objeto ) );
82 array_shift( $c ); // Le saca el HE
84 list( $dir, $pagina, $extension ) = splitfilename( $_SERVER['SCRIPT_FILENAME'] );
86 // Busca el hook con "herencia" de clases.
87 foreach( $c as $n => $class ) {
89 // Genera el nombre de la clase padre del nivel $n.
90 $class = join( '_', array_slice( $c, 0, $n ? -$n : count( $c ) ) );
92 if ( is_readable_include( "$pagina-$class-$nombre.php" ) ) {
93 return include "$pagina-$class-$nombre.php";
94 } elseif ( is_readable_include( "default-$class-$nombre.php" ) ) {
95 return include "default-$class-$nombre.php";
96 } elseif ( is_readable_include( "includes/hooks/default-$class-$nombre.php" ) ) {
97 return include "includes/hooks/default-$class-$nombre.php";
105 * "Engancha" una segmento de configuración dentro de una página.
107 * Esta función busca un archivo llamado default-<postfijo> en el include
108 * path de PHP, luego en el directoro actual, y luego un archivo llamado
109 * pagina-<postfijo> en el directorio actual. Incluye para su ejecución
110 * todos los archivos que encuentre.
111 * De esta manera, las instancias más específicas del hook sobreescriben
112 * las definiciones hechas en las instancias más genéricas.
113 * Por otro lado soporta argumentos variables, que son 'pasados' al hook
114 * en el array $args. De esta manera se pueden parametrizar los hooks.
116 * @param string $nombre Nombre del "gancho". Es el nombre del posfijo
117 * que se le agrega al nombre de archivo antes de
120 * @return array Devuelve un array_merge() de todos los valores
121 * devuletos por los hookc encontrados. Para entender bien
122 * qué pasa en cada caso particular (por ejemplo si un
123 * hookc devuelve un string y otro un array), hay que
124 * tener claro como funciona array_merge().
126 function hookc( $nombre ) {
128 // Se pasan todos los argumentos del hook (nótese que de forma similar
129 // al argv[] del sistema, el primer elemento es el nombre del hook
131 $args = func_get_args();
133 list( $dir, $pagina, $extension ) = splitfilename( $_SERVER['SCRIPT_FILENAME'] );
136 if ( is_readable_include( "includes/hooks/default-$nombre.php" ) )
137 $ret[] = include "includes/hooks/default-$nombre.php";
138 if ( is_readable_include( "default-$nombre.php" ) )
139 $ret[] = include "default-$nombre.php";
140 if ( is_readable_include( "$pagina-$nombre.php" ) )
141 $ret[] = include "$pagina-$nombre.php";
143 // Juntamos todos los valores devueltos. Suponemos que todos
144 // devuelven un hash. De devolver un valor común, seguramente se
145 // agregue al hash como un valor mas (solo que la clave será numérica
146 // y autoincremental).
147 // NOTA: Si las claves son numéricas, los elementos no reemplazan a
148 // los anteriores!!! Son agregados y se les cambia la clave por un
149 // número más alto (todavía no usado en el array).
151 foreach ( $ret as $array )
152 array_merge( $r, $array );
159 * Hook al estilo dotfile.
161 * Este tipo de hook es muy similar a un hook común, sólo cambia donde se
162 * lo busca. El directorio de búsqueda se especifica expresamente al
163 * llamar al hook y no hace un fallback a otros hooks por defecto.
165 * @param string $nombre Nombre del "gancho". En este caso simplemente se
166 * busca el archivo .$nombre.php ya que los este
167 * tipo de hook es 'directory-wide'.
168 * @param string $ruta Ruta en donde se encuentra el hookd.
170 * @return mixed Devuelve lo mismo que el archivo incluído.
172 function hookd( $nombre, $ruta = '.' ) {
174 // Se pasan todos los argumentos del hook (nótese que de forma similar
175 // al argv[] del sistema, el primer elemento es el nombre del hook
177 $args = func_get_args();
179 if ( is_readable( "$ruta/.$nombre.php" ) )
180 return include "$ruta/.$nombre.php";
185 * Verifica que un hook exista.
187 * @param string $nombre Nombre del hook a ver si existe.
189 * @return mixed Devuelve true si existe el hook.
193 function hook_exists( $nombre ) {
195 $include_path = array_unique( array_merge( preg_split( '/:/', ini_get( 'include_path' ) ), '.' ) );
196 list( $dir, $pagina, $extension ) = splitfilename( $_SERVER['SCRIPT_FILENAME'] );
197 foreach ( $include_path as $path )
198 if ( is_readable_include( "$path/$pagina-$nombre.php" )
199 or is_readable_include( "$path/default-$nombre.php" )
200 or is_readable_include( "$path/includes/hooks/default-$nombre.php" ) )
207 * Verifica que un hooko exista.
209 * @param string $nombre Nombre del hooko a ver si existe.
210 * @param object &$objeto Objeto del que se quiere saber si el hooko
213 * @return mixed Devuelve true si existe el hooko.
217 function hooko_exists( $nombre, &$objeto ) {
219 $include_path = array_unique( array_merge( preg_split( '/:/', ini_get( 'include_path' ) ), '.' ) );
220 list( $dir, $pagina, $extension ) = splitfilename( $_SERVER['SCRIPT_FILENAME'] );
221 $c = preg_split( '/_/', get_class( $objeto ) );
222 array_shift( $c ); // Le saca el HE
224 // Busca el hooko con "herencia" de clases.
225 foreach( $c as $n => $class ) {
226 $class = join( '_', array_slice( $c, 0, $n ? -$n : count( $c ) ) );
227 foreach ( $include_path as $path )
228 if ( is_readable_include( "$path/$pagina-$class-$nombre.php" )
229 or is_readable_include( "$path/default-$class-$nombre.php" )
230 or is_readable_include( "$path/includes/hooks/default-$class-$nombre.php" ) )
239 * Verifica que un hookd exista.
241 * @param string $nombre Nombre del hookd a ver si existe.
242 * @param string $ruta Ruta donde se encuentra el hookd.
244 * @return mixed Devuelve true si existe el hookd.
248 function hookd_exists( $nombre, $ruta = '.' ) {
250 return is_readable( "$ruta/.$nombre.php" );
255 * Divide un archivo devolviendo el nombre y la extensión.
257 * @param string $nombre Nombre del archivo a dividir.
259 * @return array Un array cuyo primer elemento es el nombre y el segundo
264 function splitfilename( $nombre ) {
266 $path = preg_split( '|/|', $nombre );
267 $file = array_pop( $path );
270 if ( strstr( $file, '.' ) ) {
271 preg_match( '|([^/]+?)(\.([^\.]*))?$|', $file, $m );
272 $file = $m[1] . ( ( $m[2] == '.' ) ? '.' : '' );
276 $dir = count( $path ) ? join( '/', $path ) : '';
278 return array( $dir, $file, $ext );
283 * Indica si un archivo existe en el include_path y si puede ser leido.
285 * @param string $nombre Nombre del archivo a buscar.
287 * @return array Devuelve true si esta en el include path y puede ser
293 function is_readable_include( $nombre ) {
295 list( $dir, $pagina, $extension ) = splitfilename( $nombre );
296 if ( is_readable( $nombre ) )
299 $include_path = preg_split( '/:/', ini_get( 'include_path' ) );
300 foreach ( $include_path as $path )
301 if ( is_readable( "$path/$nombre" ) )
307 // $URL: http://portal.mecon.ar/svn/he/ramas/carga_inicial/src/lib/HE/lib/hooks.php $ $Rev: 116 $ $Date: 2002-10-23 19:09:12 -0300 (mié, 23 oct 2002) $ $Author: llucar $