00001 <?php
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00053 require_once(PATH_t3lib.'class.t3lib_pagetree.php');
00054 require_once(PATH_t3lib.'class.t3lib_extobjbase.php');
00055
00056
00057
00058
00066 class tx_cms_webinfo_lang extends t3lib_extobjbase {
00067
00073 function modMenu() {
00074 global $LANG;
00075
00076 $menuArray = array (
00077 'depth' => array(
00078 1 => $LANG->getLL('depth_1'),
00079 2 => $LANG->getLL('depth_2'),
00080 3 => $LANG->getLL('depth_3')
00081 ),
00082 'details' => ''
00083 );
00084
00085
00086 $lang = $this->getSystemLanguages();
00087 $menuArray['lang']=array(
00088 0 => '[All]'
00089 );
00090 foreach($lang as $langRec) {
00091 $menuArray['lang'][$langRec['uid']] = $langRec['title'];
00092 }
00093
00094 return $menuArray;
00095 }
00096
00102 function main() {
00103 global $BACK_PATH,$LANG,$SOBE;
00104
00105 if ($this->pObj->id) {
00106 $theOutput = '';
00107
00108
00109 $h_func = t3lib_BEfunc::getFuncMenu($this->pObj->id,'SET[depth]',$this->pObj->MOD_SETTINGS['depth'],$this->pObj->MOD_MENU['depth'],'index.php');
00110 $h_func.= t3lib_BEfunc::getFuncMenu($this->pObj->id,'SET[lang]',$this->pObj->MOD_SETTINGS['lang'],$this->pObj->MOD_MENU['lang'],'index.php');
00111 $h_func.= t3lib_BEfunc::getFuncCheck($this->pObj->id,'SET[details]',$this->pObj->MOD_SETTINGS['details'],'index.php').' Details';
00112 $theOutput.= $h_func;
00113
00114
00115 $theOutput.= t3lib_BEfunc::cshItem('_MOD_web_info','lang',$GLOBALS['BACK_PATH'],'|<br/>');
00116
00117
00118
00119 $treeStartingPoint = intval($this->pObj->id);
00120 $treeStartingRecord = t3lib_BEfunc::getRecordWSOL('pages', $treeStartingPoint);
00121 $depth = $this->pObj->MOD_SETTINGS['depth'];
00122
00123
00124 $tree = t3lib_div::makeInstance('t3lib_pageTree');
00125 $tree->init('AND '.$GLOBALS['BE_USER']->getPagePermsClause(1));
00126 $tree->addField('l18n_cfg');
00127
00128
00129 $HTML = t3lib_iconWorks::getIconImage('pages', $treeStartingRecord, $GLOBALS['BACK_PATH'],'align="top"');
00130 $tree->tree[] = array(
00131 'row' => $treeStartingRecord,
00132 'HTML'=>$HTML
00133 );
00134
00135
00136 $tree->getTree($treeStartingPoint, $depth, '');
00137 #debug($tree->tree);
00138
00139
00140 $css_content = '
00141 TABLE#langTable {
00142 margin-top: 10px;
00143 }
00144 TABLE#langTable TR TD {
00145 padding-left : 2px;
00146 padding-right : 2px;
00147 white-space: nowrap;
00148 }
00149 TD.c-blocked { background-color: red; }
00150 TD.c-ok { background-color: #669966; }
00151 TD.c-fallback { }
00152 TD.c-leftLine {border-left: 2px solid black; }
00153 .bgColor5 { font-weight: bold; }
00154 ';
00155 $marker = '';
00156 $this->pObj->content = str_replace($marker,$css_content.chr(10).$marker,$this->pObj->content);
00157
00158
00159 $theOutput.= $this->renderL10nTable($tree);
00160 }
00161
00162 return $theOutput;
00163 }
00164
00171 function renderL10nTable(&$tree) {
00172 global $LANG;
00173
00174
00175 $languages = $this->getSystemLanguages();
00176
00177
00178 $titleLen = $GLOBALS['BE_USER']->uc['titleLen'];
00179
00180
00181 $output = '';
00182 $newOL_js = array();
00183 $langRecUids = array();
00184 foreach($tree->tree as $data) {
00185 $tCells = array();
00186 $langRecUids[0][] = $data['row']['uid'];
00187
00188
00189 $tCells[] = '<td'.($data['row']['_CSSCLASS'] ? ' class="'.$data['row']['_CSSCLASS'].'"' : '').'>'.
00190 $data['HTML'].
00191 htmlspecialchars(t3lib_div::fixed_lgd_cs($data['row']['title'],$titleLen)).
00192 (strcmp($data['row']['nav_title'],'') ? ' [Nav: <em>'.htmlspecialchars(t3lib_div::fixed_lgd_cs($data['row']['nav_title'],$titleLen)).'</em>]' : '').
00193 '</td>';
00194
00195
00196
00197 $viewPageLink= '<a href="#" onclick="'.
00198 htmlspecialchars(t3lib_BEfunc::viewOnClick($data['row']['uid'],$GLOBALS['BACK_PATH'],'','','','&L=###LANG_UID###')).'">'.
00199 '<img'.t3lib_iconWorks::skinImg($GLOBALS['BACK_PATH'],'gfx/zoom.gif','width="12" height="12"').' title="'.$LANG->getLL('lang_renderl10n_viewPage','1').'" border="0" alt="" />'.
00200 '</a>';
00201 $status = $data['row']['l18n_cfg']&1 ? 'c-blocked' : 'c-ok';
00202
00203
00204 $info = '';
00205 $editUid = $data['row']['uid'];
00206 $params = '&edit[pages]['.$editUid.']=edit';
00207 $info.= '<a href="#" onclick="'.htmlspecialchars(t3lib_BEfunc::editOnClick($params,$GLOBALS['BACK_PATH'])).'">'.
00208 '<img'.t3lib_iconWorks::skinImg($GLOBALS['BACK_PATH'],'gfx/edit2.gif','width="11" height="12"').' title="'.$LANG->getLL('lang_renderl10n_editDefaultLanguagePage','1').'" border="0" alt="" />'.
00209 '</a>';
00210 $info.= '<a href="#" onclick="'.htmlspecialchars('top.loadEditId('.intval($data['row']['uid']).',"&SET[language]=0"); return false;').'">'.
00211 '<img'.t3lib_iconWorks::skinImg($GLOBALS['BACK_PATH'],'gfx/edit_page.gif','width="12" height="12"').' title="'.$LANG->getLL('lang_renderl10n_editPage','1').'" border="0" alt="" />'.
00212 '</a>';
00213 $info.= str_replace('###LANG_UID###','0',$viewPageLink);
00214
00215 $info.= ' ';
00216 $info.= $data['row']['l18n_cfg']&1 ? '<span title="'.$LANG->sL('LLL:EXT:cms/locallang_tca.php:pages.l18n_cfg.I.1','1').'">D</span>' : ' ';
00217 $info.= t3lib_div::hideIfNotTranslated($data['row']['l18n_cfg']) ? '<span title="'.$LANG->sL('LLL:EXT:cms/locallang_tca.php:pages.l18n_cfg.I.2','1').'">N</span>' : ' ';
00218
00219
00220 $tCells[] = '<td class="'.$status.' c-leftLine">'.$info.'</td>';
00221 $tCells[] = '<td class="'.$status.'" title="'.$LANG->getLL('lang_renderl10n_CEcount','1').'" align="center">'.$this->getContentElementCount($data['row']['uid'],0).'</td>';
00222
00223
00224 foreach($languages as $langRow) {
00225 if ($this->pObj->MOD_SETTINGS['lang']==0 || (int)$this->pObj->MOD_SETTINGS['lang']===(int)$langRow['uid']) {
00226 $row = $this->getLangStatus($data['row']['uid'], $langRow['uid']);
00227 $info = '';
00228
00229 if (is_array($row)) {
00230 $langRecUids[$langRow['uid']][] = $row['uid'];
00231 $status = $row['_HIDDEN'] ? (t3lib_div::hideIfNotTranslated($data['row']['l18n_cfg']) || $data['row']['l18n_cfg']&1 ? 'c-blocked' : 'c-fallback') : 'c-ok';
00232 $icon = t3lib_iconWorks::getIconImage(
00233 'pages_language_overlay',
00234 $row,
00235 $GLOBALS['BACK_PATH'],
00236 'align="top" class="c-recIcon"'
00237 );
00238
00239 $info = $icon.
00240 htmlspecialchars(t3lib_div::fixed_lgd_cs($row['title'],$titleLen)).
00241 (strcmp($row['nav_title'],'') ? ' [Nav: <em>'.htmlspecialchars(t3lib_div::fixed_lgd_cs($row['nav_title'],$titleLen)).'</em>]' : '').
00242 ($row['_COUNT']>1 ? '<div>'.$LANG->getLL('lang_renderl10n_badThingThereAre','1').'</div>':'');
00243 $tCells[] = '<td class="'.$status.' c-leftLine">'.
00244 $info.
00245 ($this->pObj->MOD_SETTINGS['details'] ? $this->getLocalizedElementInfo($data['row']['uid'],$langRow['uid']) : '').
00246 '</td>';
00247
00248
00249 $info = '';
00250 $editUid = $row['uid'];
00251 $params = '&edit[pages_language_overlay]['.$editUid.']=edit';
00252 $info.= '<a href="#" onclick="'.htmlspecialchars(t3lib_BEfunc::editOnClick($params,$GLOBALS['BACK_PATH'])).'">'.
00253 '<img'.t3lib_iconWorks::skinImg($GLOBALS['BACK_PATH'],'gfx/edit2.gif','width="11" height="12"').' title="'.$LANG->getLL('lang_renderl10n_editLanguageOverlayRecord','1').'" border="0" alt="" />'.
00254 '</a>';
00255
00256 $info.= '<a href="#" onclick="'.htmlspecialchars('top.loadEditId('.intval($data['row']['uid']).',"&SET[language]='.$langRow['uid'].'"); return false;').'">'.
00257 '<img'.t3lib_iconWorks::skinImg($GLOBALS['BACK_PATH'],'gfx/edit_page.gif','width="12" height="12"').' title="'.$LANG->getLL('lang_renderl10n_editPageLang','1').'" border="0" alt="" />'.
00258 '</a>';
00259 $info.= str_replace('###LANG_UID###',$langRow['uid'],$viewPageLink);
00260
00261 $tCells[] = '<td class="'.$status.'">'.$info.'</td>';
00262 $tCells[] = '<td class="'.$status.'" title="'.$LANG->getLL('lang_renderl10n_CEcount','1').'" align="center">'.$this->getContentElementCount($data['row']['uid'],$langRow['uid']).'</td>';
00263 } else {
00264 $status = t3lib_div::hideIfNotTranslated($data['row']['l18n_cfg']) || $data['row']['l18n_cfg']&1 ? 'c-blocked' : 'c-fallback';
00265 $tCells[] = '<td class="'.$status.' c-leftLine"> </td>';
00266 $tCells[] = '<td class="'.$status.'"> </td>';
00267
00268 $info = '';
00269 $info.= '<input type="checkbox" name="newOL['.$langRow['uid'].']['.$data['row']['uid'].']" value="1" />';
00270 $newOL_js[$langRow['uid']].= '
00271 +(document.webinfoForm[\'newOL['.$langRow['uid'].']['.$data['row']['uid'].']\'].checked ? \'&edit[pages_language_overlay]['.$data['row']['uid'].']=new\' : \'\')
00272 ';
00273 $tCells[] = '<td class="'.$status.'">'.$info.'</td>';
00274 }
00275 }
00276 }
00277
00278 $output.= '
00279 <tr class="bgColor4">
00280 '.implode('
00281 ',$tCells).'
00282 </tr>';
00283 }
00284
00285
00286 $tCells = array();
00287 $tCells[] = '<td>'.$LANG->getLL('lang_renderl10n_page','1').':</td>';
00288
00289 if (is_array($langRecUids[0])) {
00290 $params = '&edit[pages]['.implode(',',$langRecUids[0]).']=edit&columnsOnly=title,nav_title,l18n_cfg,hidden';
00291 $editIco = '<a href="#" onclick="'.htmlspecialchars(t3lib_BEfunc::editOnClick($params,$GLOBALS['BACK_PATH'])).'">
00292 <img'.t3lib_iconWorks::skinImg($GLOBALS['BACK_PATH'],'gfx/edit2.gif','width="11" height="12"').' title="'.$LANG->getLL('lang_renderl10n_editPageProperties','1').'" border="0" alt="" />
00293 </a>';
00294 } else $editIco = '';
00295 $tCells[] = '<td class="c-leftLine" colspan="2">'.
00296 $LANG->getLL('lang_renderl10n_default','1').':'.
00297 $editIco.
00298 '</td>';
00299
00300 foreach($languages as $langRow) {
00301 if ($this->pObj->MOD_SETTINGS['lang']==0 || (int)$this->pObj->MOD_SETTINGS['lang']===(int)$langRow['uid']) {
00302
00303 $tCells[] = '<td class="c-leftLine">'.htmlspecialchars($langRow['title']).'</td>';
00304
00305
00306 if (is_array($langRecUids[$langRow['uid']])) {
00307 $params = '&edit[pages_language_overlay]['.implode(',',$langRecUids[$langRow['uid']]).']=edit&columnsOnly=title,nav_title,hidden';
00308 $tCells[] = '<td><a href="#" onclick="'.htmlspecialchars(t3lib_BEfunc::editOnClick($params,$GLOBALS['BACK_PATH'])).'">
00309 <img'.t3lib_iconWorks::skinImg($GLOBALS['BACK_PATH'],'gfx/edit2.gif','width="11" height="12"').' title="'.$LANG->getLL('lang_renderl10n_editLangOverlays','1').'" border="0" alt="" />
00310 </a></td>';
00311 } else {
00312 $tCells[] = '<td> </td>';
00313 }
00314
00315
00316 $params = "'".$newOL_js[$langRow['uid']]."+'&columnsOnly=title,hidden,sys_language_uid&defVals[pages_language_overlay][sys_language_uid]=".$langRow['uid'];
00317 $tCells[] = '<td><a href="#" onclick="'.htmlspecialchars(t3lib_BEfunc::editOnClick($params,$GLOBALS['BACK_PATH'])).'">
00318 <img'.t3lib_iconWorks::skinImg($GLOBALS['BACK_PATH'],'gfx/new_el.gif','width="11" height="12"').' title="'.$LANG->getLL('lang_getlangsta_createNewTranslationHeaders','1').'" border="0" alt="" />
00319 </a></td>';
00320 }
00321 }
00322
00323 $output = '
00324 <tr class="bgColor5">
00325 '.implode('
00326 ',$tCells).'
00327 </tr>'.$output;
00328
00329 $output = '
00330
00331 <table border="0" cellspacing="0" cellpadding="0" id="langTable">'.$output.'
00332 </table>';
00333
00334 return $output;
00335 }
00336
00342 function getSystemLanguages() {
00343 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
00344 '*',
00345 'sys_language',
00346 '1'.t3lib_BEfunc::deleteClause('sys_language')
00347 );
00348
00349 $outputArray = array();
00350 while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
00351 $outputArray[] = $row;
00352 }
00353
00354 return $outputArray;
00355 }
00356
00364 function getLangStatus($pageId, $langId) {
00365 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
00366 '*',
00367 'pages_language_overlay',
00368 'pid='.intval($pageId).
00369 ' AND sys_language_uid='.intval($langId).
00370 t3lib_BEfunc::deleteClause('pages_language_overlay').
00371 t3lib_BEfunc::versioningPlaceholderClause('pages_language_overlay')
00372 );
00373
00374 $row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res);
00375 if (is_array($row)) {
00376 t3lib_BEfunc::workspaceOL('pages_language_overlay',$row);
00377 $row['_COUNT'] = $GLOBALS['TYPO3_DB']->sql_num_rows($res);
00378 $row['_HIDDEN'] = $row['hidden'] ||
00379 (intval($row['endtime']) > 0 && intval($row['endtime']) < time()) ||
00380 (time() < intval($row['starttime']));
00381 }
00382
00383 return $row;
00384 }
00385
00393 function getLocalizedElementInfo($pageId,$sysLang) {
00394 global $TCA;
00395
00396 $info = '<hr/>';
00397 foreach($TCA as $table => $cfg) {
00398 if ($table!='pages' && $TCA[$table]['ctrl']['languageField'] && $TCA[$table]['ctrl']['transOrigPointerField']) {
00399 # $info.='<h3>'.$table.'</h3>';
00400 if ($TCA[$table]['ctrl']['transOrigPointerTable']) {
00401 #$info.='Table "'.$table.'" is skipped because it had a transOrigPointerTable set which is not supported - yet.';
00402 } else {
00403
00404
00405 $allRows = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows(
00406 '*',
00407 $table,
00408 'pid='.intval($pageId).
00409 ' AND '.$TCA[$table]['ctrl']['languageField'].'<=0'.
00410 t3lib_BEfunc::deleteClause($table).
00411 t3lib_BEfunc::versioningPlaceholderClause($table)
00412 );
00413 if (count($allRows)) {
00414 $info.='<h3>'.$table.'</h3>';
00415
00416 $info.='[<b>'.$TCA[$table]['ctrl']['languageField'].'</b>]';
00417 $info.='[<b>'.$TCA[$table]['ctrl']['transOrigPointerField'].'</b>]';
00418 $info.='[<b>'.$TCA[$table]['ctrl']['transOrigDiffSourceField'].'</b>]';
00419
00420
00421 $translationsUids = array(0);
00422 foreach($allRows as $row) {
00423 $info.='UID:'.$row['uid'].'/lang:'.$row[$TCA[$table]['ctrl']['languageField']].' has translations:';
00424 $translations = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows(
00425 '*',
00426 $table,
00427 'pid='.intval($pageId).
00428 ' AND '.$TCA[$table]['ctrl']['languageField'].'='.intval($sysLang).
00429 ' AND '.$TCA[$table]['ctrl']['transOrigPointerField'].'='.intval($row['uid']).
00430 t3lib_BEfunc::deleteClause($table).
00431 t3lib_BEfunc::versioningPlaceholderClause($table)
00432 );
00433
00434 foreach($translations as $c => $tr) {
00435 $info.=($c>0 ? 'UPS!!':'').'['.$tr['uid'].'],';
00436 $translationsUids[] = $tr['uid'];
00437 }
00438
00439
00440
00441 $info.='<br/>';
00442 }
00443
00444
00445 $lostTranslations = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows(
00446 'uid',
00447 $table,
00448 'pid='.intval($pageId).
00449 ' AND '.$TCA[$table]['ctrl']['languageField'].'='.intval($sysLang).
00450 ' AND uid NOT IN ('.implode(',',$translationsUids).')'.
00451 t3lib_BEfunc::deleteClause($table).
00452 t3lib_BEfunc::versioningPlaceholderClause($table)
00453 );
00454 if (count($lostTranslations)) {
00455 $info.=t3lib_div::view_array($lostTranslations);
00456 }
00457 }
00458 }
00459 }
00460 }
00461 return $info;
00462 }
00463
00471 function getContentElementCount($pageId,$sysLang) {
00472 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
00473 'count(*)',
00474 'tt_content',
00475 'pid='.intval($pageId).
00476 ' AND sys_language_uid='.intval($sysLang).
00477 t3lib_BEfunc::deleteClause('tt_content').
00478 t3lib_BEfunc::versioningPlaceholderClause('tt_content')
00479 );
00480
00481 list($count) = $GLOBALS['TYPO3_DB']->sql_fetch_row($res);
00482 return $count ? $count : '-';
00483 }
00484 }
00485
00486
00487 if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/cms/web_info/class.tx_cms_webinfo_lang.php']) {
00488 include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/cms/web_info/class.tx_cms_webinfo_lang.php']);
00489 }
00490 ?>