/** * List the extensions */ protected function listExtensions() { $rep =& $this->Template->rep; $rep->f_page = 0; // returning from submit? if ($this->filterPost('repository_action') == $rep->f_action) { // get url parameters $rep->f_tag = trim(Input::post('repository_tag')); $rep->f_type = trim(Input::post('repository_type')); $rep->f_category = trim(Input::post('repository_category')); $rep->f_state = trim(Input::post('repository_state')); $rep->f_author = trim(Input::post('repository_author')); $rep->f_order = trim(Input::post('repository_order')); $rep->f_page = trim(Input::post('repository_page')); $rep->f_find = trim(Input::post('repository_find')); $this->Session->set('repository_catalog_settings', array('repository_tag' => $rep->f_tag, 'repository_type' => $rep->f_type, 'repository_category' => $rep->f_category, 'repository_state' => $rep->f_state, 'repository_author' => $rep->f_author, 'repository_order' => $rep->f_order, 'repository_page' => $rep->f_page, 'repository_find' => $rep->f_find)); } else { $stg = $this->Session->get('repository_catalog_settings'); if (is_array($stg)) { $rep->f_tag = trim($stg['repository_tag']); $rep->f_type = trim($stg['repository_type']); $rep->f_category = trim($stg['repository_category']); $rep->f_state = trim($stg['repository_state']); $rep->f_author = trim($stg['repository_author']); $rep->f_order = trim($stg['repository_order']); $rep->f_page = trim($stg['repository_page']); $rep->f_find = trim($stg['repository_find']); } // if } // if if ($rep->f_order == '') { $rep->f_order = 'popular'; } $perpage = (int) trim(Config::get('repository_listsize')); if ($perpage < 0) { $perpage = 0; } // process parameters and build query options $options = array('languages' => $this->languages, 'sets' => 'sums,reviews'); if ($rep->f_page >= 0 && $perpage > 0) { $options['first'] = $rep->f_page * $perpage; $options['limit'] = $perpage; } // if if ($rep->f_tag != '') { $options['tags'] = $rep->f_tag; } if ($rep->f_type != '') { $options['types'] = $rep->f_type; } if ($rep->f_category != '') { $options['categories'] = $rep->f_category; } if ($rep->f_state != '') { $options['states'] = $rep->f_state; } if ($rep->f_author != '') { $options['authors'] = $rep->f_author; } if ($rep->f_find != '') { $options['find'] = $rep->f_find; } if (!Config::get('repository_unsafe_catalog')) { $options['compatibility'] = Repository::encodeVersion(VERSION . '.' . BUILD); } switch ($rep->f_order) { case 'name': break; case 'title': $options['order'] = 'title'; break; case 'author': $options['order'] = 'author'; break; case 'rating': $options['order'] = 'rating-'; break; case 'reldate': $options['order'] = 'releasedate-'; break; default: $options['order'] = 'popularity-'; } // switch // query extensions $rep->extensions = $this->getExtensionList($options); if ($rep->f_page >= 0 && $perpage > 0 && count($rep->extensions) == 0) { $rep->f_page = 0; $options['first'] = 0; $rep->extensions = $this->getExtensionList($options); } // if // add view links $totrecs = 0; foreach ($rep->extensions as &$ext) { $ext->viewLink = $this->createUrl(array('view' => $ext->name . '.' . $ext->version . '.' . $ext->language)); $ext->installLink = $this->createPageUrl('repository_manager', array('install' => $ext->name . '.' . $ext->version)); $totrecs = $ext->totrecs; } // foreach // create pages list $rep->pages = array(); if ($perpage > 0) { $first = 1; while ($totrecs > 0) { $cnt = $totrecs > $perpage ? $perpage : $totrecs; $rep->pages[] = $first . ' - ' . ($first + $cnt - 1); $first += $cnt; $totrecs -= $cnt; } // while } // if $rep->tags = $this->getTagList(array('languages' => $this->languages, 'mode' => 'initcap')); $rep->authors = $this->getAuthorList(array('languages' => $this->languages)); }
/** * Get installed extensions list. * @return array Array with the extension records. */ private function getInstalledExtensions($aIds = '') { $db =& $this->Database; // query installed extensions $exts = array(); $q = $db->execute($aIds == '' ? "select * from `tl_repository_installs` order by `extension`" : "select * from `tl_repository_installs` where `id` in ({$aIds}) order by `extension`"); while ($q->next()) { $exts[] = (object) $q->row(); } // find each highest compatible version foreach ($exts as &$ext) { $ext->tl_incompatible = false; $ext->tl_shouldwork = false; $ext->dep_missing = array(); $ext->dep_incompatible = array(); $ext->dep_shouldwork = array(); $ext->upd_version = $ext->version; $ext->upd_build = $ext->build; // query current release $elist = $this->getExtensionList(array('match' => 'exact', 'names' => $ext->extension, 'versions' => $ext->version, 'languages' => $this->languages, 'sets' => 'dependencies,history,details')); $ext->found = count($elist) > 0; if ($ext->found) { $extrec =& $elist[0]; if (isset($extrec->manual)) { $ext->manualLink = $extrec->manual; } if (isset($extrec->forum)) { $ext->forumLink = $extrec->forum; } // contao compatibility check $tlversion = Repository::encodeVersion(VERSION . '.' . BUILD); $minver = $extrec->coreminversion > 0 ? $extrec->coreminversion : $tlversion; $maxver = $extrec->coremaxversion > 0 ? $extrec->coremaxversion : $tlversion; if ($tlversion < $minver || $tlversion > $maxver) { $tlversion = intval($tlversion / 10000); $minver = intval($minver / 10000); $maxver = intval($maxver / 10000); if ($tlversion < $minver || $tlversion > $maxver) { $ext->tl_incompatible = true; } else { $ext->tl_shouldwork = true; } } // if // dependencies compatibility check if (property_exists($ext, 'dependencies')) { foreach ($ext->dependencies as &$dep) { $found = false; foreach ($exts as $e) { if ($e->extension == $dep->extension) { $found = true; $extver = $e->version; $minver = $dep->minversion > 0 ? $dep->minversion : $extver; $maxver = $dep->maxversion > 0 ? $dep->maxversion : $extver; if ($extver < $minver || $extver > $maxver) { $extver = intval($extver / 10000); $minver = intval($minver / 10000); $maxver = intval($maxver / 10000); if ($extver < $minver || $extver > $maxver) { $ext->dep_incompatible[] = array('extension' => $e->extension, 'version' => $e->version); } else { $ext->dep_shouldwork[] = array('extension' => $e->extension, 'version' => $e->version); } } // if break; } } // if if (!$found) { $ext->dep_missing[] = $dep->extension; } } // foreach } // if } else { // find any other version $elist = $this->getExtensionList(array('match' => 'exact', 'names' => $ext->extension, 'languages' => $this->languages, 'sets' => 'dependencies,history')); } // if if (count($elist) < 1) { continue; } // no other tests possible // get all available versions in descending order $vers = array(); foreach ($elist[0]->allversions as $ver) { array_unshift($vers, (object) array('version' => $ver->version, 'build' => $ver->build)); } // find highest compatible version foreach ($vers as $ver) { // status check $compatible = false; switch ($ver->version % 10) { case 0: case 1: case 2: $compatible = (int) $ext->alpha > 0; break; case 3: case 4: case 5: $compatible = (int) $ext->beta > 0; break; case 6: case 7: case 8: $compatible = (int) $ext->rc > 0; break; default: $compatible = (int) $ext->stable > 0; } // switch if (!$compatible) { continue; } // get record of this version $rec = null; if ($ver->version == $elist[0]->version) { $rec =& $elist[0]; } else { $olist = $this->getExtensionList(array('match' => 'exact', 'names' => $ext->extension, 'versions' => $ver->version, 'languages' => $this->languages, 'sets' => 'dependencies')); if (count($olist) > 0) { $rec =& $olist[0]; } } // if if ($rec == null) { continue; } // contao compatibility check $tlversion = intval(Repository::encodeVersion(VERSION . '.' . BUILD) / 10000); $minver = $rec->coreminversion > 0 ? intval($rec->coreminversion / 10000) : $tlversion; $maxver = $rec->coremaxversion > 0 ? intval($rec->coremaxversion / 10000) : $tlversion; if ($tlversion < $minver || $tlversion > $maxver) { continue; } // dependencies compatibility check if (property_exists($rec, 'dependencies')) { foreach ($rec->dependencies as &$dep) { foreach ($exts as $e) { if ($e->extension == $dep->extension) { $extver = intval($e->version / 10000); $minver = $dep->minversion > 0 ? intval($dep->minversion / 10000) : $extver; $maxver = $dep->maxversion > 0 ? intval($dep->maxversion / 10000) : $extver; if ($extver < $minver || $extver > $maxver) { $compatible = false; } break; } } // if } // foreach } // if if (!$compatible) { continue; } // $rec is the highest compatible version if ($rec->version != $ext->version || $rec->build != $ext->build) { $ext->upd_version = $rec->version; $ext->upd_build = $rec->build; } // if break; } // foreach version } // while // find display status for each extension foreach ($exts as &$ext) { $ext->status = array(); // code red if ((int) $e->error > 0) { $ext->status[] = (object) array('color' => 'red', 'text' => 'errorinstall'); } if (!$ext->found) { $ext->status[] = (object) array('color' => 'red', 'text' => 'vernotfound'); } foreach ($ext->dep_missing as $d) { $ext->status[] = (object) array('color' => 'red', 'text' => 'depmissing', 'par1' => $d); } // code yellow if ($ext->tl_incompatible) { $ext->status[] = (object) array('color' => 'darkorange', 'text' => 'notapproved', 'par1' => 'Contao', 'par2' => VERSION . '.' . BUILD); } foreach ($ext->dep_incompatible as $d) { $ext->status[] = (object) array('color' => 'darkorange', 'text' => 'notapprovedwith', 'par1' => $d->extension, 'par2' => Repository::formatVersion($d->version)); } // code blue if ($ext->upd_version != $ext->version || $ext->upd_build != $ext->build) { $ext->status[] = (object) array('text' => 'newversion', 'color' => 'blue', 'par1' => Repository::formatVersion($ext->upd_version), 'par2' => $ext->upd_build); } // code light green if ($ext->tl_shouldwork) { $ext->status[] = (object) array('color' => 'green', 'text' => 'shouldwork', 'par1' => 'Contao', 'par2' => VERSION . '.' . BUILD); } foreach ($ext->dep_shouldwork as $d) { $ext->status[] = (object) array('color' => 'green', 'text' => 'shouldwork', 'par1' => $dep->extension, 'par2' => Repository::formatVersion($dep->version)); } // code dark green if (count($ext->status) == 0) { $ext->status[] = (object) array('color' => 'green', 'text' => 'uptodate'); } if ($ext->found) { $ext->catalogLink = $this->createPageUrl('repository_catalog', array('view' => $ext->extension)); } $ext->editLink = $this->createUrl(array('edit' => $ext->extension)); if ((int) $ext->updprot == 0) { $ext->updateLink = $this->createUrl(array('install' => $ext->extension . '.' . $ext->upd_version)); } if ((int) $ext->delprot == 0) { $ext->uninstallLink = $this->createUrl(array('uninstall' => $ext->extension)); } } // while return $exts; }
/** * List the extensions */ protected function listExtensions() { $rep =& $this->Template->rep; // returning from submit? if ($this->filterPost('repository_action') == $rep->f_action) { // get url parameters $tmptag = trim($this->Input->post('repository_tag')); $tmpwildcard = trim($this->Input->post('repository_wildcardsearch')); $stg = $this->Session->get('repository_catalog_settings'); if (is_array($stg)) { $rep->f_wildcardsearch = trim($stg['repository_wildcardsearch']); $rep->f_tag = trim($stg['repository_tag']); } if ($tmptag && $tmptag != $rep->f_tag) { $rep->f_tag = trim($this->Input->post('repository_tag')); unset($rep->f_wildcardsearch); } else { if ($tmpwildcard && $tmpwildcard != $rep->f_wildcardsearch) { $rep->f_wildcardsearch = trim($this->Input->post('repository_wildcardsearch')); unset($rep->f_tag); } else { if ($tmptag == NULL && $tmpwildcard == NULL) { unset($rep->f_wildcardsearch); unset($rep->f_tag); } } } $rep->f_page = trim($this->Input->post('repository_page')); $rep->f_type = trim($this->Input->post('repository_type')); $rep->f_category = trim($this->Input->post('repository_category')); $rep->f_state = trim($this->Input->post('repository_state')); $rep->f_author = trim($this->Input->post('repository_author')); $rep->f_order = trim($this->Input->post('repository_order')); $rep->f_page = trim($this->Input->post('repository_page')); $rep->f_find = trim($this->Input->post('repository_find')); $this->Session->set('repository_catalog_settings', array('repository_tag' => $rep->f_tag, 'repository_type' => $rep->f_type, 'repository_category' => $rep->f_category, 'repository_state' => $rep->f_state, 'repository_author' => $rep->f_author, 'repository_order' => $rep->f_order, 'repository_page' => $rep->f_page, 'repository_find' => $rep->f_find, 'repository_wildcardsearch' => $rep->f_wildcardsearch)); } else { $stg = $this->Session->get('repository_catalog_settings'); if (is_array($stg)) { $rep->f_tag = trim($stg['repository_tag']); $rep->f_type = trim($stg['repository_type']); $rep->f_category = trim($stg['repository_category']); $rep->f_state = trim($stg['repository_state']); $rep->f_author = trim($stg['repository_author']); $rep->f_order = trim($stg['repository_order']); $rep->f_page = trim($stg['repository_page']); $rep->f_find = trim($stg['repository_find']); $rep->f_wildcardsearch = trim($stg['repository_wildcardsearch']); } // if } // if if ($rep->f_order == '') { $rep->f_order = 'popular'; } if ($rep->f_page < 1) { $rep->f_page = 1; } $perpage = (int) trim($GLOBALS['TL_CONFIG']['repository_listsize']); if ($perpage < 1) { $perpage = 10; } // process parameters and build query options $options = array('languages' => $this->languages, 'sets' => 'sums,reviews', 'first' => ($rep->f_page - 1) * $perpage, 'limit' => $perpage); if ($rep->f_tag != '') { $options['tags'] = $rep->f_tag; } if ($rep->f_type != '') { $options['types'] = $rep->f_type; } if ($rep->f_category != '') { $options['categories'] = $rep->f_category; } if ($rep->f_state != '') { $options['states'] = $rep->f_state; } if ($rep->f_author != '') { $options['authors'] = $rep->f_author; } if ($rep->f_find != '') { $options['find'] = $rep->f_find; } if ($rep->f_wildcardsearch != '') { unset($options[match]); // in future(ER 2.0) we want something like: $options[match] = 'fuzzy'; $options[tags] = $rep->f_wildcardsearch; unset($rep->f_tag); } switch ($rep->f_order) { case 'name': break; case 'title': $options['order'] = 'title'; break; case 'author': $options['order'] = 'author'; break; case 'rating': $options['order'] = 'rating-'; break; case 'reldate': $options['order'] = 'releasedate-'; break; default: $options['order'] = 'popularity-'; } // switch // query extensions $rep->extensions = $this->getExtensionList($options); if ($rep->f_page > 1 && count($rep->extensions) == 0) { $rep->f_page = 1; $options['first'] = 0; $rep->extensions = $this->getExtensionList($options); } // if // add view links $totrecs = 0; // Contao compatibility check $tlversion = Repository::encodeVersion(VERSION . '.' . BUILD); foreach ($rep->extensions as &$ext) { $ext->viewLink = $this->createUrl(array('view' => $ext->name . '.' . $ext->version . '.' . $ext->language)); $totrecs = $ext->totrecs; $displayversion = sprintf('%s - %s', Repository::formatCoreVersion($ext->coreminversion), Repository::formatCoreVersion($ext->coremaxversion)); if ($ext->coreminversion > 0 && $tlversion < $ext->coreminversion || $ext->coremaxversion > 0 && $tlversion > $ext->coremaxversion) { // less than current Core version $ext->status = (object) array('color' => 'darkorange', 'text' => 'notapproved', 'par1' => 'Contao', 'par2' => Repository::formatCoreVersion($tlversion)); $ext->validfor = (object) array('color' => 'red', 'version' => $displayversion); } else { if ($ext->coremaxversion > 0 && $tlversion < $ext->coremaxversion) { // greater than current Core version $ext->validfor = (object) array('color' => 'blue', 'version' => $displayversion); } else { // equal to current Core version $ext->validfor = (object) array('color' => 'green', 'version' => $displayversion); } } } // foreach $rep->pages = $totrecs > 0 ? floor(($totrecs + $perpage - 1) / $perpage) : 1; $rep->tags = $this->getTagList(array('languages' => $this->languages, 'mode' => 'initcap')); $rep->authors = $this->getAuthorList(array('languages' => $this->languages)); }