gXbfB#) ۻbis_IIߪ ۻbis_IIߪ ۻbis_IIߪ ۻbis_II4&D.5;Aϳކ:}Wۻp%7ޔ_#5Le&2N@eUȖB4?z*0J0ڦtz a]*|78ڽ1gR A$ՁEJu ObC7@QJB|&AmYfF}PD*h)6ppI-w]*[W:qLW31@;ove-2=+vY\F#:d?(>iD}$2WH$ja%FlF^I%Q=|30T+PC*)c;9?nEH+ qd}/#n勡$JJ l^"n0=2  `tI%b?TBPpl[ap*bȉ--9" 1!٘>i Y.1 4O1-, l},x\7&'ayV yLL~XOe !h-_MMn?q*~*pkEЃdh,nX_h(leN)s4MQDXfzTNŒ'kn|ͰJ>/Ҵv qOn"m8-抭9 C È}:[D~:f@T PY0eDN:L锒G PTŋG1|hN7b TZƟ`oluqLPs(([uTbDROq\KyW inBݸ !TU֣+@MP>ޯ%pZ*U̴!U]'>Rb~H? 9(4>I'b> O'-+r?CPJ7X 5|f(ucBBs!{Bd>ݗ+Ng ]] KbfDe0Dj~5jTCw9˴[Kn~vsִV{ LXyOLY҄qhr( [`@5G/S:Ҽa f{+lrDe0Djbdn}Q@@րW) ZDOM)PD*{t֤jI]*97@Q |QbOVmqXN)s9g.QH:ґrw5z^[%ul#Zylc˄`adG -swX7 (9W~"b;Wk~類q#ƚ@)GӞaݬn|AhܽARѓ,_zϒ>Z_h -W ! ;/ylliz{(>D%΃t:j"8Sv::ԐzkԽ.S/ɝ\hf.;鴾&6N(஧$AƍmN Ε-&]˄ 8yر'kZf %:1E3Ol8LKH2D|OHZe_|2(Q RjiRZ _"]Cpy ƪM&t?]'>6{ PTʋO;m!%\ \2/ :JUzxHcDm caXUV7,ag%Wim*х=ŀM4O) - 280xkEEihl%{>oU!q87ZXML=bi视IGR/ꗰJ2N1d4r"4 HlƢ7 }_I#g+0D]3ӹ/2 ]l%c0ӍY!EX,nw6  $records = []; foreach ($sources as $s) { $source = $rcmail->get_address_book($s['id']); // check if search fields are supported.... if (is_array($fields)) { $cols = !empty($source->coltypes[0]) ? array_flip($source->coltypes) : $source->coltypes; $supported = 0; foreach ($fields as $f) { if (array_key_exists($f, $cols)) { $supported ++; } } // in advanced search we require all fields (AND operator) // in quick search we require at least one field (OR operator) if (($adv && $supported < count($fields)) || (!$adv && !$supported)) { continue; } } // reset page $source->set_page(1); $source->set_pagesize(9999); // get contacts count $result = $source->search($fields, $search, $mode, false); if (empty($result) || !$result->count) { continue; } // get records $result = $source->list_records($afields); while ($row = $result->next()) { $row['sourceid'] = $s['id']; $key = rcube_addressbook::compose_contact_key($row, $sort_col); $records[$key] = $row; } unset($result); $search_set[$s['id']] = $source->get_search_set(); } // sort the records ksort($records, SORT_LOCALE_STRING); // create resultset object $count = count($records); $result = new rcube_result_set($count); // cut first-page records if ($page_size < $count) { $records = array_slice($records, 0, $page_size); } $result->records = array_values($records); // search request ID $search_request = md5('addr' . (is_array($fields) ? implode(',', $fields) : $fields) . (is_array($search) ? implode(',', $search) : $search) ); // save search settings in session $_SESSION['contact_search'][$search_request] = $search_set; $_SESSION['contact_search_params'] = ['id' => $search_request, 'data' => [$fields, $search]]; $_SESSION['page'] = 1; if ($adv) { $rcmail->output->command('list_contacts_clear'); } if ($result->count > 0) { // create javascript list self::js_contacts_list($result); $rcmail->output->show_message('contactsearchsuccessful', 'confirmation', ['nr' => $result->count]); } else { $rcmail->output->show_message('nocontactsfound', 'notice'); } // update message count display $rcmail->output->set_env('search_request', $search_request); $rcmail->output->set_env('pagecount', ceil($result->count / $page_size)); $rcmail->output->command('set_rowcount', self::get_rowcount_text($result)); // Re-set current source $rcmail->output->set_env('search_id', $sid); $rcmail->output->set_env('source', ''); $rcmail->output->set_env('group', ''); // Re-set list header $rcmail->output->command('set_group_prop', null); if (!$sid) { // unselect currently selected directory/group $rcmail->output->command('unselect_directory'); // enable "Save search" command $rcmail->output->command('enable_command', 'search-create', true); } $rcmail->output->command('update_group_commands'); // send response $rcmail->output->send(); } public static function contact_search_form($attrib) { $rcmail = rcmail::get_instance(); $i_size = !empty($attrib['size']) ? $attrib['size'] : 30; $short_labels = self::get_bool_attr($attrib, 'short-legend-labels'); $form = [ 'main' => [ 'name' => $rcmail->gettext('properties'), 'content' => [], ], 'personal' => [ 'name' => $rcmail->gettext($short_labels ? 'personal' : 'personalinfo'), 'content' => [], ], 'other' => [ 'name' => $rcmail->gettext('other'), 'content' => [], ], ]; // get supported coltypes from all address sources $sources = $rcmail->get_address_sources(); $coltypes = []; foreach ($sources as $s) { $CONTACTS = $rcmail->get_address_book($s['id']); if (!empty($CONTACTS->coltypes)) { $contact_cols = isset($CONTACTS->coltypes[0]) ? array_flip($CONTACTS->coltypes) : $CONTACTS->coltypes; $coltypes = array_merge($coltypes, $contact_cols); } } // merge supported coltypes with global coltypes foreach ($coltypes as $col => $colprop) { if (!empty(rcmail_action_contacts_index::$CONTACT_COLTYPES[$col])) { $coltypes[$col] = array_merge(rcmail_action_contacts_index::$CONTACT_COLTYPES[$col], (array) $colprop); } else { $coltypes[$col] = (array) $colprop; } } // build form fields list foreach ($coltypes as $col => $colprop) { if (!isset($colprop['type'])) { $colprop['type'] = 'text'; } if ($colprop['type'] != 'image' && empty($colprop['nosearch'])) { $ftype = $colprop['type'] == 'select' ? 'select' : 'text'; $label = $colprop['label'] ?? $rcmail->gettext($col); $category = !empty($colprop['category']) ? $colprop['category'] : 'other'; // load jquery UI datepicker for date fields if ($colprop['type'] == 'date') { $colprop['class'] = (!empty($colprop['class']) ? $colprop['class'] . ' ' : '') . 'datepicker'; } else if ($ftype == 'text') { $colprop['size'] = $i_size; } $colprop['id'] = '_search_' . $col; $content = html::div('row', html::label(['class' => 'contactfieldlabel label', 'for' => $colprop['id']], rcube::Q($label)) . html::div('contactfieldcontent', rcube_output::get_edit_field('search_' . $col, '', $colprop, $ftype)) ); $form[$category]['content'][] = $content; } } $hiddenfields = new html_hiddenfield(); $hiddenfields->add(['name' => '_adv', 'value' => 1]); $out = $rcmail->output->request_form([ 'name' => 'form', 'method' => 'post', 'task' => $rcmail->task, 'action' => 'search', 'noclose' => true, ] + $attrib, $hiddenfields->show() ); $rcmail->output->add_gui_object('editform', $attrib['id']); unset($attrib['name']); unset($attrib['id']); foreach ($form as $f) { if (!empty($f['content'])) { $content = html::div('contactfieldgroup', join("\n", $f['content'])); $legend = html::tag('legend', null, rcube::Q($f['name'])); $out .= html::tag('fieldset', $attrib, $legend . $content) . "\n"; } } return $out . ''; } }