- Add possibility (for plugins) to filter folders lists by some additional criteria (e.g. folder type)

release-0.6
alecpl 13 years ago
parent de0a3f9b9f
commit 94bdcce081

@ -1170,13 +1170,16 @@ function rcmail_mailbox_list($attrib)
if ($type=='ul' && !$attrib['id']) if ($type=='ul' && !$attrib['id'])
$attrib['id'] = 'rcmboxlist'; $attrib['id'] = 'rcmboxlist';
if (empty($attrib['folder_name']))
$attrib['folder_name'] = '*';
// get mailbox list // get mailbox list
$mbox_name = $RCMAIL->imap->get_mailbox_name(); $mbox_name = $RCMAIL->imap->get_mailbox_name();
// build the folders tree // build the folders tree
if (empty($a_mailboxes)) { if (empty($a_mailboxes)) {
// get mailbox list // get mailbox list
$a_folders = $RCMAIL->imap->list_mailboxes(); $a_folders = $RCMAIL->imap->list_mailboxes('', $attrib['folder_name'], $attrib['folder_filter']);
$delimiter = $RCMAIL->imap->get_hierarchy_delimiter(); $delimiter = $RCMAIL->imap->get_hierarchy_delimiter();
$a_mailboxes = array(); $a_mailboxes = array();
@ -1223,10 +1226,13 @@ function rcmail_mailbox_select($p = array())
$p += array('maxlength' => 100, 'realnames' => false); $p += array('maxlength' => 100, 'realnames' => false);
$a_mailboxes = array(); $a_mailboxes = array();
if (empty($p['folder_name']))
$p['folder_name'] = '*';
if ($p['unsubscribed']) if ($p['unsubscribed'])
$list = $RCMAIL->imap->list_unsubscribed(); $list = $RCMAIL->imap->list_unsubscribed('', $p['folder_name'], $p['folder_filter']);
else else
$list = $RCMAIL->imap->list_mailboxes(); $list = $RCMAIL->imap->list_mailboxes('', $p['folder_name'], $p['folder_filter']);
$delimiter = $RCMAIL->imap->get_hierarchy_delimiter(); $delimiter = $RCMAIL->imap->get_hierarchy_delimiter();

@ -3014,18 +3014,20 @@ class rcube_imap
* Public method for listing subscribed folders * Public method for listing subscribed folders
* *
* @param string $root Optional root folder * @param string $root Optional root folder
* @param string $filter Optional filter for mailbox listing * @param string $name Optional name pattern
* @param string $filter Optional filter
* *
* @return array List of mailboxes/folders * @return array List of mailboxes/folders
* @access public * @access public
*/ */
function list_mailboxes($root='', $filter='*') function list_mailboxes($root='', $name='*', $filter=null)
{ {
$a_mboxes = $this->_list_mailboxes($root, $filter); $a_mboxes = $this->_list_mailboxes($root, $name, $filter);
// INBOX should always be available // INBOX should always be available
if (!in_array('INBOX', $a_mboxes)) if ((!$filter || $filter == 'mail') && !in_array('INBOX', $a_mboxes)) {
array_unshift($a_mboxes, 'INBOX'); array_unshift($a_mboxes, 'INBOX');
}
// sort mailboxes // sort mailboxes
$a_mboxes = $this->_sort_mailbox_list($a_mboxes); $a_mboxes = $this->_sort_mailbox_list($a_mboxes);
@ -3038,23 +3040,31 @@ class rcube_imap
* Private method for mailbox listing * Private method for mailbox listing
* *
* @param string $root Optional root folder * @param string $root Optional root folder
* @param string $filter Optional filter for mailbox listing * @param string $name Optional name pattern
* @param mixed $filter Optional filter
*
* @return array List of mailboxes/folders * @return array List of mailboxes/folders
* @see rcube_imap::list_mailboxes() * @see rcube_imap::list_mailboxes()
* @access private * @access private
*/ */
private function _list_mailboxes($root='', $filter='*') private function _list_mailboxes($root='', $name='*', $filter=null)
{ {
$cache_key = 'mailboxes';
if (!empty($filter)) {
$cache_key .= ':'.substr((is_string($filter) ? $filter : serialize($filter)), 0, 90);
}
// get cached folder list // get cached folder list
$a_mboxes = $this->get_cache('mailboxes'); $a_mboxes = $this->get_cache($cache_key);
if (is_array($a_mboxes)) if (is_array($a_mboxes)) {
return $a_mboxes; return $a_mboxes;
}
$a_defaults = $a_out = array(); $a_defaults = $a_out = array();
// Give plugins a chance to provide a list of mailboxes // Give plugins a chance to provide a list of mailboxes
$data = rcmail::get_instance()->plugins->exec_hook('mailboxes_list', $data = rcmail::get_instance()->plugins->exec_hook('mailboxes_list',
array('root' => $root, 'filter' => $filter, 'mode' => 'LSUB')); array('root' => $root, 'name' => $name, 'filter' => $filter, 'mode' => 'LSUB'));
if (isset($data['folders'])) { if (isset($data['folders'])) {
$a_folders = $data['folders']; $a_folders = $data['folders'];
@ -3065,7 +3075,7 @@ class rcube_imap
// #1486225: Some dovecot versions returns wrong result using LIST-EXTENDED // #1486225: Some dovecot versions returns wrong result using LIST-EXTENDED
if (!$config->get('imap_force_lsub') && $this->get_capability('LIST-EXTENDED')) { if (!$config->get('imap_force_lsub') && $this->get_capability('LIST-EXTENDED')) {
// This will also set mailbox options, LSUB doesn't do that // This will also set mailbox options, LSUB doesn't do that
$a_folders = $this->conn->listMailboxes($root, $filter, $a_folders = $this->conn->listMailboxes($root, $name,
NULL, array('SUBSCRIBED')); NULL, array('SUBSCRIBED'));
// remove non-existent folders // remove non-existent folders
@ -3081,15 +3091,16 @@ class rcube_imap
} }
// retrieve list of folders from IMAP server using LSUB // retrieve list of folders from IMAP server using LSUB
else { else {
$a_folders = $this->conn->listSubscribed($root, $filter); $a_folders = $this->conn->listSubscribed($root, $name);
} }
} }
if (!is_array($a_folders) || !sizeof($a_folders)) if (!is_array($a_folders) || !sizeof($a_folders)) {
$a_folders = array(); $a_folders = array();
}
// write mailboxlist to cache // write mailboxlist to cache
$this->update_cache('mailboxes', $a_folders); $this->update_cache($cache_key, $a_folders);
return $a_folders; return $a_folders;
} }
@ -3099,21 +3110,24 @@ class rcube_imap
* Get a list of all folders available on the IMAP server * Get a list of all folders available on the IMAP server
* *
* @param string $root IMAP root dir * @param string $root IMAP root dir
* @param string $filter Optional filter for mailbox listing * @param string $name Optional name pattern
* @param mixed $filter Optional filter
*
* @return array Indexed array with folder names * @return array Indexed array with folder names
*/ */
function list_unsubscribed($root='', $filter='*') function list_unsubscribed($root='', $name='*', $filter=null)
{ {
// @TODO: caching
// Give plugins a chance to provide a list of mailboxes // Give plugins a chance to provide a list of mailboxes
$data = rcmail::get_instance()->plugins->exec_hook('mailboxes_list', $data = rcmail::get_instance()->plugins->exec_hook('mailboxes_list',
array('root' => $root, 'filter' => $filter, 'mode' => 'LIST')); array('root' => $root, 'name' => $name, 'filter' => $filter, 'mode' => 'LIST'));
if (isset($data['folders'])) { if (isset($data['folders'])) {
$a_mboxes = $data['folders']; $a_mboxes = $data['folders'];
} }
else { else {
// retrieve list of folders from IMAP server // retrieve list of folders from IMAP server
$a_mboxes = $this->conn->listMailboxes($root, $filter); $a_mboxes = $this->conn->listMailboxes($root, $name);
} }
if (!is_array($a_mboxes)) { if (!is_array($a_mboxes)) {
@ -3121,8 +3135,9 @@ class rcube_imap
} }
// INBOX should always be available // INBOX should always be available
if (!in_array('INBOX', $a_mboxes)) if ((!$filter || $filter == 'mail') && !in_array('INBOX', $a_mboxes)) {
array_unshift($a_mboxes, 'INBOX'); array_unshift($a_mboxes, 'INBOX');
}
// filter folders and sort them // filter folders and sort them
$a_mboxes = $this->_sort_mailbox_list($a_mboxes); $a_mboxes = $this->_sort_mailbox_list($a_mboxes);
@ -3263,7 +3278,7 @@ class rcube_imap
// clear cache // clear cache
$this->clear_message_cache($mailbox.'.msg'); $this->clear_message_cache($mailbox.'.msg');
$this->clear_cache('mailboxes'); $this->clear_cache('/^mailboxes.*/', true);
} }
return $result; return $result;
@ -3305,7 +3320,7 @@ class rcube_imap
// clear mailbox-related cache // clear mailbox-related cache
$this->clear_message_cache($mailbox.'.msg'); $this->clear_message_cache($mailbox.'.msg');
$this->clear_cache('mailboxes'); $this->clear_cache('/^mailboxes.*/', true);
} }
return $result; return $result;
@ -3777,22 +3792,36 @@ class rcube_imap
/** /**
* Clears the cache. * Clears the cache.
* *
* @param string $key Cache key * @param string $key Cache key name or pattern
* @param boolean $pattern_mode Enable it to clear all keys with name
* matching PREG pattern in $key
* @access public * @access public
*/ */
function clear_cache($key=NULL) function clear_cache($key=null, $pattern_mode=false)
{ {
if (!$this->caching_enabled) if (!$this->caching_enabled)
return; return;
if ($key===NULL) { if ($key === null) {
foreach ($this->cache as $key => $data) foreach (array_keys($this->cache) as $key)
$this->_clear_cache_record($key); $this->_clear_cache_record($key);
$this->cache = array(); $this->cache = array();
$this->cache_changed = false; $this->cache_changed = false;
$this->cache_changes = array(); $this->cache_changes = array();
} }
else if ($pattern_mode) {
foreach (array_keys($this->cache) as $k) {
if (preg_match($key, $k)) {
$this->_clear_cache_record($k);
$this->cache_changes[$k] = false;
unset($this->cache[$key]);
}
}
if (!count($this->cache)) {
$this->cache_changed = false;
}
}
else { else {
$this->_clear_cache_record($key); $this->_clear_cache_record($key);
$this->cache_changes[$key] = false; $this->cache_changes[$key] = false;

@ -24,7 +24,7 @@ $check_all = !empty($_GET['_refresh']) || (bool)$RCMAIL->config->get('check_all_
// list of folders to check // list of folders to check
if ($check_all) { if ($check_all) {
$a_mailboxes = $IMAP->list_mailboxes(); $a_mailboxes = $IMAP->list_mailboxes('', '*', 'mail');
} }
else { else {
$a_mailboxes = (array) $current; $a_mailboxes = (array) $current;

@ -1297,7 +1297,10 @@ function rcmail_editor_selector($attrib)
function rcmail_store_target_selection($attrib) function rcmail_store_target_selection($attrib)
{ {
$attrib['name'] = '_store_target'; $attrib['name'] = '_store_target';
$select = rcmail_mailbox_select(array_merge($attrib, array('noselection' => '- '.rcube_label('dontsave').' -'))); $select = rcmail_mailbox_select(array_merge($attrib, array(
'noselection' => '- '.rcube_label('dontsave').' -',
'folder_filter' => 'mail'
)));
return $select->show($_SESSION['compose']['param']['sent_mbox'], $attrib); return $select->show($_SESSION['compose']['param']['sent_mbox'], $attrib);
} }

@ -19,7 +19,7 @@
*/ */
$a_folders = $IMAP->list_mailboxes(); $a_folders = $IMAP->list_mailboxes('', '*', 'mail');
if (!empty($a_folders)) if (!empty($a_folders))
{ {

@ -28,7 +28,7 @@
<div id="mailboxlist-container"> <div id="mailboxlist-container">
<div id="mailboxlist-title" class="boxtitle"><roundcube:label name="mailboxlist" /></div> <div id="mailboxlist-title" class="boxtitle"><roundcube:label name="mailboxlist" /></div>
<div class="boxlistcontent"> <div class="boxlistcontent">
<roundcube:object name="mailboxlist" id="mailboxlist" /> <roundcube:object name="mailboxlist" id="mailboxlist" folder_filter="mail" />
</div> </div>
<div class="boxfooter"> <div class="boxfooter">
<roundcube:button name="mailboxmenulink" id="mailboxmenulink" type="link" title="folderactions" class="button groupactions" onclick="rcmail_ui.show_popup('mailboxmenu');return false" content=" " /> <roundcube:button name="mailboxmenulink" id="mailboxmenulink" type="link" title="folderactions" class="button groupactions" onclick="rcmail_ui.show_popup('mailboxmenu');return false" content=" " />

@ -28,7 +28,7 @@
<roundcube:button command="delete" type="link" class="buttonPas delete" classAct="button delete" classSel="button deleteSel" title="deletemessage" content=" " /> <roundcube:button command="delete" type="link" class="buttonPas delete" classAct="button delete" classSel="button deleteSel" title="deletemessage" content=" " />
<roundcube:container name="toolbar" id="messagetoolbar" /> <roundcube:container name="toolbar" id="messagetoolbar" />
<roundcube:button name="messagemenulink" id="messagemenulink" type="link" class="button messagemenu" title="messageactions" onclick="rcmail_ui.show_popup('messagemenu');return false" content=" " /> <roundcube:button name="messagemenulink" id="messagemenulink" type="link" class="button messagemenu" title="messageactions" onclick="rcmail_ui.show_popup('messagemenu');return false" content=" " />
<roundcube:object name="mailboxlist" type="select" noSelection="moveto" maxlength="25" onchange="rcmail.command('moveto', this.options[this.selectedIndex].value)" class="mboxlist" /> <roundcube:object name="mailboxlist" type="select" noSelection="moveto" maxlength="25" onchange="rcmail.command('moveto', this.options[this.selectedIndex].value)" class="mboxlist" folder_filter="mail" />
</div> </div>
<roundcube:include file="/includes/replyallmenu.html" /> <roundcube:include file="/includes/replyallmenu.html" />

@ -42,7 +42,7 @@
<div id="mailboxlist-container"> <div id="mailboxlist-container">
<div class="boxtitle"><roundcube:label name="mailboxlist" /></div> <div class="boxtitle"><roundcube:label name="mailboxlist" /></div>
<div class="boxlistcontent"> <div class="boxlistcontent">
<roundcube:object name="mailboxlist" id="mailboxlist" maxlength="25" /> <roundcube:object name="mailboxlist" id="mailboxlist" folder_filter="mail" />
</div> </div>
<div class="boxfooter"> <div class="boxfooter">
<roundcube:button name="mailboxmenulink" id="mailboxmenulink" type="link" title="folderactions" class="button groupactions" onclick="rcmail_ui.show_popup('mailboxmenu');return false" content=" " /> <roundcube:button name="mailboxmenulink" id="mailboxmenulink" type="link" title="folderactions" class="button groupactions" onclick="rcmail_ui.show_popup('mailboxmenu');return false" content=" " />

Loading…
Cancel
Save