2001-12-01 15:20:48 +00:00
< ? php
2003-12-13 14:59:55 +00:00
/* $Id$ */
2001-12-01 15:20:48 +00:00
2004-01-06 19:52:14 +00:00
/**
* @ name Page title
* @ ingroup common
2003-12-08 06:32:19 +00:00
*
* Functions to get and set the title of the current page .
* @ {
*/
2003-11-23 10:41:04 +00:00
function drupal_set_title ( $title = NULL ) {
static $stored_title ;
if ( isset ( $title )) {
2003-11-25 19:26:21 +00:00
$stored_title = ucfirst ( $title );
2003-11-23 10:41:04 +00:00
}
return $stored_title ;
}
function drupal_get_title () {
$title = drupal_set_title ();
if ( ! isset ( $title )) {
$title = menu_get_active_title ();
}
return $title ;
}
2004-01-06 19:52:14 +00:00
/* @} */
2003-11-23 10:41:04 +00:00
/**
2004-01-06 19:52:14 +00:00
* @ name Page breadcrumbs
* @ ingroup common
2003-12-08 06:32:19 +00:00
*
* Functions to get and set the breadcrumb trail of the current page .
* @ {
*/
2004-01-06 19:52:14 +00:00
/**
* @ param $breadcrumb Array of links , starting with " home " and proceeding up
* to but not including the current page .
*/
2003-11-23 10:41:04 +00:00
function drupal_set_breadcrumb ( $breadcrumb = NULL ) {
static $stored_breadcrumb ;
if ( isset ( $breadcrumb )) {
$stored_breadcrumb = $breadcrumb ;
}
return $stored_breadcrumb ;
}
function drupal_get_breadcrumb () {
$breadcrumb = drupal_set_breadcrumb ();
if ( ! isset ( $breadcrumb )) {
$breadcrumb = menu_get_active_breadcrumb ();
}
return $breadcrumb ;
}
2004-01-06 19:52:14 +00:00
/* @} */
2003-11-23 10:41:04 +00:00
2004-01-14 22:30:09 +00:00
/**
* @ name HTML head contents
* @ ingroup common
*
* Set and get output that should be in the \ < head\ > tag .
* @ {
*/
function drupal_set_html_head ( $data = NULL ) {
2004-04-12 08:27:57 +00:00
static $stored_head = '' ;
2004-01-14 22:30:09 +00:00
if ( ! is_null ( $data )) {
$stored_head .= " $data\n " ;
}
return $stored_head ;
}
function drupal_get_html_head () {
global $base_url ;
2004-01-29 06:47:19 +00:00
$output = " <meta http-equiv= \" Content-Type \" content= \" text/html; charset=utf-8 \" /> \n " ;
2004-01-14 22:30:09 +00:00
$output .= " <base href= \" $base_url / \" /> \n " ;
2004-01-29 06:47:19 +00:00
$output .= " <style type= \" text/css \" media= \" all \" > \n " ;
2004-01-14 22:30:09 +00:00
$output .= " @import url(misc/drupal.css); \n " ;
$output .= " </style> \n " ;
return $output . drupal_set_html_head ();
}
/* @} */
2003-09-30 17:01:34 +00:00
/**
2004-02-08 17:12:44 +00:00
* @ name URL path alias
2004-01-06 19:52:14 +00:00
* @ ingroup common
*
2004-02-08 17:12:44 +00:00
* Functions to handle path aliases .
2003-12-08 06:32:19 +00:00
*/
2003-10-03 14:10:05 +00:00
function drupal_get_path_map ( $action = " " ) {
2003-12-13 14:59:55 +00:00
static $map = NULL ;
2003-09-30 17:01:34 +00:00
2003-10-03 14:10:05 +00:00
if ( $action == " rebuild " ) {
$map = NULL ;
}
2003-12-13 14:59:55 +00:00
if ( is_null ( $map )) {
2004-01-25 09:09:00 +00:00
$map = array (); // make $map non-null in case no aliases are defined
2003-10-22 20:20:35 +00:00
$result = db_query ( " SELECT * FROM { url_alias} " );
2003-09-30 17:01:34 +00:00
while ( $data = db_fetch_object ( $result )) {
2003-10-01 05:18:03 +00:00
$map [ $data -> dst ] = $data -> src ;
2003-09-30 17:01:34 +00:00
}
}
return $map ;
}
2003-10-03 14:10:05 +00:00
function drupal_rebuild_path_map () {
drupal_get_path_map ( " rebuild " );
}
2004-01-06 19:52:14 +00:00
/**
2004-02-08 17:12:44 +00:00
* Given an old url , return the alias .
2004-01-06 19:52:14 +00:00
*/
2004-02-08 17:12:44 +00:00
function drupal_get_path_alias ( $path ) {
if (( $map = drupal_get_path_map ()) && ( $newpath = array_search ( $path , $map ))) {
return $newpath ;
}
elseif ( function_exists ( " conf_url_rewrite " )) {
return conf_url_rewrite ( $path , 'outgoing' );
}
2004-06-01 21:58:46 +00:00
else {
// No alias found. Return the normal path.
return $path ;
}
2004-02-08 17:12:44 +00:00
}
/**
* Given an alias , return the default url .
*/
function drupal_get_normal_path ( $path ) {
if (( $map = drupal_get_path_map ()) && isset ( $map [ $path ])) {
return $map [ $path ];
}
elseif ( function_exists ( " conf_url_rewrite " )) {
return conf_url_rewrite ( $path , 'incoming' );
}
else {
return $path ;
}
}
/* @} */
2004-01-06 19:52:14 +00:00
2004-01-14 22:30:09 +00:00
/**
* @ name HTTP headers
* @ ingroup common
*
* Functions to get and set the HTTP headers of the current page .
* @ {
*/
function drupal_set_header ( $header = NULL ) {
2004-04-12 08:27:57 +00:00
static $stored_headers = '' ;
2004-01-14 22:30:09 +00:00
if ( ! is_null ( $header )) {
header ( $header );
$stored_headers .= " $header\n " ;
}
return $stored_headers ;
}
function drupal_get_headers () {
return drupal_set_header ();
}
/* @} */
2004-02-08 17:12:44 +00:00
/**
* @ name HTTP handling
* @ ingroup common
*
* Functions to properly handle HTTP responses .
* @ {
*/
2004-01-06 19:52:14 +00:00
/**
* HTTP redirects . Makes sure the redirected url is formatted correctly and
* includes the session ID .
*
* @ note This function ends the request .
*
2004-02-11 19:21:14 +00:00
* @ param $url A Drupal URL
* @ param $query Query string component
* @ param $fragment Fragment identifier
2004-01-06 19:52:14 +00:00
*/
2004-02-11 19:21:14 +00:00
function drupal_goto ( $url = NULL , $query = NULL , $fragment = NULL ) {
2004-01-06 19:52:14 +00:00
/*
2004-02-11 19:21:14 +00:00
** Translate & amp ; to simply & in the absolute URL
2004-01-06 19:52:14 +00:00
*/
2003-10-03 14:10:05 +00:00
2004-02-11 19:21:14 +00:00
$url = str_replace ( " & " , " & " , url ( $url , $query , $fragment , TRUE ));
2004-01-06 19:52:14 +00:00
/*
** It is advised to use " drupal_goto() " instead of PHP ' s " header() " as
** " drupal_goto() " will append the user ' s session ID to the URI when PHP
** is compiled with " --enable-trans-sid " .
*/
if ( ! ini_get ( " session.use_trans_sid " ) || ! session_id () || strstr ( $url , session_id ())) {
header ( " Location: $url " );
}
else {
$sid = session_name () . " = " . session_id ();
if ( strstr ( $url , " ? " ) && ! strstr ( $url , $sid )) {
header ( " Location: $url & " . $sid );
}
else {
header ( " Location: $url ? " . $sid );
}
}
/*
** The " Location " header sends a REDIRECT status code to the http
** daemon . In some cases this can go wrong , so we make sure none
** of the code / below / gets executed when we redirect .
*/
exit ();
}
/**
* Generates a 404 error if the request can not be handled .
*/
2003-12-16 21:06:34 +00:00
function drupal_not_found () {
2004-04-21 13:56:38 +00:00
header ( 'HTTP/1.0 404 Not Found' );
2004-06-02 19:01:40 +00:00
watchdog ( 'httpd' , t ( '404 error: "%page" not found' , array ( '%page' => check_query ( $_GET [ " q " ]))));
2003-12-16 21:06:34 +00:00
$path = drupal_get_normal_path ( variable_get ( 'site_404' , '' ));
2004-04-21 13:56:38 +00:00
$status = MENU_FALLTHROUGH ;
2003-12-16 21:06:34 +00:00
if ( $path ) {
menu_set_active_item ( $path );
2004-04-21 13:56:38 +00:00
$status = menu_execute_active_handler ();
2003-12-16 21:06:34 +00:00
}
2004-04-21 13:56:38 +00:00
if ( $status != MENU_FOUND ) {
2004-03-08 18:35:04 +00:00
print theme ( 'page' , '' , t ( 'Page not found' ));
2003-12-16 21:06:34 +00:00
}
}
2004-01-07 19:52:10 +00:00
2004-04-21 13:56:38 +00:00
/**
* Generates a 403 error if the request is not allowed .
*/
function drupal_access_denied () {
header ( 'HTTP/1.0 403 Forbidden' );
$path = drupal_get_normal_path ( variable_get ( 'site_403' , '' ));
$status = MENU_FALLTHROUGH ;
if ( $path ) {
menu_set_active_item ( $path );
$status = menu_execute_active_handler ();
}
if ( $status != MENU_FOUND ) {
print theme ( 'page' , message_access (), t ( 'Access denied' ));
}
}
2004-01-07 19:52:10 +00:00
/**
* Flexible and powerful HTTP client implementation . Allows to GET , POST , PUT
* or any other HTTP requests . Handles redirects .
*
* @ param $url A string containing a fully qualified URI .
* @ param $headers An array containing a HTTP header => value pair .
* @ param $method A string defining the HTTP request to use .
* @ param $data A string containing data to include in the request .
* @ param $retry An integer representing how many times to retry the request
* in case of a redirect .
* @ return An object containing the HTTP request headers , response code ,
* headers , data , and redirect status .
*/
function drupal_http_request ( $url , $headers = array (), $method = 'GET' , $data = NULL , $retry = 3 ) {
// Parse the URL, and make sure we can handle the schema
$uri = parse_url ( $url );
switch ( $uri [ 'scheme' ]) {
case 'http' :
$fp = @ fsockopen ( $uri [ 'host' ], ( $uri [ 'port' ] ? $uri [ 'port' ] : 80 ), $errno , $errstr , 15 );
break ;
case 'https' :
// Note: only works for PHP 4.3 compiled with openssl
$fp = @ fsockopen ( " ssl:// $uri[host] " , ( $uri [ 'port' ] ? $uri [ 'port' ] : 443 ), $errno , $errstr , 20 );
break ;
default :
$result -> error = " invalid schema $uri[scheme] " ;
return $result ;
}
// Make sure the socket opened properly
if ( ! $fp ) {
$result -> error = trim ( " $errno $errstr " );
return $result ;
}
// Construct the path to act on
$path = $uri [ 'path' ] ? $uri [ 'path' ] : '/' ;
if ( $uri [ 'query' ]) {
$path .= " ? $uri[query] " ;
}
// Create http request
$defaults = array (
2004-01-07 20:43:26 +00:00
'Host' => " Host: $uri[host] " ,
'User-Agent' => 'User-Agent: Drupal (+http://www.drupal.org/)' ,
'Content-Length' => 'Content-Length: ' . strlen ( $data )
2004-01-07 19:52:10 +00:00
);
foreach ( $headers as $header => $value ) {
$defaults [ $header ] = " $header : $value " ;
}
$request = " $method $path HTTP/1.0 \r \n " ;
$request .= implode ( " \r \n " , $defaults );
$request .= " \r \n \r \n " ;
if ( $data ) {
$request .= " $data\r\n " ;
}
$result -> request = $request ;
fwrite ( $fp , $request );
// Fetch response.
2004-04-27 18:17:17 +00:00
$response = '' ;
2004-04-21 19:43:23 +00:00
while ( ! feof ( $fp ) && $data = fread ( $fp , 1024 )) {
2004-04-27 18:17:17 +00:00
$response .= $data ;
2004-01-07 19:52:10 +00:00
}
fclose ( $fp );
// Parse response.
2004-06-21 20:14:41 +00:00
list ( $headers , $result -> data ) = explode ( " \r \n \r \n " , $response , 2 );
$headers = preg_split ( " / \r \n | \n | \r / " , $headers );
list ( $protocol , $code , $text ) = explode ( ' ' , trim ( array_shift ( $headers )), 3 );
2004-01-07 19:52:10 +00:00
$result -> headers = array ();
// Parse headers.
2004-06-21 20:14:41 +00:00
while ( $line = trim ( array_shift ( $headers ))) {
2004-01-07 19:52:10 +00:00
list ( $header , $value ) = explode ( ':' , $line , 2 );
$result -> headers [ $header ] = trim ( $value );
}
$responses = array (
100 => 'Continue' , 101 => 'Switching Protocols' ,
200 => 'OK' , 201 => 'Created' , 202 => 'Accepted' , 203 => 'Non-Authoritative Information' , 204 => 'No Content' , 205 => 'Reset Content' , 206 => 'Partial Content' ,
300 => 'Multiple Choices' , 301 => 'Moved Permanently' , 302 => 'Found' , 303 => 'See Other' , 304 => 'Not Modified' , 305 => 'Use Proxy' , 307 => 'Temporary Redirect' ,
400 => 'Bad Request' , 401 => 'Unauthorized' , 402 => 'Payment Required' , 403 => 'Forbidden' , 404 => 'Not Found' , 405 => 'Method Not Allowed' , 406 => 'Not Acceptable' , 407 => 'Proxy Authentication Required' , 408 => 'Request Time-out' , 409 => 'Conflict' , 410 => 'Gone' , 411 => 'Length Required' , 412 => 'Precondition Failed' , 413 => 'Request Entity Too Large' , 414 => 'Request-URI Too Large' , 415 => 'Unsupported Media Type' , 416 => 'Requested range not satisfiable' , 417 => 'Expectation Failed' ,
500 => 'Internal Server Error' , 501 => 'Not Implemented' , 502 => 'Bad Gateway' , 503 => 'Service Unavailable' , 504 => 'Gateway Time-out' , 505 => 'HTTP Version not supported'
);
// RFC 2616 states that all unknown HTTP codes must be treated the same as
// the base code in their class:
if ( ! isset ( $responses [ $code ])) {
$code = floor ( $code / 100 ) * 100 ;
}
switch ( $code ) {
case 200 : // OK
case 304 : // Not modified
break ;
case 301 : // Moved permanently
case 302 : // Moved temporarily
case 307 : // Moved temporarily
$location = $result -> headers [ 'Location' ];
if ( $retry ) {
$result = drupal_http_request ( $result -> headers [ 'Location' ], $headers , $method , $data , -- $retry );
$result -> redirect_code = $result -> code ;
}
$result -> redirect_url = $location ;
break ;
default :
$result -> error = $text ;
}
$result -> code = $code ;
return $result ;
}
2004-01-06 19:52:14 +00:00
/* @} */
2003-12-16 21:06:34 +00:00
2001-12-01 15:20:48 +00:00
function error_handler ( $errno , $message , $filename , $line , $variables ) {
$types = array ( 1 => " error " , 2 => " warning " , 4 => " parse error " , 8 => " notice " , 16 => " core error " , 32 => " core warning " , 64 => " compile error " , 128 => " compile warning " , 256 => " user error " , 512 => " user warning " , 1024 => " user notice " );
$entry = $types [ $errno ] . " : $message in $filename on line $line . " ;
2003-04-21 12:36:09 +00:00
if ( $errno & E_ALL ^ E_NOTICE ) {
2004-06-02 19:01:40 +00:00
watchdog ( 'error' , t ( '%error: %message in %file on line %line.' , array ( '%error' => $types [ $errno ], '%message' => $message , '%file' => $filename , '%line' => $line )));
2003-12-13 14:59:55 +00:00
if ( error_reporting ()) {
print " <pre> $entry </pre> " ;
}
2001-12-01 15:20:48 +00:00
}
}
2003-12-13 14:59:55 +00:00
function _fix_gpc_magic ( & $item , $key ) {
if ( is_array ( $item )) {
2003-12-19 10:52:37 +00:00
array_walk ( $item , '_fix_gpc_magic' );
}
else {
2003-12-19 13:44:08 +00:00
$item = stripslashes ( $item );
2002-12-26 12:16:09 +00:00
}
}
2003-10-31 19:34:03 +00:00
function fix_gpc_magic () {
static $fixed = false ;
2003-12-19 10:52:37 +00:00
if ( ! $fixed && ini_get ( " magic_quotes_gpc " )) {
2003-12-13 14:59:55 +00:00
array_walk ( $_GET , '_fix_gpc_magic' );
array_walk ( $_POST , '_fix_gpc_magic' );
array_walk ( $_COOKIE , '_fix_gpc_magic' );
array_walk ( $_REQUEST , '_fix_gpc_magic' );
$fixed = true ;
}
2003-10-31 19:34:03 +00:00
}
2004-01-06 19:52:14 +00:00
/**
* @ name Conversion
* @ ingroup common
*
* Converts data structures to a different type .
* @ {
*/
2003-12-13 14:59:55 +00:00
function array2object ( $array ) {
if ( is_array ( $array )) {
foreach ( $array as $key => $value ) {
2001-12-30 16:16:38 +00:00
$object -> $key = $value ;
}
}
else {
2003-12-13 14:59:55 +00:00
$object = $array ;
2001-12-30 16:16:38 +00:00
}
return $object ;
}
2003-12-13 14:59:55 +00:00
function object2array ( $object ) {
if ( is_object ( $object )) {
foreach ( $object as $key => $value ) {
2001-12-30 16:16:38 +00:00
$array [ $key ] = $value ;
}
}
else {
2003-12-13 14:59:55 +00:00
$array = $object ;
2001-12-30 16:16:38 +00:00
}
return $array ;
}
2004-01-06 19:52:14 +00:00
/* @} */
2001-12-30 16:16:38 +00:00
2004-01-06 19:52:14 +00:00
/**
* @ name Messages
* @ ingroup common
*
* Frequently used messages .
* @ {
*/
2001-12-01 15:20:48 +00:00
function message_access () {
2002-12-11 20:21:04 +00:00
return t ( " You are not authorized to access this page. " );
2001-12-01 15:20:48 +00:00
}
function message_na () {
return t ( " n/a " );
}
2004-01-06 19:52:14 +00:00
/* @} */
2001-12-01 15:20:48 +00:00
2001-12-27 15:27:44 +00:00
function locale_init () {
global $languages , $user ;
2003-03-04 15:10:37 +00:00
if ( $user -> uid && $languages [ $user -> language ]) {
return $user -> language ;
}
else {
return key ( $languages );
}
2001-12-27 15:27:44 +00:00
}
2004-01-06 19:52:14 +00:00
/**
* @ ingroup common
*
* Translates strings to the current locale .
*
2004-01-11 20:31:26 +00:00
* When using t (), try to put entire sentences and strings in one t () call .
* This makes it easier for translators . We are unafraid of HTML markup within
* translation strings if necessary . The suggested syntax for a link embedded
* within a translation string is for example :
2004-01-06 19:52:14 +00:00
* @ code
* $msg = t ( " You must login below or \ <a href= \" %url \" \ >create a new
* account\ </ a\ > before viewing the next page . " , array( " % url "
* => url ( " user/register " )));
* @ endcode
2004-01-11 20:31:26 +00:00
* We suggest the same syntax for links to other sites . This makes it easy to
* change link URLs if needed ( which happens often ) without requiring updates
* to translations .
2004-01-06 19:52:14 +00:00
*
* @ param $string A string containing the english string to translate .
* @ param $args Array of values to replace in the string .
* @ return Translated string .
*/
2002-04-20 11:52:50 +00:00
function t ( $string , $args = 0 ) {
2001-12-27 15:27:44 +00:00
global $languages ;
2002-04-24 20:55:20 +00:00
2003-04-01 06:05:15 +00:00
$string = ( $languages && module_exist ( " locale " ) ? locale ( $string ) : $string );
2002-04-24 20:55:20 +00:00
2002-04-20 11:52:50 +00:00
if ( ! $args ) {
return $string ;
2002-04-22 09:05:36 +00:00
}
else {
2002-04-20 11:52:50 +00:00
return strtr ( $string , $args );
}
2001-12-27 15:27:44 +00:00
}
2003-06-12 17:24:06 +00:00
function drupal_specialchars ( $input , $quotes = ENT_NOQUOTES ) {
2003-06-19 17:26:27 +00:00
/*
** Note that we 'd like to go ' htmlspecialchars ( $input , $quotes , " utf-8 " ) '
** like the PHP manual tells us to , but we can 't because there' s a bug in
** PHP < 4.3 that makes it mess up multibyte charsets if we specify the
** charset . Change this later once we make PHP 4.3 a requirement .
*/
return htmlspecialchars ( $input , $quotes );
2003-06-05 18:09:39 +00:00
}
2004-01-06 19:52:14 +00:00
/**
* @ name Validation
* @ ingroup common
*
* Functions to validate user input .
2004-02-08 17:12:44 +00:00
* @ {
2004-01-06 19:52:14 +00:00
*/
2003-03-28 10:55:27 +00:00
/**
2003-12-08 06:32:19 +00:00
* Verify the syntax of the given e - mail address . Empty e - mail addresses are
* allowed . See RFC 2822 for details .
2003-03-28 10:55:27 +00:00
*
2004-01-06 19:52:14 +00:00
* @ param $mail A string containing an email address .
2004-01-07 19:52:10 +00:00
* @ return
2003-03-28 10:55:27 +00:00
*/
2003-04-13 13:42:51 +00:00
function valid_email_address ( $mail ) {
2003-03-28 10:55:27 +00:00
$user = '[a-zA-Z0-9_\-\.\+\^!#\$%&*+\/\=\?\`\|\{\}~\']+' ;
2004-05-24 18:09:28 +00:00
$domain = '(?:(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.?)+' ;
2003-03-28 10:55:27 +00:00
$ipv4 = '[0-9]{1,3}(\.[0-9]{1,3}){3}' ;
$ipv6 = '[0-9a-fA-F]{1,4}(\:[0-9a-fA-F]{1,4}){7}' ;
2003-12-13 14:59:55 +00:00
return preg_match ( " /^ $user @( $domain |( \ [( $ipv4 | $ipv6 ) \ ])) $ / " , $mail );
2003-03-28 10:55:27 +00:00
}
2003-07-16 20:14:26 +00:00
/**
* Verify the syntax of the given URL .
*
2004-04-12 08:27:57 +00:00
* @ param $url
* an URL
* @ param $absolute
* is the URL to be verified absolute , ie . of the form \ < scheme\ >:// \ < hostname\ >/... ?
* @ return
* valid syntax : TRUE ; FALSE otherwise
2003-07-16 20:14:26 +00:00
*/
2004-04-12 08:27:57 +00:00
function valid_url ( $url , $absolute = FALSE ) {
2004-03-21 10:28:10 +00:00
if ( $absolute ) {
2004-03-27 09:32:12 +00:00
return preg_match ( " /^(http|https|ftp): \ / \ /[a-z0-9 \ /:_ \ -_ \ . \ ?,~=#&]+ $ /i " , $url );
2004-03-21 10:28:10 +00:00
}
else {
2004-03-27 09:32:12 +00:00
return preg_match ( " /^[a-z0-9 \ /:_ \ -_ \ .,]+ $ /i " , $url );
2004-03-21 10:28:10 +00:00
}
2003-07-16 20:14:26 +00:00
}
2004-01-06 19:52:14 +00:00
function valid_input_data ( $data ) {
if ( is_array ( $data ) || is_object ( $data )) {
/*
** Form data can contain a number of nested arrays .
*/
foreach ( $data as $key => $value ) {
2004-01-17 23:19:02 +00:00
if ( ! valid_input_data ( $key ) || ! valid_input_data ( $value )) {
2004-01-06 19:52:14 +00:00
return 0 ;
}
}
}
else {
/*
** Detect evil input data .
*/
// check strings:
$match = preg_match ( " / \ Wjavascript \ s*:/i " , $data );
$match += preg_match ( " / \ Wexpression \ s* \ (/i " , $data );
$match += preg_match ( " / \ Walert \ s* \ (/i " , $data );
// check attributes:
$match += preg_match ( " / \ W(dynsrc|datasrc|data|lowsrc|on[a-z]+) \ s*=[^>]+?>/i " , $data );
// check tags:
$match += preg_match ( " /< \ s*(applet|script|object|style|embed|form|blink|meta|html|frame|iframe|layer|ilayer|head|frameset|xml)/i " , $data );
if ( $match ) {
2004-06-02 19:01:40 +00:00
watchdog ( 'warning' , t ( 'terminated request because of suspicious input data: %data' , array ( '%data' => drupal_specialchars ( $data ))));
2004-01-06 19:52:14 +00:00
return 0 ;
}
}
return 1 ;
}
/* @} */
/**
* @ defgroup search Search interface
* @ {
*/
2002-03-05 20:15:17 +00:00
/**
* Format a single result entry of a search query :
*
2003-12-08 06:32:19 +00:00
* @ param $item a single search result as returned by < i > module </ i > _search of
2003-11-24 22:46:03 +00:00
* type array ( " count " => ... , " link " => ... , " title " => ... , " user " => ... ,
2003-12-08 06:32:19 +00:00
* " date " => ... , " keywords " => ... )
* @ param $type module type of this item
2002-03-05 20:15:17 +00:00
*/
2001-12-27 15:27:44 +00:00
function search_item ( $item , $type ) {
2002-04-27 13:19:37 +00:00
/*
** Modules may implement the " search_item " hook in order to overwrite
** the default function to display search results .
*/
if ( module_hook ( $type , " search_item " )) {
$output = module_invoke ( $type , " search_item " , $item );
}
else {
2004-03-31 22:50:23 +00:00
$output = " <dt class= \" title \" ><a href= \" " . $item [ " link " ] . " \" > " . $item [ " title " ] . " </a></dt> " ;
$output .= " <dd class= \" small \" > " . t ( $type ) . ( $item [ " user " ] ? " - " . $item [ " user " ] : " " ) . " " . ( $item [ " date " ] ? " - " . format_date ( $item [ " date " ], " small " ) : " " ) . " </dd> " ;
2002-04-27 13:19:37 +00:00
}
2001-12-27 15:27:44 +00:00
return $output ;
}
2002-03-05 20:15:17 +00:00
/**
* Render a generic search form .
*
* " Generic " means " universal usable " - that is , usable not only from
2004-06-21 20:05:37 +00:00
* 'site.com/search' , but also as a simple search box ( without " Restrict search
2003-12-08 06:32:19 +00:00
* to " , help text, etc) from theme's header etc. This means: provide options to
* only conditionally render certain parts of this form .
2002-03-05 20:15:17 +00:00
*
2003-12-08 06:32:19 +00:00
* @ param $action Form action . Defaults to 'site.com/search' .
* @ param $keys string containing keywords for the search .
* @ param $options != 0 : Render additional form fields / text ( " Restrict search
* to " , help text, etc).
2002-03-05 20:15:17 +00:00
*/
2003-06-30 19:18:47 +00:00
function search_form ( $action = NULL , $keys = NULL , $options = NULL ) {
2004-01-02 12:15:37 +00:00
$edit = $_POST [ 'edit' ];
2001-12-27 15:27:44 +00:00
if ( ! $action ) {
2003-01-06 19:51:01 +00:00
$action = url ( " search " );
2001-12-27 15:27:44 +00:00
}
2004-03-31 22:50:23 +00:00
$output = " <div class= \" search-form \" ><br /><input type= \" text \" class= \" form-text \" size= \" 50 \" value= \" " . check_form ( $keys ) . " \" name= \" keys \" /> " ;
2003-10-15 15:12:50 +00:00
$output .= " <input type= \" submit \" class= \" form-submit \" value= \" " . t ( " Search " ) . " \" /> \n " ;
2001-12-27 15:27:44 +00:00
2003-12-13 14:59:55 +00:00
if ( $options ) {
2001-12-27 15:27:44 +00:00
$output .= " <br /> " ;
$output .= t ( " Restrict search to " ) . " : " ;
foreach ( module_list () as $name ) {
if ( module_hook ( $name , " search " )) {
2002-03-05 20:15:17 +00:00
$output .= " <input type= \" checkbox \" name= \" edit[type][ $name ] \" " . ( $edit [ " type " ][ $name ] ? " checked= \" checked \" " : " " ) . " /> " . t ( $name );
2001-12-27 15:27:44 +00:00
}
}
2004-03-31 22:50:23 +00:00
$output .= " </div> " ;
2001-12-27 15:27:44 +00:00
}
return form ( $output , " post " , $action );
}
/*
2002-03-05 20:15:17 +00:00
* Collect the search results :
*/
2003-06-25 22:10:54 +00:00
function search_data ( $keys = NULL ) {
2003-05-13 18:36:38 +00:00
$edit = $_POST [ " edit " ];
2004-04-12 08:27:57 +00:00
$output = '' ;
2001-12-27 15:27:44 +00:00
2003-01-09 20:06:00 +00:00
if ( isset ( $keys )) {
2001-12-27 15:27:44 +00:00
foreach ( module_list () as $name ) {
2004-02-01 19:07:36 +00:00
if ( module_hook ( $name , " search " ) && ( ! $edit [ " type " ] || $edit [ " type " ][ $name ])) {
list ( $title , $results ) = module_invoke ( $name , " search " , $keys );
if ( $results ) {
$output .= " <h2> $title </h2> " ;
2004-03-31 22:50:23 +00:00
$output .= " <dl class= \" search-results \" > " ;
2004-02-01 19:07:36 +00:00
foreach ( $results as $entry ) {
$output .= search_item ( $entry , $name );
}
2004-03-31 22:50:23 +00:00
$output .= " </dl> " ;
2001-12-27 15:27:44 +00:00
}
}
}
}
return $output ;
}
2002-03-05 20:15:17 +00:00
/**
* Display the search form and the resulting data .
*
2003-12-08 06:32:19 +00:00
* @ param $type If set , search only nodes of this type . Otherwise , search all
* types .
* @ param $action Form action . Defaults to 'site.com/search' .
* @ param $keys Query string . Defaults to global $keys .
* @ param $options != 0 : Render additional form fields / text ( " Restrict search
* to " , help text, etc).
2002-03-05 20:15:17 +00:00
*/
2003-06-30 19:18:47 +00:00
function search_type ( $type , $action = NULL , $keys = NULL , $options = NULL ) {
$_POST [ " edit " ][ " type " ][ $type ] = " on " ;
2001-12-27 15:27:44 +00:00
2003-06-25 22:10:54 +00:00
return search_form ( $action , $keys , $options ) . " <br /> " . search_data ( $keys );
2001-12-27 15:27:44 +00:00
}
2004-01-06 19:52:14 +00:00
/* @} */
2003-06-06 21:08:35 +00:00
2001-12-01 15:20:48 +00:00
function check_form ( $text ) {
2003-06-23 07:24:56 +00:00
return drupal_specialchars ( $text , ENT_QUOTES );
2001-12-01 15:20:48 +00:00
}
2003-10-07 10:22:33 +00:00
function check_file ( $filename ) {
return is_uploaded_file ( $filename );
2001-12-01 15:20:48 +00:00
}
2004-02-08 17:12:44 +00:00
/**
* @ name Formatting
* @ ingroup common
*
* Functions to format numbers , strings , dates , etc .
* @ {
*/
2002-04-27 13:19:37 +00:00
function format_rss_channel ( $title , $link , $description , $items , $language = " en " , $args = array ()) {
// arbitrary elements may be added using the $args associative array
2003-12-13 14:59:55 +00:00
$output = " <channel> \n " ;
2003-06-05 18:09:39 +00:00
$output .= " <title> " . drupal_specialchars ( strip_tags ( $title )) . " </title> \n " ;
$output .= " <link> " . drupal_specialchars ( strip_tags ( $link )) . " </link> \n " ;
2004-04-24 16:25:31 +00:00
$output .= " <description> " . drupal_specialchars ( strip_tags ( $description )) . " </description> \n " ;
2003-06-05 18:09:39 +00:00
$output .= " <language> " . drupal_specialchars ( strip_tags ( $language )) . " </language> \n " ;
2002-04-27 13:19:37 +00:00
foreach ( $args as $key => $value ) {
2003-09-10 19:30:34 +00:00
$output .= " < $key > " . drupal_specialchars ( strip_tags ( $value )) . " </ $key > \n " ;
2002-04-27 13:19:37 +00:00
}
2001-12-01 15:20:48 +00:00
$output .= $items ;
$output .= " </channel> \n " ;
return $output ;
}
2002-04-27 13:19:37 +00:00
function format_rss_item ( $title , $link , $description , $args = array ()) {
// arbitrary elements may be added using the $args associative array
2003-12-13 14:59:55 +00:00
$output = " <item> \n " ;
2003-06-05 18:09:39 +00:00
$output .= " <title> " . drupal_specialchars ( strip_tags ( $title )) . " </title> \n " ;
$output .= " <link> " . drupal_specialchars ( strip_tags ( $link )) . " </link> \n " ;
$output .= " <description> " . drupal_specialchars ( check_output ( $description )) . " </description> \n " ;
2002-04-27 13:19:37 +00:00
foreach ( $args as $key => $value ) {
2003-06-05 18:09:39 +00:00
$output .= " < $key > " . drupal_specialchars ( strip_tags ( $value )) . " </ $key > " ;
2002-04-27 13:19:37 +00:00
}
2001-12-01 15:20:48 +00:00
$output .= " </item> \n " ;
return $output ;
}
2003-01-21 22:44:25 +00:00
/**
* Formats a string with a count of items so that the string is pluralized
2003-12-08 06:32:19 +00:00
* correctly . format_plural calls t () by itself , make sure not to pass already
* localized strings to it .
2003-01-21 22:44:25 +00:00
*
2003-12-08 06:32:19 +00:00
* @ param $count The item count to display .
* @ param $singular The string for the singular case . Please make sure it ' s
* clear this is singular , to ease translation . ( " 1 new comment " instead of " 1
* new " ).
2004-01-06 19:52:14 +00:00
* @ param $plural The string for the plural case . Please make sure it ' s clear
2003-12-08 06:32:19 +00:00
* this is plural , to ease translation . Use % count in places of the item
* count , as in " %count new comments " .
2004-02-08 17:12:44 +00:00
* @ return Translated string
2003-01-21 22:44:25 +00:00
*/
2001-12-01 15:20:48 +00:00
function format_plural ( $count , $singular , $plural ) {
2003-01-21 22:44:25 +00:00
return t ( $count == 1 ? $singular : $plural , array ( " %count " => $count ));
2001-12-01 15:20:48 +00:00
}
2004-02-08 17:12:44 +00:00
/**
* Generates a string representation for the given byte count .
*
* @ param $size The size in bytes
* @ return Translated string representation of the size
*/
2001-12-01 15:20:48 +00:00
function format_size ( $size ) {
2002-07-05 18:28:02 +00:00
$suffix = t ( " bytes " );
2001-12-01 15:20:48 +00:00
if ( $size > 1024 ) {
$size = round ( $size / 1024 , 2 );
2002-07-05 18:28:02 +00:00
$suffix = t ( " KB " );
2001-12-01 15:20:48 +00:00
}
if ( $size > 1024 ) {
$size = round ( $size / 1024 , 2 );
2002-07-05 18:28:02 +00:00
$suffix = t ( " MB " );
2001-12-01 15:20:48 +00:00
}
2002-07-05 18:28:02 +00:00
return t ( " %size %suffix " , array ( " %size " => $size , " %suffix " => $suffix ));
2001-12-01 15:20:48 +00:00
}
2004-02-08 17:12:44 +00:00
/**
* Formats a time interval with the requested granularity .
*
* @ param $timestamp The length of the interval in seconds
* @ param $granularity How much units to consider when generating the string
* @ return Translated string representation of the interval
*/
2004-01-21 06:40:57 +00:00
function format_interval ( $timestamp , $granularity = 2 ) {
2003-01-21 22:44:25 +00:00
$units = array ( " 1 year|%count years " => 31536000 , " 1 week|%count weeks " => 604800 , " 1 day|%count days " => 86400 , " 1 hour|%count hours " => 3600 , " 1 min|%count min " => 60 , " 1 sec|%count sec " => 1 );
2004-04-12 08:27:57 +00:00
$output = '' ;
2003-12-24 12:40:28 +00:00
foreach ( $units as $key => $value ) {
2001-12-01 15:20:48 +00:00
$key = explode ( " | " , $key );
if ( $timestamp >= $value ) {
$output .= ( $output ? " " : " " ) . format_plural ( floor ( $timestamp / $value ), $key [ 0 ], $key [ 1 ]);
$timestamp %= $value ;
2004-01-21 06:40:57 +00:00
$granularity -- ;
}
if ( $granularity == 0 ) {
break ;
2001-12-01 15:20:48 +00:00
}
}
2004-04-12 08:27:57 +00:00
return $output ? $output : t ( " 0 sec " );
2001-12-01 15:20:48 +00:00
}
2004-02-08 17:12:44 +00:00
/**
* Formats a date with the given configured format or a custom format string .
* Drupal allows administrators to select formatting strings for 'small' ,
* 'medium' and 'large' date formats . This function can handle these formats ,
* as well as any custom format .
*
* @ param $timestamp The exact date to format
* @ param $type Could be 'small' , 'medium' or 'large' for the preconfigured
* date formats . If 'custom' is specified , the next parameter
* should contain the format string
* @ param $format Format string ( as required by the PHP date () function ) .
* Only required if 'custom' date format is requested .
2004-02-08 21:42:59 +00:00
* @ param $timezone Timezone offset in seconds in case the user timezone
* should not be used .
2004-02-08 17:12:44 +00:00
* @ return Translated date string in the requested format
*/
2004-02-08 21:42:59 +00:00
function format_date ( $timestamp , $type = 'medium' , $format = '' , $timezone = NULL ) {
if ( $timezone === NULL ) {
global $user ;
$timezone = $user -> uid ? $user -> timezone : variable_get ( 'date_default_timezone' , 0 );
}
2001-12-01 15:20:48 +00:00
2004-02-08 21:42:59 +00:00
$timestamp += $timezone ;
2001-12-01 15:20:48 +00:00
switch ( $type ) {
2004-02-08 21:42:59 +00:00
case 'small' :
$format = variable_get ( 'date_format_short' , 'm/d/Y - H:i' );
2001-12-01 15:20:48 +00:00
break ;
2004-02-08 21:42:59 +00:00
case 'large' :
$format = variable_get ( 'date_format_long' , 'l, F j, Y - H:i' );
2001-12-01 15:20:48 +00:00
break ;
2004-02-08 21:42:59 +00:00
case 'custom' :
2003-09-29 18:20:38 +00:00
// No change to format
2001-12-01 15:20:48 +00:00
break ;
2004-02-08 21:42:59 +00:00
case 'medium' :
2001-12-01 15:20:48 +00:00
default :
2004-02-08 21:42:59 +00:00
$format = variable_get ( 'date_format_medium' , 'D, m/d/Y - H:i' );
2003-09-29 18:20:38 +00:00
}
2004-02-08 21:42:59 +00:00
$max = strlen ( $format );
2004-04-12 08:27:57 +00:00
$date = '' ;
2004-02-08 21:42:59 +00:00
for ( $i = 0 ; $i <= $max ; $c = $format { $i ++ }) {
if ( strpos ( 'AaDFlM' , $c )) {
2004-02-21 14:08:09 +00:00
$date .= t ( gmdate ( $c , $timestamp ));
2004-02-08 21:42:59 +00:00
}
else if ( strpos ( 'BdgGhHiIjLmnsStTUwWYyz' , $c )) {
$date .= gmdate ( $c , $timestamp );
}
else if ( $c == 'r' ) {
$date .= format_date ( $timestamp - $timezone , 'custom' , 'D, d M Y H:i:s O' , $timezone );
2003-09-29 18:20:38 +00:00
}
2004-02-08 21:42:59 +00:00
else if ( $c == 'O' ) {
$date .= sprintf ( '%s%02d%02d' , ( $timezone < 0 ? '-' : '+' ), abs ( $timezone / 3600 ), abs ( $timezone % 3600 ) / 60 );
}
else if ( $c == 'Z' ) {
$date .= $timezone ;
2003-09-29 18:20:38 +00:00
}
else {
2004-02-08 21:42:59 +00:00
$date .= $c ;
2003-09-29 18:20:38 +00:00
}
2001-12-01 15:20:48 +00:00
}
2004-02-08 21:42:59 +00:00
2001-12-01 15:20:48 +00:00
return $date ;
}
2004-02-08 17:12:44 +00:00
/**
* Formats a username .
*
* @ param $object User object
* @ return String containing a HTML link to the user ' s page if the
* passed object suggests that this is a site user . Otherwise
* only the user name is returned .
*/
2001-12-01 15:20:48 +00:00
function format_name ( $object ) {
if ( $object -> uid && $object -> name ) {
2003-08-22 21:35:25 +00:00
/*
** Shorten the name when it is too long or it will break many
** tables .
*/
if ( strlen ( $object -> name ) > 20 ) {
2004-04-15 14:07:08 +00:00
$name = truncate_utf8 ( $object -> name , 15 ) . " ... " ;
2003-08-22 21:35:25 +00:00
}
else {
$name = $object -> name ;
}
2004-06-18 15:04:37 +00:00
$output = l ( $name , " user/ $object->uid " , array ( " title " => t ( " View user profile. " )));
2001-12-01 15:20:48 +00:00
}
2003-02-02 10:13:13 +00:00
else if ( $object -> name ) {
/*
** Sometimes modules display content composed by people who are
** not registers members of the site ( i . e . mailing list or news
** aggregator modules ) . This clause enables modules to display
** the true author of the content .
*/
2004-05-18 18:41:46 +00:00
if ( $object -> homepage ) {
$output = " <a href= \" $object->homepage\ " > $object -> name </ a > " ;
}
else {
$output = $object -> name ;
}
$output .= ' (' . t ( 'not verified' ) . ')' ;
2003-02-02 10:13:13 +00:00
}
2001-12-01 15:20:48 +00:00
else {
2003-04-21 12:36:09 +00:00
$output = t ( variable_get ( " anonymous " , " Anonymous " ));
2001-12-01 15:20:48 +00:00
}
2001-12-05 18:54:14 +00:00
return $output ;
2001-12-01 15:20:48 +00:00
}
2004-02-08 17:12:44 +00:00
/* @} */
2001-12-01 15:20:48 +00:00
2004-01-06 19:52:14 +00:00
/**
* @ defgroup from Form generation
* @ {
*/
2004-03-11 05:28:51 +00:00
function form ( $form , $method = " post " , $action = NULL , $attributes = NULL ) {
2003-05-19 18:26:49 +00:00
if ( ! $action ) {
2003-06-03 18:04:47 +00:00
$action = request_uri ();
2003-05-19 18:26:49 +00:00
}
2004-03-11 05:28:51 +00:00
return " <form action= \" $action\ " method = \ " $method\ " " . drupal_attributes( $attributes ) . " > \n $form\n </ form > \n " ;
2001-12-01 15:20:48 +00:00
}
2004-05-31 09:40:56 +00:00
/**
* File an error against the form with the specified name .
*/
function form_set_error ( $name , $message ) {
$GLOBALS [ 'form' ][ $name ] = $message ;
drupal_set_message ( $message , 'error' );
}
/**
* Return true when errors have been set .
*/
function form_has_errors () {
return isset ( $GLOBALS [ 'form' ]);
}
/**
* Return the error message filed against the form with the specified name .
*/
function _form_get_error ( $name ) {
return $GLOBALS [ 'form' ][ $name ];
}
function _form_get_class ( $name , $required , $error ) {
return $name . ( $required ? ' required' : '' ) . ( $error ? ' error' : '' );
}
function form_item ( $title , $value , $description = NULL , $id = NULL , $required = FALSE , $error = FALSE ) {
return theme ( " form_element " , $title , $value , $description , $id , $required , $error );
2001-12-01 15:20:48 +00:00
}
2003-11-17 19:16:55 +00:00
2003-12-22 14:45:00 +00:00
function form_group ( $legend , $group , $description = NULL ) {
2003-11-06 18:27:58 +00:00
return " <fieldset> " . ( $legend ? " <legend> $legend </legend> " : " " ) . $group . ( $description ? " <div class= \" description \" > $description </div> " : " " ) . " </fieldset> \n " ;
}
2001-12-01 15:20:48 +00:00
2004-04-24 15:39:31 +00:00
function form_radio ( $title , $name , $value = 1 , $checked = 0 , $description = NULL , $attributes = NULL , $required = FALSE ) {
2004-05-31 09:40:56 +00:00
$element = " <input type= \" radio \" class= \" " . _form_get_class ( 'form-radio' , $required , _form_get_error ( $name )) . " \" name= \" edit[ $name ] \" value= \" $value\ " " . ( $checked ? " checked = \ " checked \" " : " " ) . drupal_attributes ( $attributes ) . ' />' ;
2004-02-24 20:22:45 +00:00
if ( ! is_null ( $title )) {
$element = " <label class= \" option \" > $element $title </label> " ;
}
2004-05-31 09:40:56 +00:00
return theme ( 'form_element' , NULL , $element , $description , $required , _form_get_error ( $name ));
2003-12-24 12:40:28 +00:00
}
2004-06-04 18:10:05 +00:00
function form_radios ( $title , $name , $value , $options , $description = NULL , $required = FALSE , $attributes = NULL ) {
2003-12-24 12:40:28 +00:00
if ( count ( $options ) > 0 ) {
2004-04-12 08:27:57 +00:00
$choices = '' ;
2003-12-24 12:40:28 +00:00
foreach ( $options as $key => $choice ) {
2004-06-04 18:10:05 +00:00
$choices .= " <label class= \" option \" ><input type= \" radio \" class= \" form-radio \" name= \" edit[ $name ] \" value= \" $key\ " " . ( $key == $value ? " checked = \ " checked \" " : " " ) . drupal_attributes ( $attributes ) . " /> $choice </label><br /> " ;
2003-12-24 12:40:28 +00:00
}
2004-05-31 09:40:56 +00:00
return theme ( 'form_element' , $title , $choices , $description , $required , _form_get_error ( $name ));
2003-12-24 12:40:28 +00:00
}
2003-04-13 13:42:51 +00:00
}
2004-04-24 15:39:31 +00:00
function form_checkbox ( $title , $name , $value = 1 , $checked = 0 , $description = NULL , $attributes = NULL , $required = FALSE ) {
2004-05-31 09:40:56 +00:00
$element = " <input type= \" checkbox \" class= \" " . _form_get_class ( 'form-checkbox' , $required , _form_get_error ( $name )) . " \" name= \" edit[ $name ] \" id= \" edit- $name\ " value = \ " " . $value . " \" " . ( $checked ? " checked= \" checked \" " : " " ) . drupal_attributes ( $attributes ) . ' />' ;
2004-02-24 20:22:45 +00:00
if ( ! is_null ( $title )) {
$element = " <label class= \" option \" > $element $title </label> " ;
}
2004-05-31 09:40:56 +00:00
return form_hidden ( $name , 0 ) . theme ( 'form_element' , NULL , $element , $description , $required , _form_get_error ( $name ));
2001-12-01 15:20:48 +00:00
}
2004-06-04 18:10:05 +00:00
function form_checkboxes ( $title , $name , $values , $options , $description = NULL , $required = FALSE , $attributes = NULL ) {
2004-05-15 15:42:47 +00:00
if ( count ( $options ) > 0 ) {
if ( ! isset ( $values )) {
$values = array ();
}
$choices = '' ;
foreach ( $options as $key => $choice ) {
2004-06-04 18:10:05 +00:00
$choices .= " <label class= \" option \" ><input type= \" checkbox \" class= \" form-checkbox \" name= \" edit[ $name ][] \" value= \" $key\ " " . (in_array( $key , $values ) ? " checked = \ " checked \" " : " " ) . drupal_attributes ( $attributes ) . " /> $choice </label><br /> " ;
2004-05-15 15:42:47 +00:00
}
2004-05-31 09:40:56 +00:00
return theme ( 'form_element' , $title , $choices , $description , $required , _form_get_error ( $name ));
2004-05-15 15:42:47 +00:00
}
}
2004-04-24 15:39:31 +00:00
function form_textfield ( $title , $name , $value , $size , $maxlength , $description = NULL , $attributes = NULL , $required = FALSE ) {
2003-06-05 18:09:39 +00:00
$size = $size ? " size= \" $size\ " " : " " ;
2004-05-31 09:40:56 +00:00
return theme ( " form_element " , $title , " <input type= \" text \" maxlength= \" $maxlength\ " class = \ " " . _form_get_class ( 'form-text' , $required , _form_get_error ( $name )) . " \" name= \" edit[ $name ] \" id= \" $name\ " $size value = \ " " . check_form ( $value ) . " \" " . drupal_attributes ( $attributes ) . " /> " , $description , $name , $required , _form_get_error ( $name ));
2001-12-01 15:20:48 +00:00
}
2004-04-24 15:39:31 +00:00
function form_password ( $title , $name , $value , $size , $maxlength , $description = NULL , $attributes = NULL , $required = FALSE ) {
2003-06-05 18:09:39 +00:00
$size = $size ? " size= \" $size\ " " : " " ;
2004-05-31 09:40:56 +00:00
return theme ( " form_element " , $title , " <input type= \" password \" class= \" " . _form_get_class ( 'form-password' , $required , _form_get_error ( $name )) . " \" maxlength= \" $maxlength\ " name = \ " edit[ $name ] \" id= \" $name\ " $size value = \ " " . check_form ( $value ) . " \" " . drupal_attributes ( $attributes ) . " /> " , $description , $name , $required , _form_get_error ( $name ));
2001-12-01 15:20:48 +00:00
}
2004-04-24 15:39:31 +00:00
function form_textarea ( $title , $name , $value , $cols , $rows , $description = NULL , $attributes = NULL , $required = FALSE ) {
2003-06-05 18:09:39 +00:00
$cols = $cols ? " cols= \" $cols\ " " : " " ;
2003-04-23 18:58:43 +00:00
module_invoke_all ( " textarea " , $name ); // eg. optionally plug in a WYSIWYG editor
2004-05-31 09:40:56 +00:00
return theme ( " form_element " , $title , " <textarea wrap= \" virtual \" $cols rows= \" $rows\ " name = \ " edit[ $name ] \" id= \" $name\ " " . drupal_attributes( $attributes ) . " > " . check_form( $value ) . " </ textarea > " , $description , $name , $required , _form_get_error( $name ));
2001-12-01 15:20:48 +00:00
}
2004-05-05 15:58:26 +00:00
/**
* Outputs a form select item .
*
* @ param $options Array containing the options to choose from . The basic format
* is " value " => " label " . If you want to group options together
* ( with < optgroup > tags ), the format becomes " group name " =>
* $options , where $options is an array of " value " => " label "
* pairs .
*
* Examples :
* @ verbatim $flavor = array ( 1 => " Vanilla " , 2 => " Chocolate " , 3 => " Strawberry " ); @ endverbatim
* @ verbatim $order = array ( " Food " => array ( 1 => " Ice cream " , 2 => " Hamburger " ), " Drink " => array ( 1 => " Cola " , 2 => " Water " )); @ endverbatim
*/
2004-04-24 15:39:31 +00:00
function form_select ( $title , $name , $value , $options , $description = NULL , $extra = 0 , $multiple = 0 , $required = FALSE ) {
2004-04-12 08:27:57 +00:00
$select = '' ;
2003-12-24 12:40:28 +00:00
foreach ( $options as $key => $choice ) {
2004-05-05 15:58:26 +00:00
if ( is_array ( $choice )) {
$select .= " <optgroup label= \" $key\ " > " ;
foreach ( $choice as $key => $choice ) {
$select .= " <option value= \" $key\ " " . (is_array( $value ) ? (in_array( $key , $value ) ? " selected = \ " selected \" " : " " ) : ( $value == $key ? " selected= \" selected \" " : " " )) . " > " . check_form ( $choice ) . " </option> " ;
}
$select .= " </optgroup> " ;
}
else {
$select .= " <option value= \" $key\ " " . (is_array( $value ) ? (in_array( $key , $value ) ? " selected = \ " selected \" " : " " ) : ( $value == $key ? " selected= \" selected \" " : " " )) . " > " . check_form ( $choice ) . " </option> " ;
}
2003-06-05 18:09:39 +00:00
}
2004-05-31 09:40:56 +00:00
return theme ( " form_element " , $title , " <select name= \" edit[ $name ] " . ( $multiple ? " [] " : " " ) . " \" " . ( $multiple ? " multiple= \" multiple \" " : " " ) . ( $extra ? " $extra " : " " ) . " id= \" $name\ " > $select </ select > " , $description , $name , $required , _form_get_error( $name ));
2003-06-05 18:09:39 +00:00
}
2004-04-24 15:39:31 +00:00
function form_file ( $title , $name , $size , $description = NULL , $required = FALSE ) {
2004-05-31 09:40:56 +00:00
return theme ( " form_element " , $title , " <input type= \" file \" class= \" " . _form_get_class ( 'form-file' , $required , _form_get_error ( $name )) . " \" name= \" edit[ $name ] \" id= \" $name\ " size = \ " $size\ " /> \n " , $description , $name , $required , _form_get_error( $error ));
2001-12-01 15:20:48 +00:00
}
function form_hidden ( $name , $value ) {
return " <input type= \" hidden \" name= \" edit[ $name ] \" value= \" " . check_form ( $value ) . " \" /> \n " ;
}
2003-12-22 14:45:00 +00:00
function form_button ( $value , $name = " op " , $type = " submit " , $attributes = NULL ) {
2003-12-15 19:58:53 +00:00
return " <input type= \" $type\ " class = \ " form- $type\ " name = \ " $name\ " value = \ " " . check_form ( $value ) . " \" " . drupal_attributes ( $attributes ) . " /> \n " ;
}
2003-12-22 14:45:00 +00:00
function form_submit ( $value , $name = " op " , $attributes = NULL ) {
2003-12-15 19:58:53 +00:00
return form_button ( $value , $name , " submit " , $attributes );
2001-12-01 15:20:48 +00:00
}
2003-12-22 14:45:00 +00:00
function form_weight ( $title = NULL , $name = " weight " , $value = 0 , $delta = 10 , $description = NULL , $extra = 0 ) {
2003-04-03 22:18:27 +00:00
for ( $n = ( - 1 * $delta ); $n <= $delta ; $n ++ ) {
2002-10-26 15:17:26 +00:00
$weights [ $n ] = $n ;
}
return form_select ( $title , $name , $value , $weights , $description , $extra );
}
2004-01-06 19:52:14 +00:00
/* @} */
2003-06-19 17:26:27 +00:00
2004-02-11 19:21:14 +00:00
function url ( $url = NULL , $query = NULL , $fragment = NULL , $absolute = NULL ) {
2004-01-14 22:41:15 +00:00
global $base_url ;
2004-01-17 23:19:02 +00:00
2003-05-31 13:05:06 +00:00
static $script ;
if ( empty ( $script )) {
/*
** On some webservers such as IIS we can ' t omit " index.php " . As such we
** generate " index.php?q=foo " instead of " ?q=foo " on anything that is not
** Apache .
*/
$script = ( strpos ( $_SERVER [ " SERVER_SOFTWARE " ], " Apache " ) === false ) ? " index.php " : " " ;
}
2004-06-01 21:58:46 +00:00
$url = drupal_get_path_alias ( $url );
2003-09-30 17:01:34 +00:00
2003-12-29 19:10:26 +00:00
if ( isset ( $fragment )) {
$fragment = " # $fragment " ;
}
2004-02-11 19:21:14 +00:00
$base = ( $absolute ? $base_url . '/' : '' );
2003-02-15 17:15:48 +00:00
if ( variable_get ( " clean_url " , " 0 " ) == " 0 " ) {
2003-02-14 19:52:45 +00:00
if ( isset ( $url )) {
if ( isset ( $query )) {
2004-02-11 19:21:14 +00:00
return " $base $script ?q= $url & $query $fragment " ;
2003-02-14 19:52:45 +00:00
}
else {
2004-02-11 19:21:14 +00:00
return " $base $script ?q= $url $fragment " ;
2003-02-14 19:52:45 +00:00
}
2003-01-06 21:24:21 +00:00
}
else {
2003-02-14 19:52:45 +00:00
if ( isset ( $query )) {
2004-02-11 19:21:14 +00:00
return " $base $script ? $query $fragment " ;
2003-02-14 19:52:45 +00:00
}
else {
2004-02-11 19:21:14 +00:00
return " $base $fragment " ;
2003-02-14 19:52:45 +00:00
}
2003-01-06 21:24:21 +00:00
}
}
else {
2003-02-14 19:52:45 +00:00
if ( isset ( $url )) {
if ( isset ( $query )) {
2004-02-11 19:21:14 +00:00
return " $base $url ? $query $fragment " ;
2003-02-14 19:52:45 +00:00
}
else {
2004-02-11 19:21:14 +00:00
return " $base $url $fragment " ;
2003-02-14 19:52:45 +00:00
}
2003-01-06 21:24:21 +00:00
}
2003-01-11 10:46:11 +00:00
else {
2003-02-14 19:52:45 +00:00
if ( isset ( $query )) {
2004-02-11 19:21:14 +00:00
return " $base $script ? $query $fragment " ;
2003-02-14 19:52:45 +00:00
}
else {
2004-02-11 19:21:14 +00:00
return " $base $fragment " ;
2003-02-14 19:52:45 +00:00
}
2003-01-11 10:46:11 +00:00
}
2003-01-06 21:24:21 +00:00
}
2002-04-20 11:52:50 +00:00
}
2004-03-10 19:32:37 +00:00
function drupal_attributes ( $attributes = array ()) {
if ( count ( $attributes )) {
2003-08-12 20:37:16 +00:00
$t = array ();
foreach ( $attributes as $key => $value ) {
$t [] = " $key = \" $value\ " " ;
}
2004-03-10 19:32:37 +00:00
2003-08-12 20:37:16 +00:00
return " " . implode ( $t , " " );
2002-04-27 13:19:37 +00:00
}
2003-08-12 20:37:16 +00:00
}
2003-01-06 19:51:01 +00:00
2004-02-11 19:21:14 +00:00
function l ( $text , $url , $attributes = array (), $query = NULL , $fragment = NULL , $absolute = NULL ) {
2004-05-28 20:05:15 +00:00
if ( drupal_get_normal_path ( $url ) == $_GET [ 'q' ]) {
2004-01-19 21:57:42 +00:00
if ( isset ( $attributes [ 'class' ])) {
$attributes [ 'class' ] .= ' active' ;
}
else {
$attributes [ 'class' ] = 'active' ;
}
}
2004-02-11 19:21:14 +00:00
return " <a href= \" " . url ( $url , $query , $fragment , $absolute ) . " \" " . drupal_attributes ( $attributes ) . " > $text </a> " ;
2002-04-20 11:52:50 +00:00
}
2001-12-01 15:20:48 +00:00
function field_get ( $string , $name ) {
2004-01-23 15:31:29 +00:00
ereg ( " , $name =([^,]+) " , " , $string " , $regs );
2001-12-01 15:20:48 +00:00
return $regs [ 1 ];
}
function field_set ( $string , $name , $value ) {
$rval = ereg_replace ( " , $name =[^,]+ " , " " , " , $string " );
2003-01-09 20:06:00 +00:00
if ( isset ( $value )) {
2002-03-05 20:15:17 +00:00
$rval .= ( $rval == " , " ? " " : " , " ) . " $name = $value " ;
}
2001-12-01 15:20:48 +00:00
return substr ( $rval , 1 );
}
function link_page () {
2003-08-11 20:41:37 +00:00
global $custom_links ;
2002-04-14 20:46:41 +00:00
2003-09-05 13:19:00 +00:00
if ( is_array ( $custom_links )) {
2002-04-02 09:45:57 +00:00
return $custom_links ;
}
else {
2003-01-26 13:22:02 +00:00
$links = module_invoke_all ( " link " , " page " );
2003-08-11 20:41:37 +00:00
array_unshift ( $links , l ( t ( " home " ), " " , array ( " title " => t ( " Return to the main page. " ))));
2002-04-02 09:45:57 +00:00
return $links ;
2001-12-01 15:20:48 +00:00
}
2002-04-14 20:46:41 +00:00
}
2001-12-01 15:20:48 +00:00
function link_node ( $node , $main = 0 ) {
2003-01-26 13:22:02 +00:00
return module_invoke_all ( " link " , " node " , $node , $main );
2001-12-01 15:20:48 +00:00
}
2003-05-18 09:48:49 +00:00
function drupal_page_footer () {
2001-12-01 15:20:48 +00:00
if ( variable_get ( " cache " , 0 )) {
2002-01-05 16:28:34 +00:00
page_set_cache ();
2001-12-01 15:20:48 +00:00
}
2003-01-26 13:22:02 +00:00
2003-08-13 20:44:11 +00:00
/*
** A hook for modules where modules may take action at the end of a
** request good uses include setting a cache , page logging , etc .
*/
2003-01-26 13:22:02 +00:00
module_invoke_all ( " exit " );
2001-12-01 15:20:48 +00:00
}
2004-02-12 19:37:04 +00:00
/**
* Walks through the provided array and constructs an associative
* array out of it . The keys of the resulting array will be the
* values of the passed array . The values will either be the same
* ( if no function was specified ), or the results of the function
* given the value .
*
* @ param $array An array
* @ param $function A name of a function to apply to all values
*/
function drupal_map_assoc ( $array , $function = NULL ) {
if ( ! isset ( $function )) {
$result = array ();
foreach ( $array as $value ) {
$result [ $value ] = $value ;
}
return $result ;
}
elseif ( function_exists ( $function )) {
$result = array ();
foreach ( $array as $value ) {
$result [ $value ] = $function ( $value );
}
return $result ;
}
}
2004-01-06 12:09:42 +00:00
/**
* Wrapper around xml_parser_create () which extracts the encoding from the XML
* data first and sets the output encoding to UTF - 8. This function should be
* used instead of xml_parser_create (), because PHP 's XML parser doesn' t check
* the input encoding itself .
*
* This is also where unsupported encodings should be converted .
* Callers should take this into account : $data might have been changed after
* the call .
*
* @ param $data The XML data which will be parsed later .
*/
function drupal_xml_parser_create ( & $data ) {
$encoding = 'utf-8' ;
if ( ereg ( '^<\?xml[^>]+encoding="([^"]+)"' , $data , $match )) {
$encoding = $match [ 1 ];
}
/*
2004-02-17 23:36:22 +00:00
* Unsupported encodings are converted here into UTF - 8.
* Requires iconv , see http :// www . php . net / iconv
2004-01-06 12:09:42 +00:00
*/
2004-02-17 23:36:22 +00:00
$php_supported = array ( 'utf-8' , 'iso-8859-1' , 'us-ascii' );
if ( ! in_array ( strtolower ( $encoding ), $php_supported )) {
if ( function_exists ( 'iconv' )) {
$out = iconv ( $encoding , 'utf-8' , $data );
if ( $out !== false ) {
$data = $out ;
$encoding = 'utf-8' ;
}
}
}
2004-01-06 12:09:42 +00:00
$xml_parser = xml_parser_create ( $encoding );
xml_parser_set_option ( $xml_parser , XML_OPTION_TARGET_ENCODING , 'utf-8' );
return $xml_parser ;
}
2004-04-15 14:07:08 +00:00
/**
* UTF - 8 - safe string truncation
* If the end position is in the middle of a UTF - 8 sequence , it scans backwards
* until the beginning of the byte sequence .
*
* Use this function whenever you want to chop off a string at an unsure
* location . On the other hand , if you 're sure that you' re splitting on a
* character boundary ( e . g . after using strpos or similar ), you can safely use
* substr () instead .
*
* @ param $string The string to truncate
* @ param $len An upper limit on the returned string length .
*/
function truncate_utf8 ( $string , $len ) {
$slen = strlen ( $string );
if ( $slen <= $len ) {
return $string ;
}
if (( ord ( $string [ $len ]) < 0x80 ) || ( ord ( $string [ $len ]) >= 0xC0 )) {
return substr ( $string , 0 , $len );
}
while ( ord ( $string [ -- $len ]) < 0xC0 ) {};
return substr ( $string , 0 , $len );
}
2001-12-01 15:20:48 +00:00
include_once " includes/theme.inc " ;
2002-11-09 13:59:36 +00:00
include_once " includes/pager.inc " ;
2002-12-24 15:40:32 +00:00
include_once " includes/menu.inc " ;
2003-04-29 22:02:02 +00:00
include_once " includes/xmlrpc.inc " ;
2003-08-20 19:19:13 +00:00
include_once " includes/tablesort.inc " ;
2003-12-26 23:03:21 +00:00
include_once " includes/file.inc " ;
2003-02-12 16:21:48 +00:00
2003-03-04 06:19:01 +00:00
// set error handler:
set_error_handler ( " error_handler " );
2003-06-04 18:24:39 +00:00
// spit out the correct charset http header
2004-05-03 11:53:59 +00:00
drupal_set_header ( " Content-Type: text/html; charset=utf-8 " );
2003-06-04 18:24:39 +00:00
2003-09-30 17:01:34 +00:00
// initialize the _GET["q"] prior to loading the modules and invoking their 'init' hook:
if ( ! empty ( $_GET [ " q " ])) {
2003-12-12 19:44:57 +00:00
$_GET [ " q " ] = drupal_get_normal_path ( trim ( $_GET [ " q " ], " / " ));
2003-09-30 17:01:34 +00:00
}
else {
2003-12-12 19:44:57 +00:00
$_GET [ " q " ] = drupal_get_normal_path ( variable_get ( " site_frontpage " , " node " ));
2003-09-30 17:01:34 +00:00
}
2003-03-17 07:01:12 +00:00
// initialize installed modules:
module_init ();
2003-12-09 23:38:32 +00:00
if ( $_REQUEST && ! user_access ( " bypass input data check " )) {
2003-11-18 19:44:36 +00:00
if ( ! valid_input_data ( $_REQUEST )) {
die ( " terminated request because of suspicious input data " );
}
}
2001-12-01 15:20:48 +00:00
// initialize localization system:
$locale = locale_init ();
// initialize theme:
2003-11-09 23:27:22 +00:00
$theme = init_theme ();
2003-11-18 19:44:36 +00:00
2003-03-04 15:10:37 +00:00
?>