| // +--------------------------------------------------------------------+ // // $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 $ // /** * "Engancha" una página dentro de otra. * * Esta función busca por un archivo llamado igual que el script php que * se está ejecutando más un postfijo para incluirlo en la ejecución. De * no encontrarlo, busca uno llamado default-.php en el * directorio actual y/o en el include_path del php. * Por otro lado soporta argumentos variables, que son 'pasados' al hook * en el array $args. De esta manera se pueden parametrizar los hooks. * * @param string $nombre Nombre del "gancho". Es el nombre del posfijo * que se le agrega al nombre de archivo antes de * buscar. * * @return mixed Devuelve lo mismo que el archivo incluído. */ function hook( $nombre ) { // Se pasan todos los argumentos del hook (nótese que de forma similar // al argv[] del sistema, el primer elemento es el nombre del hook // siempre). $args = func_get_args(); list( $dir, $pagina, $extension ) = splitfilename( $_SERVER['SCRIPT_FILENAME'] ); if ( is_readable_include( "$pagina-$nombre.php" ) ) { return include "$pagina-$nombre.php"; } elseif ( is_readable_include( "default-$nombre.php" ) ) { return include "default-$nombre.php"; } elseif ( is_readable_include( "includes/hooks/default-$nombre.php" ) ) { return include "includes/hooks/default-$nombre.php"; } } /** * "Engancha" una página dentro de otra desde un método de un objeto. * * Esta función busca por un archivo llamado igual que el script php que * se está ejecutando más un postfijo para incluirlo en la ejecución. De * no encontrarlo, busca uno llamado default--.php en el * directorio actual y/o en el include_path del php. es la clase * del objeto o de un objeto padre (obtenido del nombre de la clase según * las recomendaciones de PEAR ). Se busca primero * un hook que coincida con la clase más específica y luego el de las * clases padre. * Por otro lado soporta argumentos variables, que son 'pasados' al hook * en el array $args. De esta manera se pueden parametrizar los hooks. * * @param string $nombre Nombre del "gancho". Es el nombre del posfijo * que se le agrega al nombre de archivo antes de * buscar. * @param object &$objeto Objeto a usar en el hooko. * * @return mixed Devuelve lo mismo que el archivo incluído. */ function hooko( $nombre, &$objeto ) { // Se pasan todos los argumentos del hook (nótese que de forma similar // al argv[] del sistema, el primer elemento es el nombre del hook // siempre). $args = func_get_args(); // Obtiene el nombre de la clase y sus padres. $c = preg_split( '/_/', get_class( $objeto ) ); array_shift( $c ); // Le saca el HE list( $dir, $pagina, $extension ) = splitfilename( $_SERVER['SCRIPT_FILENAME'] ); // Busca el hook con "herencia" de clases. foreach( $c as $n => $class ) { // Genera el nombre de la clase padre del nivel $n. $class = join( '_', array_slice( $c, 0, $n ? -$n : count( $c ) ) ); if ( is_readable_include( "$pagina-$class-$nombre.php" ) ) { return include "$pagina-$class-$nombre.php"; } elseif ( is_readable_include( "default-$class-$nombre.php" ) ) { return include "default-$class-$nombre.php"; } elseif ( is_readable_include( "includes/hooks/default-$class-$nombre.php" ) ) { return include "includes/hooks/default-$class-$nombre.php"; } } } /** * "Engancha" una segmento de configuración dentro de una página. * * Esta función busca un archivo llamado default- en el include * path de PHP, luego en el directoro actual, y luego un archivo llamado * pagina- en el directorio actual. Incluye para su ejecución * todos los archivos que encuentre. * De esta manera, las instancias más específicas del hook sobreescriben * las definiciones hechas en las instancias más genéricas. * Por otro lado soporta argumentos variables, que son 'pasados' al hook * en el array $args. De esta manera se pueden parametrizar los hooks. * * @param string $nombre Nombre del "gancho". Es el nombre del posfijo * que se le agrega al nombre de archivo antes de * buscar. * * @return array Devuelve un array_merge() de todos los valores * devuletos por los hookc encontrados. Para entender bien * qué pasa en cada caso particular (por ejemplo si un * hookc devuelve un string y otro un array), hay que * tener claro como funciona array_merge(). */ function hookc( $nombre ) { // Se pasan todos los argumentos del hook (nótese que de forma similar // al argv[] del sistema, el primer elemento es el nombre del hook // siempre). $args = func_get_args(); list( $dir, $pagina, $extension ) = splitfilename( $_SERVER['SCRIPT_FILENAME'] ); $ret = array(); if ( is_readable_include( "includes/hooks/default-$nombre.php" ) ) $ret[] = include "includes/hooks/default-$nombre.php"; if ( is_readable_include( "default-$nombre.php" ) ) $ret[] = include "default-$nombre.php"; if ( is_readable_include( "$pagina-$nombre.php" ) ) $ret[] = include "$pagina-$nombre.php"; // Juntamos todos los valores devueltos. Suponemos que todos // devuelven un hash. De devolver un valor común, seguramente se // agregue al hash como un valor mas (solo que la clave será numérica // y autoincremental). // NOTA: Si las claves son numéricas, los elementos no reemplazan a // los anteriores!!! Son agregados y se les cambia la clave por un // número más alto (todavía no usado en el array). $r = array(); foreach ( $ret as $array ) array_merge( $r, $array ); return $r; } /** * Hook al estilo dotfile. * * Este tipo de hook es muy similar a un hook común, sólo cambia donde se * lo busca. El directorio de búsqueda se especifica expresamente al * llamar al hook y no hace un fallback a otros hooks por defecto. * * @param string $nombre Nombre del "gancho". En este caso simplemente se * busca el archivo .$nombre.php ya que los este * tipo de hook es 'directory-wide'. * @param string $ruta Ruta en donde se encuentra el hookd. * * @return mixed Devuelve lo mismo que el archivo incluído. */ function hookd( $nombre, $ruta = '.' ) { // Se pasan todos los argumentos del hook (nótese que de forma similar // al argv[] del sistema, el primer elemento es el nombre del hook // siempre). $args = func_get_args(); if ( is_readable( "$ruta/.$nombre.php" ) ) return include "$ruta/.$nombre.php"; } /** * Verifica que un hook exista. * * @param string $nombre Nombre del hook a ver si existe. * * @return mixed Devuelve true si existe el hook. * * @see hook() */ function hook_exists( $nombre ) { $include_path = array_unique( array_merge( preg_split( '/:/', ini_get( 'include_path' ) ), '.' ) ); list( $dir, $pagina, $extension ) = splitfilename( $_SERVER['SCRIPT_FILENAME'] ); foreach ( $include_path as $path ) if ( is_readable_include( "$path/$pagina-$nombre.php" ) or is_readable_include( "$path/default-$nombre.php" ) or is_readable_include( "$path/includes/hooks/default-$nombre.php" ) ) return true; return false; } /** * Verifica que un hooko exista. * * @param string $nombre Nombre del hooko a ver si existe. * @param object &$objeto Objeto del que se quiere saber si el hooko * existe. * * @return mixed Devuelve true si existe el hooko. * * @see hooko() */ function hooko_exists( $nombre, &$objeto ) { $include_path = array_unique( array_merge( preg_split( '/:/', ini_get( 'include_path' ) ), '.' ) ); list( $dir, $pagina, $extension ) = splitfilename( $_SERVER['SCRIPT_FILENAME'] ); $c = preg_split( '/_/', get_class( $objeto ) ); array_shift( $c ); // Le saca el HE // Busca el hooko con "herencia" de clases. foreach( $c as $n => $class ) { $class = join( '_', array_slice( $c, 0, $n ? -$n : count( $c ) ) ); foreach ( $include_path as $path ) if ( is_readable_include( "$path/$pagina-$class-$nombre.php" ) or is_readable_include( "$path/default-$class-$nombre.php" ) or is_readable_include( "$path/includes/hooks/default-$class-$nombre.php" ) ) return true; } return false; } /** * Verifica que un hookd exista. * * @param string $nombre Nombre del hookd a ver si existe. * @param string $ruta Ruta donde se encuentra el hookd. * * @return mixed Devuelve true si existe el hookd. * * @see hookd() */ function hookd_exists( $nombre, $ruta = '.' ) { return is_readable( "$ruta/.$nombre.php" ); } /** * Divide un archivo devolviendo el nombre y la extensión. * * @param string $nombre Nombre del archivo a dividir. * * @return array Un array cuyo primer elemento es el nombre y el segundo * la extensión. * * @see hook() */ function splitfilename( $nombre ) { $path = preg_split( '|/|', $nombre ); $file = array_pop( $path ); $ext = ''; if ( strstr( $file, '.' ) ) { preg_match( '|([^/]+?)(\.([^\.]*))?$|', $file, $m ); $file = $m[1] . ( ( $m[2] == '.' ) ? '.' : '' ); $ext = $m[3]; } $dir = count( $path ) ? join( '/', $path ) : ''; return array( $dir, $file, $ext ); } /** * Indica si un archivo existe en el include_path y si puede ser leido. * * @param string $nombre Nombre del archivo a buscar. * * @return array Devuelve true si esta en el include path y puede ser * leido. * * @see hook() * @see hook_exists() */ function is_readable_include( $nombre ) { list( $dir, $pagina, $extension ) = splitfilename( $nombre ); if ( is_readable( $nombre ) ) return true; $include_path = preg_split( '/:/', ini_get( 'include_path' ) ); foreach ( $include_path as $path ) if ( is_readable( "$path/$nombre" ) ) return true; return false; } // $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 $ ?>