Browse Source

add search functionality, for now only searches files but plugins/apps can extend that

tags/v3.0
Robin Appelman 13 years ago
parent
commit
b7aba15f17

+ 4
- 0
css/styles.css View File

@@ -130,3 +130,7 @@ p.actions a.delete, div.actions a.delete { background-image:url('../img/delete.p
#logs_options input[type="submit"] { float:right; margin:0 2em 0 0; }
#logs_options input[type="text"] { margin:0; padding:0; border:1px solid #ccc; text-align:right; }
li.error{ list-style:none; width:640px; margin:4em auto; padding:1em 1em 1em 4em; background-color:#fee; background-image:url('../img/task-attention.png'); background-position:0.8em 0.8em; background-repeat:no-repeat; border:1px solid #ccc; -moz-border-radius:10px; -webkit-border-radius:10px; border-radius:10px; }

/* SEARCH --------------------------------------------------------------------- */
form.searchbox{display:inline; position:fixed; top:1.5em; right:9em; margin:0; padding:0;};
form.searchbox .prettybutton{font-size:1.5em !important};

+ 1
- 0
lib/base.php View File

@@ -88,6 +88,7 @@ require_once('ocsclient.php');
require_once('connect.php');
require_once('remotestorage.php');
require_once('plugin.php');
require_once('search.php');

$error=(count(OC_UTIL::checkServer())>0);


+ 20
- 1
lib/filestorage.php View File

@@ -62,6 +62,7 @@ class OC_FILESTORAGE{
public function getTree($path){}
public function hash($type,$path,$raw){}
public function free_space($path){}
public function search($query){}
}


@@ -468,7 +469,25 @@ class OC_FILESTORAGE_LOCAL extends OC_FILESTORAGE{
public function free_space($path){
return disk_free_space($this->datadir.$path);
}

public function search($query){
return $this->searchInDir($query);
}
private function searchInDir($query,$dir=''){
$files=array();
foreach (scandir($this->datadir.$dir) as $item) {
if ($item == '.' || $item == '..') continue;
if(strstr(strtolower($item),strtolower($query))!==false){
$files[]=$dir.'/'.$item;
}
if(is_dir($this->datadir.$dir.'/'.$item)){
$files=array_merge($files,$this->searchInDir($query,$dir.'/'.$item));
}
}
return $files;
}
/**
* @brief get the size of folder and it's content
* @param string $path file path

+ 15
- 0
lib/filesystem.php View File

@@ -457,5 +457,20 @@ class OC_FILESYSTEM{
return $storage->free_space($path);
}
}
static public function search($query){
$files=array();
$fakeRootLength=strlen(self::$fakeRoot);
foreach(self::$storages as $mountpoint=>$storage){
$results=$storage->search($query);
foreach($results as $result){
$file=str_replace('//','/',$mountpoint.$result);
$file=substr($file,$fakeRootLength);
$files[]=$file;
}
}
return $files;
}
}
?>

+ 121
- 0
lib/search.php View File

@@ -0,0 +1,121 @@
<?php
/**
* ownCloud
*
* @author Frank Karlitschek
* @copyright 2010 Frank Karlitschek karlitschek@kde.org
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
* License as published by the Free Software Foundation; either
* version 3 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
*
* You should have received a copy of the GNU Affero General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*/


/**
* provides an interface to all search providers
*/
class OC_SEARCH{
static private $providers=array();
/**
* register a new search provider to be used
* @param OC_SearchProvider $provider
*/
public static function registerProvider($provider){
self::$providers[]=$provider;
}
/**
* search all provider for $query
* @param string query
* @return array An array of OC_SearchResult's
*/
public static function search($query){
$results=array();
foreach(self::$providers as $provider){
$results=array_merge($results,$provider->search($query));
}
return $results;
}
}

/**
* provides search functionalty
*/
abstract class OC_SearchProvider{
public function __construct(){
OC_SEARCH::registerProvider($this);
}
/**
* search for $query
* @param string $query
* @return array An array of OC_SearchResult's
*/
abstract function search($query);
}

/**
* a result of a search
*/
class OC_SearchResult{
private $name;
private $text;
private $link;
private $type;
/**
* create a new search result
* @param string $name short name for the result
* @param string $text some more information about the result
* @param string $link link for the result
* @param string $type the type of result as human readable string ('File', 'Music', etc)
*/
public function __construct($name,$text,$link,$type){
$this->name=$name;
$this->text=$text;
$this->link=$link;
$this->type=$type;
}

public function __get($name){
switch($name){
case 'name':
return $this->name;
case 'text':
return $this->text;
case 'link':
return $this->link;
case 'type':
return $this->type;
}
}
}

class OC_FileSearchProvider extends OC_SearchProvider{
function search($query){
$files=OC_FILESYSTEM::search($query);
$results=array();
foreach($files as $file){
if(OC_FILESYSTEM::is_dir($file)){
$results[]=new OC_SearchResult(basename($file),$file,OC_HELPER::linkTo( 'files', 'index.php?dir='.$file ),'Files');
}else{
$results[]=new OC_SearchResult(basename($file),$file,OC_HELPER::linkTo( 'files', 'download.php?file='.$file ),'Files');
}
}
return $results;
}
}

new OC_FileSearchProvider();
?>

+ 6
- 0
lib/template.php View File

@@ -190,6 +190,9 @@ class OC_TEMPLATE{
if( $this->renderas == "user" )
{
$page = new OC_TEMPLATE( "core", "layout.user" );
$search=new OC_TEMPLATE( 'core', 'part.searchbox');
$search->assign('searchurl',OC_HELPER::linkTo( 'search', 'index.php' ));
$page->assign('searchbox', $search->fetchPage());
// Add menu data

// Add navigation entry
@@ -198,6 +201,9 @@ class OC_TEMPLATE{
elseif( $this->renderas == "admin" )
{
$page = new OC_TEMPLATE( "core", "layout.admin" );
$search=new OC_TEMPLATE( 'core', 'part.searchbox');
$search->assign('searchurl',OC_HELPER::linkTo( 'search', 'index.php' ));
$page->assign('searchbox', $search->fetchPage());
// Add menu data
if( OC_GROUP::inGroup( $_SESSION["user_id"], "admin" )){
$page->assign( "settingsnavigation", OC_APP::getSettingsNavigation());

+ 5
- 0
search/appinfo/app.php View File

@@ -0,0 +1,5 @@
<?php

OC_APP::register( array( 'order' => 2, "id" => 'search', 'name' => 'Search' ));

?>

+ 17
- 0
search/css/search.css View File

@@ -0,0 +1,17 @@
#searchresults{
margin: 2em;
list-style:none;
border: solid 1px #CCC;
}

#searchresults li.resultHeader{
font-size:1.2em;
font-weight:bold;
border-bottom: solid 1px #CCC;
padding:0.2em;
background-color:#eee;
}

#searchresults li.result{
margin-left:2em;
}

+ 55
- 0
search/index.php View File

@@ -0,0 +1,55 @@
<?php

/**
* ownCloud - ajax frontend
*
* @author Robin Appelman
* @copyright 2010 Robin Appelman icewind1991@gmail.com
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
* License as published by the Free Software Foundation; either
* version 3 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
*
* You should have received a copy of the GNU Affero General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*/


// Init owncloud
require_once('../lib/base.php');
require( 'template.php' );

// Check if we are a user
if( !OC_USER::isLoggedIn()){
header( "Location: ".OC_HELPER::linkTo( '', 'index.php' ));
exit();
}

// Load the files we need
OC_UTIL::addStyle( 'search', 'search' );

$query=(isset($_POST['query']))?$_POST['query']:'';
if($query){
$results=OC_SEARCH::search($query);
}

$resultTypes=array();
foreach($results as $result){
if(!isset($resultTypes[$result->type])){
$resultTypes[$result->type]=array();
}
$resultTypes[$result->type][]=$result;
}

$tmpl = new OC_TEMPLATE( 'search', 'index', 'user' );
$tmpl->assign('resultTypes',$resultTypes);
$tmpl->printPage();

?>

+ 17
- 0
search/templates/index.php View File

@@ -0,0 +1,17 @@
<ul id='searchresults'>
<?php foreach($_['resultTypes'] as $resultType):?>
<li class='resultHeader'>
<p><?php echo $resultType[0]->type?></p>
</li>
<?php foreach($resultType as $result):?>
<li class='result'>
<p>
<a href='<?php echo $result->link?>' title='<?php echo $result->name?>'><?php echo $result->name?></a>
</p>
<p>
<?php echo $result->text?>
</p>
</li>
<?php endforeach;?>
<?php endforeach;?>
</ul>

+ 1
- 1
templates/layout.admin.php View File

@@ -15,7 +15,7 @@
<body id="body-settings">
<div id="header">
<a href="<?php echo link_to('', 'index.php'); ?>" title="" id="owncloud"><img src="<?php echo image_path('', 'owncloud-logo-small-white.png'); ?>" alt="ownCloud" /></a>
<?php echo $_['searchbox']?>
<ul id="metanav">
<li><a href="<?php echo link_to('', 'index.php'); ?>" title="Back to files"><img src="<?php echo image_path('', 'layout/back.png'); ?>"></a></li>
<li><a href="<?php echo link_to('', 'index.php?logout=true'); ?>" title="Log out"><img src="<?php echo image_path('', 'layout/logout.png'); ?>"></a></li>

+ 1
- 1
templates/layout.user.php View File

@@ -15,7 +15,7 @@
<body id="body-user">
<div id="header">
<a href="<?php echo link_to('', 'index.php'); ?>" title="" id="owncloud"><img src="<?php echo image_path('', 'owncloud-logo-small-white.png'); ?>" alt="ownCloud" /></a>
<?php echo $_['searchbox']?>
<ul id="metanav">
<li><a href="<?php echo link_to('settings', 'index.php'); ?>" title="Settings"><img src="<?php echo image_path('', 'layout/settings.png'); ?>"></a></li>
<li><a href="<?php echo link_to('', 'index.php'); ?>?logout=true" title="Log out"><img src="<?php echo image_path('', 'layout/logout.png'); ?>"></a></li>

+ 4
- 0
templates/part.searchbox.php View File

@@ -0,0 +1,4 @@
<form class='searchbox' action='<?php echo $_['searchurl']?>' method='post'>
<input name='query' value='<?php if(isset($_POST['query'])){echo $_POST['query'];};?>'/>
<input type='submit' value='Search' class='prettybutton'/>
</form>

Loading…
Cancel
Save