| 1 | <?php
 | 
  
    | 2 | 
 | 
  
    | 3 | /**
 | 
  
    | 4 |  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 | 
  
    | 5 |  *
 | 
  
    | 6 |  * This program is free software: you can redistribute it and/or modify
 | 
  
    | 7 |  * it under the terms of the GNU General Public License as published by
 | 
  
    | 8 |  * the Free Software Foundation, either version 3 of the License, or
 | 
  
    | 9 |  * (at your option) any later version.
 | 
  
    | 10 |  *
 | 
  
    | 11 |  * This program is distributed in the hope that it will be useful,
 | 
  
    | 12 |  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
  
    | 13 |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
  
    | 14 |  * GNU General Public License for more details.
 | 
  
    | 15 |  *
 | 
  
    | 16 |  * You should have received a copy of the GNU General Public License
 | 
  
    | 17 |  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
  
    | 18 |  */
 | 
  
    | 19 | /**
 | 
  
    | 20 |  * PageTree generator
 | 
  
    | 21 |  *
 | 
  
    | 22 |  * @category     WbACP
 | 
  
    | 23 |  * @package      WbACP_Pages
 | 
  
    | 24 |  * @author       Werner v.d.Decken <wkl@isteam.de>
 | 
  
    | 25 |  * @copyright    Werner v.d.Decken <wkl@isteam.de>
 | 
  
    | 26 |  * @license      http://www.gnu.org/licenses/gpl.html   GPL License
 | 
  
    | 27 |  * @version      1.0.0
 | 
  
    | 28 |  * @revision     $Revision: 2070 $
 | 
  
    | 29 |  * @link         $HeadURL: svn://isteam.dynxs.de/wb-archiv/branches/2.8.x/wb/admin/pages/PageTree.php $
 | 
  
    | 30 |  * @lastmodified $Date: 2014-01-03 02:21:42 +0100 (Fri, 03 Jan 2014) $
 | 
  
    | 31 |  * @since        file added on 2012-12-21
 | 
  
    | 32 |  */
 | 
  
    | 33 | 	
 | 
  
    | 34 | class a_pages_PageTree
 | 
  
    | 35 | {
 | 
  
    | 36 | /** @var object instance of the application object */
 | 
  
    | 37 | 	protected $_oApp     = null;
 | 
  
    | 38 | /** @var object instance of the database object */
 | 
  
    | 39 | 	protected $_oDb      = null;
 | 
  
    | 40 | /** @var object instance holds several values from the application global scope */
 | 
  
    | 41 | 	protected $_oReg     = null;
 | 
  
    | 42 | /** @var object instance holds all of the translations */
 | 
  
    | 43 | 	protected $_oTrans   = null;
 | 
  
    | 44 | /** @var string full HTML formattet list of pages */
 | 
  
    | 45 | 	protected $_sOutput         = '';
 | 
  
    | 46 | /** @var integer number of all reachable pages */	
 | 
  
    | 47 | 	protected $_iPagesTotal     = 0;
 | 
  
    | 48 | /** @var integer number of all writeable pages */	
 | 
  
    | 49 | 	protected $_iPagesWriteable = 0;
 | 
  
    | 50 | /** @var integer index for toggle background color of the list */	
 | 
  
    | 51 | 	protected $_iLineColor      = 0;
 | 
  
    | 52 | /** @var array entries to build a select list for parents */	
 | 
  
    | 53 | 	protected $_aParentList     = array();
 | 
  
    | 54 | /** @var integer count all executed database requests passing all iterations. */
 | 
  
    | 55 | 	protected $_queries = 0;
 | 
  
    | 56 | /**
 | 
  
    | 57 |  * constructor used to import some application constants and objects
 | 
  
    | 58 |  */	
 | 
  
    | 59 | 	public function __construct() 
 | 
  
    | 60 | 	{
 | 
  
    | 61 | 		// import global vars and objects
 | 
  
    | 62 | 		$this->_oApp   = $GLOBALS['admin'];
 | 
  
    | 63 | 		$this->_oDb    = WbDatabase::getInstance();
 | 
  
    | 64 | 		$this->_oReg   = WbAdaptor::getInstance();
 | 
  
    | 65 | 		$this->_oTrans = Translate::getInstance();
 | 
  
    | 66 | 	}
 | 
  
    | 67 | /**
 | 
  
    | 68 |  * parse the page tree and return
 | 
  
    | 69 |  * @param int use page-ID as root of the generated page tree. (default: 0)
 | 
  
    | 70 |  * @return type
 | 
  
    | 71 |  */	
 | 
  
    | 72 | 	public function parseTree($iTreeRoot = 0) {
 | 
  
    | 73 | 		return $this->_createTree($iTreeRoot);
 | 
  
    | 74 | 	}
 | 
  
    | 75 | /**
 | 
  
    | 76 |  *  parse the page tree and print it out
 | 
  
    | 77 |  * @param int use page-ID as root of the generated page tree. (default: 0)
 | 
  
    | 78 |  */	
 | 
  
    | 79 | 	public function displayTree($iTreeRoot = 0) {
 | 
  
    | 80 | 		echo $this->parseTree($iTreeRoot);
 | 
  
    | 81 | 	}
 | 
  
    | 82 | /**
 | 
  
    | 83 |  * total number of found pages which are visible for actual user
 | 
  
    | 84 |  * @return integer
 | 
  
    | 85 |  */	
 | 
  
    | 86 | 	public function getTotalPages() {
 | 
  
    | 87 | 		return $this->_iPagesTotal;
 | 
  
    | 88 | 	}
 | 
  
    | 89 | /**
 | 
  
    | 90 |  * number of found pages which are writable for actual user
 | 
  
    | 91 |  * @return integer
 | 
  
    | 92 |  */	
 | 
  
    | 93 | 	public function getWriteablePages() {
 | 
  
    | 94 | 		return $this->_iPagesWriteable;
 | 
  
    | 95 | 	}
 | 
  
    | 96 | /**
 | 
  
    | 97 |  * a list with all possible parent pages
 | 
  
    | 98 |  * @return array
 | 
  
    | 99 |  */	
 | 
  
    | 100 | 	public function getParentList($iTreeRoot = 0) {
 | 
  
    | 101 | 		if(!$this->_sOutput) {
 | 
  
    | 102 | 			$this->parseTree($iTreeRoot);
 | 
  
    | 103 | 		}
 | 
  
    | 104 | 		return $this->_aParentList;
 | 
  
    | 105 | 	}
 | 
  
    | 106 | /**
 | 
  
    | 107 |  * create a page tree as a well formatted, unordered list
 | 
  
    | 108 |  * @param int use page-ID as root of the generated page tree. (default: 0)
 | 
  
    | 109 |  * @return string the whoole list
 | 
  
    | 110 |  */
 | 
  
    | 111 | 	protected function _createTree($iTreeRoot = 0)
 | 
  
    | 112 | 	{
 | 
  
    | 113 | 		// compose the complete list
 | 
  
    | 114 | 		$sOutput = ''
 | 
  
    | 115 | 		// build the head
 | 
  
    | 116 | 		      . $this->_Tabs(0 , true).'<div class="jsadmin pages_list">'.PHP_EOL
 | 
  
    | 117 | 		      . $this->_Tabs(1).'<table>'.PHP_EOL
 | 
  
    | 118 | 		      . $this->_Tabs(1).'<tbody>'.PHP_EOL
 | 
  
    | 119 | 		      . $this->_Tabs(1).'<tr class="pages_list_header">'.PHP_EOL
 | 
  
    | 120 | 		      . $this->_Tabs(1).'<th style="width:20px;">'.PHP_EOL.'</th>'.PHP_EOL
 | 
  
    | 121 | 		      . $this->_Tabs(1).'<th class="list_menu_title">'.$this->_oTrans->TEXT_VISIBILITY.
 | 
  
    | 122 | 		                        ' / '.$this->_oTrans->TEXT_MENU_TITLE.':</th>'.PHP_EOL
 | 
  
    | 123 | 		      . $this->_Tabs(0).'<th class="list_page_title">'.$this->_oTrans->TEXT_PAGE_TITLE.
 | 
  
    | 124 | 		                        '</th>'.PHP_EOL
 | 
  
    | 125 | 		      . $this->_Tabs(0).'<th class="list_page_id">PID</th>'.PHP_EOL
 | 
  
    | 126 | 		      . $this->_Tabs(0).'<th class="header_list_actions">'.$this->_oTrans->TEXT_ACTIONS.
 | 
  
    | 127 | 		                        ':</th>'.PHP_EOL
 | 
  
    | 128 | 		      . $this->_Tabs(0).'<th class="list_page_id"> </th>'.PHP_EOL
 | 
  
    | 129 | 		      . $this->_Tabs(-1).'</tr>'.PHP_EOL
 | 
  
    | 130 | 		      . $this->_Tabs(-1).'</tbody>'.PHP_EOL
 | 
  
    | 131 | 		      . $this->_Tabs(-1).'</table>'.PHP_EOL
 | 
  
    | 132 | 		// generate the page lines
 | 
  
    | 133 | 		      . $this->_IterateTree($iTreeRoot)
 | 
  
    | 134 | 		// build the footer
 | 
  
    | 135 | 		      . $this->_Tabs(-1).'</div>'.PHP_EOL;
 | 
  
    | 136 | 		;
 | 
  
    | 137 | 		$this->_sOutput = $sOutput;
 | 
  
    | 138 | 		return $sOutput;
 | 
  
    | 139 | 	}
 | 
  
    | 140 | /**
 | 
  
    | 141 |  * Create a string of multiple TABs to prettify the HTML-output
 | 
  
    | 142 |  * ingrease the number of TABs with a positive and degrease with an negative Value.
 | 
  
    | 143 |  * '0' means: do not change the value. Or set an absolute number using $bRelative=false
 | 
  
    | 144 |  * @staticvar int $iTabLevel
 | 
  
    | 145 |  * @param integer $iTabsDiv number of TABs to add/sub
 | 
  
    | 146 |  * @param bool $bRelative false if should be set to absolute value
 | 
  
    | 147 |  * @return string
 | 
  
    | 148 |  */
 | 
  
    | 149 | 	protected function _Tabs($iTabsDiv = 0, $bRelative = true)
 | 
  
    | 150 | 	{
 | 
  
    | 151 | 		static $iTabLevel = 0;
 | 
  
    | 152 | 		$iTabLevel = ($bRelative ? $iTabLevel + $iTabsDiv : $iTabsDiv);
 | 
  
    | 153 | 		$iTabLevel += ($iTabLevel < 0 ? 0 - $iTabLevel : $iTabsDiv);
 | 
  
    | 154 | 		return str_repeat("\t", $iTabLevel);
 | 
  
    | 155 | 	}
 | 
  
    | 156 | /**
 | 
  
    | 157 |  * compose the needed SQL statement
 | 
  
    | 158 |  * @param  integer $iParentKey
 | 
  
    | 159 |  * @return string SQL statement
 | 
  
    | 160 |  */			
 | 
  
    | 161 | 	protected function _makeSql($iParentKey = 0)
 | 
  
    | 162 | 	{
 | 
  
    | 163 | 		$iParentKey = intval($iParentKey);
 | 
  
    | 164 | 		$sql  = 'SELECT ( SELECT COUNT(*) '
 | 
  
    | 165 | 		      .          'FROM `'.$this->_oDb->TablePrefix.'pages` `x` '
 | 
  
    | 166 | 		      .          'WHERE x.`parent`=p.`page_id`'
 | 
  
    | 167 | 		      .        ') `children`, '
 | 
  
    | 168 | 		      .        's.`module`, MAX(s.`publ_start` + s.`publ_end`) published, p.`link`, '
 | 
  
    | 169 | 		      .        '(SELECT MAX(`position`) FROM `'.$this->_oDb->TablePrefix.'pages` '
 | 
  
    | 170 | 		      .        'WHERE `parent`='.$iParentKey.') max_position, '
 | 
  
    | 171 | 		      .        '0 min_position, '
 | 
  
    | 172 | 		      .        'p.`position`, '
 | 
  
    | 173 | 		      .        'p.`page_id`, p.`parent`, p.`level`, p.`language`, p.`admin_groups`, '
 | 
  
    | 174 | 		      .        'p.`admin_users`, p.`viewing_groups`, p.`viewing_users`, p.`visibility`, '
 | 
  
    | 175 | 		      .        'p.`menu_title`, p.`page_title`, p.`page_trail`, '
 | 
  
    | 176 | 		      .        'GROUP_CONCAT(CAST(CONCAT(s.`section_id`, \' - \', s.`module`) AS CHAR) ORDER BY s.`position` SEPARATOR \'\n\') `section_list` '
 | 
  
    | 177 | 		      . 'FROM `'.$this->_oDb->TablePrefix.'pages` p '
 | 
  
    | 178 | 		      .    'INNER JOIN `'.$this->_oDb->TablePrefix.'sections` s '
 | 
  
    | 179 | 		      .    'ON p.`page_id`=s.`page_id` '
 | 
  
    | 180 | 		      . 'WHERE `parent`='.$iParentKey.' '
 | 
  
    | 181 | 		      .    (($this->_oReg->PageTrash != 'inline') ? 'AND `visibility`!=\'deleted\' ' : '')
 | 
  
    | 182 | 		      . 'GROUP BY p.`page_id` '
 | 
  
    | 183 | 		      . 'ORDER BY p.`position` ASC';
 | 
  
    | 184 | 		return $sql;
 | 
  
    | 185 | 	}
 | 
  
    | 186 | /**
 | 
  
    | 187 |  * iterate through all nodes which having subnodes 
 | 
  
    | 188 |  * @param integer start iteration from this parent page ( 0 = root)
 | 
  
    | 189 |  * @return string all of the item lines 
 | 
  
    | 190 |  */	
 | 
  
    | 191 | 	protected function _IterateTree($iParent = 0)
 | 
  
    | 192 | 	{
 | 
  
    | 193 | 		$sOutput = '';
 | 
  
    | 194 | 		// Get page list from database
 | 
  
    | 195 | 		if(($oPages = $this->_oDb->query($this->_makeSql($iParent)))) 
 | 
  
    | 196 | 		{
 | 
  
    | 197 | 			$this->_queries++;
 | 
  
    | 198 | 			// output block-header
 | 
  
    | 199 | 			$sOutput .= $this->_Tabs(0).'<ul id="p'.$iParent.'" class="page_list"';
 | 
  
    | 200 | 			if(!$iParent) {
 | 
  
    | 201 | 				$sOutput .= ' style="display: block;"';
 | 
  
    | 202 | 			}else {
 | 
  
    | 203 | 			// show block depending from Cookies
 | 
  
    | 204 | 				if (isset ($_COOKIE['p'.$iParent]) && $_COOKIE['p'.$iParent] == '1') {
 | 
  
    | 205 | 					$sOutput .= ' style="display: block;"';
 | 
  
    | 206 | 				}
 | 
  
    | 207 | 			}
 | 
  
    | 208 | 			$sOutput .= '>'.PHP_EOL;
 | 
  
    | 209 | 			$iMinPosition = 1;
 | 
  
    | 210 | 			while($aPage = $oPages->fetchRow(MYSQL_ASSOC))
 | 
  
    | 211 | 			{ // iterate through the current branch
 | 
  
    | 212 | 				if($this->_oReg->PageLevelLimit && ($aPage['level'] > $this->_oReg->PageLevelLimit)) {
 | 
  
    | 213 | 					return '';
 | 
  
    | 214 | 				}
 | 
  
    | 215 | 				$aPage['min_position'] = ($aPage['position'] < $iMinPosition ? $aPage['position'] : $iMinPosition);
 | 
  
    | 216 | 				$this->_iLineColor = $this->_iPagesTotal++ % 2;
 | 
  
    | 217 | 				$aPage['iswriteable'] = false;
 | 
  
    | 218 | 				if( $this->_oApp->ami_group_member($aPage['admin_users']) ||
 | 
  
    | 219 | 					$this->_oApp->is_group_match($this->_oApp->get_groups_id(), $aPage['admin_groups']))
 | 
  
    | 220 | 				{
 | 
  
    | 221 | 					if(($aPage['visibility'] == 'deleted' && $this->_oReg->PageTrash == 'inline') ||
 | 
  
    | 222 | 					   ($aPage['visibility'] != 'deleted'))
 | 
  
    | 223 | 					{
 | 
  
    | 224 | 						$aPage['iswriteable'] = true;
 | 
  
    | 225 | 						$this->_iPagesWriteable++;
 | 
  
    | 226 | 					}
 | 
  
    | 227 | 				} else {
 | 
  
    | 228 | 					if($aPage['visibility'] == 'private') { continue; }
 | 
  
    | 229 | 				}
 | 
  
    | 230 | 				// add this item to the secondary list of parents
 | 
  
    | 231 | 				$this->_addToParentList($aPage);
 | 
  
    | 232 | 				$sOutput .= $this->_createListItem($aPage);
 | 
  
    | 233 | 			}
 | 
  
    | 234 | 			$sOutput .= $this->_Tabs(-1).'</ul>'.PHP_EOL;
 | 
  
    | 235 | 		}
 | 
  
    | 236 | 		return $sOutput;
 | 
  
    | 237 | 	}
 | 
  
    | 238 | /**
 | 
  
    | 239 |  * formating the given page object for output
 | 
  
    | 240 |  * @param type $aPage
 | 
  
    | 241 |  * @return string
 | 
  
    | 242 |  */
 | 
  
    | 243 | 	protected function _createListItem($aPage)
 | 
  
    | 244 | 	{
 | 
  
    | 245 | 	// output the current item
 | 
  
    | 246 | 	// --- HEADER ------------------------------------------------------------------------
 | 
  
    | 247 | 		$sOutput  = $this->_Tabs(0).'<li class="p'.$aPage['parent'].'">'.PHP_EOL
 | 
  
    | 248 | 		          . $this->_Tabs(1).'<table class="pages_view">'.PHP_EOL
 | 
  
    | 249 | 		          . $this->_Tabs(1).'<tbody>'.PHP_EOL
 | 
  
    | 250 | 		          . $this->_Tabs(1).'<tr class="row_'.$this->_iLineColor.'">'.PHP_EOL;
 | 
  
    | 251 | 	// --- TAB 1 --- (expand/collapse) ---------------------------------------------------
 | 
  
    | 252 | 		$sOutput .= $this->_Tabs(1).'<td valign="middle" width="20" style="padding-left: '
 | 
  
    | 253 | 		          . (int)($aPage['level']*20).'px;">';
 | 
  
    | 254 | 		if((bool)$aPage['children']) {
 | 
  
    | 255 | 			$sOutput .= '<a href="javascript:toggle_visibility(\'p'.$aPage['page_id'].'\');" '
 | 
  
    | 256 | 			          . 'title="'.$this->_oTrans->TEXT_EXPAND.'/'.$this->_oTrans->TEXT_COLLAPSE.'">'
 | 
  
    | 257 | 			          . '<span><img src="'.$this->_oReg->ThemeRel.'images/'
 | 
  
    | 258 | 			          . ( ((isset($_COOKIE['p'.$aPage['page_id']]) 
 | 
  
    | 259 | 						  && $_COOKIE['p'.$aPage['page_id']] == '1') ? 'minus' : 'plus')
 | 
  
    | 260 | 						)
 | 
  
    | 261 | 			          . '_16.png" onclick="toggle_plus_minus(\''.$aPage['page_id'].'\');" '
 | 
  
    | 262 | 			          . 'name="plus_minus_'.$aPage['page_id'].'" alt="+" /></span></a>';
 | 
  
    | 263 | 		}else {
 | 
  
    | 264 | 			$sOutput .= ' ';
 | 
  
    | 265 | 		}
 | 
  
    | 266 | 		$sOutput .= '</td>'.PHP_EOL;
 | 
  
    | 267 | 	// --- TAB 2 --- (menu title) --------------------------------------------------------
 | 
  
    | 268 | 		$sOutput .= $this->_Tabs(0).'<td class="list_menu_title">';
 | 
  
    | 269 | 		if($this->_oApp->get_permission('pages_modify') && $aPage['iswriteable']) {
 | 
  
    | 270 | 			$sOutput .= '<a href="'.$this->_oReg->AcpRel.'pages/modify.php?page_id='
 | 
  
    | 271 | 			          . $aPage['page_id'].'" title="'.$this->_oTrans->TEXT_MODIFY.'">';
 | 
  
    | 272 | 		}
 | 
  
    | 273 | 		$sIcon = $this->_oReg->ThemeRel.'images/'.$aPage['visibility'].'_16.png';
 | 
  
    | 274 | 		if(!is_readable(rtrim($this->_oReg->DocumentRoot, '/').$sIcon)) {
 | 
  
    | 275 | 			$sIcon = $this->_oReg->ThemeRel.'images/public_16.png';
 | 
  
    | 276 | 		}
 | 
  
    | 277 | 		$sOutput .= '<img src="'.$sIcon.'" alt="'.$this->_oTrans->TEXT_VISIBILITY.': '
 | 
  
    | 278 | 				  . $this->_oTrans->{'TEXT_'.strtoupper($aPage['visibility'])}  .'" class="page_list_rights" />';
 | 
  
    | 279 | 		if($this->_oApp->get_permission('pages_modify') && $aPage['iswriteable']) {
 | 
  
    | 280 | 			$sOutput .= '<span class="modify_link">'.$aPage['menu_title'].'</span></a>';
 | 
  
    | 281 | 		}else {
 | 
  
    | 282 | 			$sOutput .=  '<span class="bold grey">'.$aPage['menu_title'].'</span>';
 | 
  
    | 283 | 		}
 | 
  
    | 284 | 		$sOutput .= '</td>'.PHP_EOL;
 | 
  
    | 285 | 	// --- TAB 3 --- (page title) --------------------------------------------------------
 | 
  
    | 286 | 		$sOutput .= $this->_Tabs(0).'<td class="list_page_title">'.$aPage['page_title'].'</td>'.PHP_EOL;
 | 
  
    | 287 | 	// --- TAB 4 --- (page ID) -----------------------------------------------------------
 | 
  
    | 288 | 		$sOutput .= $this->_Tabs(0).'<td class="list_page_id right">'.$aPage['page_id'].'</td>'.PHP_EOL;
 | 
  
    | 289 | 	// --- TAB 5 --- (show this page in new window) --------------------------------------
 | 
  
    | 290 | 		$sOutput .= $this->_Tabs(0).'<td class="list_actions">';
 | 
  
    | 291 | 		if($aPage['visibility'] != 'deleted' && $aPage['visibility'] != 'none') {
 | 
  
    | 292 | 			$sPageLink = $this->_oReg->AppRel.preg_replace(
 | 
  
    | 293 | 			                                 '/^'.preg_quote($this->_oReg->AppUrl, '/').'/siU',
 | 
  
    | 294 | 			                                 '', 
 | 
  
    | 295 | 			                                 $this->_oApp->page_link($aPage['link'])
 | 
  
    | 296 | 			                                );
 | 
  
    | 297 | 			$sOutput .= '<a href="'.$sPageLink.'" target="_blank" title="'.$this->_oTrans->TEXT_VIEW
 | 
  
    | 298 | 			          . '"><img src="'.$this->_oReg->ThemeRel.'images/view_16.png" alt="'
 | 
  
    | 299 | 			          . $this->_oTrans->TEXT_VIEW.'" /></a>';
 | 
  
    | 300 | 		}else { 
 | 
  
    | 301 | 			$sOutput .= '<img src="'.$this->_oReg->ThemeRel.'images/blank_16.gif" alt=" " />';
 | 
  
    | 302 | 		}
 | 
  
    | 303 | 		$sOutput .= '</td>'.PHP_EOL;
 | 
  
    | 304 | 
 | 
  
    | 305 | 	// --- TAB 6 --- (edit settings) -----------------------------------------------------
 | 
  
    | 306 | 		$sOutput .= $this->_Tabs(0).'<td class="list_actions">';
 | 
  
    | 307 | 		if($aPage['visibility'] != 'deleted') { 
 | 
  
    | 308 | 			if($this->_oApp->get_permission('pages_settings') && $aPage['iswriteable']) {
 | 
  
    | 309 | 				$sOutput .= '<a href="'.$this->_oReg->AcpRel.'pages/settings.php?page_id='
 | 
  
    | 310 | 				          . $aPage['page_id'].'" title="'.$this->_oTrans->TEXT_SETTINGS.'">'
 | 
  
    | 311 | 				          . '<img src="'.$this->_oReg->ThemeRel.'images/modify_16.png" alt="'
 | 
  
    | 312 | 				          . $this->_oTrans->TEXT_SETTINGS.'" /></a>';
 | 
  
    | 313 | 			}
 | 
  
    | 314 | 		}else {
 | 
  
    | 315 | 			$sOutput .= '<a href="'.$this->_oReg->AcpRel.'pages/restore.php?page_id='.$aPage['page_id'].'" '
 | 
  
    | 316 | 			          . 'title="'.$this->_oTrans->TEXT_RESTORE.'"><img src="'.$this->_oReg->ThemeRel
 | 
  
    | 317 | 			          . 'images/restore_16.png" alt="'.$this->_oTrans->TEXT_RESTORE.'" /></a>';
 | 
  
    | 318 | 		}
 | 
  
    | 319 | 		$sOutput .= '</td>'.PHP_EOL;
 | 
  
    | 320 | 
 | 
  
    | 321 | 	// --- TAB 7 --- (edit sections) -----------------------------------------------------
 | 
  
    | 322 | 		$sOutput .= $this->_Tabs(0).'<td class="list_actions">';
 | 
  
    | 323 | 		if( $this->_oReg->ManageSections && $this->_oApp->get_permission('pages_add') && $aPage['iswriteable'] ) {
 | 
  
    | 324 | 			$file = $this->_oApp->page_is_active($aPage) ? "clock_16.png" : "clock_red_16.png";
 | 
  
    | 325 | 			$file = ($aPage['published'] && $aPage['module'] != 'menu_link') ? $file : 'noclock_16.png';
 | 
  
    | 326 | 			$sOutput .= '<a href="'.$this->_oReg->AcpRel.'pages/sections.php?page_id='
 | 
  
    | 327 | 			          . $aPage['page_id'].'" title="'.$this->_oTrans->HEADING_MANAGE_SECTIONS."\n".$aPage['section_list'].'">'
 | 
  
    | 328 | 			          . '<img src="'.$this->_oReg->ThemeRel.'images/'.$file.'" alt="'
 | 
  
    | 329 | 			          . $this->_oTrans->HEADING_MANAGE_SECTIONS."\n".$aPage['section_list'].'" /></a>';
 | 
  
    | 330 | 		}else { 
 | 
  
    | 331 | 			$sOutput .= '<img src="'.$this->_oReg->ThemeRel.'images/blank_16.gif" alt=" " />';
 | 
  
    | 332 | 		}
 | 
  
    | 333 | 		$sOutput .= '</td>'.PHP_EOL;
 | 
  
    | 334 | 
 | 
  
    | 335 | 	// --- TAB 8 --- (move up) -----------------------------------------------------------
 | 
  
    | 336 | 		$sOutput .= $this->_Tabs(0).'<td class="list_actions">';
 | 
  
    | 337 | 		if($aPage['position'] > $aPage['min_position']) {
 | 
  
    | 338 | 			if($aPage['visibility'] != 'deleted') {
 | 
  
    | 339 | 				if($this->_oApp->get_permission('pages_settings') && $aPage['iswriteable']) {
 | 
  
    | 340 | 					$sOutput .= '<a href="'.$this->_oReg->AcpRel.'pages/move_up.php?page_id='
 | 
  
    | 341 | 					          . $aPage['page_id'].'" title="'.$this->_oTrans->TEXT_MOVE_UP
 | 
  
    | 342 | 					          . '"><img src="'.$this->_oReg->ThemeRel.'images/up_16.png" alt="'
 | 
  
    | 343 | 					          . $this->_oTrans->TEXT_MOVE_UP.'" /></a>';
 | 
  
    | 344 | 				}
 | 
  
    | 345 | 			}
 | 
  
    | 346 | 		}
 | 
  
    | 347 | 		$sOutput .= '</td>'.PHP_EOL;
 | 
  
    | 348 | 
 | 
  
    | 349 | 	// --- TAB 9 --- (move down) ---------------------------------------------------------
 | 
  
    | 350 | 		$sOutput .= $this->_Tabs(0).'<td class="list_actions">';
 | 
  
    | 351 | 		if($aPage['position'] < $aPage['max_position']) {
 | 
  
    | 352 | 			if($aPage['visibility'] != 'deleted') {
 | 
  
    | 353 | 				if($this->_oApp->get_permission('pages_settings') && $aPage['iswriteable']) {
 | 
  
    | 354 | 					$sOutput .= '<a href="'.$this->_oReg->AcpRel.'pages/move_down.php?page_id='
 | 
  
    | 355 | 					          . $aPage['page_id'].'" title="'.$this->_oTrans->TEXT_MOVE_DOWN
 | 
  
    | 356 | 					          . '"><img src="'.$this->_oReg->ThemeRel.'images/down_16.png" alt="'
 | 
  
    | 357 | 					          . $this->_oTrans->TEXT_MOVE_DOWN.'" /></a>';
 | 
  
    | 358 | 				}
 | 
  
    | 359 | 			}
 | 
  
    | 360 | 		}
 | 
  
    | 361 | 		$sOutput .= '</td>'.PHP_EOL;
 | 
  
    | 362 | 
 | 
  
    | 363 | 	// --- TAB 10 --- (delete page) ------------------------------------------------------
 | 
  
    | 364 | 		$sOutput .= $this->_Tabs(0).'<td class="list_actions">';
 | 
  
    | 365 | 		if($this->_oApp->get_permission('pages_delete') && $aPage['iswriteable']) {
 | 
  
    | 366 | 			$sOutput .= '<a href="javascript:confirm_link(pages_delete_confirm+\'?\',\''
 | 
  
    | 367 | 			          . $this->_oReg->AcpRel.'pages/delete.php?page_id='
 | 
  
    | 368 | 			          . $this->_oApp->getIDKEY($aPage['page_id']).'\');" title="'
 | 
  
    | 369 | 			          . $this->_oTrans->TEXT_DELETE.'"><img src="'.$this->_oReg->ThemeRel
 | 
  
    | 370 | 			          . 'images/delete_16.png" alt="'.$this->_oTrans->TEXT_DELETE.'" /></a>';
 | 
  
    | 371 | 		}else { 
 | 
  
    | 372 | 			$sOutput .= '<img src="'.$this->_oReg->ThemeRel.'images/blank_16.gif" alt=" " />';
 | 
  
    | 373 | 		}
 | 
  
    | 374 | 		$sOutput .= '</td>'.PHP_EOL;
 | 
  
    | 375 | 
 | 
  
    | 376 | 	// --- TAB 11 --- (add child page) ---------------------------------------------------
 | 
  
    | 377 | 		$sOutput .= $this->_Tabs(0).'<td class="list_actions">';
 | 
  
    | 378 | 		if( 
 | 
  
    | 379 | 			$this->_oApp->get_permission('pages_add')
 | 
  
    | 380 | 			&& $aPage['iswriteable'] 
 | 
  
    | 381 | 			&& ($aPage['visibility'] != 'deleted') 
 | 
  
    | 382 | 			&& $aPage['level'] < ($this->_oReg->PageLevelLimit - 1)
 | 
  
    | 383 | 		  )
 | 
  
    | 384 | 		{
 | 
  
    | 385 | 			$sOutput .= '<a href="javascript:add_child_page(\''.$aPage['page_id'].'\');" '
 | 
  
    | 386 | 			          . 'title="'.$this->_oTrans->HEADING_ADD_CHILD_PAGE.'"><img src="'
 | 
  
    | 387 | 			          . $this->_oReg->ThemeRel.'images/siteadd.png" name="addpage_'.$aPage['page_id']
 | 
  
    | 388 | 			          . '" alt="'.$this->_oTrans->HEADING_ADD_CHILD_PAGE.'" /></a>';
 | 
  
    | 389 | 		}else { 
 | 
  
    | 390 | 			$sOutput .= ' '; 
 | 
  
    | 391 | 		}
 | 
  
    | 392 | 		$sOutput .= '</td>'.PHP_EOL;
 | 
  
    | 393 | 	// --- TAB 12 --- (show language) ----------------------------------------------------
 | 
  
    | 394 | 		$sOutput .= $this->_Tabs(0).'<td class="list_page_id center">'.$aPage['language'].'</td>'.PHP_EOL;
 | 
  
    | 395 | 	// --- FOOTER ------------------------------------------------------------------------
 | 
  
    | 396 | 		$sOutput .= $this->_Tabs(-1).'</tr>'.PHP_EOL
 | 
  
    | 397 | 		          . $this->_Tabs(-1).'</tbody>'.PHP_EOL
 | 
  
    | 398 | 		          . $this->_Tabs(-1).'</table>'.PHP_EOL;
 | 
  
    | 399 | 	// if there children, iterate through this children now
 | 
  
    | 400 | 		if((bool)$aPage['children']) {
 | 
  
    | 401 | 			$sOutput .= $this->_IterateTree($aPage['page_id']);
 | 
  
    | 402 | 		}
 | 
  
    | 403 | 		$sOutput .= $this->_Tabs(-1).'</li>'.PHP_EOL;
 | 
  
    | 404 | 		return $sOutput;
 | 
  
    | 405 | 	} // end of method _createListItem
 | 
  
    | 406 | /**
 | 
  
    | 407 |  * build a list of possible parent pages
 | 
  
    | 408 |  * @param array $aPage 
 | 
  
    | 409 |  */	
 | 
  
    | 410 | 	protected function _addToParentList(array $aPage)
 | 
  
    | 411 | 	{
 | 
  
    | 412 | 		if( ($aPage['level'] < ($this->_oReg->PageLevelLimit - 1))
 | 
  
    | 413 | 			&& $aPage['iswriteable'] 
 | 
  
    | 414 | 			&& ($aPage['visibility'] != 'deleted')
 | 
  
    | 415 | 			&& $this->_oApp->get_permission('pages_add') ) 
 | 
  
    | 416 | 		{
 | 
  
    | 417 | 			$aPage['disabled'] = ($aPage['iswriteable'] ? 0 : 1);
 | 
  
    | 418 | 			$this->_aParentList[] = $aPage;
 | 
  
    | 419 | 		}
 | 
  
    | 420 | 	}
 | 
  
    | 421 | 	
 | 
  
    | 422 | } // end of class PageTree
 |