/** * Main function * * @return string HTML output */ function main() { global $BE_USER, $LANG, $BACK_PATH, $TCA; $content = ''; $table = 'tx_dam'; t3lib_div::loadTCA($table); // // set language query // $this->langRows = $this->pObj->getLanguages($this->pObj->defaultPid); $this->langCurrent = intval($this->pObj->MOD_SETTINGS['tx_dam_list_langSelector']); if (!isset($this->langRows[$this->langCurrent])) { $this->langCurrent = $this->pObj->MOD_SETTINGS['tx_dam_list_langSelector'] = key($this->langRows); } $langQuery = ''; $languageField = $TCA[$table]['ctrl']['languageField']; if ($this->langCurrent and $this->pObj->MOD_SETTINGS['tx_dam_list_langOverlay'] === 'exclusive') { // if ($this->langCurrent) { This works but create NULL columns for non-translated records so we need to use language overlay anyway $lgOvlFields = tx_dam_db::getLanguageOverlayFields($table, 'tx_dam_lgovl'); $languageField = $TCA[$table]['ctrl']['languageField']; $transOrigPointerField = $TCA[$table]['ctrl']['transOrigPointerField']; $this->pObj->selection->setSelectionLanguage($this->langCurrent); $this->pObj->selection->qg->query['SELECT']['tx_dam as tx_dam_lgovl'] = implode(', ', $lgOvlFields) . ', tx_dam.uid as _dlg_uid, tx_dam.title as _dlg_title'; $this->pObj->selection->qg->query['LEFT_JOIN']['tx_dam as tx_dam_lgovl'] = 'tx_dam.uid=tx_dam_lgovl.' . $transOrigPointerField; if ($this->pObj->MOD_SETTINGS['tx_dam_list_langOverlay'] === 'exclusive') { $this->pObj->selection->qg->query['WHERE']['WHERE']['tx_dam_lgovl.' . $languageField] = 'AND tx_dam_lgovl.' . $languageField . '=' . $this->langCurrent; $this->pObj->selection->qg->query['WHERE']['WHERE']['tx_dam_lgovl.deleted'] = 'AND tx_dam_lgovl.deleted=0'; } else { $this->pObj->selection->qg->query['WHERE']['WHERE']['tx_dam_lgovl.' . $languageField] = 'AND (tx_dam_lgovl.' . $languageField . ' IN (' . $this->langCurrent . ',0,-1) )'; $this->pObj->selection->qg->query['WHERE']['WHERE']['tx_dam_lgovl.deleted'] = 'AND (tx_dam_lgovl.sys_language_uid=1 OR tx_dam.sys_language_uid=0 )'; } } else { $this->pObj->selection->qg->query['WHERE']['WHERE']['tx_dam.' . $languageField] = 'AND tx_dam.' . $languageField . ' IN (0,-1)'; } // // set query and sorting // $allFields = tx_dam_db::getFieldListForUser($table); if ($this->pObj->MOD_SETTINGS['tx_dam_list_thumbs_sortField']) { if (in_array($this->pObj->MOD_SETTINGS['tx_dam_list_thumbs_sortField'], $allFields)) { $orderBy = 'tx_dam.' . $this->pObj->MOD_SETTINGS['tx_dam_list_thumbs_sortField']; } } else { $orderBy = $TCA[$table]['ctrl']['sortby'] ? $TCA[$table]['ctrl']['sortby'] : $TCA[$table]['ctrl']['default_sortby']; $orderBy = $GLOBALS['TYPO3_DB']->stripOrderBy($orderBy); $this->pObj->MOD_SETTINGS['tx_dam_list_thumbs_sortField'] = $orderBy; } if ($this->pObj->MOD_SETTINGS['tx_dam_list_thumbs_sortRev']) { $orderBy .= ' DESC'; } $this->pObj->selection->qg->addOrderBy($orderBy); // // Use the current selection to create a query and count selected records // $this->pObj->selection->addSelectionToQuery(); $this->pObj->selection->execSelectionQuery(TRUE); // // output header: info bar, result browser, .... // $content .= $this->pObj->guiItems->getOutput('header'); $content .= $this->pObj->doc->spacer(10); // any records found? if ($this->pObj->selection->pointer->countTotal) { // TODO move to scbase (see tx_dam_browser too) if (is_array($allFields) && count($allFields)) { $fieldsSelItems = array(); foreach ($allFields as $field => $title) { $fL = is_array($TCA[$table]['columns'][$field]) ? preg_replace('#:$#', '', $GLOBALS['LANG']->sL($TCA[$table]['columns'][$field]['label'])) : '[' . $field . ']'; $fieldsSelItems[$field] = t3lib_div::fixed_lgd_cs($fL, 15); } $sortingSelector = $GLOBALS['LANG']->sL('LLL:EXT:dam/lib/locallang.xml:labelSorting', 1) . ' '; $sortingSelector .= t3lib_befunc::getFuncMenu('', 'SET[tx_dam_list_thumbs_sortField]', $this->pObj->MOD_SETTINGS['tx_dam_list_thumbs_sortField'], $fieldsSelItems); if ($this->pObj->MOD_SETTINGS['tx_dam_list_thumbs_sortRev']) { $href = t3lib_div::linkThisScript(array('SET[tx_dam_list_thumbs_sortRev]' => '0')); $sortingSelector .= '<button name="SET[tx_dam_list_thumbs_sortRev]" type="button" onclick="self.location.href=\'' . htmlspecialchars($href) . '\'">' . '<img' . t3lib_iconWorks::skinImg($BACK_PATH, 'gfx/pil2up.gif', 'width="12" height="7"') . ' alt="" />' . '</button>'; } else { $href = t3lib_div::linkThisScript(array('SET[tx_dam_list_thumbs_sortRev]' => '1')); $sortingSelector .= '<button name="SET[tx_dam_list_thumbs_sortRev]" type="button" onclick="self.location.href=\'' . htmlspecialchars($href) . '\'">' . '<img' . t3lib_iconWorks::skinImg($BACK_PATH, 'gfx/pil2down.gif', 'width="12" height="7"') . ' alt="" />' . '</button>'; } $sortingSelector = '<form action="' . htmlspecialchars(t3lib_div::linkThisScript()) . '" method="post">' . $sortingSelector . '</form>'; } $this->pObj->markers['LANGUAGE_SELECT'] = $this->pObj->languageSwitch($this->langRows, intval($this->pObj->MOD_SETTINGS['tx_dam_list_langSelector'])); $content .= $this->pObj->contentLeftRight($sortingSelector, ''); $content .= $this->pObj->doc->spacer(10); // // creates thumbnail list // // limit query for browsing $this->pObj->selection->addLimitToQuery(); $res = $this->pObj->selection->execSelectionQuery(); $showElements = array(); if ($this->pObj->MOD_SETTINGS['tx_dam_list_thumbs_showTitle']) { $showElements[] = 'title'; } if ($this->pObj->MOD_SETTINGS['tx_dam_list_thumbs_showInfo']) { $showElements[] = 'info'; } if ($this->pObj->MOD_SETTINGS['tx_dam_list_thumbs_showIcons']) { $showElements[] = 'actions'; } // extra CSS code for HTML header $this->pObj->doc->inDocStylesArray['tx_dam_SCbase_dia'] = tx_dam_guiFunc::getDiaStyles($this->diaSize, $this->diaMargin, 5); $code = ''; // // init iterator for query // $conf = array('table' => 'tx_dam', 'countTotal' => $this->pObj->selection->pointer->countTotal); if ($this->langCurrent > 0 and $this->pObj->MOD_SETTINGS['tx_dam_list_langOverlay'] !== 'exclusive') { $dbIterator = new tx_dam_iterator_db_lang_ovl($res, $conf); $dbIterator->initLanguageOverlay($table, $this->pObj->MOD_SETTINGS['tx_dam_list_langSelector']); } else { $dbIterator = new tx_dam_iterator_db($res, $conf); } if ($dbIterator->count()) { while ($dbIterator->valid() and $dbIterator->currentPointer < $this->pObj->selection->pointer->itemsPerPage) { $row = $dbIterator->current(); $onClick = $this->pObj->doc->wrapClickMenuOnIcon('', $table, $row['uid'], $listFr = 1, $addParams = '', $enDisItems = '', $returnOnClick = TRUE); $actions = $this->getItemControl($row); $code .= tx_dam_guiFunc::getDia($row, $this->diaSize, $this->diaMargin, $showElements, $onClick, true, $actions); $dbIterator->next(); } } $content .= $this->pObj->doc->spacer(5); $content .= $this->pObj->doc->section('', '<div style="line-height:' . ($this->diaSize + 7 + 8) . 'px;">' . $code . '</div><br style="clear:left" />', 0, 1); } return $content; }
/** * Make selector box for creating new translation for a record or switching to edit the record in an existing language. * Displays only languages which are available for the current page. * * @param array $langRowsLanguage records including faked record for default language * @param integer $currentLanguage uid of the current language * @param boolean $formFields If true, form-fields will be wrapped around * @return string <select> HTML element (if there were items for the box anyways...) */ function languageSwitch($langRows, $currentLanguage, $formFields = false) { $content = ''; // page available in other languages than default language? if (is_array($langRows) && count($langRows)) { $langSelItems = array(); foreach ($langRows as $lang) { $langSelItems[$lang['uid']] = $lang['title']; } // If any languages are left, make selector: if (count($langSelItems) > 1) { $content .= $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_general.xml:LGL.language', 1) . ' '; $content .= t3lib_befunc::getFuncMenu('', 'SET[tx_dam_list_langSelector]', $currentLanguage, $langSelItems); if ($currentLanguage > 0) { $content .= t3lib_befunc::getFuncMenu('', 'SET[tx_dam_list_langOverlay]', $this->MOD_SETTINGS['tx_dam_list_langOverlay'], $this->MOD_MENU['tx_dam_list_langOverlay']); } if ($formFields) { $content = '<form action="' . htmlspecialchars(t3lib_div::linkThisScript()) . '" method="post">' . $content . '</form>'; } } } return $content; }
/** * Render list of files. * * @param array List of files. See t3lib_div::getFilesInDir * @param string $mode EB mode: "db", "file", ... * @return string HTML output */ function renderFileList($files, $mode = 'file', $act = '') { global $LANG, $BACK_PATH, $TCA, $TYPO3_CONF_VARS; $out = ''; // sorting selector // TODO move to scbase (see tx_dam_list_thumbs too) $allFields = tx_dam_db::getFieldListForUser('tx_dam'); if (is_array($allFields) && count($allFields)) { $fieldsSelItems = array(); foreach ($allFields as $field => $title) { $fL = is_array($TCA['tx_dam']['columns'][$field]) ? preg_replace('#:$#', '', $GLOBALS['LANG']->sL($TCA['tx_dam']['columns'][$field]['label'])) : '[' . $field . ']'; $fieldsSelItems[$field] = t3lib_div::fixed_lgd_cs($fL, 15); } $sortingSelector = '<label>' . $GLOBALS['LANG']->sL('LLL:EXT:dam/lib/locallang.xml:labelSorting', 1) . '</label> '; $sortingSelector .= t3lib_befunc::getFuncMenu($this->addParams, 'SET[txdam_sortField]', $this->damSC->MOD_SETTINGS['txdam_sortField'], $fieldsSelItems); if ($this->damSC->MOD_SETTINGS['txdam_sortRev']) { $params = (array) $this->addParams + array('SET[txdam_sortRev]' => '0'); $href = t3lib_div::linkThisScript($params); $sortingSelector .= '<button name="SET[txdam_sortRev]" type="button" onclick="self.location.href=\'' . htmlspecialchars($href) . '\'">' . '<img' . t3lib_iconWorks::skinImg($BACK_PATH, 'gfx/pil2up.gif', 'width="12" height="7"') . ' alt="" />' . '</button>'; } else { $params = (array) $this->addParams + array('SET[txdam_sortRev]' => '1'); $href = t3lib_div::linkThisScript($params); $sortingSelector .= '<button name="SET[txdam_sortRev]" type="button" onclick="self.location.href=\'' . htmlspecialchars($href) . '\'">' . '<img' . t3lib_iconWorks::skinImg($BACK_PATH, 'gfx/pil2down.gif', 'width="12" height="7"') . ' alt="" />' . '</button>'; } $sortingSelector = $this->getFormTag('', 'sortingSelector') . $sortingSelector . '</form>'; } $out .= '<div id="medialistfunctions">'; $out .= $this->getSelectionSelector(); $out .= $this->getFormTag(); $out .= $this->damSC->getSearchBox('simple', false, '', true); $out .= '</form>'; $out .= $sortingSelector; $out .= '</div>'; $out .= $this->doc->spacer(10); $out .= $this->damSC->getResultInfoBar(); $out .= $this->doc->spacer(10); // Listing the files: if (is_array($files) and count($files)) { $displayThumbs = $this->displayThumbs(); $dragdropImage = $mode == 'rte' && ($act == 'dragdrop' || $act == 'media_dragdrop'); $addAllJS = ''; $displayItems = ''; if ($mode == 'rte' && $act == 'media') { if (t3lib_div::inList($GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['rtehtmlarea']['plugins']['TYPO3Link']['additionalAttributes'], 'usedamcolumn') && $this->thisConfig['buttons.']['link.'][$act . '.']['properties.']['title.']['useDAMColumn']) { $displayItems = $this->thisConfig['buttons.']['link.'][$act . '.']['properties.']['title.']['useDAMColumn.']['displayItems'] ? $this->thisConfig['buttons.']['link.'][$act . '.']['properties.']['title.']['useDAMColumn.']['displayItems'] : ''; } } // Traverse the file list: $lines = array(); foreach ($files as $fI) { if (!$fI['__exists']) { tx_dam::meta_updateStatus($fI); continue; } // Create file icon: $iconFile = tx_dam::icon_getFileType($fI); $iconTag = tx_dam_guiFunc::icon_getFileTypeImgTag($fI); $iconAndFilename = $iconTag . htmlspecialchars(t3lib_div::fixed_lgd_cs($fI['file_title'], max($GLOBALS['BE_USER']->uc['titleLen'], 120))); // Create links for adding the file: if (strstr($fI['file_name_absolute'], ',') || strstr($fI['file_name_absolute'], '|')) { // In case an invalid character is in the filepath, display error message: $eMsg = $LANG->JScharCode(sprintf($LANG->getLL('invalidChar'), ', |')); $ATag_insert = '<a href="#" onclick="alert(' . $eMsg . ');return false;">'; // If filename is OK, just add it: } else { // JS: insertElement(table, uid, type, filename, fpath, filetype, imagefile ,action, close) $onClick_params = implode(', ', array("'" . $fI['_ref_table'] . "'", "'" . $fI['_ref_id'] . "'", "'" . $mode . "'", t3lib_div::quoteJSvalue($fI['file_name']), t3lib_div::quoteJSvalue($fI['_ref_file_path']), "'" . $fI['file_type'] . "'", "'" . $iconFile . "'")); $titleAttrib = tx_dam_guiFunc::icon_getTitleAttribute($fI); if ($mode === 'rte' and $act === 'media') { $onClick = 'return link_folder(\'' . t3lib_div::rawUrlEncodeFP(tx_dam::file_relativeSitePath($fI['_ref_file_path'])) . '\');'; if (t3lib_div::inList($GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['rtehtmlarea']['plugins']['TYPO3Link']['additionalAttributes'], 'txdam')) { $onClick = 'browse_links_setAdditionalValue(\'txdam\', \'' . $fI['uid'] . '\');' . $onClick; } if (t3lib_div::inList($GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['rtehtmlarea']['plugins']['TYPO3Link']['additionalAttributes'], 'usedamcolumn') && $this->thisConfig['buttons.']['link.'][$act . '.']['properties.']['title.']['useDAMColumn']) { $damTitle = t3lib_div::quoteJSvalue(tx_dam_guiFunc::meta_compileHoverText($fI, $displayItems, ', ')); $onClick = 'if (document.getElementById(\'rtehtmlarea-dam-browse-links-useDAMColumn\') && document.getElementById(\'rtehtmlarea-dam-browse-links-useDAMColumn\').checked) { document.getElementById(\'rtehtmlarea-browse-links-anchor_title\').value = ' . $damTitle . '; }' . $onClick; } $ATag_insert = '<a href="#" onclick="' . htmlspecialchars($onClick) . '"' . $titleAttrib . '>'; } elseif (!$dragdropImage) { $onClick = 'return insertElement(' . $onClick_params . ');'; $ATag_add = '<a href="#" onclick="' . htmlspecialchars($onClick) . '"' . $titleAttrib . '>'; $addIcon = $ATag_add . '<img' . t3lib_iconWorks::skinImg($GLOBALS['BACK_PATH'], 'gfx/plusbullet2.gif', 'width="18" height="16"') . ' title="' . $LANG->getLL('addToList', 1) . '" alt="" /></a>'; $onClick = 'return insertElement(' . $onClick_params . ', \'\', 1);'; $ATag_insert = '<a href="#" onclick="' . htmlspecialchars($onClick) . '"' . $titleAttrib . '>'; $addAllJS .= $mode === 'rte' ? '' : 'insertElement(' . $onClick_params . '); '; } } // Create link to showing details about the file in a window: if ($fI['__exists']) { $infoOnClick = 'launchView(\'' . t3lib_div::rawUrlEncodeFP($fI['file_name_absolute']) . '\', \'\'); return false;'; $ATag_info = '<a href="#" onclick="' . htmlspecialchars($infoOnClick) . '">'; $info = $ATag_info . '<img' . t3lib_iconWorks::skinImg($GLOBALS['BACK_PATH'], 'gfx/zoom2.gif', 'width="12" height="12"') . ' title="' . $LANG->getLL('info', 1) . '" alt="" /> ' . $LANG->getLL('info', 1) . '</a>'; $info = '<span class="button">' . $info . '</span>'; } else { $info = ' '; } // Thumbnail/size generation: $clickThumb = ''; if ($displayThumbs and is_file($fI['file_name_absolute']) and tx_dam_image::isPreviewPossible($fI)) { $addAttrib = array(); $addAttrib['title'] = tx_dam_guiFunc::meta_compileHoverText($fI); $clickThumb = tx_dam_image::previewImgTag($fI, '', $addAttrib); $clickThumb = '<div class="clickThumb">' . $ATag_insert . $clickThumb . '</a>' . '</div>'; } elseif ($displayThumbs) { $clickThumb = '<div style="width:68px"></div>'; } // Image for drag & drop replaces the thumbnail if ($dragdropImage and t3lib_div::inList($TYPO3_CONF_VARS['GFX']['imagefile_ext'], $fI['file_type']) and is_file($fI['file_name_absolute'])) { if (t3lib_div::_GP('noLimit')) { $maxW = 10000; $maxH = 10000; } else { $maxW = 380; $maxH = 500; } $IW = $fI['hpixels']; $IH = $fI['vpixels']; if ($IW > $maxW) { $IH = ceil($IH / $IW * $maxW); $IW = $maxW; } if ($IH > $maxH) { $IW = ceil($IW / $IH * $maxH); $IH = $maxH; } $clickThumb = '<img src="' . t3lib_div::getIndpEnv('TYPO3_SITE_URL') . substr($fI['file_name_absolute'], strlen(PATH_site)) . '" width="' . $IW . '" height="' . $IH . '"' . ($this->defaultClass ? ' class="' . $this->defaultClass . '"' : '') . ' alt="' . $fI['alt_text'] . '" title="' . $fI[$this->imgTitleDAMColumn] . '" txdam="' . $fI['uid'] . '" />'; $clickThumb = '<div class="clickThumb2">' . $clickThumb . '</div>'; } // Show element: $lines[] = ' <tr> <td valign="middle" class="bgColor4" nowrap="nowrap" style="min-width:20em">' . ($dragdropImage ? '' : $ATag_insert) . $iconAndFilename . '</a>' . ' </td> <td valign="middle" class="bgColor4" width="1%">' . ($mode == 'rte' ? '' : $addIcon) . '</td> <td valign="middle" nowrap="nowrap" width="1%">' . $info . '</td> </tr>'; $infoText = ''; if ($this->getModSettings('extendedInfo')) { $infoText = tx_dam_guiFunc::meta_compileInfoData($fI, 'file_name, file_size:filesize, _dimensions, caption:truncate:50, instructions', 'table'); $infoText = str_replace('<table>', '<table border="0" cellpadding="0" cellspacing="1">', $infoText); $infoText = str_replace('<strong>', '<strong style="font-weight:normal;">', $infoText); $infoText = str_replace('</td><td>', '</td><td class="bgColor-10">', $infoText); } if ($displayThumbs || $dragdropImage and $infoText) { $lines[] = ' <tr class="bgColor"> <td valign="top" colspan="3"> <table border="0" cellpadding="0" cellspacing="0"><tr> <td valign="top">' . $clickThumb . '</td> <td valign="top" style="padding-left:1em">' . $infoText . '</td></tr> </table> <div style="height:0.5em;"></div> </td> </tr>'; } elseif ($clickThumb or $infoText) { $lines[] = ' <tr class="bgColor"> <td valign="top" colspan="3" style="padding-left:22px"> ' . $clickThumb . $infoText . ' <div style="height:0.5em;"></div> </td> </tr>'; } $lines[] = ' <tr> <td colspan="3"><div style="height:0.5em;"></div></td> </tr>'; } // Wrap all the rows in table tags: $out .= ' <!-- File listing --> <table border="0" cellpadding="1" cellspacing="0" id="typo3-fileList"> ' . implode('', $lines) . ' </table>'; } if ($addAllJS) { $label = $LANG->getLL('eb_addAllToList', true); $titleAttrib = ' title="' . $label . '"'; $onClick = $addAllJS . 'return true;'; $ATag_add = '<a href="#" onclick="' . htmlspecialchars($onClick) . '"' . $titleAttrib . '>'; $addIcon = $ATag_add . '<img' . t3lib_iconWorks::skinImg($GLOBALS['BACK_PATH'], 'gfx/plusbullet2.gif', 'width="18" height="16"') . ' alt="" />'; $addAllButton = '<div class="addAllButton"><span class="button"' . $titleAttrib . '>' . $ATag_add . $addIcon . $label . '</a></span></div>'; $out = $out . $addAllButton; } $out .= $this->doc->spacer(20); $out .= $this->damSC->getResultInfoBar(); // Return accumulated content for filelisting: return $out; }