Ejemplo n.º 1
0
/**
 * Create the search query strings for all given criteria and merge results for every mailbox
 * @param resource $imapConnection
 * @param array $mailbox_array (reference)
 * @param array $biop_array (reference)
 * @param array $unop_array (reference)
 * @param array $where_array (reference)
 * @param array $what_array (reference)
 * @param array $exclude_array (reference)
 * @param array $sub_array (reference)
 * @param array $mboxes_array selectable unformatted mailboxes names (reference)
 * @return array array(mailbox => array(UIDs))
 */
function sqimap_asearch($imapConnection, &$mailbox_array, &$biop_array, &$unop_array, &$where_array, &$what_array, &$exclude_array, &$sub_array, &$mboxes_array)
{
    $search_charset = sqimap_asearch_get_charset();
    $mbox_search = array();
    $search_string = '';
    $cur_mailbox = $mailbox_array[0];
    $cur_biop = '';
    /* Start with ALL */
    /* We loop one more time than the real array count, so the last search gets fired */
    for ($cur_crit = 0, $iCnt = count($where_array); $cur_crit <= $iCnt; ++$cur_crit) {
        if (empty($exclude_array[$cur_crit])) {
            $next_mailbox = isset($mailbox_array[$cur_crit]) ? $mailbox_array[$cur_crit] : false;
            if ($next_mailbox != $cur_mailbox) {
                $search_string = trim($search_string);
                /* Trim out last space */
                if ($cur_mailbox == 'All Folders') {
                    $search_mboxes = $mboxes_array;
                } else {
                    if (!empty($sub_array[$cur_crit - 1]) || !in_array($cur_mailbox, $mboxes_array)) {
                        $search_mboxes = sqimap_asearch_get_sub_mailboxes($cur_mailbox, $mboxes_array);
                    } else {
                        $search_mboxes = array($cur_mailbox);
                    }
                }
                foreach ($search_mboxes as $cur_mailbox) {
                    if (isset($mbox_search[$cur_mailbox])) {
                        $mbox_search[$cur_mailbox]['search'] .= ' ' . $search_string;
                    } else {
                        $mbox_search[$cur_mailbox]['search'] = $search_string;
                    }
                    $mbox_search[$cur_mailbox]['charset'] = $search_charset;
                }
                $cur_mailbox = $next_mailbox;
                $search_string = '';
            }
            if (isset($where_array[$cur_crit]) && empty($exclude_array[$cur_crit])) {
                $aCriteria = array();
                for ($crit = $cur_crit; $crit < count($where_array); $crit++) {
                    $criteria = trim(sqimap_asearch_build_criteria($where_array[$crit], $what_array[$crit], $search_charset));
                    if (!empty($criteria) && empty($exclude_array[$crit])) {
                        if (asearch_nz($mailbox_array[$crit]) == $cur_mailbox) {
                            $unop = $unop_array[$crit];
                            if (!empty($unop)) {
                                $criteria = $unop . ' ' . $criteria;
                            }
                            $aCriteria[] = array($biop_array[$crit], $criteria);
                        }
                    }
                    // unset something
                    $exclude_array[$crit] = true;
                }
                $aSearch = array();
                for ($i = 0, $iCnt = count($aCriteria); $i < $iCnt; ++$i) {
                    $cur_biop = $aCriteria[$i][0];
                    $next_biop = isset($aCriteria[$i + 1][0]) ? $aCriteria[$i + 1][0] : false;
                    if ($next_biop != $cur_biop && $next_biop == 'OR') {
                        $aSearch[] = 'OR ' . $aCriteria[$i][1];
                    } else {
                        if ($cur_biop != 'OR') {
                            $aSearch[] = 'ALL ' . $aCriteria[$i][1];
                        } else {
                            // OR only supports 2 search keys so we need to create a parenthesized list
                            $prev_biop = isset($aCriteria[$i - 1][0]) ? $aCriteria[$i - 1][0] : false;
                            if ($prev_biop == $cur_biop) {
                                $last = $aSearch[$i - 1];
                                if (!substr($last, -1) == ')') {
                                    $aSearch[$i - 1] = "(OR {$last}";
                                    $aSearch[] = $aCriteria[$i][1] . ')';
                                } else {
                                    $sEnd = '';
                                    while ($last && substr($last, -1) == ')') {
                                        $last = substr($last, 0, -1);
                                        $sEnd .= ')';
                                    }
                                    $aSearch[$i - 1] = "(OR {$last}";
                                    $aSearch[] = $aCriteria[$i][1] . $sEnd . ')';
                                }
                            } else {
                                $aSearch[] = $aCriteria[$i][1];
                            }
                        }
                    }
                }
                $search_string .= implode(' ', $aSearch);
            }
        }
    }
    return $mbox_search;
}
Ejemplo n.º 2
0
/** Print the basic search form
 */
function asearch_print_form_basic($imapConnection, &$boxes, $mailbox_array, $biop_array, $unop_array, $where_array, $what_array, $exclude_array, $sub_array)
{
    global $color;
    //Search Form
    echo "<br />\n";
    echo '<form action="' . asearch_get_href() . '" name="form_asearch">' . "\n";
    echo html_tag('table', '', 'center', $color[9], 'width="100%" cellpadding="1" cellspacing="1" border="0"');
    //echo html_tag('tr', html_tag('td', asearch_get_title_display($color, _("Search Criteria")), 'center', $color[5], 'colspan=4'));
    $row_count = count($where_array);
    for ($row_num = 0; $row_num < $row_count; $row_num++) {
        $mailbox = asearch_nz($mailbox_array[$row_num]);
        $biop = strip_tags(asearch_nz($biop_array[$row_num]));
        $unop = strip_tags(asearch_nz($unop_array[$row_num]));
        $where = strip_tags(asearch_nz($where_array[$row_num]));
        $what = asearch_nz($what_array[$row_num]);
        $exclude = strip_tags(asearch_nz($exclude_array[$row_num]));
        $sub = strip_tags(asearch_nz($sub_array[$row_num]));
        asearch_print_form_row_basic($imapConnection, $boxes, $mailbox, $biop, $unop, $where, $what, $exclude, $sub, $row_num);
    }
    echo '</table>' . "\n";
    echo '</form>' . "\n";
}
Ejemplo n.º 3
0
/** Print the basic search form
 * @param stream $imapConnection
 * @param array $boxes
 * @param array $mailbox_array
 * @param array $biop_array
 * @param array $unop_array
 * @param array $where_array
 * @param array $what_array
 * @param array $exclude_array
 * @param array $sub_array
 * @since 1.5.1
 * @private
 */
function asearch_print_form_basic($imapConnection, &$boxes, $mailbox_array, $biop_array, $unop_array, $where_array, $what_array, $exclude_array, $sub_array)
{
    global $allow_advanced_search, $search_advanced, $oTemplate, $imap_asearch_unops, $imap_asearch_options;
    $row_num = 0;
    $mailbox = asearch_nz($mailbox_array[$row_num]);
    $biop = strip_tags(asearch_nz($biop_array[$row_num]));
    $unop = strip_tags(asearch_nz($unop_array[$row_num]));
    $where = strip_tags(asearch_nz($where_array[$row_num]));
    $what = asearch_nz($what_array[$row_num]);
    $exclude = strip_tags(asearch_nz($exclude_array[$row_num]));
    $sub = strip_tags(asearch_nz($sub_array[$row_num]));
    # Build the mailbox array
    $a = array();
    if ($mailbox != 'All Folders' && !asearch_mailbox_exists($mailbox, $boxes)) {
        $a[$mailbox] = '[' . _("Missing") . '] ' . sm_encode_html_special_chars(asearch_get_mailbox_display($mailbox));
    }
    $a['All Folders'] = '[' . asearch_get_mailbox_display('All Folders') . ']';
    $a = array_merge($a, sqimap_mailbox_option_array($imapConnection, 0, $boxes, NULL));
    if ($allow_advanced_search > 1) {
        $link = '../src/search.php?advanced=' . ($search_advanced ? 0 : 1);
        $txt = $search_advanced ? _("Standard Search") : _("Advanced search");
    } else {
        $link = NULL;
        $txt = NULL;
    }
    $oTemplate->assign('allow_advanced_search', $allow_advanced_search > 1);
    $oTemplate->assign('adv_toggle_text', $txt);
    $oTemplate->assign('adv_toggle_link', $link);
    $oTemplate->assign('mailbox_options', $a);
    $oTemplate->assign('unary_options', $imap_asearch_unops);
    $oTemplate->assign('where_options', $imap_asearch_options);
    $oTemplate->assign('mailbox_sel', strtolower(sm_encode_html_special_chars($mailbox)));
    $oTemplate->assign('unary_sel', $unop);
    $oTemplate->assign('where_sel', $where);
    $oTemplate->assign('what_val', $what);
    echo '<form action="../src/search.php" name="form_asearch">' . "\n" . addHidden('smtoken', sm_generate_security_token()) . "\n";
    $oTemplate->display('search.tpl');
    echo "</form>\n";
}