2004-05-31 20:10:36 +00:00
< ? php
/*
$Id $
2009-10-27 18:47:12 +00:00
This code is part of LDAP Account Manager ( http :// www . ldap - account - manager . org / )
2013-01-19 13:18:52 +00:00
Copyright ( C ) 2003 - 2013 Roland Gruber
2004-05-31 20:10:36 +00:00
This program is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation ; either version 2 of the License , or
( at your option ) any later version .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
along with this program ; if not , write to the Free Software
Foundation , Inc . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307 USA
*/
/**
* This file includes functions to manage the list views .
*
* @ package lists
* @ author Roland Gruber
*/
2006-01-01 16:30:05 +00:00
/** Used to get type information. */
include_once ( " types.inc " );
/** Used to get PDF information. */
include_once ( " pdfstruct.inc " );
2006-01-03 22:02:03 +00:00
/** Used to create PDF files. */
include_once ( " pdf.inc " );
2006-01-01 16:30:05 +00:00
2005-01-23 17:54:13 +00:00
/**
2006-01-01 16:30:05 +00:00
* Generates the list view .
*
* @ package lists
* @ author Roland Gruber
2006-09-23 11:19:36 +00:00
*
2006-01-01 16:30:05 +00:00
*/
class lamList {
2006-09-23 11:19:36 +00:00
2006-01-01 16:30:05 +00:00
/** Account type */
2007-11-11 14:01:16 +00:00
protected $type ;
2006-09-23 11:19:36 +00:00
2006-01-01 16:30:05 +00:00
/** current page number */
2007-11-11 14:01:16 +00:00
protected $page = 1 ;
2006-09-23 11:19:36 +00:00
2006-01-01 16:30:05 +00:00
/** list of LDAP attributes */
2007-11-11 14:01:16 +00:00
protected $attrArray = array ();
2006-09-23 11:19:36 +00:00
2006-01-01 16:30:05 +00:00
/** list of attribute descriptions */
2007-11-11 14:01:16 +00:00
protected $descArray = array ();
2006-09-23 11:19:36 +00:00
2006-01-01 16:30:05 +00:00
/** maximum count of entries per page */
2007-12-09 10:45:04 +00:00
protected $maxPageEntries = 30 ;
2006-09-23 11:19:36 +00:00
2006-01-01 16:30:05 +00:00
/** sort column name */
2007-11-05 18:14:38 +00:00
protected $sortColumn ;
/** sort direction: 1 for ascending, -1 for descending */
protected $sortDirection = 1 ;
2006-09-23 11:19:36 +00:00
2006-01-01 16:30:05 +00:00
/** LDAP suffix */
2007-11-11 14:01:16 +00:00
protected $suffix ;
2006-09-23 11:19:36 +00:00
2006-01-01 16:30:05 +00:00
/** refresh page switch */
2007-11-11 14:01:16 +00:00
protected $refresh = true ;
2006-09-23 11:19:36 +00:00
2006-01-01 16:30:05 +00:00
/** LDAP entries */
2007-11-11 14:01:16 +00:00
protected $entries ;
2013-04-02 18:46:39 +00:00
/** sort mapping for entries array(original index => sorted index) */
protected $sortMapping ;
2006-09-23 11:19:36 +00:00
2013-02-19 17:36:46 +00:00
/** list of filters (attribute name => filter input) */
protected $filters = array ();
2006-09-23 11:19:36 +00:00
2006-01-01 16:30:05 +00:00
/** list of possible LDAP suffixes(organizational units) */
2007-11-11 14:01:16 +00:00
protected $possibleSuffixes ;
2006-09-23 11:19:36 +00:00
2006-01-01 16:30:05 +00:00
/** list of account specific labels */
2007-11-11 14:01:16 +00:00
protected $labels ;
/** configuration options */
private $configOptions ;
2012-09-09 14:02:27 +00:00
/** tabindex for GUI elements */
protected $tabindex = 1 ;
2006-09-23 11:19:36 +00:00
2007-12-09 10:45:04 +00:00
/** ID for list size config option */
const LIST_SIZE_OPTION_NAME = " L_SIZE " ;
2012-04-06 13:12:43 +00:00
/** prefix for virtual (non-LDAP) attributes */
const VIRTUAL_ATTRIBUTE_PREFIX = 'lam_virtual_' ;
2006-01-01 16:30:05 +00:00
/**
* Constructor
*
* @ param string $type account type
* @ return lamList list object
*/
2007-12-28 16:08:56 +00:00
public function __construct ( $type ) {
2006-01-01 16:30:05 +00:00
$this -> type = $type ;
$this -> labels = array (
2012-02-09 17:08:39 +00:00
'nav' => _ ( " Object count: %s " ),
2006-01-01 16:30:05 +00:00
'error_noneFound' => _ ( " No objects found! " ),
'newEntry' => _ ( " New object " ),
2012-02-05 19:03:25 +00:00
'deleteEntry' => _ ( " Delete selected objects " ));
2007-11-11 14:01:16 +00:00
$this -> configOptions = $this -> listGetAllConfigOptions ();
$this -> listReadOptionsFromCookie ();
}
/**
* Reads the list options from the cookie value .
*/
private function listReadOptionsFromCookie () {
if ( sizeof ( $this -> configOptions ) > 0 ) {
if ( isset ( $_COOKIE [ " ListOptions_ " . $this -> type ])) {
$cookieValue = $_COOKIE [ " ListOptions_ " . $this -> type ];
$valueParts = explode ( " ; " , $cookieValue );
$values = array ();
for ( $i = 0 ; $i < sizeof ( $valueParts ); $i ++ ) {
$key_value = explode ( '=' , $valueParts [ $i ]);
if ( sizeof ( $key_value ) == 2 ) {
$values [ $key_value [ 0 ]] = $key_value [ 1 ];
}
}
for ( $i = 0 ; $i < sizeof ( $this -> configOptions ); $i ++ ) {
if ( isset ( $values [ $this -> configOptions [ $i ] -> getID ()])) {
$this -> configOptions [ $i ] -> setValue ( $values [ $this -> configOptions [ $i ] -> getID ()]);
}
}
// notify subclasses
$this -> listConfigurationChanged ();
}
}
2006-01-01 16:30:05 +00:00
}
2006-09-23 11:19:36 +00:00
2006-01-01 16:30:05 +00:00
/**
* Prints the HTML code to display the list view .
*/
2007-11-11 14:01:16 +00:00
public function showPage () {
2012-09-09 14:02:27 +00:00
$this -> tabindex = 1 ;
2006-01-01 16:30:05 +00:00
// do POST actions
2010-11-06 09:40:32 +00:00
$postFragment = $this -> listDoPost ();
2006-01-01 16:30:05 +00:00
// get some parameters
$this -> listGetParams ();
// print HTML head
$this -> listPrintHeader ();
2010-11-26 20:16:14 +00:00
// print messages when redirected from other pages
$this -> listPrintRedirectMessages ();
2006-01-01 16:30:05 +00:00
// refresh data if needed
2010-02-13 19:05:33 +00:00
if ( $this -> refresh ) {
$this -> listBuildFilter ();
$this -> listRefreshData ();
}
2006-01-01 16:30:05 +00:00
// sort rows by sort column
2010-02-13 19:05:33 +00:00
if ( isset ( $this -> entries )) {
2013-04-02 18:46:39 +00:00
$this -> listCreateSortMapping ( $this -> entries );
2006-01-01 16:30:05 +00:00
}
2010-11-06 09:40:32 +00:00
// insert HTML fragment from listDoPost
echo $postFragment ;
2011-04-09 10:04:56 +00:00
// config dialog
$this -> listPrintConfigurationPage ();
2006-01-01 16:30:05 +00:00
// show form
2010-08-21 08:30:11 +00:00
echo " <div class= \" ui-tabs-panel ui-widget-content ui-corner-bottom \" > " ;
2010-08-23 18:01:06 +00:00
echo " <div id= \" listTabContentArea \" > \n " ;
2010-08-21 09:43:52 +00:00
echo ( " <form action= \" list.php?type= " . $this -> type . " &norefresh=true \" method= \" post \" > \n " );
2006-01-01 16:30:05 +00:00
// draw account list if accounts were found
2010-02-13 19:05:33 +00:00
if ( sizeof ( $this -> entries ) > 0 ) {
2007-02-11 18:06:42 +00:00
// buttons
$this -> listPrintButtons ( false );
2010-01-01 17:21:46 +00:00
echo ( " <br> \n " );
2006-01-01 16:30:05 +00:00
// navigation bar
2010-02-13 19:05:33 +00:00
$this -> listDrawNavigationBar ( sizeof ( $this -> entries ));
2006-01-01 16:30:05 +00:00
echo ( " <br> \n " );
2010-08-23 18:01:06 +00:00
echo " <div id= \" listScrollArea \" style= \" overflow: auto; padding: 1px; \" > " ;
2006-01-01 16:30:05 +00:00
// account table head
$this -> listPrintTableHeader ();
// account table body
2010-02-13 19:05:33 +00:00
$this -> listPrintTableBody ( $this -> entries );
2010-08-23 18:01:06 +00:00
echo " </div> " ;
2006-01-01 16:30:05 +00:00
}
else {
2007-02-11 18:06:42 +00:00
// buttons
$this -> listPrintButtons ( true );
2010-10-10 17:34:07 +00:00
echo ( " <br> \n " );
2007-11-06 17:42:37 +00:00
// navigation bar
2010-02-13 19:05:33 +00:00
$this -> listDrawNavigationBar ( sizeof ( $this -> entries ));
2007-11-06 17:42:37 +00:00
echo ( " <br> \n " );
2006-01-01 16:30:05 +00:00
// account table head
$this -> listPrintTableHeader ();
echo " </table><br> \n " ;
2005-01-23 17:54:13 +00:00
}
2007-11-11 14:01:16 +00:00
$this -> listPrintFooter ();
2005-01-23 17:54:13 +00:00
}
2006-01-01 16:30:05 +00:00
/**
* Builds the regular expressions from the filter values .
*/
2007-11-11 14:01:16 +00:00
protected function listBuildFilter () {
2013-02-19 17:36:46 +00:00
if ( isset ( $_GET [ 'accountEditBack' ])) {
return ;
}
2006-01-01 16:30:05 +00:00
$filter = array ();
2013-02-19 17:36:46 +00:00
$this -> filters = array ();
2013-01-14 17:10:03 +00:00
if ( ! isset ( $_POST [ 'clear_filter' ])) {
// build filter array
for ( $i = 0 ; $i < sizeof ( $this -> attrArray ); $i ++ ) {
$foundFilter = null ;
if ( isset ( $_GET [ " filter " . strtolower ( $this -> attrArray [ $i ])])) {
$foundFilter = $_GET [ " filter " . strtolower ( $this -> attrArray [ $i ])];
2010-04-07 19:23:11 +00:00
}
2013-01-14 17:10:03 +00:00
if ( isset ( $_POST [ " filter " . strtolower ( $this -> attrArray [ $i ])])) {
$foundFilter = $_POST [ " filter " . strtolower ( $this -> attrArray [ $i ])];
}
if ( isset ( $foundFilter ) && ( $foundFilter != '' )) {
if ( preg_match ( '/^([\p{L}\p{N} _\\*\\$\\.@-])+$/iu' , $foundFilter )) { // \p{L} matches any Unicode letter
2013-02-19 17:36:46 +00:00
$this -> filters [ strtolower ( $this -> attrArray [ $i ])] = $foundFilter ;
2013-01-14 17:10:03 +00:00
}
else {
StatusMessage ( 'ERROR' , _ ( 'Please enter a valid filter. Only letters, numbers and " _*$.@-" are allowed.' ), htmlspecialchars ( $foundFilter ));
}
2010-04-07 19:23:11 +00:00
}
2006-01-01 16:30:05 +00:00
}
}
}
2013-04-02 18:46:39 +00:00
2006-01-01 16:30:05 +00:00
/**
2013-04-02 18:46:39 +00:00
* Determines the sort mapping and stores it in $this -> sortMapping .
* The sort mapping is used to display the right rows when the account table is created .
2006-01-01 16:30:05 +00:00
*
* @ param array $info the account list
*/
2013-04-02 18:46:39 +00:00
protected function listCreateSortMapping ( & $info ) {
2011-05-21 10:58:22 +00:00
if ( ! is_array ( $this -> attrArray )) return ;
if ( ! is_string ( $this -> sortColumn )) return ;
2013-04-02 18:46:39 +00:00
$toSort = array ();
$col = $this -> sortColumn ;
$size = sizeof ( $info );
if ( $this -> sortColumn != 'dn' ) {
for ( $i = 0 ; $i < $size ; $i ++ ) {
// sort by first attribute with name $sort
$toSort [] = & $info [ $i ][ $col ][ 0 ];
}
2004-05-31 20:10:36 +00:00
}
else {
2013-04-02 18:46:39 +00:00
for ( $i = 0 ; $i < $size ; $i ++ ) {
$toSort [] = & $info [ $i ][ $col ];
}
2004-05-31 20:10:36 +00:00
}
2013-04-02 18:46:39 +00:00
natcasesort ( $toSort );
$sortResult = array ();
if ( $this -> sortDirection == 1 ) {
foreach ( $toSort as $orig => $val ) {
$sortResult [] = $orig ;
}
}
else {
$counter = sizeof ( $toSort );
foreach ( $toSort as $orig => $val ) {
$counter -- ;
$sortResult [ $counter ] = $orig ;
}
}
$this -> sortMapping = & $sortResult ;
2004-05-31 20:10:36 +00:00
}
2006-01-01 16:30:05 +00:00
/**
* Draws a navigation bar to switch between pages
*
* @ param integer $count number of account entries
*/
2007-11-11 14:01:16 +00:00
protected function listDrawNavigationBar ( $count ) {
2013-02-19 17:36:46 +00:00
$filter = $this -> getFilterAsTextForURL ();
2010-10-10 17:34:07 +00:00
echo ( " <table width= \" 100% \" border= \" 0 \" > \n " );
2006-01-01 16:30:05 +00:00
echo ( " <tr> \n " );
2010-10-10 17:34:07 +00:00
echo ( " <td align= \" left \" > " );
2006-01-01 16:30:05 +00:00
printf ( $this -> labels [ 'nav' ], $count );
echo ( " </td> " );
2006-09-23 11:19:36 +00:00
2010-12-19 13:25:01 +00:00
if ( $count > $this -> maxPageEntries ) {
2013-01-19 13:18:52 +00:00
echo ( " <td class= \" activepage \" align= \" right \" > " );
2010-12-19 13:25:01 +00:00
if ( $this -> page != 1 ) {
echo ( " <a title= \" " . _ ( 'Jump to first page' ) . " \" href= \" list.php?type= " . $this -> type . " &norefresh=true&page=1 " .
2013-02-19 17:36:46 +00:00
" &sort= " . $this -> sortColumn . " &sortdirection= " . $this -> sortDirection . $filter . " \" > " .
2011-04-03 10:29:23 +00:00
" <img height=16 width=16 class= \" align-middle \" alt= \" \" src= \" ../../graphics/go-first.png \" ></a> \n " );
2010-12-19 13:25:01 +00:00
}
if ( $this -> page > 10 ) {
echo ( " <a title= \" " . _ ( 'Jump 10 pages backward' ) . " \" href= \" list.php?type= " . $this -> type . " &norefresh=true&page= " . ( $this -> page - 10 ) .
2013-02-19 17:36:46 +00:00
" &sort= " . $this -> sortColumn . " &sortdirection= " . $this -> sortDirection . $filter . " \" > " .
2011-04-03 10:29:23 +00:00
" <img height=16 width=16 class= \" align-middle \" alt= \" \" src= \" ../../graphics/go-previous.png \" ></a> \n " );
2010-07-30 16:08:20 +00:00
}
2012-07-22 17:32:23 +00:00
for ( $i = $this -> page - 6 ; $i < ( $this -> page + 5 ); $i ++ ) {
2010-12-19 13:25:01 +00:00
if ( $i >= ( $count / $this -> maxPageEntries )) {
break ;
}
elseif ( $i < 0 ) {
continue ;
}
if ( $i == $this -> page - 1 ) {
2012-03-10 14:15:31 +00:00
echo ' ' . ( $i + 1 ) . ' ' ;
2010-12-19 13:25:01 +00:00
}
else {
2012-03-10 14:15:31 +00:00
echo " <a href= \" list.php?type= " . $this -> type . " &norefresh=true&page= " . ( $i + 1 ) .
2013-02-19 17:36:46 +00:00
" &sort= " . $this -> sortColumn . " &sortdirection= " . $this -> sortDirection . $filter . " \" > " . ( $i + 1 ) . " </a> \n " ;
2010-12-19 13:25:01 +00:00
}
2010-07-30 16:08:20 +00:00
}
2010-12-19 13:25:01 +00:00
if ( $this -> page < (( $count / $this -> maxPageEntries ) - 10 )) {
echo ( " <a title= \" " . _ ( 'Jump 10 pages forward' ) . " \" href= \" list.php?type= " . $this -> type . " &norefresh=true&page= " . ( $this -> page + 10 ) .
2013-02-19 17:36:46 +00:00
" &sort= " . $this -> sortColumn . " &sortdirection= " . $this -> sortDirection . $filter . " \" > " .
2011-04-03 10:29:23 +00:00
" <img height=16 width=16 class= \" align-middle \" alt= \" \" src= \" ../../graphics/go-next.png \" ></a> \n " );
2006-01-01 16:30:05 +00:00
}
2010-12-19 13:25:01 +00:00
if ( $this -> page < ( $count / $this -> maxPageEntries )) {
2012-03-10 14:15:31 +00:00
echo ( " <a title= \" " . _ ( 'Jump to last page' ) . " \" href= \" list.php?type= " . $this -> type . " &norefresh=true&page= " . ceil (( $count / $this -> maxPageEntries )) .
2013-02-19 17:36:46 +00:00
" &sort= " . $this -> sortColumn . " &sortdirection= " . $this -> sortDirection . $filter . " \" > " .
2011-04-03 10:29:23 +00:00
" <img height=16 width=16 class= \" align-middle \" alt= \" \" src= \" ../../graphics/go-last.png \" ></a> \n " );
2006-01-01 16:30:05 +00:00
}
2010-12-19 13:25:01 +00:00
echo " </td> " ;
2006-01-01 16:30:05 +00:00
}
2010-12-19 13:25:01 +00:00
echo " </tr></table> \n " ;
2004-06-11 11:01:56 +00:00
}
2013-02-19 17:36:46 +00:00
/**
* Returns the filter as text to be used as URL parameter .
*
* @ return String filter text
*/
protected function getFilterAsTextForURL () {
$text = '' ;
foreach ( $this -> filters as $attr => $filter ) {
$text .= " &filter " . strtolower ( $attr ) . '=' . $filter ;
}
return $text ;
}
2006-09-23 11:19:36 +00:00
2006-01-01 16:30:05 +00:00
/**
* Prints the attribute and filter row at the account table head
*/
2007-11-11 14:01:16 +00:00
protected function listPrintTableHeader () {
2013-02-19 17:36:46 +00:00
$filter = $this -> getFilterAsTextForURL ();
2006-01-01 16:30:05 +00:00
// print table header
2013-02-03 11:46:47 +00:00
echo " <table id= \" accountTable \" frame= \" box \" rules= \" none \" class= \" " . $this -> type . " -border collapse accountlist ui-corner-all \" width= \" 100% \" ><thead> \n " ;
2014-02-01 15:32:44 +00:00
echo " <tr class= \" " . $this -> type . " -dark \" > \n " ;
echo " <th width=22 height=34><a href= \" # \" onClick= \" list_switchAccountSelection(); \" ><img height=16 width=16 src= \" ../../graphics/selectDown.png \" alt= \" select all \" ></a></th> \n " ;
echo " <td> <a href= \" # \" onClick= \" list_switchAccountSelection(); \" > " .
" <font color= \" black \" ><small> " . _ ( " Select all " ) . " </small></font></a></td> \n " ;
2006-01-01 16:30:05 +00:00
// table header
for ( $k = 0 ; $k < sizeof ( $this -> descArray ); $k ++ ) {
if ( strtolower ( $this -> attrArray [ $k ]) == $this -> sortColumn ) {
2007-11-05 18:14:38 +00:00
$sortImage = " sort_asc.png " ;
if ( $this -> sortDirection < 0 ) {
$sortImage = " sort_desc.png " ;
}
2011-04-04 16:48:14 +00:00
echo " <th align= \" left \" ><a href= \" list.php?type= " . $this -> type . " & " .
2013-02-19 17:36:46 +00:00
" sort= " . strtolower ( $this -> attrArray [ $k ]) . $filter . " &norefresh=y " . " \" > " . $this -> descArray [ $k ] .
2011-04-03 10:29:23 +00:00
" <img height=16 width=16 style= \" vertical-align: middle; \" src= \" ../../graphics/ $sortImage\ " alt = \ " sort direction \" ></a></th> \n " ;
2006-01-01 16:30:05 +00:00
}
2011-04-04 16:48:14 +00:00
else echo " <th align= \" left \" ><a href= \" list.php?type= " . $this -> type . " & " .
2013-02-19 17:36:46 +00:00
" sort= " . strtolower ( $this -> attrArray [ $k ]) . $filter . " &norefresh=y " . " \" > " . $this -> descArray [ $k ] . " </a></th> \n " ;
2005-02-22 20:20:47 +00:00
}
2006-01-01 16:30:05 +00:00
echo " </tr> \n " ;
2006-09-23 11:19:36 +00:00
2006-01-01 16:30:05 +00:00
// print filter row
2013-01-19 13:18:52 +00:00
echo " <tr align= \" center \" class= \" " . $this -> type . " -bright \" > \n " ;
2006-01-01 16:30:05 +00:00
echo " <td width=22 height=34> " ;
2009-02-07 20:37:06 +00:00
printHelpLink ( getHelp ( '' , '250' ), '250' );
2006-01-01 16:30:05 +00:00
echo " </td> \n " ;
2004-06-11 11:01:56 +00:00
echo " <td> " ;
2013-01-14 17:10:03 +00:00
$filterGroup = new htmlGroup ();
$filterButton = new htmlButton ( 'apply_filter' , 'filter.png' , true );
$filterButton -> setTitle ( _ ( " Filter " ));
$filterGroup -> addElement ( $filterButton );
2013-02-19 17:36:46 +00:00
if ( sizeof ( $this -> filters ) > 0 ) {
2013-01-14 17:10:03 +00:00
$filterGroup -> addElement ( new htmlSpacer ( '1px' , null ));
$clearFilterButton = new htmlButton ( 'clear_filter' , 'clearFilter.png' , true );
$clearFilterButton -> setTitle ( _ ( 'Clear filter' ));
$filterGroup -> addElement ( $clearFilterButton );
}
parseHtml ( null , $filterGroup , array (), false , $this -> tabindex , $this -> type );
2004-06-11 11:01:56 +00:00
echo " </td> \n " ;
2006-01-01 16:30:05 +00:00
// print input boxes for filters
for ( $k = 0 ; $k < sizeof ( $this -> descArray ); $k ++ ) {
2011-04-04 16:48:14 +00:00
echo " <td align= \" left \" > " ;
2012-04-06 13:12:43 +00:00
if ( $this -> canBeFiltered ( $this -> attrArray [ $k ])) {
$value = " " ;
2013-01-14 17:10:03 +00:00
if ( ! isset ( $_POST [ 'clear_filter' ])) {
2013-02-19 17:36:46 +00:00
if ( isset ( $this -> filters [ strtolower ( $this -> attrArray [ $k ])])) {
$value = $this -> filters [ strtolower ( $this -> attrArray [ $k ])];
2013-01-14 17:10:03 +00:00
}
2012-04-06 13:12:43 +00:00
}
2012-10-08 18:01:55 +00:00
$filterInput = new htmlInputField ( 'filter' . strtolower ( $this -> attrArray [ $k ]), $value );
2013-01-19 13:18:52 +00:00
$filterInput -> setCSSClasses ( array ( $this -> type . '-dark' ));
2012-10-08 18:01:55 +00:00
$filterInput -> setFieldSize ( '15' );
$filterInput -> setOnKeyPress ( " SubmitForm('apply_filter', event); " );
parseHtml ( null , $filterInput , array (), false , $this -> tabindex , $this -> type );
2012-04-06 13:12:43 +00:00
}
2006-01-01 16:30:05 +00:00
echo " </td> \n " ;
}
2010-08-23 18:01:06 +00:00
echo " </tr></thead> \n " ;
2004-06-11 11:01:56 +00:00
}
2012-04-06 13:12:43 +00:00
/**
* Returns if the given attribute can be filtered .
* If filtering is not possible then no filter box will be displayed .
* By default all attributes can be filtered .
*
* @ param String $attr attribute name
* @ return boolean filtering possible
*/
protected function canBeFiltered ( $attr ) {
return true ;
}
2004-06-11 11:01:56 +00:00
2006-01-01 16:30:05 +00:00
/**
* Prints the entry list
2006-09-23 11:19:36 +00:00
*
2006-01-01 16:30:05 +00:00
* @ param array $info entries
*/
2007-11-11 14:01:16 +00:00
protected function listPrintTableBody ( & $info ) {
2010-08-23 18:01:06 +00:00
echo " <tbody> \n " ;
2006-01-01 16:30:05 +00:00
// calculate which rows to show
$table_begin = ( $this -> page - 1 ) * $this -> maxPageEntries ;
if (( $this -> page * $this -> maxPageEntries ) > sizeof ( $info )) $table_end = sizeof ( $info );
else $table_end = ( $this -> page * $this -> maxPageEntries );
2013-04-02 18:46:39 +00:00
// get sort mapping
$sortMapping = & $this -> sortMapping ;
if ( empty ( $sortMapping )) {
$sortMapping = array ();
$infoSize = sizeof ( $info );
for ( $i = 0 ; $i < $infoSize ; $i ++ ) {
$sortMapping [ $i ] = $i ;
}
}
2006-01-01 16:30:05 +00:00
// print account list
for ( $i = $table_begin ; $i < $table_end ; $i ++ ) {
2013-04-02 18:46:39 +00:00
$index = $sortMapping [ $i ];
$rowID = base64_encode ( $info [ $index ][ 'dn' ]);
2010-07-07 15:22:07 +00:00
if ((( $i - $table_begin ) % 2 ) == 1 ) {
2013-01-19 13:18:52 +00:00
$classes = ' ' . $this -> type . '-bright' ;
2010-07-07 15:22:07 +00:00
}
else {
2013-01-19 13:18:52 +00:00
$classes = ' ' . $this -> type . '-dark' ;
2010-07-07 15:22:07 +00:00
}
2012-09-09 14:02:27 +00:00
echo ( " <tr class= \" $classes\ " " .
2011-04-09 10:04:56 +00:00
" onClick= \" list_click(' " . $rowID . " ') \" \n " .
2013-04-02 18:46:39 +00:00
" onDblClick= \" top.location.href='../account/edit.php?type= " . $this -> type . " &DN= " . rawurlencode ( $info [ $index ][ 'dn' ]) . " ' \" > \n " );
2011-05-07 12:03:55 +00:00
echo " <td align= \" center \" ><input class= \" accountBoxUnchecked \" onClick= \" list_click(' " . $rowID . " ') \" " .
2010-02-17 17:57:04 +00:00
" type= \" checkbox \" name= \" " . $rowID . " \" ></td> \n " ;
2013-04-02 18:46:39 +00:00
$this -> listPrintToolLinks ( $info [ $index ], $rowID );
2006-01-01 16:30:05 +00:00
for ( $k = 0 ; $k < sizeof ( $this -> attrArray ); $k ++ ) {
echo ( " <td> " );
$attrName = strtolower ( $this -> attrArray [ $k ]);
2013-04-02 18:46:39 +00:00
$this -> listPrintTableCellContent ( $info [ $index ], $attrName );
2006-01-01 16:30:05 +00:00
echo ( " </td> \n " );
2005-01-27 21:07:48 +00:00
}
2006-01-01 16:30:05 +00:00
echo ( " </tr> \n " );
}
// display select all link
$colspan = sizeof ( $this -> attrArray ) + 1 ;
2013-01-19 13:18:52 +00:00
echo " <tr class= \" " . $this -> type . " -bright \" > \n " ;
2011-04-03 10:29:23 +00:00
echo " <td align= \" center \" ><a href= \" # \" onClick= \" list_switchAccountSelection(); \" ><img height=16 width=16 src= \" ../../graphics/select.png \" alt= \" select all \" ></a></td> \n " ;
2010-02-17 17:57:04 +00:00
echo " <td colspan= $colspan > <a href= \" # \" onClick= \" list_switchAccountSelection(); \" > " .
2014-02-01 15:32:44 +00:00
" <font color= \" black \" ><small> " . _ ( " Select all " ) . " </small></font></a></td> \n " ;
2006-01-01 16:30:05 +00:00
echo " </tr> \n " ;
2010-08-23 18:01:06 +00:00
echo " </tbody> \n " ;
echo " </table> \n " ;
2006-01-01 16:30:05 +00:00
}
2007-02-17 16:26:08 +00:00
2007-04-21 11:04:50 +00:00
/**
* Prints the tool image links ( e . g . edit and delete ) for each account .
*
2007-11-25 12:52:18 +00:00
* @ param array $account LDAP attributes
* @ param String $id account ID
2007-04-21 11:04:50 +00:00
*/
2007-11-25 12:52:18 +00:00
private function listPrintToolLinks ( $account , $id ) {
2010-08-31 17:35:36 +00:00
$toolCount = 0 ;
2012-10-08 18:01:55 +00:00
$group = new htmlGroup ();
// edit link
$editLink = new htmlLink ( '' , " ../account/edit.php?type= " . $this -> type . " &DN=' " . rawurlencode ( $account [ 'dn' ]) . " ' " , '../../graphics/edit.png' );
$editLink -> setTitle ( _ ( " Edit " ));
$group -> addElement ( $editLink );
2010-08-31 17:35:36 +00:00
$toolCount ++ ;
2012-10-08 18:01:55 +00:00
// delete link
2014-01-15 20:48:52 +00:00
if ( checkIfWriteAccessIsAllowed ( $this -> type ) && checkIfDeleteEntriesIsAllowed ( $this -> type )) {
2012-10-08 18:01:55 +00:00
$deleteLink = new htmlLink ( '' , " deletelink.php?type= " . $this -> type . " &DN=' " . rawurlencode ( $account [ 'dn' ]) . " ' " , '../../graphics/delete.png' );
$deleteLink -> setTitle ( _ ( " Delete " ));
$group -> addElement ( $deleteLink );
2010-08-31 17:35:36 +00:00
$toolCount ++ ;
2007-12-30 16:08:54 +00:00
}
2012-10-08 18:01:55 +00:00
// PDF button
$pdfButton = new htmlButton ( " createPDF_ " . $id , 'pdf.png' , true );
$pdfButton -> setTitle ( _ ( 'Create PDF file' ));
$group -> addElement ( $pdfButton );
2010-08-31 17:35:36 +00:00
$toolCount ++ ;
2007-11-05 18:14:38 +00:00
// additional tools
$tools = $this -> getAdditionalTools ();
for ( $i = 0 ; $i < sizeof ( $tools ); $i ++ ) {
2012-10-08 18:01:55 +00:00
$toolLink = new htmlLink ( '' , $tools [ $i ] -> getLinkTarget () . " ?type= " . $this -> type . " &DN=' " . rawurlencode ( $account [ 'dn' ]) . " ' " , '../../graphics/' . $tools [ $i ] -> getImage ());
$toolLink -> setTitle ( $tools [ $i ] -> getName ());
$group -> addElement ( $toolLink );
2010-08-31 17:35:36 +00:00
$toolCount ++ ;
2007-11-05 18:14:38 +00:00
}
2010-08-31 17:35:36 +00:00
$width = ( $toolCount * 20 ) + 20 ;
2012-10-08 18:01:55 +00:00
echo " <td align='center' style= \" white-space: nowrap; width: ${ width } px; \" > " ;
parseHtml ( null , $group , array (), false , $this -> tabindex , $this -> type );
2010-08-31 17:35:36 +00:00
echo " </td> \n " ;
2007-04-21 11:04:50 +00:00
}
2007-02-17 16:26:08 +00:00
/**
* Prints the content of a cell in the account list for a given LDAP entry and attribute .
*
* @ param array $entry LDAP attributes
* @ param string $attribute attribute name
*/
2007-11-11 14:01:16 +00:00
protected function listPrintTableCellContent ( & $entry , & $attribute ) {
2007-02-17 16:26:08 +00:00
// print all attribute entries seperated by "; "
if ( isset ( $entry [ $attribute ]) && sizeof ( $entry [ $attribute ]) > 0 ) {
if ( is_array ( $entry [ $attribute ])) {
// sort array
sort ( $entry [ $attribute ]);
2007-03-21 13:36:09 +00:00
echo htmlspecialchars ( implode ( " ; " , $entry [ $attribute ]), ENT_QUOTES , " UTF-8 " );
}
else {
echo htmlspecialchars ( $entry [ $attribute ], ENT_QUOTES , " UTF-8 " );
2007-02-17 16:26:08 +00:00
}
}
}
2006-09-23 11:19:36 +00:00
2006-01-01 16:30:05 +00:00
/**
* Manages all POST actions ( e . g . button pressed ) for the account lists .
2010-11-06 09:40:32 +00:00
*
* @ return String HTML fragment to insert into beginning of account list
2006-01-01 16:30:05 +00:00
*/
2008-01-14 18:10:13 +00:00
protected function listDoPost () {
2010-10-31 13:48:15 +00:00
// check if button was pressed and if we have to add/delete an account or call file upload
if ( isset ( $_POST [ 'new' ]) || isset ( $_POST [ 'del' ]) || isset ( $_POST [ 'fileUpload' ])){
2014-01-15 20:48:52 +00:00
if ( ! checkIfWriteAccessIsAllowed ( $this -> type )) {
2007-12-30 16:08:54 +00:00
die ();
}
2006-01-01 16:30:05 +00:00
// add new account
2013-05-01 12:36:17 +00:00
if ( isset ( $_POST [ 'new' ]) && checkIfNewEntriesAreAllowed ( $this -> type )){
2007-11-06 17:42:37 +00:00
metaRefresh ( " ../account/edit.php?type= " . $this -> type . " &suffix= " . $this -> suffix );
2005-01-27 21:07:48 +00:00
exit ;
}
2006-01-01 16:30:05 +00:00
// delete account(s)
2013-05-01 12:36:17 +00:00
elseif ( isset ( $_POST [ 'del' ]) && checkIfDeleteEntriesIsAllowed ( $this -> type )){
2006-01-01 16:30:05 +00:00
// search for checkboxes
$accounts = array_keys ( $_POST , " on " );
2006-06-29 19:38:38 +00:00
// build DN list
2006-01-01 16:30:05 +00:00
$_SESSION [ 'delete_dn' ] = array ();
for ( $i = 0 ; $i < sizeof ( $accounts ); $i ++ ) {
2010-01-04 20:15:25 +00:00
$_SESSION [ 'delete_dn' ][] = base64_decode ( $accounts [ $i ]);
2006-01-01 16:30:05 +00:00
}
if ( sizeof ( $accounts ) > 0 ) {
metaRefresh ( " ../delete.php?type= " . $this -> type );
exit ;
}
2005-01-27 21:07:48 +00:00
}
2010-10-31 13:48:15 +00:00
// file upload
2013-05-01 12:36:17 +00:00
elseif ( isset ( $_POST [ 'fileUpload' ]) && checkIfNewEntriesAreAllowed ( $this -> type )){
2010-10-31 13:48:15 +00:00
metaRefresh ( " ../masscreate.php?type= " . $this -> type );
exit ;
}
2007-11-25 12:52:18 +00:00
}
// PDF button
foreach ( $_POST as $key => $value ) {
if ( strpos ( $key , 'createPDF_' ) > - 1 ) {
$parts = explode ( " _ " , $key );
2010-05-02 15:34:44 +00:00
if ( sizeof ( $parts ) == 2 ) {
2007-11-25 12:52:18 +00:00
$this -> showPDFPage ( $parts [ 1 ]);
exit ;
}
}
}
// PDF creation Ok
if ( isset ( $_POST [ 'createPDFok' ])) {
$pdfStruct = $_POST [ 'pdf_structure' ];
$option = $_POST [ 'createFor' ];
2010-11-06 09:40:32 +00:00
$filename = '' ;
2007-11-25 12:52:18 +00:00
// create for clicked account
if ( $option == 'DN' ) {
$_SESSION [ " accountPDF " ] = new accountContainer ( $this -> type , " accountPDF " );
2009-12-06 18:34:24 +00:00
$_SESSION [ " accountPDF " ] -> load_account ( base64_decode ( $_POST [ 'clickedAccount' ]));
2010-11-06 09:40:32 +00:00
$filename = createModulePDF ( array ( $_SESSION [ " accountPDF " ]), $pdfStruct );
2007-11-25 12:52:18 +00:00
unset ( $_SESSION [ " accountPDF " ]);
}
// create for all selected accounts
elseif ( $option == 'SELECTED' ) {
2006-01-01 16:30:05 +00:00
// search for checkboxes
$accounts = array_keys ( $_POST , " on " );
$list = array ();
// load accounts from LDAP
for ( $i = 0 ; $i < sizeof ( $accounts ); $i ++ ) {
$_SESSION [ " accountPDF- $i " ] = new accountContainer ( $this -> type , " accountPDF- $i " );
2009-12-06 18:34:24 +00:00
$_SESSION [ " accountPDF- $i " ] -> load_account ( base64_decode ( $accounts [ $i ]));
2006-01-01 16:30:05 +00:00
$list [ $i ] = $_SESSION [ " accountPDF- $i " ];
}
if ( sizeof ( $list ) > 0 ) {
2010-11-06 09:40:32 +00:00
$filename = createModulePDF ( $list , $pdfStruct );
2007-11-25 12:52:18 +00:00
for ( $i = 0 ; $i < sizeof ( $accounts ); $i ++ ) {
unset ( $_SESSION [ " accountPDF- $i " ]);
}
2006-01-01 16:30:05 +00:00
}
}
2007-11-25 12:52:18 +00:00
// create for all accounts
elseif ( $option == 'ALL' ) {
2006-01-01 16:30:05 +00:00
$list = array ();
2013-04-02 18:46:39 +00:00
$entriesCount = sizeof ( $this -> entries );
for ( $i = 0 ; $i < $entriesCount ; $i ++ ) {
2006-01-01 16:30:05 +00:00
$_SESSION [ " accountPDF- $i " ] = new accountContainer ( $this -> type , " accountPDF- $i " );
2006-01-03 22:02:03 +00:00
$_SESSION [ " accountPDF- $i " ] -> load_account ( $this -> entries [ $i ][ 'dn' ]);
2006-01-01 16:30:05 +00:00
$list [ $i ] = $_SESSION [ " accountPDF- $i " ];
}
if ( sizeof ( $list ) > 0 ) {
2010-11-06 09:40:32 +00:00
$filename = createModulePDF ( $list , $pdfStruct );
2013-04-02 18:46:39 +00:00
for ( $i = 0 ; $i < $entriesCount ; $i ++ ) {
2007-11-25 12:52:18 +00:00
// clean session
unset ( $_SESSION [ " accountPDF- $i " ]);
}
2006-01-01 16:30:05 +00:00
}
2005-01-27 21:07:48 +00:00
}
2010-03-08 18:18:31 +00:00
elseif ( $option == 'SESSION' ) {
2010-11-06 09:40:32 +00:00
$filename = createModulePDF ( array ( $_SESSION [ $_POST [ 'PDFSessionID' ]]), $pdfStruct );
2011-11-01 17:14:54 +00:00
unset ( $_SESSION [ $_POST [ 'PDFSessionID' ]]);
2010-11-06 09:40:32 +00:00
}
if ( $filename != '' ) {
return " <script type= \" text/javascript \" >window.open(' " . $filename . " ', '_blank');</script> " ;
2010-03-08 18:18:31 +00:00
}
2005-01-27 21:07:48 +00:00
}
2007-11-11 14:01:16 +00:00
// check if back from configuration page
if ( sizeof ( $this -> configOptions ) > 0 ) {
if ( isset ( $_POST [ 'saveConfigOptions' ])) {
$cookieValue = '' ;
for ( $i = 0 ; $i < sizeof ( $this -> configOptions ); $i ++ ) {
$this -> configOptions [ $i ] -> fillFromPostData ();
$cookieValue .= $this -> configOptions [ $i ] -> getID () . " = " . $this -> configOptions [ $i ] -> getValue () . ';' ;
}
// save options as cookie for one year
setcookie ( " ListOptions_ " . $this -> type , $cookieValue , time () + 60 * 60 * 24 * 365 , " / " );
// notify subclasses
$this -> listConfigurationChanged ();
}
}
2010-11-06 09:40:32 +00:00
return '' ;
2005-01-27 21:07:48 +00:00
}
2007-11-25 12:52:18 +00:00
/**
* Shows the page where the user may select the PDF options .
*
* @ param String $id account ID
*/
private function showPDFPage ( $id ) {
2010-03-08 18:18:31 +00:00
$sessionObject = null ;
$PDFSessionID = null ;
if (( $id == null ) && isset ( $_GET [ 'PDFSessionID' ])) {
$PDFSessionID = $_GET [ 'PDFSessionID' ];
$sessionObject = $_SESSION [ $PDFSessionID ];
}
2007-11-25 12:52:18 +00:00
// search for checkboxes
$selAccounts = array_keys ( $_POST , " on " );
2007-12-03 09:18:20 +00:00
if ( ! in_array ( $id , $selAccounts )) {
$selAccounts [] = $id ;
}
2010-11-06 09:40:32 +00:00
// get possible PDF structures
$pdf_structures = getPDFStructureDefinitions ( $this -> type );
2007-11-25 12:52:18 +00:00
$this -> listPrintHeader ();
2013-01-19 13:18:52 +00:00
echo " <div class= \" ui-tabs-nav " . $this -> type . " -bright \" > " ;
2010-11-06 09:40:32 +00:00
echo " <div class= \" smallPaddingContent \" > \n " ;
echo " <form action= \" list.php?type= " . $this -> type . " &norefresh=true \" method= \" post \" > \n " ;
2007-11-25 12:52:18 +00:00
2010-11-06 09:40:32 +00:00
$container = new htmlTable ();
$container -> addElement ( new htmlSubTitle ( _ ( 'Create PDF file' )), true );
2010-11-06 13:02:13 +00:00
$container -> addElement ( new htmlTableExtendedSelect ( 'pdf_structure' , $pdf_structures , array ( 'default' ), _ ( 'PDF structure' ), '405' ), true );
2010-11-06 09:40:32 +00:00
$container -> addElement ( new htmlSpacer ( null , '5px' ), true );
$container -> addElement ( new htmlOutputText ( _ ( 'Create for' )));
// check if account object is already in session
if ( $sessionObject != null ) {
$container -> addElement ( new htmlOutputText ( $sessionObject -> finalDN ));
$container -> addElement ( new htmlHiddenInput ( 'createFor' , 'SESSION' ));
$container -> addElement ( new htmlHiddenInput ( 'PDFSessionID' , $PDFSessionID ), true );
}
else {
$radioOptions = array (
2011-01-15 18:10:55 +00:00
getAbstractDN ( base64_decode ( $id )) => 'DN' ,
2010-11-06 09:40:32 +00:00
sprintf ( _ ( 'All selected accounts (%s)' ), sizeof ( $selAccounts )) => 'SELECTED' ,
sprintf ( _ ( 'All accounts (%s)' ), sizeof ( $this -> entries )) => 'ALL'
);
$container -> addElement ( new htmlRadio ( 'createFor' , $radioOptions , 'DN' ), true );
}
$container -> addElement ( new htmlSpacer ( null , '10px' ), true );
$buttonContainer = new htmlTable ();
2010-11-06 13:02:13 +00:00
$buttonContainer -> colspan = 3 ;
2010-11-06 09:40:32 +00:00
$buttonContainer -> addElement ( new htmlButton ( 'createPDFok' , _ ( 'Ok' )));
$buttonContainer -> addElement ( new htmlButton ( 'createPDFCancel' , _ ( 'Cancel' )));
2012-10-08 18:01:55 +00:00
$container -> addElement ( $buttonContainer , true );
// hidden inputs for selected accounts
for ( $i = 0 ; $i < sizeof ( $selAccounts ); $i ++ ) {
$container -> addElement ( new htmlHiddenInput ( $selAccounts [ $i ], 'on' ));
}
$container -> addElement ( new htmlHiddenInput ( 'clickedAccount' , $id ));
2010-11-06 09:40:32 +00:00
2012-09-09 14:02:27 +00:00
parseHtml ( null , $container , array (), false , $this -> tabindex , $this -> type );
2010-11-06 09:40:32 +00:00
2007-11-25 12:52:18 +00:00
$this -> listPrintFooter ();
}
2006-09-23 11:19:36 +00:00
2006-01-01 16:30:05 +00:00
/**
* Prints a combobox with possible sub - DNs .
2012-10-07 13:35:10 +00:00
*
* @ return htmlGroup OU selection ( may be empty )
2006-01-01 16:30:05 +00:00
*/
2007-11-11 14:01:16 +00:00
protected function listShowOUSelection () {
2012-10-07 13:35:10 +00:00
$group = new htmlGroup ();
2006-01-01 16:30:05 +00:00
if ( sizeof ( $this -> possibleSuffixes ) > 1 ) {
2012-09-09 14:02:27 +00:00
$suffixList = array ();
2006-01-01 16:30:05 +00:00
for ( $i = 0 ; $i < sizeof ( $this -> possibleSuffixes ); $i ++ ) {
2012-09-09 14:02:27 +00:00
$suffixList [ getAbstractDN ( $this -> possibleSuffixes [ $i ])] = $this -> possibleSuffixes [ $i ];
2006-01-01 16:30:05 +00:00
}
2012-09-09 14:02:27 +00:00
$suffixSelect = new htmlSelect ( 'suffix' , $suffixList , array ( $this -> suffix ));
$suffixSelect -> setOnchangeEvent ( " listOUchanged(' " . $this -> type . " ', this) " );
$suffixSelect -> setRightToLeftTextDirection ( true );
$suffixSelect -> setSortElements ( false );
$suffixSelect -> setHasDescriptiveElements ( true );
$group -> addElement ( $suffixSelect );
$group -> addElement ( new htmlSpacer ( '5px' , null ));
2006-01-01 16:30:05 +00:00
}
2012-10-07 13:35:10 +00:00
return $group ;
2005-04-14 17:42:15 +00:00
}
2006-09-23 11:19:36 +00:00
2006-01-01 16:30:05 +00:00
/**
2007-11-25 12:52:18 +00:00
* Prints the create and delete buttons .
2006-01-01 16:30:05 +00:00
*
* @ param boolean $createOnly true if only the create button should be displayed
2012-10-07 13:35:10 +00:00
* @ param int $tabindex HTML tabindex counter
2006-01-01 16:30:05 +00:00
*/
2007-11-11 14:01:16 +00:00
protected function listPrintButtons ( $createOnly ) {
2012-10-07 13:35:10 +00:00
$table = new htmlTable ( '100%' );
$left = new htmlGroup ();
// button part
$left -> alignment = htmlElement :: ALIGN_LEFT ;
2014-01-15 20:48:52 +00:00
if ( checkIfWriteAccessIsAllowed ( $this -> type )) {
2013-05-01 12:36:17 +00:00
// add button
if ( checkIfNewEntriesAreAllowed ( $this -> type )) {
$newButton = new htmlButton ( 'new' , $this -> labels [ 'newEntry' ]);
$newButton -> setIconClass ( 'createButton' );
$left -> addElement ( $newButton );
}
// delete button
if ( ! $createOnly && checkIfDeleteEntriesIsAllowed ( $this -> type )) {
2012-10-07 13:35:10 +00:00
$left -> addElement ( new htmlSpacer ( '1px' , null ));
$delButton = new htmlButton ( 'del' , $this -> labels [ 'deleteEntry' ]);
$delButton -> setIconClass ( 'deleteButton' );
$left -> addElement ( $delButton );
2007-12-30 16:08:54 +00:00
}
2010-10-31 13:48:15 +00:00
$type = new $this -> type ();
2012-08-13 17:43:48 +00:00
$toolSettings = $_SESSION [ 'config' ] -> getToolSettings ();
2013-05-01 12:36:17 +00:00
if ( $type -> supportsFileUpload () && checkIfNewEntriesAreAllowed ( $this -> type )
&& ! ( isset ( $toolSettings [ 'tool_hide_toolFileUpload' ]) && ( $toolSettings [ 'tool_hide_toolFileUpload' ] == 'true' ))) {
2012-10-07 13:35:10 +00:00
$left -> addElement ( new htmlSpacer ( '20px' , null ));
$uploadButton = new htmlButton ( 'fileUpload' , _ ( 'File upload' ));
$uploadButton -> setIconClass ( 'upButton' );
$left -> addElement ( $uploadButton );
2010-10-31 13:48:15 +00:00
}
2005-02-26 14:32:52 +00:00
}
2012-10-07 13:35:10 +00:00
// OU selection and settings
$right = new htmlGroup ();
$right -> alignment = htmlElement :: ALIGN_RIGHT ;
$right -> addElement ( $this -> listShowOUSelection ());
$refreshButton = new htmlButton ( 'refresh' , 'refresh.png' , true );
$refreshButton -> setTitle ( _ ( " Refresh " ));
$right -> addElement ( $refreshButton );
$right -> addElement ( new htmlSpacer ( '1px' , null ));
$settingsLink = new htmlLink ( '' , '#' , '../../graphics/tools.png' );
$settingsLink -> setOnClick ( 'listShowSettingsDialog(\'' . _ ( 'Change list settings' ) . '\', \'' . _ ( 'Ok' ) . '\', \'' . _ ( 'Cancel' ) . '\');' );
$settingsLink -> setTitle ( _ ( 'Change settings' ));
$right -> addElement ( $settingsLink );
$this -> addExtraInputElementsToTopArea ( $left , $right );
$table -> addElement ( $left );
$table -> addElement ( $right );
parseHtml ( null , $table , array (), false , $this -> tabindex , $this -> type );
}
/**
* Can be used by subclasses to add e . g . additional buttons to the top area .
*
* @ param htmlGroup $left left part
* @ param htmlGroup $right right part
*/
protected function addExtraInputElementsToTopArea ( & $left , & $right ) {
// only used by subclasses
2007-02-11 18:06:42 +00:00
}
2006-01-01 16:30:05 +00:00
/**
2007-11-11 14:01:16 +00:00
* Prints the HTML header .
2006-01-01 16:30:05 +00:00
*/
2007-11-11 14:01:16 +00:00
protected function listPrintHeader () {
2010-01-01 17:21:46 +00:00
include '../main_header.php' ;
2006-01-01 16:30:05 +00:00
}
2007-11-11 14:01:16 +00:00
/**
* Prints the HTML footer .
*/
2010-08-21 09:43:52 +00:00
protected function listPrintFooter () {
2010-08-31 17:35:36 +00:00
?>
</ form ></ div ></ div >
< script type = " text/javascript " >
jQuery ( document ) . ready ( function () {
2013-04-02 18:54:39 +00:00
jQuery ( '#tab_<?php echo $this->type; ?>' ) . addClass ( 'ui-tabs-active' );
2010-08-31 17:35:36 +00:00
jQuery ( '#tab_<?php echo $this->type; ?>' ) . addClass ( 'ui-state-active' );
window . onload = listResizeITabContentDiv ;
window . onresize = listResizeITabContentDiv ;
jQuery ( '#filterButton' ) . button ();
});
</ script >
< ? php
2010-08-21 09:43:52 +00:00
include '../main_footer.php' ;
2007-11-11 14:01:16 +00:00
}
2006-09-23 11:19:36 +00:00
2006-01-01 16:30:05 +00:00
/**
* Returns an hash array containing with all attributes to be shown and their descriptions .
* Format : array ( attribute => description )
*
* @ return array attribute list
*/
2012-04-06 13:12:43 +00:00
protected function listGetAttributeDescriptionList () {
2006-01-01 16:30:05 +00:00
$ret = array ();
$attr_string = $_SESSION [ " config " ] -> get_listAttributes ( $this -> type );
$temp_array = explode ( " ; " , $attr_string );
$hash_table = getListAttributeDescriptions ( $this -> type );
2013-08-25 12:18:00 +00:00
$hash_table = array_change_key_case ( $hash_table , CASE_LOWER );
2006-01-01 16:30:05 +00:00
// generate column attributes and descriptions
for ( $i = 0 ; $i < sizeof ( $temp_array ); $i ++ ) {
// if value is predifined, look up description in hash_table
if ( substr ( $temp_array [ $i ], 0 , 1 ) == " # " ) {
$attr = strtolower ( substr ( $temp_array [ $i ], 1 ));
if ( isset ( $hash_table [ $attr ])) {
$ret [ $attr ] = $hash_table [ $attr ];
}
else {
$ret [ $attr ] = $attr ;
}
2005-04-14 17:42:15 +00:00
}
2006-01-01 16:30:05 +00:00
// if not predefined, the attribute is seperated by a ":" from description
2005-04-14 17:42:15 +00:00
else {
2006-01-01 16:30:05 +00:00
$attr = explode ( " : " , $temp_array [ $i ]);
if ( isset ( $attr [ 1 ])) {
$ret [ $attr [ 0 ]] = $attr [ 1 ];
}
else {
$ret [ $attr [ 0 ]] = $attr [ 0 ];
}
2005-04-14 17:42:15 +00:00
}
}
2006-01-01 16:30:05 +00:00
return $ret ;
}
2006-09-23 11:19:36 +00:00
2006-01-01 16:30:05 +00:00
/**
* Sets some internal parameters .
*/
2007-11-11 14:01:16 +00:00
protected function listGetParams () {
2013-02-19 17:36:46 +00:00
if ( isset ( $_GET [ 'accountEditBack' ])) {
$this -> refresh = true ;
return ;
}
2010-01-04 20:50:39 +00:00
// check if only PDF should be shown
if ( isset ( $_GET [ 'printPDF' ])) {
2010-03-08 18:18:31 +00:00
$this -> showPDFPage ( null );
2010-01-04 20:50:39 +00:00
exit ();
}
2006-01-01 16:30:05 +00:00
// get current page
if ( isset ( $_GET [ " page " ])) $this -> page = $_GET [ " page " ];
else $this -> page = 1 ;
// generate attribute-description table
$temp_array = $this -> listGetAttributeDescriptionList ();
$this -> attrArray = array_keys ( $temp_array ); // list of LDAP attributes to show
$this -> descArray = array_values ( $temp_array ); // list of descriptions for the attributes
// get sorting column
2007-11-05 18:14:38 +00:00
if ( isset ( $_GET [ " sort " ])) {
if ( $_GET [ " sort " ] == $this -> sortColumn ) {
$this -> sortDirection = - $this -> sortDirection ;
}
else {
$this -> sortColumn = $_GET [ " sort " ];
$this -> sortDirection = 1 ;
}
}
else {
$this -> sortColumn = strtolower ( $this -> attrArray [ 0 ]);
$this -> sortDirection = 1 ;
}
// get sort order
if ( isset ( $_GET [ 'sortdirection' ])) {
$this -> sortDirection = $_GET [ 'sortdirection' ];
}
2006-01-01 16:30:05 +00:00
// check search suffix
2006-01-24 14:23:42 +00:00
if ( isset ( $_POST [ 'suffix' ])) $this -> suffix = $_POST [ 'suffix' ]; // new suffix selected via combobox
2007-05-13 14:08:10 +00:00
elseif ( isset ( $_GET [ 'suffix' ])) $this -> suffix = $_GET [ 'suffix' ]; // new suffix selected via combobox
2006-01-01 16:30:05 +00:00
elseif ( ! $this -> suffix ) $this -> suffix = $_SESSION [ " config " ] -> get_Suffix ( $this -> type ); // default suffix
// check if LDAP data should be refreshed
$this -> refresh = true ;
if ( isset ( $_GET [ 'norefresh' ])) $this -> refresh = false ;
2013-01-14 17:10:03 +00:00
if ( isset ( $_POST [ 'refresh' ]) || isset ( $_POST [ 'apply_filter' ]) || isset ( $_POST [ 'clear_filter' ])) {
2010-02-13 19:05:33 +00:00
$this -> refresh = true ;
}
2006-01-01 16:30:05 +00:00
}
2006-09-23 11:19:36 +00:00
2006-01-01 16:30:05 +00:00
/**
* Rereads the entries from LDAP .
*/
2007-11-11 14:01:16 +00:00
protected function listRefreshData () {
2012-04-20 18:24:13 +00:00
// check suffix
if ( ! $this -> suffix ) {
$this -> suffix = $_SESSION [ " config " ] -> get_Suffix ( $this -> type ); // default suffix
}
2006-01-01 16:30:05 +00:00
// configure search filter
$module_filter = get_ldap_filter ( $this -> type ); // basic filter is provided by modules
2013-02-19 17:36:46 +00:00
$filter = " (& " . $module_filter . $this -> buildLDAPAttributeFilter () . " ) " ;
2006-01-01 16:30:05 +00:00
$attrs = $this -> attrArray ;
2012-04-06 13:12:43 +00:00
// remove virtual attributes from list
for ( $i = 0 ; $i < sizeof ( $attrs ); $i ++ ) {
if ( strpos ( $attrs [ $i ], self :: VIRTUAL_ATTRIBUTE_PREFIX ) === 0 ) {
unset ( $attrs [ $i ]);
}
}
$attrs = array_values ( $attrs );
// include additional attributes
$additionalAttrs = $this -> getAdditionalLDAPAttributesToRead ();
for ( $i = 0 ; $i < sizeof ( $additionalAttrs ); $i ++ ) {
if ( ! in_array_ignore_case ( $additionalAttrs [ $i ], $attrs )) {
$attrs [] = $additionalAttrs [ $i ];
}
}
2011-05-21 10:58:22 +00:00
$this -> entries = searchLDAP ( $this -> suffix , $filter , $attrs );
2010-02-14 18:01:20 +00:00
$lastError = getLastLDAPError ();
if ( $lastError != null ) {
call_user_func_array ( 'StatusMessage' , $lastError );
2005-04-14 17:42:15 +00:00
}
2006-01-01 16:30:05 +00:00
// generate list of possible suffixes
2011-04-25 18:01:11 +00:00
$typeObj = new $this -> type ();
$this -> possibleSuffixes = $typeObj -> getSuffixList ();
2005-04-14 17:42:15 +00:00
}
2007-02-11 18:06:42 +00:00
2013-02-19 17:36:46 +00:00
/**
* Builds the LDAP filter based on the filter entries in the GUI .
*
* @ return String LDAP filter
*/
protected function buildLDAPAttributeFilter () {
$text = '' ;
foreach ( $this -> filters as $attr => $filter ) {
$text .= '(' . $attr . '=' . $filter . ')' ;
}
return $text ;
}
2013-01-20 19:14:16 +00:00
/**
* Forces a refresh of the LDAP data .
* Function must be called before $this -> refresh option is checked to load new LDAP data ( e . g . in listGetParams ) .
*/
protected function forceRefresh () {
$this -> refresh = true ;
if ( isset ( $_GET [ 'norefresh' ])) {
unset ( $_GET [ 'norefresh' ]);
}
}
2012-04-06 13:12:43 +00:00
/**
* Returns a list of additional LDAP attributes that should be read .
* This can be used to show additional data even if the user selected other attributes to show in the list .
*
* @ return array additional attribute names
*/
protected function getAdditionalLDAPAttributesToRead () {
return array ();
}
2007-02-11 18:06:42 +00:00
/**
2007-11-11 14:01:16 +00:00
* Returns a list of lamListTool objects to display next to the edit / delete buttons .
*
* @ return lamListTool [] tools
2007-02-11 18:06:42 +00:00
*/
2007-11-11 14:01:16 +00:00
protected function getAdditionalTools () {
return array ();
2007-02-11 18:06:42 +00:00
}
2007-11-05 18:14:38 +00:00
/**
2007-11-11 14:01:16 +00:00
* Returns a list of possible configuration options .
2007-11-05 18:14:38 +00:00
*
2007-11-11 14:01:16 +00:00
* @ return array list of lamListOption objects
2007-11-05 18:14:38 +00:00
*/
2007-11-11 14:01:16 +00:00
protected function listGetAllConfigOptions () {
2011-01-24 20:50:04 +00:00
$listSizeOption = new lamSelectListOption ( _ ( " Maximum list entries " ), array ( 10 , 20 , 30 , 50 , 75 , 100 , 500 , 1000 ), self :: LIST_SIZE_OPTION_NAME );
2010-09-26 11:12:02 +00:00
$listSizeOption -> setHelpID ( '208' );
2010-11-21 15:03:19 +00:00
$listSizeOption -> setValue ( $this -> maxPageEntries );
2007-12-09 10:45:04 +00:00
return array ( $listSizeOption );
2007-11-05 18:14:38 +00:00
}
2007-11-11 14:01:16 +00:00
/**
* Prints the list configuration page .
*/
protected function listPrintConfigurationPage () {
2011-04-25 18:01:11 +00:00
echo " <div id= \" settingsDialog \" class= \" hidden \" > \n " ;
2011-04-09 10:04:56 +00:00
echo " <form id= \" settingsDialogForm \" action= \" list.php?type= " . $this -> type . " &norefresh=true \" method= \" post \" > \n " ;
echo '<table width="100%"><tr><td>' ;
2010-09-26 11:12:02 +00:00
$configContainer = new htmlTable ();
2007-11-11 14:01:16 +00:00
for ( $i = 0 ; $i < sizeof ( $this -> configOptions ); $i ++ ) {
2010-09-26 11:12:02 +00:00
$configContainer -> mergeTableElements ( $this -> configOptions [ $i ] -> getMetaHTML ());
2007-11-11 14:01:16 +00:00
}
2011-04-09 10:04:56 +00:00
$configContainer -> addElement ( new htmlHiddenInput ( 'saveConfigOptions' , 'ok' ));
2010-09-26 11:12:02 +00:00
2012-09-09 14:02:27 +00:00
parseHtml ( '' , $configContainer , array (), false , $this -> tabindex , $this -> type );
2007-11-11 14:01:16 +00:00
echo " </td></tr></table> \n " ;
2011-04-09 10:04:56 +00:00
echo '</form>' ;
echo " </div> \n " ;
2007-11-11 14:01:16 +00:00
}
/**
* Returns the configuration option with the given ID .
*
* @ param String $ID ID
*/
protected function listGetConfigOptionByID ( $ID ) {
for ( $i = 0 ; $i < sizeof ( $this -> configOptions ); $i ++ ) {
if ( $this -> configOptions [ $i ] -> getID () === $ID ) {
return $this -> configOptions [ $i ];
}
}
return null ;
}
/**
* Called when the configuration options changed .
*/
protected function listConfigurationChanged () {
2007-12-09 10:45:04 +00:00
$sizeOption = $this -> listGetConfigOptionByID ( self :: LIST_SIZE_OPTION_NAME );
if ( $sizeOption -> getValue () != null ) {
$this -> maxPageEntries = $sizeOption -> getValue ();
}
2007-11-11 14:01:16 +00:00
return ;
}
2010-11-26 20:16:14 +00:00
/**
* Prints messages when another page ( e . g . delete / upload ) redirects to the list view .
*/
protected function listPrintRedirectMessages () {
if ( isset ( $_GET [ 'deleteAllOk' ])) {
StatusMessage ( 'INFO' , _ ( 'Deletion was successful.' ));
}
2010-11-28 15:27:27 +00:00
elseif ( isset ( $_GET [ 'uploadAllOk' ])) {
StatusMessage ( 'INFO' , _ ( " Upload has finished " ));
2012-02-05 10:38:59 +00:00
if ( isset ( $_SESSION [ 'mass_pdf' ][ 'file' ])) {
2012-02-05 13:16:01 +00:00
StatusMessage ( 'INFO' , sprintf ( _ ( 'You can download your PDF files {link=%s}{color=#d2131a}here{endcolor}{endlink}.' ), '../' . $_SESSION [ 'mass_pdf' ][ 'file' ]));
2012-02-05 10:38:59 +00:00
}
2010-11-28 15:27:27 +00:00
}
2012-06-05 18:20:17 +00:00
if ( isset ( $_SESSION [ 'listRedirectMessages' ])) {
2010-11-28 15:27:27 +00:00
for ( $i = 0 ; $i < sizeof ( $_SESSION [ 'listRedirectMessages' ]); $i ++ ) {
call_user_func_array ( 'StatusMessage' , $_SESSION [ 'listRedirectMessages' ][ $i ]);
}
unset ( $_SESSION [ 'listRedirectMessages' ]);
}
2010-11-26 20:16:14 +00:00
}
2007-11-05 18:14:38 +00:00
}
/**
* Represents a tool which can be included in the account lists .
*
* @ package lists
* @ author Roland Gruber
*/
class lamListTool {
2012-07-15 12:05:47 +00:00
/** tool name */
2007-11-05 18:14:38 +00:00
private $name ;
2012-07-15 12:05:47 +00:00
/** tool image */
2007-11-05 18:14:38 +00:00
private $image ;
2012-07-15 12:05:47 +00:00
/** link target */
2007-11-05 18:14:38 +00:00
private $target ;
/**
* Constructor
*
* @ param String $name tool name
* @ param String $image image file
* @ param String $target target page
* @ return lamListTool tool object
*/
2007-12-28 16:08:56 +00:00
public function __construct ( $name , $image , $target ) {
2007-11-05 18:14:38 +00:00
$this -> name = $name ;
$this -> image = $image ;
$this -> target = $target ;
}
/**
* Returns the name of the tool image .
* The image is returned without path ( e . g . mytool . png ) . All images must reside in the graphics folder .
*
* @ return String image name
*/
2007-11-11 14:01:16 +00:00
public function getImage () {
2007-11-05 18:14:38 +00:00
return $this -> image ;
}
/**
* Returns the tool name .
* This is used for the tool tip .
*
* @ return String name
*/
2007-11-11 14:01:16 +00:00
public function getName () {
2007-11-05 18:14:38 +00:00
return $this -> name ;
}
/**
* Returns the PHP file ( relative to 'templates/lists' ) which will be the target for this tool .
* The target page will be opened with two GET parameters : DN and type ( e . g . user )
*
* @ return String page file ( e . g . 'mytool.php' )
*/
2007-11-11 14:01:16 +00:00
public function getLinkTarget () {
2007-11-05 18:14:38 +00:00
return $this -> target ;
}
2005-04-14 17:42:15 +00:00
2006-01-01 16:30:05 +00:00
}
2005-04-14 17:42:15 +00:00
2007-11-11 14:01:16 +00:00
/**
* Represents a list configuration option .
*
* @ package lists
* @ author Roland Gruber
*/
abstract class lamListOption {
2012-07-15 12:05:47 +00:00
/** unique ID */
2007-11-11 14:01:16 +00:00
private $ID ;
2012-07-15 12:05:47 +00:00
/** option value */
2007-11-11 14:01:16 +00:00
private $value ;
/**
* Creates a new config option .
*
2007-12-09 10:45:04 +00:00
* @ param String $ID unique ID
2007-11-11 14:01:16 +00:00
* @ return lamConfigOption config option
*/
2007-12-28 16:08:56 +00:00
public function __construct ( $ID ) {
2007-11-11 14:01:16 +00:00
$this -> ID = $ID ;
}
/**
* Returns the option ID .
*
* @ return String ID
*/
public function getID () {
return $this -> ID ;
}
/**
* Fills the config option from POST data .
*
* @ return array list of StatusMessages ( array ( < type > , < head line > , < body > ))
*/
public abstract function fillFromPostData ();
/**
* Returns the option value . The value must not contain " = " and " ; " .
*
* @ return String value
*/
public function getValue () {
return $this -> value ;
}
/**
* Sets the config option value . The value must not contain " = " and " ; " .
*
* @ param String $value
*/
public function setValue ( $value ) {
if (( strpos ( $value , '=' ) > - 1 ) || ( strpos ( $value , ';' ) > - 1 )) {
user_error ( " Invalid value for list option: " . $value , E_ERROR );
}
$this -> value = $value ;
}
/**
* Returns the meta HTML data to display this option .
*
2010-09-26 11:12:02 +00:00
* @ return htmlTable meta HTML
2007-11-11 14:01:16 +00:00
*/
public abstract function getMetaHTML ();
}
/**
* Boolean option for list configuration .
*
* @ package lists
* @ author Roland Gruber
*/
class lamBooleanListOption extends lamListOption {
2012-07-15 12:05:47 +00:00
/** option name */
2007-11-11 14:01:16 +00:00
private $name ;
/**
* Creates a new boolean option .
*
* @ param String $name name to show on config page
2007-12-09 10:45:04 +00:00
* @ param String $ID unique ID
2007-11-11 14:01:16 +00:00
* @ return lamBooleanListOption config option
*/
2007-12-28 16:08:56 +00:00
public function __construct ( $name , $ID ) {
parent :: __construct ( $ID );
2007-11-11 14:01:16 +00:00
$this -> name = $name ;
}
/**
* Returns if this option is selected .
*
* @ return boolean true , if selected
*/
public function isSelected () {
return ( $this -> getValue () === " 1 " );
}
/**
* Fills the config option from POST data .
*
* @ return array list of StatusMessages ( array ( < type > , < head line > , < body > ))
*/
public function fillFromPostData () {
if ( isset ( $_POST [ $this -> getID ()])) {
$this -> setValue ( " 1 " );
}
else {
$this -> setValue ( " 0 " );
}
}
/**
* Returns the meta HTML data to display this option .
*
2010-09-26 11:12:02 +00:00
* @ return htmlTable meta HTML
2007-11-11 14:01:16 +00:00
*/
public function getMetaHTML () {
2010-09-26 11:12:02 +00:00
$return = new htmlTable ();
$return -> addElement ( new htmlTableExtendedInputCheckbox ( $this -> getID (), $this -> isSelected (), $this -> name ));
2007-11-11 14:01:16 +00:00
return $return ;
}
}
2007-12-09 10:45:04 +00:00
/**
* Boolean option for list configuration .
*
* @ package lists
* @ author Roland Gruber
*/
class lamSelectListOption extends lamListOption {
2012-07-15 12:05:47 +00:00
/** option name */
2007-12-09 10:45:04 +00:00
private $name ;
2012-07-15 12:05:47 +00:00
/** possible select options */
2007-12-09 10:45:04 +00:00
private $options ;
2012-07-15 12:05:47 +00:00
/** help ID */
2007-12-09 10:45:04 +00:00
private $helpID ;
/**
* Creates a new selection list option .
*
* @ param String $name name to show on config page
* @ param array $options list of possible values
* @ param String $ID unique ID
* @ return lamBooleanListOption config option
*/
2007-12-28 16:08:56 +00:00
public function __construct ( $name , $options , $ID ) {
parent :: __construct ( $ID );
2007-12-09 10:45:04 +00:00
$this -> name = $name ;
$this -> options = $options ;
}
/**
* Sets the help ID .
*
* @ param Strign $id help ID
*/
public function setHelpID ( $id ) {
$this -> helpID = $id ;
}
/**
* Fills the config option from POST data .
*
* @ return array list of StatusMessages ( array ( < type > , < head line > , < body > ))
*/
public function fillFromPostData () {
if ( isset ( $_POST [ $this -> getID ()])) {
$this -> setValue ( $_POST [ $this -> getID ()]);
}
else {
$this -> setValue ( null );
}
}
/**
* Returns the meta HTML data to display this option .
*
2010-09-26 11:12:02 +00:00
* @ return htmlTable meta HTML
2007-12-09 10:45:04 +00:00
*/
public function getMetaHTML () {
2010-09-26 11:12:02 +00:00
$return = new htmlTable ();
$return -> addElement ( new htmlTableExtendedSelect ( $this -> getID (), $this -> options , array ( $this -> getValue ()), $this -> name , $this -> helpID ));
2007-12-09 10:45:04 +00:00
return $return ;
}
2010-11-26 20:16:14 +00:00
2007-12-09 10:45:04 +00:00
}
2004-05-31 20:10:36 +00:00
?>