diff --git a/oss/joomla/trunk/administrator/components/com_search/config.xml b/oss/joomla/trunk/administrator/components/com_search/config.xml new file mode 100644 index 00000000..89ea9e75 --- /dev/null +++ b/oss/joomla/trunk/administrator/components/com_search/config.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/oss/joomla/trunk/administrator/components/com_search/controller.php b/oss/joomla/trunk/administrator/components/com_search/controller.php new file mode 100644 index 00000000..027beb5a --- /dev/null +++ b/oss/joomla/trunk/administrator/components/com_search/controller.php @@ -0,0 +1,46 @@ +getModel( 'Search' ); + $view =& $this->getView( 'Search' ); + $view->setModel( $model, true ); + $view->display(); + } + + /** + * Reset Statistics + */ + function reset() + { + $model =& $this->getModel( 'Search' ); + $model->reset(); + $this->setRedirect('index.php?option=com_search'); + } +} \ No newline at end of file diff --git a/oss/joomla/trunk/administrator/components/com_search/helpers/index.html b/oss/joomla/trunk/administrator/components/com_search/helpers/index.html new file mode 100644 index 00000000..fa6d84e8 --- /dev/null +++ b/oss/joomla/trunk/administrator/components/com_search/helpers/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/oss/joomla/trunk/administrator/components/com_search/helpers/search.php b/oss/joomla/trunk/administrator/components/com_search/helpers/search.php new file mode 100644 index 00000000..9807a776 --- /dev/null +++ b/oss/joomla/trunk/administrator/components/com_search/helpers/search.php @@ -0,0 +1,204 @@ +getTag(); + $ignoreFile = $lang->getLanguagePath().DS.$tag.DS.$tag.'.ignore.php'; + if (file_exists($ignoreFile)) { + include $ignoreFile; + } + + // check for words to ignore + $aterms = explode( ' ', JString::strtolower( $searchword ) ); + + // first case is single ignored word + if ( count( $aterms ) == 1 && in_array( JString::strtolower( $searchword ), $search_ignore ) ) { + $ignored = true; + } + + // filter out search terms that are too small + foreach( $aterms AS $aterm ) { + if (JString::strlen( $aterm ) < 3) { + $search_ignore[] = $aterm; + } + } + + // next is to remove ignored words from type 'all' or 'any' (not exact) searches with multiple words + if ( count( $aterms ) > 1 && $searchphrase != 'exact' ) { + $pruned = array_diff( $aterms, $search_ignore ); + $searchword = implode( ' ', $pruned ); + } + + return $ignored; + } + + function limitSearchWord(&$searchword) + { + $restriction = false; + + // limit searchword to 20 characters + if ( JString::strlen( $searchword ) > 20 ) { + $searchword = JString::substr( $searchword, 0, 19 ); + $restriction = true; + } + + // searchword must contain a minimum of 3 characters + if ( $searchword && JString::strlen( $searchword ) < 3 ) { + $searchword = ''; + $restriction = true; + } + + return $restriction; + } + + function logSearch( $search_term ) + { + global $mainframe; + + $db =& JFactory::getDBO(); + + $params = &JComponentHelper::getParams( 'com_search' ); + $enable_log_searches = $params->get('enabled'); + + $search_term = $db->getEscaped( trim( $search_term) ); + + if ( @$enable_log_searches ) + { + $db =& JFactory::getDBO(); + $query = 'SELECT hits' + . ' FROM #__core_log_searches' + . ' WHERE LOWER( search_term ) = "'.$search_term.'"' + ; + $db->setQuery( $query ); + $hits = intval( $db->loadResult() ); + if ( $hits ) { + $query = 'UPDATE #__core_log_searches' + . ' SET hits = ( hits + 1 )' + . ' WHERE LOWER( search_term ) = "'.$search_term.'"' + ; + $db->setQuery( $query ); + $db->query(); + } else { + $query = 'INSERT INTO #__core_log_searches VALUES ( "'.$search_term.'", 1 )'; + $db->setQuery( $query ); + $db->query(); + } + } + } + + /** + * Prepares results from search for display + * + * @param string The source string + * @param int Number of chars to trim + * @param string The searchword to select around + * @return string + */ + function prepareSearchContent( $text, $length = 200, $searchword ) + { + // strips tags won't remove the actual jscript + $text = preg_replace( "']*>.*?'si", "", $text ); + $text = preg_replace( '/{.+?}/', '', $text); + //$text = preg_replace( '/]*>([^<]+)<\/a>/is','\2', $text ); + // replace line breaking tags with whitespace + $text = preg_replace( "'<(br[^/>]*?/|hr[^/>]*?/|/(div|h[1-6]|li|p|td))>'si", ' ', $text ); + + return SearchHelper::_smartSubstr( strip_tags( $text ), $length, $searchword ); + } + + /** + * Checks an object for search terms (after stripping fields of HTML) + * + * @param object The object to check + * @param string Search words to check for + * @param array List of object variables to check against + * @returns boolean True if searchTerm is in object, false otherwise + */ + function checkNoHtml($object, $searchTerm, $fields) { + $searchRegex = array( + '#]*>.*?#si', + '#]*>.*?#si', + '##si', + '#<[^>]*>#i' + ); + $terms = explode(' ', $searchTerm); + if(empty($fields)) return false; + foreach($fields AS $field) { + if(!isset($object->$field)) continue; + $text = $object->$field; + foreach($searchRegex As $regex) { + $text = preg_replace($regex, '', $text); + } + foreach($terms AS $term) { + if(JString::stristr($text, $term) !== false) { + return true; + } + } + } + return false; + } + + /** + * returns substring of characters around a searchword + * + * @param string The source string + * @param int Number of chars to return + * @param string The searchword to select around + * @return string + */ + function _smartSubstr($text, $length = 200, $searchword) + { + $textlen = JString::strlen($text); + $lsearchword = JString::strtolower($searchword); + $wordfound = false; + $pos = 0; + while ($wordfound === false && $pos < $textlen) { + if (($wordpos = @JString::strpos($text, ' ', $pos + $length)) !== false) { + $chunk_size = $wordpos - $pos; + } else { + $chunk_size = $length; + } + $chunk = JString::substr($text, $pos, $chunk_size); + $wordfound = JString::strpos(JString::strtolower($chunk), $lsearchword); + if ($wordfound === false) { + $pos += $chunk_size + 1; + } + } + + if ($wordfound !== false) { + return (($pos > 0) ? '... ' : '') . $chunk . ' ...'; + } else { + if (($wordpos = @JString::strpos($text, ' ', $length)) !== false) { + return JString::substr($text, 0, $wordpos) . ' ...'; + } else { + return JString::substr($text, 0, $length); + } + } + } +} diff --git a/oss/joomla/trunk/administrator/components/com_search/helpers/site.php b/oss/joomla/trunk/administrator/components/com_search/helpers/site.php new file mode 100644 index 00000000..659400e8 --- /dev/null +++ b/oss/joomla/trunk/administrator/components/com_search/helpers/site.php @@ -0,0 +1,38 @@ + \ No newline at end of file diff --git a/oss/joomla/trunk/administrator/components/com_search/models/index.html b/oss/joomla/trunk/administrator/components/com_search/models/index.html new file mode 100644 index 00000000..fa6d84e8 --- /dev/null +++ b/oss/joomla/trunk/administrator/components/com_search/models/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/oss/joomla/trunk/administrator/components/com_search/models/search.php b/oss/joomla/trunk/administrator/components/com_search/models/search.php new file mode 100644 index 00000000..ccf9e756 --- /dev/null +++ b/oss/joomla/trunk/administrator/components/com_search/models/search.php @@ -0,0 +1,122 @@ +setQuery( 'DELETE FROM #__core_log_searches' ); + $db->query(); + } + + function getItems( ) + { + global $mainframe, $option; + $db =& JFactory::getDBO(); + + $filter_order = $mainframe->getUserStateFromRequest( 'com_search.filter_order', 'filter_order', 'hits', 'cmd' ); + $filter_order_Dir = $mainframe->getUserStateFromRequest( 'com_search.filter_order_Dir', 'filter_order_Dir', '', 'word' ); + $limit = $mainframe->getUserStateFromRequest( 'global.list.limit', 'limit', $mainframe->getCfg('list_limit'), 'int' ); + $limitstart = $mainframe->getUserStateFromRequest( 'com_search.limitstart', 'limitstart', 0, 'int' ); + $search = $mainframe->getUserStateFromRequest( 'com_search.search', 'search', '', 'string' ); + $search = JString::strtolower( $search ); + $showResults = JRequest::getInt('search_results'); + + // table ordering + if ( $filter_order_Dir == 'ASC' ) { + $this->lists['order_Dir'] = 'ASC'; + } else { + $this->lists['order_Dir'] = 'DESC'; + } + $this->lists['order'] = $filter_order; + + // search filter + $this->lists['search']= $search; + + $where = array(); + if ($search) { + $where[] = 'LOWER( search_term ) LIKE '.$db->Quote( '%'.$db->getEscaped( $search, true ).'%', false ); + } + + $where = ( count( $where ) ? ' WHERE ' . implode( ' AND ', $where ) : '' ); + $orderby = ' ORDER BY '. $filter_order .' '. $filter_order_Dir .', hits DESC'; + + // get the total number of records + $query = 'SELECT COUNT(*)' + . ' FROM #__core_log_searches' + . $where; + $db->setQuery( $query ); + $total = $db->loadResult(); + + jimport( 'joomla.html.pagination' ); + $pageNav = new JPagination( $total, $limitstart, $limit ); + + $query = ' SELECT * ' + . ' FROM #__core_log_searches ' + . $where + . $orderby; + $db->setQuery( $query, $pageNav->limitstart, $pageNav->limit ); + + $rows = $db->loadObjectList(); + + JPluginHelper::importPlugin( 'search' ); + + if (!class_exists( 'JSite' )) + { + // This fools the routers in the search plugins into thinking it's in the frontend + require_once( JPATH_COMPONENT.DS.'helpers'.DS.'site.php' ); + } + + for ($i=0, $n = count($rows); $i < $n; $i++) { + // determine if number of results for search item should be calculated + // by default it is `off` as it is highly query intensive + if ( $showResults ) { + $results = $mainframe->triggerEvent( 'onSearch', array( $rows[$i]->search_term ) ); + + $count = 0; + for ($j = 0, $n2 = count( $results ); $j < $n2; $j++) { + $count += count( $results[$j] ); + } + + $rows[$i]->returns = $count; + } else { + $rows[$i]->returns = null; + } + } + + return $rows; + } +} \ No newline at end of file diff --git a/oss/joomla/trunk/administrator/components/com_search/search.php b/oss/joomla/trunk/administrator/components/com_search/search.php new file mode 100644 index 00000000..9964b045 --- /dev/null +++ b/oss/joomla/trunk/administrator/components/com_search/search.php @@ -0,0 +1,22 @@ +execute( JRequest::getCmd( 'task' ) ); +$controller->redirect(); \ No newline at end of file diff --git a/oss/joomla/trunk/administrator/components/com_search/search.xml b/oss/joomla/trunk/administrator/components/com_search/search.xml new file mode 100644 index 00000000..4c829243 --- /dev/null +++ b/oss/joomla/trunk/administrator/components/com_search/search.xml @@ -0,0 +1,12 @@ + + + Search + Joomla! Project + 2006 + Copyright (C) 2005 - 2008 Open Source Matters. All rights reserved. + http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL + admin@joomla.org + www.joomla.org + 1.5.0 + DESCSEARCH + diff --git a/oss/joomla/trunk/administrator/components/com_search/views/index.html b/oss/joomla/trunk/administrator/components/com_search/views/index.html new file mode 100644 index 00000000..fa6d84e8 --- /dev/null +++ b/oss/joomla/trunk/administrator/components/com_search/views/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/oss/joomla/trunk/administrator/components/com_search/views/search/index.html b/oss/joomla/trunk/administrator/components/com_search/views/search/index.html new file mode 100644 index 00000000..fa6d84e8 --- /dev/null +++ b/oss/joomla/trunk/administrator/components/com_search/views/search/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/oss/joomla/trunk/administrator/components/com_search/views/search/tmpl/default.php b/oss/joomla/trunk/administrator/components/com_search/views/search/tmpl/default.php new file mode 100644 index 00000000..bfaaeec8 --- /dev/null +++ b/oss/joomla/trunk/administrator/components/com_search/views/search/tmpl/default.php @@ -0,0 +1,89 @@ + + +
+ + + + + + +
+ : + + + + + : + enabled ? ''. JText::_( 'Enabled' ) .'' : ''. JText::_( 'Disabled' ) .'' ?> + + + showResults ) : ?> + + + + +
+ +
+ + + + + + + showResults ) : ?> + + + + + + + + + + + items); $i < $n; $i++) { + $row =& $this->items[$i]; + ?> + + + + + showResults ) : ?> + + + + + +
+ + + lists['order_Dir'], @$this->lists['order'] ); ?> + + lists['order_Dir'], @$this->lists['order'] ); ?> + + +
+ pageNav->getListFooter(); ?> +
+ pageNav->limitstart; ?> + + search_term, ENT_QUOTES, 'UTF-8'); ?> + + hits; ?> + + returns; ?> +
+
+ + + + + +
\ No newline at end of file diff --git a/oss/joomla/trunk/administrator/components/com_search/views/search/tmpl/index.html b/oss/joomla/trunk/administrator/components/com_search/views/search/tmpl/index.html new file mode 100644 index 00000000..fa6d84e8 --- /dev/null +++ b/oss/joomla/trunk/administrator/components/com_search/views/search/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/oss/joomla/trunk/administrator/components/com_search/views/search/view.php b/oss/joomla/trunk/administrator/components/com_search/views/search/view.php new file mode 100644 index 00000000..8e43bb66 --- /dev/null +++ b/oss/joomla/trunk/administrator/components/com_search/views/search/view.php @@ -0,0 +1,64 @@ +setTitle(JText::_('Search Statistics')); + + $limit = $mainframe->getUserStateFromRequest( 'global.list.limit', 'limit', $mainframe->getCfg('list_limit'), 'int' ); + $limitstart = $mainframe->getUserStateFromRequest( 'com_search.limitstart', 'limitstart', 0, 'int' ); + + $model = $this->getModel(); + $items = $model->getItems(); + $params = &JComponentHelper::getParams( 'com_search' ); + $enabled = $params->get('enabled'); + JHTML::_('behavior.tooltip'); + jimport('joomla.html.pagination'); + $pageNav = new JPagination( count($items), $limitstart, $limit ); + + $showResults = JRequest::getInt('search_results'); + + $search = $mainframe->getUserStateFromRequest( 'com_search.search', 'search', '', 'string' ); + + $this->assignRef('items', $items); + $this->assignRef('enabled', $enabled); + $this->assignRef('pageNav', $pageNav); + $this->assignRef('search', $search ); + $this->assignRef('lists', $model->lists ); + + $this->assignRef('showResults', $showResults); + + parent::display($tpl); + } +} \ No newline at end of file