function rex_copyRevisionContent($article_id, $clang, $from_revision_id, $to_revision_id, $from_re_sliceid = 0, $to_revision_delete = FALSE) { global $REX; if ($to_revision_delete) { $dc = new rex_sql(); // $dc->debugsql = 1; $dc->setQuery('delete from ' . $REX['TABLE_PREFIX'] . 'article_slice where article_id=' . $article_id . ' and clang=' . $clang . ' and revision=' . $to_revision_id); } if ($from_revision_id == $to_revision_id) { return false; } $gc = new rex_sql(); // $gc->debugsql = 1; $gc->setQuery("select * from " . $REX['TABLE_PREFIX'] . "article_slice where re_article_slice_id='{$from_re_sliceid}' and article_id='{$article_id}' and clang='{$clang}' and revision='{$from_revision_id}'"); if ($gc->getRows() == 1) { // letzt slice_id des ziels holen .. $glid = new rex_sql(); // $glid->debugsql = 1; $glid->setQuery("\n\t\t\t\t\tselect \n\t\t\t\t\t\tr1.id, r1.re_article_slice_id\n\t from \n\t\t\t\t\t\t" . $REX['TABLE_PREFIX'] . "article_slice as r1\n\t\t\t\t\tleft join " . $REX['TABLE_PREFIX'] . "article_slice as r2 on r1.id = r2.re_article_slice_id\n\t where \n\t\t\t\t\t\tr1.article_id = {$article_id} and r1.clang = {$clang} and \n\t\t\t\t\t\tr2.id is NULL and \n\t\t\t\t\t\tr1.revision='{$to_revision_id}';"); if ($glid->getRows() == 1) { $to_last_slice_id = $glid->getValue("r1.id"); } else { $to_last_slice_id = 0; } $ins = new rex_sql(); // $ins->debugsql = 1; $ins->setTable($REX['TABLE_PREFIX'] . "article_slice"); $cols = new rex_sql(); $cols->setquery("SHOW COLUMNS FROM " . $REX['TABLE_PREFIX'] . "article_slice"); for ($j = 0; $j < $cols->rows; $j++, $cols->next()) { $colname = $cols->getValue("Field"); if ($colname == "re_article_slice_id") { $value = $to_last_slice_id; } elseif ($colname == "revision") { $value = $to_revision_id; } elseif ($colname == "createdate") { $value = time(); } elseif ($colname == "updatedate") { $value = time(); } elseif ($colname == "createuser") { $value = $REX["USER"]->getValue("login"); } elseif ($colname == "updateuser") { $value = $REX["USER"]->getValue("login"); } else { $value = $gc->getValue($colname); } if ($colname != "id") { $ins->setValue($colname, $ins->escape($value)); } } $ins->insert(); // id holen und als re setzen und weitermachen.. rex_copyRevisionContent($article_id, $clang, $from_revision_id, $to_revision_id, $gc->getValue("id")); return true; } rex_generateArticle($article_id); return true; }
/** * Executes the search. * * @param string $_search * * @return array */ function search($_search) { $startTime = microtime(true); $this->searchString = trim(stripslashes($_search)); $keywordCount = $this->parseSearchString($this->searchString); if (empty($this->searchString) or empty($this->searchArray)) { return array('count' => 0, 'hits' => array(), 'keywords' => array(), 'keywords' => '', 'sql' => 'No search performed.', 'blacklisted' => false, 'hash' => '', 'simwordsnewsearch' => '', 'simwords' => array(), 'time' => 0); } // ask cache if ($this->cache and $this->isCached($this->searchString)) { $this->cachedArray['time'] = microtime(true) - $startTime; if ($this->similarwords and $this->cachedArray['count'] > 0) { $this->storeKeywords($this->searchArray); } // EP registrieren rex_register_extension_point('A587_SEARCH_EXECUTED', $this->cachedArray); //var_dump($this->cachedArray['sql']); return $this->cachedArray; } $return = array(); $return['simwordsnewsearch'] = ''; $return['simwords'] = array(); if ($this->similarwords) { $simwords = array(); foreach ($this->searchArray as $keyword) { $sounds = array(); if ($this->similarwordsMode & A587_SIMILARWORDS_SOUNDEX) { $sounds[] = "soundex = '" . soundex($keyword['search']) . "'"; } if ($this->similarwordsMode & A587_SIMILARWORDS_METAPHONE) { $sounds[] = "metaphone = '" . metaphone($keyword['search']) . "'"; } if ($this->similarwordsMode & A587_SIMILARWORDS_COLOGNEPHONE) { $sounds[] = "colognephone = '" . $this->cologne_phone($keyword['search']) . "'"; } $simwords[] = sprintf("\n SELECT\n GROUP_CONCAT(DISTINCT keyword SEPARATOR ' ') as keyword,\n '%s' AS typedin,\n SUM(count) as count\n FROM `%s`\n WHERE 1\n %s\n AND (%s)", $keyword['search'], $this->tablePrefix . '587_keywords', $this->clang !== false ? 'AND (clang = ' . intval($this->clang) . ' OR clang IS NULL)' : '', implode(' OR ', $sounds)); } // simwords $simWordsSQL = new rex_sql(); foreach ($simWordsSQL->getArray(sprintf("\n %s\n GROUP BY %s\n ORDER BY SUM(count)", implode(' UNION ', $simwords), $this->similarwordsPermanent ? "''" : 'keyword, typedin')) as $simword) { $return['simwords'][$simword['typedin']] = array('keyword' => $simword['keyword'], 'typedin' => $simword['typedin'], 'count' => $simword['count']); } $newsearch = array(); foreach ($this->searchArray as $keyword) { if (preg_match($this->encodeRegex('~\\s~is'), $keyword['search'])) { $quotes = '"'; } else { $quotes = ''; } if (array_key_exists($keyword['search'], $return['simwords'])) { $newsearch[] = $quotes . $return['simwords'][$keyword['search']]['keyword'] . $quotes; } else { $newsearch[] = $quotes . $keyword['search'] . $quotes; } } $return['simwordsnewsearch'] = implode(' ', $newsearch); } if ($this->similarwordsPermanent) { $keywordCount = $this->parseSearchString($this->searchString . ' ' . $return['simwordsnewsearch']); } $searchColumns = array(); switch ($this->textMode) { case 'unmodified': $searchColumns[] = 'unchangedtext'; break; case 'both': $searchColumns[] = 'plaintext'; $searchColumns[] = 'unchangedtext'; break; default: $searchColumns[] = 'plaintext'; } $sql = new rex_sql(); $Awhere = array(); $Amatch = array(); foreach ($this->searchArray as $keyword) { // build MATCH-Array $match = sprintf("(( MATCH (`%s`) AGAINST ('%s')) * %d)", implode('`,`', $searchColumns), $sql->escape($keyword['search']), $keyword['weight']); if ($this->searchEntities) { $match .= ' + ' . sprintf("(( MATCH (`%s`) AGAINST ('%s')) * %d)", implode('`,`', $searchColumns), $sql->escape(htmlentities($keyword['search'], ENT_COMPAT, 'UTF-8')), $keyword['weight']); } $Amatch[] = $match; // build WHERE-Array if ($this->searchMode == 'match') { $AWhere[] = $match; } else { $tmpWhere = array(); foreach ($searchColumns as $searchColumn) { $tmpWhere[] = sprintf("(`%s` LIKE '%%%s%%')", $searchColumn, str_replace(array('%', '_'), array('\\%', '\\_'), $sql->escape($keyword['search']))); if ($this->searchEntities) { $tmpWhere[] = sprintf("(`%s` LIKE '%%%s%%')", $searchColumn, str_replace(array('%', '_'), array('\\%', '\\_'), $sql->escape(htmlentities($keyword['search'], ENT_COMPAT, 'UTF-8')))); } } $AWhere[] = '(' . implode(' OR ', $tmpWhere) . ')'; } /*if($this->logicalMode == ' AND ') $Awhere[] = '+*'.$keyword['search'].'*'; else $AWhere[] = '*'.$keyword['search'].'*';*/ } // build MATCH-String $match = '(' . implode(' + ', $Amatch) . ' + 1)'; // build WHERE-String $where = '(' . implode($this->logicalMode, $AWhere) . ')'; #$where = sprintf("( MATCH (%s) AGAINST ('%s' IN BOOLEAN MODE)) > 0",implode(',',$searchColumns),implode(' ',$Awhere)); // language if ($this->clang !== false) { $where .= ' AND (clang = ' . intval($this->clang) . ' OR clang IS NULL)'; } $AwhereToSearch = array(); if (array_key_exists('articles', $this->searchInIDs) and count($this->searchInIDs['articles'])) { $AwhereToSearch[] = "texttype = 'article'"; $AwhereToSearch[] = "(fid IN (" . implode(',', $this->searchInIDs['articles']) . "))"; } if (array_key_exists('categories', $this->searchInIDs) and count($this->searchInIDs['categories'])) { $AwhereToSearch[] = "(catid IN (" . implode(',', $this->searchInIDs['categories']) . ") AND ftable = '" . $sql->escape($this->tablePrefix) . "article')"; } if (array_key_exists('filecategories', $this->searchInIDs) and count($this->searchInIDs['filecategories'])) { $AwhereToSearch[] = "(catid IN (" . implode(',', $this->searchInIDs['filecategories']) . ") AND ftable = '" . $sql->escape($this->tablePrefix) . "file')"; } if (array_key_exists('db_columns', $this->searchInIDs) and count($this->searchInIDs['db_columns'])) { $AwhereToSearch[] = "texttype = 'db_column'"; $Acolumns = array(); foreach ($this->searchInIDs['db_columns'] as $table => $colArray) { foreach ($colArray as $column) { //$Acolumns[] = sprintf("(ftable = '%s' AND fcolumn = '%s' %s)", $table, $column, $strSearchArticles); $Acolumns[] = sprintf("(ftable = '%s' AND fcolumn = '%s')", $table, $column); } } $AwhereToSearch[] = '(' . implode(' OR ', $Acolumns) . ')'; } if (count($AwhereToSearch)) { if ($this->searchArticles) { $where .= " AND ((texttype = 'article') OR (" . implode(' AND ', $AwhereToSearch) . '))'; } else { $where .= ' AND (' . implode(' AND ', $AwhereToSearch) . ')'; } } if (!empty($this->where)) { $where .= ' AND (' . $this->where . ')'; } // build ORDER-BY-String $Aorder = array(); foreach ($this->order as $col => $dir) { $Aorder[] = $col . ' ' . $dir; } $selectFields = array(); if ($this->groupBy) { $selectFields[] = sprintf('(SELECT SUM%s FROM `%s` summe WHERE summe.fid = r1.fid AND summe.ftable = r1.ftable) AS RELEVANCE587', $match, $this->tablePrefix . '587_searchindex'); $selectFields[] = sprintf('(SELECT COUNT(*) FROM `%s` summe WHERE summe.fid = r1.fid AND (summe.ftable IS NULL OR summe.ftable = r1.ftable) AND (summe.fcolumn IS NULL OR summe.fcolumn = r1.fcolumn) AND summe.texttype = r1.texttype) AS COUNT587', $this->tablePrefix . '587_searchindex'); } else { $selectFields[] = $match . ' AS RELEVANCE587'; } $selectFields[] = '`id`'; $selectFields[] = '`fid`'; $selectFields[] = '`catid`'; $selectFields[] = '`ftable`'; $selectFields[] = '`fcolumn`'; $selectFields[] = '`texttype`'; $selectFields[] = '`clang`'; $selectFields[] = '`unchangedtext`'; $selectFields[] = '`plaintext`'; $selectFields[] = '`teaser`'; $selectFields[] = '`values`'; $selectFields[] = '`filename`'; $selectFields[] = '`fileext`'; if ($this->groupBy) { $query = sprintf(' SELECT SQL_CALC_FOUND_ROWS %s FROM `%s` r1 WHERE (%s) AND ( ( %s = (SELECT MAX%s FROM `%s` r2 WHERE r1.ftable = r2.ftable AND r1.fid = r2.fid %s) AND fid IS NOT NULL ) OR ftable IS NULL ) GROUP BY ftable,fid,clang ORDER BY %s LIMIT %d,%d', implode(",\n", $selectFields), $this->tablePrefix . '587_searchindex', $where, $match, $match, $this->tablePrefix . '587_searchindex', $this->clang !== false ? 'AND (clang = ' . intval($this->clang) . ' OR clang IS NULL)' : '', implode(",\n", $Aorder), $this->limit[0], $this->limit[1]); } else { $query = sprintf(' SELECT SQL_CALC_FOUND_ROWS %s FROM `%s` WHERE %s ORDER BY %s LIMIT %d,%d', implode(",\n", $selectFields), $this->tablePrefix . '587_searchindex', $where, implode(",\n", $Aorder), $this->limit[0], $this->limit[1]); } #echo '<pre>'.$query.'</pre>'; $sqlResult = $sql->getArray($query); $indexIds = array(); $count = 0; $sqlResultCount = $sql->getArray('SELECT FOUND_ROWS() as count'); $return['count'] = intval($sqlResultCount[0]['count']); // hits $return['hits'] = array(); $i = 0; foreach ($sqlResult as $hit) { $indexIds[] = $hit['id']; $return['hits'][$i] = array(); $return['hits'][$i]['id'] = $hit['id']; $return['hits'][$i]['fid'] = $hit['fid']; if (!is_numeric($hit['fid']) and !is_null($json_decode_fid = json_decode($hit['fid'], true))) { $return['hits'][$i]['fid'] = $json_decode_fid; } $return['hits'][$i]['table'] = $hit['ftable']; $return['hits'][$i]['column'] = $hit['fcolumn']; $return['hits'][$i]['type'] = $hit['texttype']; $return['hits'][$i]['clang'] = $hit['clang']; $return['hits'][$i]['unchangedtext'] = $hit['unchangedtext']; $return['hits'][$i]['plaintext'] = $hit['plaintext']; $return['hits'][$i]['teaser'] = $this->getTeaserText($hit['plaintext']); $return['hits'][$i]['highlightedtext'] = $this->getHighlightedText($hit['plaintext']); $return['hits'][$i]['article_teaser'] = $hit['teaser']; $return['hits'][$i]['values'] = a587_config_unserialize($hit['values']); $return['hits'][$i]['filename'] = $hit['filename']; $return['hits'][$i]['fileext'] = $hit['fileext']; $i++; if ($this->groupBy) { $count += $hit['COUNT587']; } } if ($this->groupBy) { $indexIds = array(); foreach ($sql->getArray(sprintf(' SELECT id FROM `%s` WHERE %s LIMIT %d,%d', $this->tablePrefix . '587_searchindex', $where, $this->limit[0], $count)) as $hit) { $indexIds[] = $hit['id']; } } // keywords, which were searched for $return['keywords'] = $this->searchArray; $return['searchterm'] = $this->searchString; // sql $return['sql'] = $query; // was any blacklisted word searched for? $return['blacklisted'] = false; if (count($this->blacklisted) > 0) { $return['blacklisted'] = $this->blacklisted; } $return['hash'] = $this->cacheHash($this->searchString); if ($this->similarwords and $i) { $this->storeKeywords($this->searchArray); } if ($this->cache) { $this->cacheSearch(serialize($return), $indexIds); } // EP registrieren rex_register_extension_point('A587_SEARCH_EXECUTED', $return); $return['time'] = microtime(true) - $startTime; return $return; }
if (!empty($_GET['do']) and $_GET['do'] == 'incremental') { echo '<div class="rex-message" style="display:none;" id="rexsearch_generate_cancel"><div class="rex-warning"><p><span>' . $I18N->Msg('a587_settings_generate_cancel') . '</span></p></div></div>'; echo '<div class="rex-message" style="display:none;" id="rexsearch_generate_done"><div class="rex-info"><p><span>' . $I18N->Msg('a587_settings_generate_done') . '</span></p></div></div>'; echo '<div class="rex-message" id="rexsearch_generate_inprogress"><div class="rex-warning" style="background-image:url(../files/addons/rexsearch/loading.gif)"><p><span>' . $I18N->Msg('a587_settings_generate_inprogress') . '</span></p></div></div>'; echo '<h4 class="rex-hl3" id="rexsearch_generate_header">' . $I18N->Msg('a587_settings_generate_incremental') . '</h4>'; $js_output = ''; $globalcount = 0; foreach (a587_getArticleIds() as $id) { #$js_output .= 'index("art",'.$id.');'; $js_output .= 'indexArray.push(new Array("art",' . $id . '));'; $globalcount++; } if (!empty($REX['ADDON']['settings']['rexsearch']['include']) and is_array($REX['ADDON']['settings']['rexsearch']['include'])) { foreach ($REX['ADDON']['settings']['rexsearch']['include'] as $table => $columnArray) { $sql = new rex_sql(); $sql->setQuery("SELECT COUNT(*) AS count FROM `" . $sql->escape($table) . "`"); $count = intval($sql->getValue('count')); $step_width = 100; for ($i = 0; $i < $count; $i += $step_width) { foreach ($columnArray as $column) { #$js_output .= 'index("col",new Array("'.$table.'","'.$column.'"));'; $js_output .= 'indexArray.push(new Array("col",new Array("' . $table . '","' . $column . '",' . $i . ',' . $step_width . ')));'; $globalcount++; } } } } if (!empty($REX['ADDON']['settings']['rexsearch']['indexmediapool']) and intval($REX['ADDON']['settings']['rexsearch']['indexmediapool'])) { $mediaSQL = new rex_sql(); $mediaSQL->setTable($REX['TABLE_PREFIX'] . 'file'); if ($mediaSQL->select('file_id, category_id, filename')) {
/** * Erstellt eine Clang * * @param $id Id der Clang * @param $name Name der Clang * * @return TRUE bei Erfolg, sonst FALSE */ function rex_addCLang($id, $name) { global $REX; if (isset($REX['CLANG'][$id])) { return FALSE; } $REX['CLANG'][$id] = $name; $file = $REX['INCLUDE_PATH'] . "/clang.inc.php"; rex_replace_dynamic_contents($file, "\$REX['CLANG'] = " . var_export($REX['CLANG'], TRUE) . ";\n"); $add = new rex_sql(); $add->setQuery("select * from " . $REX['TABLE_PREFIX'] . "article where clang='0'"); $fields = $add->getFieldnames(); $adda = new rex_sql(); // $adda->debugsql = 1; for ($i = 0; $i < $add->getRows(); $i++) { $adda->setTable($REX['TABLE_PREFIX'] . "article"); foreach ($fields as $key => $value) { if ($value == 'pid') { echo ''; } else { if ($value == 'clang') { $adda->setValue('clang', $id); } else { if ($value == 'status') { $adda->setValue('status', '0'); } else { $adda->setValue($value, $add->escape($add->getValue($value))); } } } } $adda->insert(); $add->next(); } $add = new rex_sql(); $add->setQuery("insert into " . $REX['TABLE_PREFIX'] . "clang set id='{$id}',name='{$name}'"); // ----- EXTENSION POINT rex_register_extension_point('CLANG_ADDED', '', array('id' => $id, 'name' => $name)); return TRUE; }
/** * Verschieben eines Artikels von einer Kategorie in eine Andere * * @param int $id ArtikelId des zu verschiebenden Artikels * @param int $from_cat_id KategorieId des Artikels, der Verschoben wird * @param int $to_cat_id KategorieId in die der Artikel verschoben werden soll * * @return boolean TRUE bei Erfolg, sonst FALSE */ function rex_moveArticle($id, $from_cat_id, $to_cat_id) { global $REX; $id = (int) $id; $to_cat_id = (int) $to_cat_id; $from_cat_id = (int) $from_cat_id; if ($from_cat_id == $to_cat_id) { return false; } // Artikel in jeder Sprache verschieben foreach ($REX['CLANG'] as $clang => $clang_name) { // validierung der id & from_cat_id $from_sql = new rex_sql(); $from_sql->setQuery('select * from ' . $REX['TABLE_PREFIX'] . 'article where clang="' . $clang . '" and startpage<>1 and id="' . $id . '" and re_id="' . $from_cat_id . '"'); if ($from_sql->getRows() == 1) { // validierung der to_cat_id $to_sql = new rex_sql(); $to_sql->setQuery('select * from ' . $REX['TABLE_PREFIX'] . 'article where clang="' . $clang . '" and startpage=1 and id="' . $to_cat_id . '"'); if ($to_sql->getRows() == 1 || $to_cat_id == 0) { if ($to_sql->getRows() == 1) { $re_id = $to_sql->getValue('id'); $path = $to_sql->getValue('path') . $to_sql->getValue('id') . '|'; $catname = $to_sql->getValue('name'); } else { // In RootEbene $re_id = 0; $path = '|'; $catname = $from_sql->getValue('name'); } $art_sql = new rex_sql(); //$art_sql->debugsql = 1; $art_sql->setTable($REX['TABLE_PREFIX'] . 'article'); $art_sql->setValue('re_id', $re_id); $art_sql->setValue('path', $path); $art_sql->setValue('catname', $art_sql->escape($catname)); // Artikel als letzten Artikel in die neue Kat einfügen $art_sql->setValue('prior', '99999'); // Kopierter Artikel offline setzen $art_sql->setValue('status', '0'); $art_sql->addGlobalUpdateFields(); $art_sql->setWhere('clang="' . $clang . '" and startpage<>1 and id="' . $id . '" and re_id="' . $from_cat_id . '"'); $art_sql->update(); // Prios neu berechnen rex_newArtPrio($to_cat_id, $clang, 1, 0); rex_newArtPrio($from_cat_id, $clang, 1, 0); } else { return false; } } else { return false; } } // Caches des Artikels löschen, in allen Sprachen rex_deleteCacheArticle($id); // Caches der Kategorien löschen, da sich derin befindliche Artikel geändert haben rex_deleteCacheArticle($from_cat_id); rex_deleteCacheArticle($to_cat_id); return true; }