2007-07-22 20:21:02 +00:00
< ? php
// $Id$
/**
* @ file
2007-07-30 18:23:25 +00:00
* Administrative page callbacks for the path module .
2007-07-22 20:21:02 +00:00
*/
/**
* Return a listing of all defined URL aliases .
* When filter key passed , perform a standard search on the given key ,
* and return the list of matching URL aliases .
*/
function path_admin_overview ( $keys = NULL ) {
// Add the filter form above the overview table.
2009-07-29 06:39:35 +00:00
$build [ 'path_admin_filter_form' ] = drupal_get_form ( 'path_admin_filter_form' , $keys );
2007-07-22 20:21:02 +00:00
// Enable language column if locale is enabled or if we have any alias with language
2009-05-16 15:23:16 +00:00
$alias_exists = ( bool ) db_query_range ( 'SELECT 1 FROM {url_alias} WHERE language <> :language' , array ( ':language' => '' ), 0 , 1 ) -> fetchField ();
$multilanguage = ( module_exists ( 'locale' ) || $alias_exists );
2007-07-22 20:21:02 +00:00
$header = array (
array ( 'data' => t ( 'Alias' ), 'field' => 'dst' , 'sort' => 'asc' ),
array ( 'data' => t ( 'System' ), 'field' => 'src' ),
array ( 'data' => t ( 'Operations' ), 'colspan' => '2' )
);
if ( $multilanguage ) {
2008-10-09 20:20:49 +00:00
array_splice ( $header , 2 , 0 , array ( array ( 'data' => t ( 'Language' ), 'field' => 'language' )));
2007-07-22 20:21:02 +00:00
}
2009-05-10 16:50:19 +00:00
$query = db_select ( 'url_alias' ) -> extend ( 'PagerDefault' ) -> extend ( 'TableSort' );
if ( $keys ) {
// Replace wildcards with PDO wildcards.
$query -> condition ( 'dst' , '%' . preg_replace ( '!\*+!' , '%' , $keys ) . '%' , 'LIKE' );
}
$result = $query
-> fields ( 'url_alias' )
2009-05-22 11:33:18 +00:00
-> orderByHeader ( $header )
2009-05-10 16:50:19 +00:00
-> limit ( 50 )
-> execute ();
2007-07-22 20:21:02 +00:00
$rows = array ();
$destination = drupal_get_destination ();
2009-05-10 16:50:19 +00:00
foreach ( $result as $data ) {
2008-12-05 12:50:28 +00:00
$row = array (
'data' => array (
l ( $data -> dst , $data -> src ),
l ( $data -> src , $data -> src , array ( 'alias' => TRUE )),
2009-07-08 07:26:31 +00:00
l ( t ( 'edit' ), " admin/settings/path/edit/ $data->pid " , array ( 'query' => $destination )),
l ( t ( 'delete' ), " admin/settings/path/delete/ $data->pid " , array ( 'query' => $destination )),
2008-12-05 12:50:28 +00:00
),
);
2009-08-22 14:34:23 +00:00
// If the system path maps to a different URL alias, highlight this table
// row to let the user know of old aliases.
if ( $data -> dst != drupal_get_path_alias ( $data -> src , $data -> language )) {
$row [ 'class' ] = array ( 'warning' );
}
2007-07-22 20:21:02 +00:00
if ( $multilanguage ) {
2008-12-05 12:50:28 +00:00
array_splice ( $row [ 'data' ], 2 , 0 , module_invoke ( 'locale' , 'language_name' , $data -> language ));
2007-07-22 20:21:02 +00:00
}
$rows [] = $row ;
}
if ( empty ( $rows )) {
2009-07-08 07:26:31 +00:00
$empty_message = $keys ? t ( 'No URL aliases found.' ) : t ( 'No URL aliases available. <a href="@link">Add alias</a>.' , array ( '@link' => url ( 'admin/settings/path/add' ))) ;
2007-07-22 20:21:02 +00:00
$rows [] = array ( array ( 'data' => $empty_message , 'colspan' => ( $multilanguage ? 5 : 4 )));
}
2009-07-29 06:39:35 +00:00
$build [ 'path_table' ] = array (
'#theme' => 'table' ,
'#header' => $header ,
'#rows' => $rows
);
$build [ 'path_pager' ] = array ( '#theme' => 'pager' );
2007-07-22 20:21:02 +00:00
2009-07-29 06:39:35 +00:00
return $build ;
2007-07-22 20:21:02 +00:00
}
/**
* Menu callback ; handles pages for creating and editing URL aliases .
*/
2007-08-12 16:34:56 +00:00
function path_admin_edit ( $pid = 0 ) {
2007-07-22 20:21:02 +00:00
if ( $pid ) {
$alias = path_load ( $pid );
2008-10-13 00:33:05 +00:00
drupal_set_title ( $alias [ 'dst' ]);
2007-08-12 16:34:56 +00:00
$output = drupal_get_form ( 'path_admin_form' , $alias );
2007-07-22 20:21:02 +00:00
}
else {
2007-08-12 16:34:56 +00:00
$output = drupal_get_form ( 'path_admin_form' );
2007-07-22 20:21:02 +00:00
}
return $output ;
}
/**
* Return a form for editing or creating an individual URL alias .
*
* @ ingroup forms
2008-01-08 10:35:43 +00:00
* @ see path_admin_form_validate ()
* @ see path_admin_form_submit ()
2007-07-22 20:21:02 +00:00
*/
function path_admin_form ( & $form_state , $edit = array ( 'src' => '' , 'dst' => '' , 'language' => '' , 'pid' => NULL )) {
2007-08-12 16:34:56 +00:00
2007-07-22 20:21:02 +00:00
$form [ '#alias' ] = $edit ;
$form [ 'src' ] = array (
'#type' => 'textfield' ,
'#title' => t ( 'Existing system path' ),
'#default_value' => $edit [ 'src' ],
2009-06-11 04:59:26 +00:00
'#maxlength' => 255 ,
2007-07-22 20:21:02 +00:00
'#size' => 45 ,
'#description' => t ( 'Specify the existing path you wish to alias. For example: node/28, forum/1, taxonomy/term/1+2.' ),
2007-11-10 12:08:22 +00:00
'#field_prefix' => url ( NULL , array ( 'absolute' => TRUE )) . ( variable_get ( 'clean_url' , 0 ) ? '' : '?q=' ),
'#required' => TRUE ,
2007-07-22 20:21:02 +00:00
);
$form [ 'dst' ] = array (
'#type' => 'textfield' ,
'#title' => t ( 'Path alias' ),
'#default_value' => $edit [ 'dst' ],
2009-06-11 04:59:26 +00:00
'#maxlength' => 255 ,
2007-07-22 20:21:02 +00:00
'#size' => 45 ,
'#description' => t ( 'Specify an alternative path by which this data can be accessed. For example, type "about" when writing an about page. Use a relative path and don\'t add a trailing slash or the URL alias won\'t work.' ),
2007-11-10 12:08:22 +00:00
'#field_prefix' => url ( NULL , array ( 'absolute' => TRUE )) . ( variable_get ( 'clean_url' , 0 ) ? '' : '?q=' ),
'#required' => TRUE ,
2007-07-22 20:21:02 +00:00
);
// This will be a hidden value unless locale module is enabled
$form [ 'language' ] = array (
'#type' => 'value' ,
'#value' => $edit [ 'language' ]
);
if ( $edit [ 'pid' ]) {
$form [ 'pid' ] = array ( '#type' => 'hidden' , '#value' => $edit [ 'pid' ]);
$form [ 'submit' ] = array ( '#type' => 'submit' , '#value' => t ( 'Update alias' ));
}
else {
$form [ 'submit' ] = array ( '#type' => 'submit' , '#value' => t ( 'Create new alias' ));
}
return $form ;
}
/**
* Verify that a new URL alias is valid
*/
function path_admin_form_validate ( $form , & $form_state ) {
$src = $form_state [ 'values' ][ 'src' ];
$dst = $form_state [ 'values' ][ 'dst' ];
$pid = isset ( $form_state [ 'values' ][ 'pid' ]) ? $form_state [ 'values' ][ 'pid' ] : 0 ;
// Language is only set if locale module is enabled, otherwise save for all languages.
$language = isset ( $form_state [ 'values' ][ 'language' ]) ? $form_state [ 'values' ][ 'language' ] : '' ;
2009-05-10 16:50:19 +00:00
$has_alias = db_query ( " SELECT COUNT(dst) FROM { url_alias} WHERE pid <> :pid AND dst = :dst AND language = :language " , array (
':pid' => $pid ,
':dst' => $dst ,
':language' => $language ,
))
-> fetchField ();
if ( $has_alias ) {
2007-07-22 20:21:02 +00:00
form_set_error ( 'dst' , t ( 'The alias %alias is already in use in this language.' , array ( '%alias' => $dst )));
}
2007-11-10 12:08:22 +00:00
$item = menu_get_item ( $src );
2009-01-13 19:27:21 +00:00
if ( ! $item || ! $item [ 'access' ]) {
form_set_error ( 'src' , t ( " The path '@link_path' is either invalid or you do not have access to it. " , array ( '@link_path' => $src )));
2007-11-10 12:08:22 +00:00
}
2007-07-22 20:21:02 +00:00
}
/**
* Save a new URL alias to the database .
*/
function path_admin_form_submit ( $form , & $form_state ) {
// Language is only set if locale module is enabled
path_set_alias ( $form_state [ 'values' ][ 'src' ], $form_state [ 'values' ][ 'dst' ], isset ( $form_state [ 'values' ][ 'pid' ]) ? $form_state [ 'values' ][ 'pid' ] : 0 , isset ( $form_state [ 'values' ][ 'language' ]) ? $form_state [ 'values' ][ 'language' ] : '' );
drupal_set_message ( t ( 'The alias has been saved.' ));
2009-07-08 07:26:31 +00:00
$form_state [ 'redirect' ] = 'admin/settings/path' ;
2007-07-22 20:21:02 +00:00
return ;
}
/**
* Menu callback ; confirms deleting an URL alias
2007-12-28 12:02:52 +00:00
*/
2007-07-29 16:58:19 +00:00
function path_admin_delete_confirm ( $form_state , $pid ) {
2007-07-22 20:21:02 +00:00
$path = path_load ( $pid );
if ( user_access ( 'administer url aliases' )) {
$form [ 'pid' ] = array ( '#type' => 'value' , '#value' => $pid );
$output = confirm_form ( $form ,
t ( 'Are you sure you want to delete path alias %title?' , array ( '%title' => $path [ 'dst' ])),
2009-07-08 07:26:31 +00:00
isset ( $_GET [ 'destination' ]) ? $_GET [ 'destination' ] : 'admin/settings/path' );
2007-07-22 20:21:02 +00:00
}
return $output ;
}
/**
* Execute URL alias deletion
2007-12-28 12:02:52 +00:00
*/
2007-07-22 20:21:02 +00:00
function path_admin_delete_confirm_submit ( $form , & $form_state ) {
if ( $form_state [ 'values' ][ 'confirm' ]) {
path_admin_delete ( $form_state [ 'values' ][ 'pid' ]);
2009-07-08 07:26:31 +00:00
$form_state [ 'redirect' ] = 'admin/settings/path' ;
2007-07-22 20:21:02 +00:00
return ;
}
}
/**
* Return a form to filter URL aliases .
*
* @ ingroup forms
2008-01-08 10:35:43 +00:00
* @ see path_admin_filter_form_submit ()
2007-07-22 20:21:02 +00:00
*/
function path_admin_filter_form ( & $form_state , $keys = '' ) {
2009-08-22 14:34:23 +00:00
$form [ '#attributes' ] = array ( 'class' => array ( 'search-form' ));
2007-07-22 20:21:02 +00:00
$form [ 'basic' ] = array ( '#type' => 'fieldset' ,
'#title' => t ( 'Filter aliases' )
);
$form [ 'basic' ][ 'inline' ] = array ( '#prefix' => '<div class="container-inline">' , '#suffix' => '</div>' );
$form [ 'basic' ][ 'inline' ][ 'filter' ] = array (
'#type' => 'textfield' ,
'#title' => '' ,
'#default_value' => $keys ,
2008-11-22 10:49:01 +00:00
'#maxlength' => 128 ,
2007-07-22 20:21:02 +00:00
'#size' => 25 ,
);
2007-11-10 12:08:22 +00:00
$form [ 'basic' ][ 'inline' ][ 'submit' ] = array (
'#type' => 'submit' ,
'#value' => t ( 'Filter' ),
'#submit' => array ( 'path_admin_filter_form_submit_filter' ),
);
if ( $keys ) {
$form [ 'basic' ][ 'inline' ][ 'reset' ] = array (
'#type' => 'submit' ,
'#value' => t ( 'Reset' ),
'#submit' => array ( 'path_admin_filter_form_submit_reset' ),
);
}
2007-07-22 20:21:02 +00:00
return $form ;
}
/**
2007-11-10 12:08:22 +00:00
* Process filter form submission when the Filter button is pressed .
2007-07-22 20:21:02 +00:00
*/
2007-11-10 12:08:22 +00:00
function path_admin_filter_form_submit_filter ( $form , & $form_state ) {
2009-07-08 07:26:31 +00:00
$form_state [ 'redirect' ] = 'admin/settings/path/list/' . trim ( $form_state [ 'values' ][ 'filter' ]);
2007-07-22 20:21:02 +00:00
}
2007-11-10 12:08:22 +00:00
/**
* Process filter form submission when the Reset button is pressed .
*/
function path_admin_filter_form_submit_reset ( $form , & $form_state ) {
2009-07-08 07:26:31 +00:00
$form_state [ 'redirect' ] = 'admin/settings/path/list' ;
2007-11-10 12:08:22 +00:00
}
2007-07-22 20:21:02 +00:00
/**
* Helper function for grabbing filter keys .
*/
function path_admin_filter_get_keys () {
// Extract keys as remainder of path
$path = explode ( '/' , $_GET [ 'q' ], 5 );
return count ( $path ) == 5 ? $path [ 4 ] : '' ;
}