false, 'is_external_catalog' => false ); var $public_functions = array( 'contacts_list' => true, ); /** * Construtor... * */ public function ui_mobilecc() { $this->nextmatchs = CreateObject('phpgwapi.nextmatchs'); } /** * Inicia um BO de catálogo do módulo de contactcenter. * @return * @param $catalog String com o catálogo */ private function set_catalog($catalog) { if(strpos($catalog,'bo_global_ldap_catalog')===false){ //Ldap? $this->bo= CreateObject("contactcenter.".$catalog); } else { $exploded = explode("#",$catalog); $this->bo= CreateObject("contactcenter.bo_global_ldap_catalog",$exploded[1],$exploded[2],$exploded[3]); if($exploded[3]==1) $this->page_info['is_external_catalog'] = true; else { $this->page_info['is_external_catalog'] = false; } } $this->page_info['actual_catalog'] = $catalog; } /** * Busca um nome a partir do catálogo. Se nenhum for informado previamente, * retorna um array vazio. * * Caso o catálogo atual seja grupos, a busca será por títulos, caso seja * contatos pessoais, será por names_ordered, se for contato no ldap, será * por cn. * * @return array, com os ids relativos a busca * @param $name string com o nome à ser buscado. */ public function find($name) { if(!$this->page_info["actual_catalog"]) return array(); if($this->page_info['actual_catalog']=="bo_group_manager") { //parametros de busca para grupos $id = 'group.id_group'; $what = array('group.title',$id); $search = "group.title"; } else { //parametros de busca para pessoas $id = 'contact.id_contact'; $search = "contact.names_ordered"; $what = array('contact.names_ordered',$id); } if ((strpos($this->page_info["actual_catalog"],'bo_global_ldap_catalog')!==false) && (!$this->page_info['is_external_catalog'])) { //Ldap do expresso, leva em conta alguns atributos do expresso array_push($what,'contact.object_class', 'contact.account_visible', 'contact.account_status' ); $rules = array( 0 => array( 'field' => 'contact.object_class', 'type' => '=', 'value' => 'phpgwAccount' ), 1 => array( 'field' => 'contact.account_status', 'type' => 'iLIKE', 'value' => '%' ), 2 => array( 'field' => 'contact.account_visible', 'type' => '!=', 'value' => '-1' ), 3 => array( 'field' => 'contact.object_class', 'type' => '=', 'value' => 'inetOrgPerson' ) ); } else{ $rules = array(); } if ($name != '') { //String em branco, não preciso adicionar essa regra array_push($rules,array( 'field' => $search, 'type' => 'iLIKE', 'value' => '%'.$name.'%' )); } $ids = $this->bo->find($what,$rules); if(is_array($ids)) foreach($ids as $id_r) { //Quero apenas os ids, como valores nas posições do array $retorno[] = $id_r[substr($id,strpos($id,".")+1)]; } return $retorno; } /** * Monta a lista de contatos na tela, de acordo com a busca. Se não foi feita * busca, mostra apenas o formulário para pesquisa. * * @return */ function contacts_list($from_calendar=false) { $entries = array(); $actual_page = 0; if(isset($_POST['name']) && strlen($_POST['name'])<2) //Busca apenas para nomes com mais de 4 palavras $ids = false; else { /////////////// Pego os ids referente a consulta, se a mesma foi feita if(isset($_POST['name'])) { $this->set_catalog($_POST['catalog']); $ids = $this->find($_POST['name']); if(is_array($ids)) { $actual_page = 1; $_SESSION["mobile_search_ids"] = $ids; $_SESSION["mobile_search_catalog"] = $_POST['catalog']; $ids = array_slice($ids,0,10); //Apenas a primeira página } } else if(isset($_GET['page'])) { $this->set_catalog($_SESSION["mobile_search_catalog"]); $ids = array_slice($_SESSION["mobile_search_ids"],($_GET['page']-1)*10,10); //Página solicitada $actual_page = $_GET['page']; } else $ids = false; } ///////////// Pego os dados dos ids da página em questão. if(!is_array($ids) || count($_SESSION["mobile_search_ids"])>100 || (isset($_POST["name"]) && strlen($_POST['name'])<2)) { $entries = array(); } else { //Só pego os dados completos caso haja resultado na busca if($this->page_info['actual_catalog']!="bo_group_manager") { //Se não for grupo, tenho que ordenar as connections $entries = $this->bo->get_multiple_entries($ids,array("names_ordered"=>true,"uidnumber"=>true,"id_contact"=>true,"connections"=>true)); /** * As entradas vindas de get_multiple_entries não vem com as connections * ordenadas. Abaixo eu ordeno o array connections de cada entrada para ter * sempre na frente os valores defaults, primeiro o default de email, depois * o de telefone. */ foreach($entries as &$valor) { /* Sempre iniciar os arrays, pois pode interferir na * ordenação atual se tiverem valores antigos desnecessários * causando erro de tamanhos inconsistentes */ $default = array(); $type = array(); foreach($valor['connections'] as $key => $value) { $default[$key] = $value['connection_is_default']; $type[$key] = $value['id_type']; } array_multisort($default, SORT_DESC, $type, SORT_ASC, $valor['connections']); }//Fim da ordenação } else { $entries = $this->bo->get_multiple_entries($ids,array("id_group"=>true,"title"=>true,"short_name"=>true)); } } ///////////////// Monto os dados gerais da página no template. $p = CreateObject('phpgwapi.Template',PHPGW_APP_TPL); if(!$from_calendar) $p->set_file(Array('entries' => 'cc_main.tpl')); else if($from_calendar =='mobilecalendar') $p->set_file(Array('entries' => 'add_participants.tpl')); else $p->set_file(Array('entries' => 'add_recipients.tpl')); $p->set_block('entries','body'); $p->set_block('entries','people_header'); $p->set_block('entries','group_header'); $p->set_block('entries','row'); $p->set_block('entries','row_group'); $p->set_block('entries','row_empty'); $p->set_block('entries','option'); $p->set_block('entries','page'); $p->set_block('entries','page_no_link'); $p->set_block('entries','row_addeds'); $texts = array( 'lang_name' => lang("Name"), 'lang_catalog' => lang("Catalog"), 'lang_search' => lang("Search") ); $p->set_var($texts); $p->set_var('lang_already_addeds:',lang('already_addeds:')); if($from_calendar == 'mobilecalendar') $p->set_var('lang_continue_scheduling',lang('continue scheduling')); else if($from_calendar == 'mobilemail'){ $p->set_var('lang_continue',lang('continue')); } /////////// Preenche o combo de catálogos $bo_cc = CreateObject("contactcenter.bo_contactcenter"); $branchs = $bo_cc->get_catalog_tree(); if(!$from_calendar || $from_calendar == 'mobilemail') { foreach($branchs as $branch) { //Pego apenas a estrutura dos ramos vindos do banco, pois as do ldap estão confusas e com dados aparentemente inconsistentes. if($branch['class']!="bo_global_ldap_catalog" && $branch['class']!="bo_catalog_group_catalog") { $p->set_var(array('option_value'=>$branch['class'],'option_text'=>$branch['name'])); if($this->page_info['actual_catalog']==$branch['class']) $p->set_var('selected','selected'); else $p->set_var('selected',''); $p->parse('options','option',True); } } } /////////// Preenche o combo, com dados do ldap $bo_ldap_manager = CreateObject("contactcenter.bo_ldap_manager"); $branchs = $bo_ldap_manager->get_all_ldap_sources(); foreach($branchs as $id=>$branch) { //Ldaps expresso $p->set_var(array('option_value'=>"bo_global_ldap_catalog#". $id."#". $branch['dn']."#". 0, 'option_text'=>$branch['name'])); //No value eu passo também o id, o contexto e se é externo, quando é um ldap if($this->page_info['actual_catalog']=="bo_global_ldap_catalog#".$id."#".$branch['dn']."#". 0) $p->set_var('selected','selected'); else $p->set_var('selected',''); $p->parse('options','option',True); } if(!$from_calendar || $from_calendar == 'mobilemail') { $branchs = $bo_ldap_manager->get_external_ldap_sources(); if(is_array($branchs)) foreach($branchs as $id=>$branch) { //Ldaps externos $p->set_var(array('option_value'=>"bo_global_ldap_catalog#". $id."#". $branch['dn']."#". 1, 'option_text'=>$branch['name'])); //No value eu passo também o id, o contexto e se é externo, quando é um ldap if($this->page_info['actual_catalog']=="bo_global_ldap_catalog#".$id."#".$branch['dn']."#". 1) $p->set_var('selected','selected'); else $p->set_var('selected',''); $p->parse('options','option',True); } } /////////// Monta o resultado da pesquisa $p->set_var('th_theme',$GLOBALS['phpgw_info']['theme']['th_bg']); if(empty($entries) && isset($_POST["name"]) && count($_SESSION["mobile_search_ids"])<=100 && strlen($_POST['name'])>=2) { //Se foi feita a busca e não teve resultados... $p->set_var('message',lang('No matches found')); $p->parse('rows','row_empty',True); } else if(count($_SESSION["mobile_search_ids"])>100) { //Muitos resultados... $p->set_var('message',lang('too many results')); $p->parse('rows','row_empty',True); } else if(isset($_POST["name"]) && strlen($_POST['name'])<2) { //Muitos resultados... $p->set_var('message',lang('the search argument must have at least 4 digits')); $p->parse('rows','row_empty',True); } else if((isset($_POST["name"])) || (isset($_GET["page"]))){ //Renderizar... /////////// Preenche o cabeçalho da consulta if($this->page_info['actual_catalog']!="bo_group_manager") { $p->set_var( array('lang_people_name' => lang("Name"), 'lang_phone' => lang("Phone"), 'lang_mobile' => "Celular", 'lang_mail' => lang("Email"))); $p->parse('header','people_header',True); } else { $p->set_var( array('lang_group_name' => lang("Name"), 'lang_title' => lang("Title") )); $p->parse('header','group_header',True); } /////////// Preencho as linhas do resultado foreach($entries as $id => $entry) { $this->nextmatchs->template_alternate_row_color($p); if(($this->page_info['actual_catalog']!="bo_group_manager") && (strpos($this->page_info['actual_catalog'],'bo_global_ldap_catalog')===false)){ //People $var = array( 'row_nome' => $entry['names_ordered'], 'row_mobile' => $entry['contact']['business_info']['celPhone'] ); $conn1 = array_shift($entry['connections']); if(($conn1==NULL)||($conn1['connection_is_default']!=1)) { $var['row_telefone'] = ' '; $var['row_email'] = ' '; } else if($conn1['id_type']==1) { $var['row_email'] = $conn1['connection_value']; $conn2=array_shift($entry['connections']); if(($conn2==NULL)||($conn2['connection_is_default']!=1)) $var['row_telefone'] = ' '; else $var['row_telefone'] = $conn2['connection_value']; } else if($conn1['id_type']==2) { $var['row_email'] = ' '; $var['row_telefone'] = $conn1['connection_value']; } $var['form_action'] = "index.php?menuaction=ac.ui_mobilemail.new_msg"; $p->set_var($var); $p->parse('rows','row',True); } else if($this->page_info['actual_catalog']=="bo_group_manager"){ //Grupos $var = array( 'row_group_name'=>$entry['short_name'], 'row_title' => $entry['title'] ); $p->set_var($var); $p->parse('rows','row_group',True); } else { //Ldap $var = array('row_nome'=>$entry['names_ordered'][0],'row_mobile'=>$entry['companies']['company1']['celPhone']); $conn1 = array_shift($entry['connections']); if(($conn1==NULL)) { $var['row_telefone'] = ' '; $var['row_email'] = ' '; } else if($conn1['id_type']==1) { $var['row_email'] = $conn1['connection_value']; $conn2=array_shift($entry['connections']); if($conn2==NULL) $var['row_telefone'] = ' '; else $var['row_telefone'] = $conn2['connection_value']; } else if($conn1['id_type']==2) { $var['row_email'] = ' '; $var['row_telefone'] = $conn1['connection_value']; } if(!$from_calendar) $var['form_action'] = "index.php?menuaction=ac.ui_mobilemail.new_msg"; else if($from_calendar == 'mobilecalendar'){ $var['id_contact'] = $entry['uidnumber'][0].'U'; $var['form_action'] = "index.php?menuaction=mobile.ui_mobilecalendar.add_participant"; }else{ $var['id_contact'] = $entry['uidnumber'][0].'U'; $var['form_action'] = "index.php?menuaction=ac.ui_mobilemail.add_recipient"; } $var['lang_select'] = lang("select"); $p->set_var($var); $p->parse('rows','row',True); } } } if($from_calendar == 'mobilemail') { $p->set_var('lang_choose_the_recipients',lang("choose the recipients")); $participants = $_SESSION['mobile_mail']; reset($participants); while (($participant = current($participants))!==false) { $p->set_var('row_contact_name',$participant); if(next($participants)!==false) $p->set_var('row_separate',','); else $p->set_var('row_separate','.'); $p->parse('rows_addeds','row_addeds',True); } }else if($from_calendar == 'mobilecalendar'){ $p->set_var('lang_choose_the_participants',lang("choose the participants")); $participants = $_SESSION['mobile_calendar']; @reset($participants); while (($participant = current($participants))!==false) { $p->set_var('row_contact_name',$participant); if(next($participants)!==false) $p->set_var('row_separate',','); else $p->set_var('row_separate','.'); $p->parse('rows_addeds','row_addeds',True); } } ////////////////// Monto a paginação if(!empty($entries) && count($_SESSION["mobile_search_ids"])<=100) { $num_pages = count($_SESSION["mobile_search_ids"])/10; if((count($_SESSION["mobile_search_ids"])%10!=0) || ($num_pages<1)) $num_pages++; if($actual_page!=0) { for($i=1;$i<=$num_pages;$i++) { $p->set_var('num_page',$i); $p->set_var('display_page',$i); if($i!=$actual_page) $p->parse('pages','page',True); else $p->parse('pages','page_no_link',True); } } if($actual_page>1) { $p->set_var('num_page',$actual_page-1); $p->set_var('display_page','<'); $p->parse('back','page',True); } if(($actual_page!=floor($num_pages)) && (floor($num_pages)>1) && ($actual_page!=0)) { $p->set_var('num_page',$actual_page+1); $p->set_var('display_page','>'); $p->parse('next','page',True); } } //$p->pfp('out','body'); $GLOBALS['phpgw_info']['mobiletemplate']->set_content($p->fp('out','body')); } } ?>