| 1 | <?php
 | 
  
    | 2 | /**
 | 
  
    | 3 |  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 | 
  
    | 4 |  *
 | 
  
    | 5 |  * This program is free software: you can redistribute it and/or modify
 | 
  
    | 6 |  * it under the terms of the GNU General Public License as published by
 | 
  
    | 7 |  * the Free Software Foundation, either version 3 of the License, or
 | 
  
    | 8 |  * (at your option) any later version.
 | 
  
    | 9 |  *
 | 
  
    | 10 |  * This program is distributed in the hope that it will be useful,
 | 
  
    | 11 |  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
  
    | 12 |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
  
    | 13 |  * GNU General Public License for more details.
 | 
  
    | 14 |  *
 | 
  
    | 15 |  * You should have received a copy of the GNU General Public License
 | 
  
    | 16 |  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
  
    | 17 |  */
 | 
  
    | 18 | 
 | 
  
    | 19 | /**
 | 
  
    | 20 |  * Lib.php
 | 
  
    | 21 |  *
 | 
  
    | 22 |  * @category     Modules
 | 
  
    | 23 |  * @package      Modules_MultiLingual
 | 
  
    | 24 |  * @author       Werner v.d.Decken <wkl@isteam.de>
 | 
  
    | 25 |  * @author       Dietmar Wöllbrink <dietmar.woellbrink@websiteBaker.org>
 | 
  
    | 26 |  * @copyright    Werner v.d.Decken <wkl@isteam.de>
 | 
  
    | 27 |  * @license      http://www.gnu.org/licenses/gpl.html   GPL License
 | 
  
    | 28 |  * @version      1.6.8
 | 
  
    | 29 |  * @revision     $Revision: 2025 $
 | 
  
    | 30 |  * @link         $HeadURL: svn://isteam.dynxs.de/wb-archiv/branches/2.8.x/wb/modules/MultiLingual/Lib.php $
 | 
  
    | 31 |  * @lastmodified $Date: 2013-12-07 04:03:58 +0100 (Sat, 07 Dec 2013) $
 | 
  
    | 32 |  * @since        File available since 09.01.2013
 | 
  
    | 33 |  * @description  provides a flexible posibility for changeing to a translated page
 | 
  
    | 34 |  */
 | 
  
    | 35 | 
 | 
  
    | 36 | class m_MultiLingual_Lib {
 | 
  
    | 37 | /** @var object instance of the WbAdaptor object */
 | 
  
    | 38 | 	protected $_oReg = null;
 | 
  
    | 39 | /** @var object instance of the application object */
 | 
  
    | 40 | 	private $_oApp     = null;
 | 
  
    | 41 | /** @var object instance of the database object */
 | 
  
    | 42 | 	private $_oDb      = null;
 | 
  
    | 43 | 
 | 
  
    | 44 | 	private $_defaultPageId = 0;
 | 
  
    | 45 | 
 | 
  
    | 46 | 
 | 
  
    | 47 | /** @var array holds several values from the default.ini */	
 | 
  
    | 48 | 	private $_config      = array();
 | 
  
    | 49 | /** @var array set several values for Twig_Environment */	
 | 
  
    | 50 | 	private $_aTwigEnv    = array();
 | 
  
    | 51 | /** @var array set several values for Twig_Loader */	
 | 
  
    | 52 | 	private $_aTwigLoader = array();
 | 
  
    | 53 | /** @var string set icon extension */	
 | 
  
    | 54 | 	private $_sExtension  = array();
 | 
  
    | 55 | /**
 | 
  
    | 56 |  * constructor used to import some application constants and objects
 | 
  
    | 57 |  */	
 | 
  
    | 58 | 	public function __construct() 
 | 
  
    | 59 | 	{
 | 
  
    | 60 | 		// import global vars and objects
 | 
  
    | 61 | 		if(!defined('ADMIN_REL')) { define('ADMIN_REL', WB_REL.'/'.ADMIN_DIRECTORY); }
 | 
  
    | 62 | 		$this->_oApp        = (isset($GLOBALS['admin']) ? $GLOBALS['admin'] : $GLOBALS['wb']);
 | 
  
    | 63 | 		$this->_oDb         = WbDatabase::getInstance();
 | 
  
    | 64 | 		$this->_oReg        = WbAdaptor::getInstance();
 | 
  
    | 65 | 		$this->_config      = $this->_aConfig = $this->getConfig((dirname(__FILE__)).'/default.ini');
 | 
  
    | 66 | 		$this->_aTwigEnv    = $this->_config['twig-environment'];
 | 
  
    | 67 | 		$this->_aTwigLoader = $this->_config['twig-loader-file'];
 | 
  
    | 68 | 	}
 | 
  
    | 69 | 
 | 
  
    | 70 | 	/**
 | 
  
    | 71 | 	 * methode to update a var/value-pair into table
 | 
  
    | 72 | 	 * @param integer $iPageId which page shall be updated
 | 
  
    | 73 | 	 * @param string $sTable the pages table
 | 
  
    | 74 | 	 * @param integer $iEntry 
 | 
  
    | 75 | 	 * @return bool
 | 
  
    | 76 | 	 */ 
 | 
  
    | 77 | 	private function _updatePageCode($iPageId, $sTable, $iNewPageCode = null)
 | 
  
    | 78 | 	{
 | 
  
    | 79 | 		// if new Pagecode is missing then set the own page ID
 | 
  
    | 80 | 		$entry = ( !isset($iNewPageCode) ? $iPageId : $iNewPageCode);
 | 
  
    | 81 | 		$sql = 'UPDATE `'.$this->_oDb->TablePrefix.$sTable.'` '
 | 
  
    | 82 | 		     . 'SET `page_code`='.$entry.', '
 | 
  
    | 83 | 		     .     '`modified_when` = '.time().' '
 | 
  
    | 84 | 		     . 'WHERE `page_id` = '.$iPageId;
 | 
  
    | 85 | 		return (bool)$this->_oDb->query($sql);
 | 
  
    | 86 | 	}
 | 
  
    | 87 | 
 | 
  
    | 88 | 	/**
 | 
  
    | 89 | 	 * compose the needed SQL statement
 | 
  
    | 90 | 	 * @param integer $sLangKey
 | 
  
    | 91 | 	 * @return database object with given SQL statement
 | 
  
    | 92 | 	 */			
 | 
  
    | 93 | 	private function _getLangInUsedDbResult ( $sLangKey='' ) 
 | 
  
    | 94 | 	{
 | 
  
    | 95 | 		$sql = 'SELECT DISTINCT `language`,'
 | 
  
    | 96 | 		     .                 '`page_id`,`level`,`parent`,`root_parent`,`page_code`,`link`,'
 | 
  
    | 97 | 		     .                 '`visibility`,`viewing_groups`,`viewing_users`,`position`,'
 | 
  
    | 98 | 		     .                 '`page_title`,`tooltip` '
 | 
  
    | 99 | 		     . 'FROM `'.$this->_oDb->TablePrefix.'pages` '
 | 
  
    | 100 | 		     . 'WHERE `level`= \'0\' '
 | 
  
    | 101 | 		     .   'AND `root_parent`=`page_id` '
 | 
  
    | 102 | 		     .   'AND (`visibility`!=\'none\' '
 | 
  
    | 103 | 		     .   'AND `visibility`!=\'hidden\') '
 | 
  
    | 104 | 		     .   ( ($sLangKey!='') ? ' AND `language` = \''.$sLangKey.'\'' : '')
 | 
  
    | 105 | 		     .   'GROUP BY `language` '
 | 
  
    | 106 | 		     .   'ORDER BY `position`';
 | 
  
    | 107 | 		return $this->_oDb->query($sql);
 | 
  
    | 108 | 	}
 | 
  
    | 109 | 
 | 
  
    | 110 | 	/**
 | 
  
    | 111 | 	* 
 | 
  
    | 112 | 	* search for pages with given page code and create a DB result object
 | 
  
    | 113 | 	* @param integer Pagecode to search for
 | 
  
    | 114 | 	* @return object result object or null on error
 | 
  
    | 115 | 	*/
 | 
  
    | 116 | 	private function _getPageCodeDbResult( $iPageCode )
 | 
  
    | 117 | 	{
 | 
  
    | 118 | 		$sql = 'SELECT `language`,'
 | 
  
    | 119 | 		     .        '`page_id`,`level`,`parent`,`root_parent`,`page_code`,`link`,'
 | 
  
    | 120 | 		     .        '`visibility`,`viewing_groups`,`viewing_users`,`position`,'
 | 
  
    | 121 | 		     .        '`page_title`,`tooltip` '
 | 
  
    | 122 | 		     .  'FROM `'.$this->_oDb->TablePrefix.'pages`'
 | 
  
    | 123 | 		     .  'WHERE `page_code` = '.$iPageCode.' '
 | 
  
    | 124 | 		     .  'ORDER BY `position`';
 | 
  
    | 125 | 		return $this->_oDb->query($sql);
 | 
  
    | 126 | 	}
 | 
  
    | 127 | 
 | 
  
    | 128 | 	/**
 | 
  
    | 129 | 	 * compose the needed SQL statement
 | 
  
    | 130 | 	 * @param integer $sLangKey
 | 
  
    | 131 | 	 * @return database object with given SQL statementt
 | 
  
    | 132 | 	 */
 | 
  
    | 133 | 	private function _getLangAddonsDbResult ( $sLangKey='' ) 
 | 
  
    | 134 | 	{
 | 
  
    | 135 | 		$sql = 'SELECT `directory`,`name`  FROM `'.$this->_oDb->TablePrefix.'addons` '
 | 
  
    | 136 | 		     . 'WHERE `type` = \'language\' '
 | 
  
    | 137 | 		     . ( ($sLangKey!='') ? ' AND `directory` = \''.$langKey.'\' ' : '')
 | 
  
    | 138 | 		     . 'ORDER BY `directory`';
 | 
  
    | 139 | 		return $this->_oDb->query($sql);
 | 
  
    | 140 | 	}
 | 
  
    | 141 | 
 | 
  
    | 142 | 	/**
 | 
  
    | 143 | 	 * 
 | 
  
    | 144 | 	 * @param integer $parent
 | 
  
    | 145 | 	 * @return database object with given SQL statement
 | 
  
    | 146 | 	 */
 | 
  
    | 147 | 	private function _getPageListDbResult ( $parent ) 
 | 
  
    | 148 | 	{
 | 
  
    | 149 | 	    $sql = 'SELECT `language`,`tooltip`,'
 | 
  
    | 150 | 		     .        '`page_id`,`page_title`,`menu_title`, `page_code`, `parent` '
 | 
  
    | 151 | 		     . 'FROM `'.$this->_oDb->TablePrefix.'pages` '
 | 
  
    | 152 | 		     . 'WHERE `parent` = '.$parent. ' '
 | 
  
    | 153 | 		     . 'ORDER BY `position`';
 | 
  
    | 154 | 		return $this->_oDb->query($sql);
 | 
  
    | 155 | 	}
 | 
  
    | 156 | 
 | 
  
    | 157 | 	private function _getPageCodeValues(  $iPageCode=0 )
 | 
  
    | 158 | 	{
 | 
  
    | 159 | 		$aRetval = array();
 | 
  
    | 160 | 		if( ($oRes = $this->_getPageCodeDbResult($iPageCode)) )
 | 
  
    | 161 | 		{
 | 
  
    | 162 | 			while($page = $oRes->fetchRow(MYSQL_ASSOC))
 | 
  
    | 163 | 			{
 | 
  
    | 164 | 				if(!$this->_oApp->page_is_visible($page)) {continue;}
 | 
  
    | 165 | 				$aRetval[$page['language']] = $page;
 | 
  
    | 166 | 			}
 | 
  
    | 167 | 		}
 | 
  
    | 168 | 		return $aRetval;
 | 
  
    | 169 | 	}
 | 
  
    | 170 | 
 | 
  
    | 171 | 	private function _getPageList($parent, $this_page=0 )
 | 
  
    | 172 | 	{
 | 
  
    | 173 | 		static $entries = array();
 | 
  
    | 174 | 		if( ($oLang = $this->_getPageListDbResult($parent)) )
 | 
  
    | 175 | 		{
 | 
  
    | 176 | 			while($value = $oLang->fetchRow(MYSQL_ASSOC))
 | 
  
    | 177 | 			{
 | 
  
    | 178 | 				if (( $value['page_id'] != $this_page ) )
 | 
  
    | 179 | 				{
 | 
  
    | 180 | 					$entries [$value['page_id']]['language'] = $value['language'];
 | 
  
    | 181 | 					$entries [$value['page_id']]['menu_title'] = $value['menu_title'];
 | 
  
    | 182 | 					$this->_getPageList($value['page_id'], $this_page );
 | 
  
    | 183 | 				}
 | 
  
    | 184 | 			}
 | 
  
    | 185 | 		}
 | 
  
    | 186 | 		return $entries;
 | 
  
    | 187 | 	}
 | 
  
    | 188 | 
 | 
  
    | 189 | 
 | 
  
    | 190 |     protected function getConfig($sFilename)
 | 
  
    | 191 |     {
 | 
  
    | 192 |         if(is_readable($sFilename)){
 | 
  
    | 193 |             return parse_ini_file($sFilename, true);
 | 
  
    | 194 |         }else {
 | 
  
    | 195 |             return null;
 | 
  
    | 196 |         }
 | 
  
    | 197 |     }
 | 
  
    | 198 | 
 | 
  
    | 199 | 
 | 
  
    | 200 | 	private function _getAllowedLanguagesFromAddons($sLangKey='')
 | 
  
    | 201 | 	{
 | 
  
    | 202 | 		$aLangAddons = array();
 | 
  
    | 203 | 		if( ($oLang = $this->_getLangAddonsDbResult($sLangKey)) )
 | 
  
    | 204 | 		{
 | 
  
    | 205 | 			while( $aLang = $oLang->fetchRow(MYSQL_ASSOC) )
 | 
  
    | 206 | 			{
 | 
  
    | 207 | 				$aLangAddons[$aLang['directory']] = $aLang['name'];
 | 
  
    | 208 | 			}
 | 
  
    | 209 | 		}
 | 
  
    | 210 | 		return $aLangAddons;
 | 
  
    | 211 | 	}
 | 
  
    | 212 | 
 | 
  
    | 213 | 	/**
 | 
  
    | 214 | 	 * 
 | 
  
    | 215 | 	 * 
 | 
  
    | 216 | 	 * @param 
 | 
  
    | 217 | 	 * @return array of first visible language pages with defined fields
 | 
  
    | 218 | 	 */
 | 
  
    | 219 | 	private function _getLanguagesDetailsInUsed ( $sLangKey='' ) 
 | 
  
    | 220 | 	{
 | 
  
    | 221 | 		$aRetval = array();
 | 
  
    | 222 | 		if( ($oRes = $this->_getLangInUsedDbResult($sLangKey)) ) 
 | 
  
    | 223 | 		{
 | 
  
    | 224 | 			while($page = $oRes->fetchRow(MYSQL_ASSOC))
 | 
  
    | 225 | 			{
 | 
  
    | 226 | 				if(!$this->_oApp->page_is_visible($page)) {continue;}
 | 
  
    | 227 | 				$aRetval[$page['language']] = $page;
 | 
  
    | 228 | 			}
 | 
  
    | 229 | 		}
 | 
  
    | 230 | 		return $aRetval;
 | 
  
    | 231 | 	}
 | 
  
    | 232 | 	
 | 
  
    | 233 | 	/**
 | 
  
    | 234 | 	* m_MultiLingual_Lib::getLangMenuData()
 | 
  
    | 235 | 	* 
 | 
  
    | 236 | 	* @param mixed $config
 | 
  
    | 237 | 	* @param mixed $oApp
 | 
  
    | 238 | 	* @return
 | 
  
    | 239 | 	*/
 | 
  
    | 240 | 	private function _getLangMenuData ( ) 
 | 
  
    | 241 | 	{
 | 
  
    | 242 | 		$aTplData = array();
 | 
  
    | 243 | 	// get root pages for all used languages
 | 
  
    | 244 | 		$aAllowedRootLanguages = $this->_getLanguagesDetailsInUsed( );
 | 
  
    | 245 | 		if(sizeof($aAllowedRootLanguages)>1)
 | 
  
    | 246 | 		{
 | 
  
    | 247 | 		// get all pages witch the same page_code
 | 
  
    | 248 | 			$aMatchingPages = $this->_getPageCodeValues( $this->_oApp->page['page_code'] );
 | 
  
    | 249 | 		// remove all pages from list with not avaliable languages
 | 
  
    | 250 | 			$aPossibleMatchingPages = array_intersect_key($aMatchingPages, $aAllowedRootLanguages);
 | 
  
    | 251 | 		// add Allowed root pages to possible matches
 | 
  
    | 252 | 			$aAvailablePages = array_merge($aAllowedRootLanguages, $aPossibleMatchingPages);
 | 
  
    | 253 | 			foreach ( $aAvailablePages AS $aPage)
 | 
  
    | 254 | 			{
 | 
  
    | 255 | 				$aTplData[] = array(
 | 
  
    | 256 | 				    'sIconUrl'         => $this->_oReg->AppRel . 'modules/'
 | 
  
    | 257 | 					                    . basename(dirname(__FILE__)) . '/',
 | 
  
    | 258 | 				    'bCurrentLanguage' => (($aPage['language'] == $this->_oReg->Language) ? true : false),
 | 
  
    | 259 | 				    'sTargetPageUrl'   => $this->_oReg->AppRel . $this->_oReg->PagesDir
 | 
  
    | 260 | 				                        . trim($aAvailablePages[$aPage['language']]['link'],'/')
 | 
  
    | 261 | 					                    . $this->_oReg->PageExtension,
 | 
  
    | 262 | 				    'sPageTitle'       => $aAvailablePages[$aPage['language']]['page_title'],
 | 
  
    | 263 | 				    'sFilename'        => strtolower($aAvailablePages[$aPage['language']]['language']),
 | 
  
    | 264 | 				    'sImageType'       => $this->_sExtension,
 | 
  
    | 265 | 					'sToolTip'         => $aAvailablePages[$aPage['language']]['tooltip']
 | 
  
    | 266 | 				);
 | 
  
    | 267 | 			}
 | 
  
    | 268 | 		}
 | 
  
    | 269 | 		return $aTplData;
 | 
  
    | 270 | 	}
 | 
  
    | 271 | 
 | 
  
    | 272 | 	/**
 | 
  
    | 273 | 	* m_MultiLingual_Lib::getLangMenu()
 | 
  
    | 274 | 	* 
 | 
  
    | 275 | 	* @param mixed $config
 | 
  
    | 276 | 	* @param mixed $oApp
 | 
  
    | 277 | 	* @return
 | 
  
    | 278 | 	*/
 | 
  
    | 279 | 	private function _getLangMenuTwig ( ) 
 | 
  
    | 280 | 	{
 | 
  
    | 281 | 		$loader = new Twig_Loader_Filesystem( dirname(__FILE__).$this->_aTwigLoader['templates_dir'] );
 | 
  
    | 282 | 		$twig   = new Twig_Environment( $loader );
 | 
  
    | 283 | 		$data['aTargetList']   = $this->_getLangMenuData( );
 | 
  
    | 284 | 		return $twig->render($this->_aTwigLoader['default_template'], $data);
 | 
  
    | 285 | 	}
 | 
  
    | 286 | 
 | 
  
    | 287 |     private function _detectIE()
 | 
  
    | 288 |     {
 | 
  
    | 289 |         preg_match('/MSIE (.*?);/', $_SERVER['HTTP_USER_AGENT'], $aMatches);
 | 
  
    | 290 |         if (count($aMatches)>1){
 | 
  
    | 291 |           return true;
 | 
  
    | 292 |         }
 | 
  
    | 293 |         return false;
 | 
  
    | 294 |     }
 | 
  
    | 295 |     
 | 
  
    | 296 | 	public function setExtension($sExtension = 'auto') 
 | 
  
    | 297 | 	{   
 | 
  
    | 298 | 		if($sExtension == 'auto' || $sExtension == 'svg') {
 | 
  
    | 299 | 			$this->_sExtension = ($this->_detectIE() == true) ? 'png' : 'svg';
 | 
  
    | 300 | 		} else {
 | 
  
    | 301 | 			$this->_sExtension = 'png';
 | 
  
    | 302 | 		}
 | 
  
    | 303 | 		return;
 | 
  
    | 304 | 	}
 | 
  
    | 305 |     
 | 
  
    | 306 | 	public function getLangMenu() 
 | 
  
    | 307 | 	{
 | 
  
    | 308 | 		return $this->_getLangMenuTwig ( );
 | 
  
    | 309 | 	}
 | 
  
    | 310 | 
 | 
  
    | 311 | 	public function updateDefaultPagesCode (  ) 
 | 
  
    | 312 | 	{
 | 
  
    | 313 | 		$retVal  = false;
 | 
  
    | 314 | 		$aLangs  = $this->_getLanguagesDetailsInUsed(  );
 | 
  
    | 315 | 		$entries = $this->_getPageList( 0 );
 | 
  
    | 316 | // fill page_code with page_id for default_language
 | 
  
    | 317 | 		while( list( $page_id, $val ) = each ( $entries ) )
 | 
  
    | 318 | 		{
 | 
  
    | 319 | 			if( $val['language'] == $this->_oReg->DefaultLanguage ) {
 | 
  
    | 320 | 				if( ($retVal = $this->_updatePageCode((int)$page_id, 'pages', (int)$page_id ))==false ){ break;  }
 | 
  
    | 321 | 			}
 | 
  
    | 322 | 		}
 | 
  
    | 323 | 		return $retVal;
 | 
  
    | 324 | 	}
 | 
  
    | 325 | 	
 | 
  
    | 326 | }
 |