diff --git a/css/styles.css b/css/styles.css index 6b866843541..b737181d01b 100644 --- a/css/styles.css +++ b/css/styles.css @@ -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}; \ No newline at end of file diff --git a/lib/base.php b/lib/base.php index 3f1bb6f3149..10d59a9d0d6 100644 --- a/lib/base.php +++ b/lib/base.php @@ -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); diff --git a/lib/filestorage.php b/lib/filestorage.php index 3d0bdf4cc0e..429961b3d69 100644 --- a/lib/filestorage.php +++ b/lib/filestorage.php @@ -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 diff --git a/lib/filesystem.php b/lib/filesystem.php index 03fbecdc4c0..2b5c3a56b6e 100644 --- a/lib/filesystem.php +++ b/lib/filesystem.php @@ -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; + + } } ?> diff --git a/lib/search.php b/lib/search.php new file mode 100644 index 00000000000..ef82e225f3d --- /dev/null +++ b/lib/search.php @@ -0,0 +1,121 @@ +. + * + */ + + +/** + * 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(); +?> \ No newline at end of file diff --git a/lib/template.php b/lib/template.php index 75e4303ff6a..0d6776aa26d 100644 --- a/lib/template.php +++ b/lib/template.php @@ -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()); diff --git a/search/appinfo/app.php b/search/appinfo/app.php new file mode 100644 index 00000000000..44834498fec --- /dev/null +++ b/search/appinfo/app.php @@ -0,0 +1,5 @@ + 2, "id" => 'search', 'name' => 'Search' )); + +?> diff --git a/search/css/search.css b/search/css/search.css new file mode 100644 index 00000000000..df0712be03f --- /dev/null +++ b/search/css/search.css @@ -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; +} \ No newline at end of file diff --git a/search/index.php b/search/index.php new file mode 100644 index 00000000000..e6f41528ea3 --- /dev/null +++ b/search/index.php @@ -0,0 +1,55 @@ +. +* +*/ + + +// 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(); + +?> diff --git a/search/templates/index.php b/search/templates/index.php new file mode 100644 index 00000000000..7241553e7fc --- /dev/null +++ b/search/templates/index.php @@ -0,0 +1,17 @@ +
type?>
++ name?> +
++ text?> +
+