зеркало из https://github.com/nextcloud/server.git
add search functionality, for now only searches files but plugins/apps can extend that
This commit is contained in:
Родитель
8d52fdb7fa
Коммит
b7aba15f17
|
@ -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="submit"] { float:right; margin:0 2em 0 0; }
|
||||||
#logs_options input[type="text"] { margin:0; padding:0; border:1px solid #ccc; text-align:right; }
|
#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; }
|
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};
|
|
@ -88,6 +88,7 @@ require_once('ocsclient.php');
|
||||||
require_once('connect.php');
|
require_once('connect.php');
|
||||||
require_once('remotestorage.php');
|
require_once('remotestorage.php');
|
||||||
require_once('plugin.php');
|
require_once('plugin.php');
|
||||||
|
require_once('search.php');
|
||||||
|
|
||||||
$error=(count(OC_UTIL::checkServer())>0);
|
$error=(count(OC_UTIL::checkServer())>0);
|
||||||
|
|
||||||
|
|
|
@ -62,6 +62,7 @@ class OC_FILESTORAGE{
|
||||||
public function getTree($path){}
|
public function getTree($path){}
|
||||||
public function hash($type,$path,$raw){}
|
public function hash($type,$path,$raw){}
|
||||||
public function free_space($path){}
|
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){
|
public function free_space($path){
|
||||||
return disk_free_space($this->datadir.$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
|
* @brief get the size of folder and it's content
|
||||||
* @param string $path file path
|
* @param string $path file path
|
||||||
|
|
|
@ -457,5 +457,20 @@ class OC_FILESYSTEM{
|
||||||
return $storage->free_space($path);
|
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;
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
|
|
|
@ -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();
|
||||||
|
?>
|
|
@ -190,6 +190,9 @@ class OC_TEMPLATE{
|
||||||
if( $this->renderas == "user" )
|
if( $this->renderas == "user" )
|
||||||
{
|
{
|
||||||
$page = new OC_TEMPLATE( "core", "layout.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 menu data
|
||||||
|
|
||||||
// Add navigation entry
|
// Add navigation entry
|
||||||
|
@ -198,6 +201,9 @@ class OC_TEMPLATE{
|
||||||
elseif( $this->renderas == "admin" )
|
elseif( $this->renderas == "admin" )
|
||||||
{
|
{
|
||||||
$page = new OC_TEMPLATE( "core", "layout.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
|
// Add menu data
|
||||||
if( OC_GROUP::inGroup( $_SESSION["user_id"], "admin" )){
|
if( OC_GROUP::inGroup( $_SESSION["user_id"], "admin" )){
|
||||||
$page->assign( "settingsnavigation", OC_APP::getSettingsNavigation());
|
$page->assign( "settingsnavigation", OC_APP::getSettingsNavigation());
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
OC_APP::register( array( 'order' => 2, "id" => 'search', 'name' => 'Search' ));
|
||||||
|
|
||||||
|
?>
|
|
@ -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;
|
||||||
|
}
|
|
@ -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();
|
||||||
|
|
||||||
|
?>
|
|
@ -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>
|
|
@ -15,7 +15,7 @@
|
||||||
<body id="body-settings">
|
<body id="body-settings">
|
||||||
<div id="header">
|
<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>
|
<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">
|
<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'); ?>" 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>
|
<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>
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
<body id="body-user">
|
<body id="body-user">
|
||||||
<div id="header">
|
<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>
|
<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">
|
<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('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>
|
<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>
|
||||||
|
|
|
@ -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>
|
Загрузка…
Ссылка в новой задаче