vid; } $query = db_select('taxonomy_term_data', 't'); $query->addTag('translatable'); $query->addTag('term_access'); // Select rows that match by term name. $tags_return = $query ->fields('t', array('tid', 'name')) ->condition('t.vid', $vids) ->condition('t.name', '%' . db_like($typed) . '%', 'LIKE') ->range(0, 10) ->execute() ->fetchAllKeyed(); $term_matches = array(); foreach ($tags_return as $tid => $name) { $n = $name; // Term names containing commas or quotes must be wrapped in quotes. // if (strpos($name, ',') !== FALSE || strpos($name, '"') !== FALSE) { // $n = '"' . str_replace('"', '""', $name) . '"'; // } $term_matches[$n] = check_plain($name); } } drupal_json_output($term_matches); } /** * materio_search_api_autocomplete_searchapi($typed = '') * * GOOD one using searchapi (SOLR) */ function materio_search_api_autocomplete_searchapi($typed = ''){ // If the request has a '/' in the search text, then the menu system will have // split it into multiple arguments, recover the intended $tags_typed. $args = func_get_args(); $typed = implode('/', $args); // dsm($typed, 'typed'); if ($typed != '') { // search for patterns like key -another key +lastkey // and provide auto completion for the last key preg_match_all('/\s?[\+|-]?[^\s]+/', $typed, $adv_search_q); // dsm($adv_search_q, "adv_search_q"); preg_match('/^(\+|-)?(.*)$/', trim(array_pop($adv_search_q[0])), $last); // dsm($last, "last"); $tosearch = isset($last[2]) ? $last[2] : $typed; // build the query global $language; $index_machine_name = variable_get('autocompletesearchindex_'.$language->language, -1); $query = search_api_query($index_machine_name); // $query_filter = $query->createFilter(); // $query_filter->condition('name', $tosearch); // $query_filter->condition('type', 'article'); // $query->filter($query_filter); $query->keys($tosearch); $tags_return = $query->execute(); // dsm($tags_return, '$tags_return'); if($tags_return['result count']){ $term_matches = array(); $index = search_api_index_load($index_machine_name); $delta = 0; foreach ($index->loadItems(array_keys($tags_return['results'])) as $item) { //dsm($item, '$item'); //$term_matches[$item->tid] = check_plain($item->name); // $term_matches[check_plain($item->name)] = check_plain($item->name); // TODO: leave tags with nodes $term_matches[trim(implode(' ', $adv_search_q[0]).' "'.$last[1].$item->name).'"'] = check_plain($item->name); $delta++; if($delta > 15) break; } drupal_json_output($term_matches); }else{ drupal_json_output(array()); } }else{ return; } // dsm($term_matches, 'term_matches'); // return 'debug mode of materio_search_api_autocomplete_searchapi'; } /** * materio_search_api_results_search() * * */ function materio_search_api_results_search(){ //dsm("materio_search_api_results_search"); // retreive typed words separated by slashes as a sentence $keys = func_get_args(); // dsm($args, 'args'); $typed = implode('/', $keys); // remove query page params preg_match_all('/\?page=([0-9]+)/', $typed, $pages); //dsm($pages, '$pages'); if($pages[0]){ $typed = str_replace($pages[0][0], '', $typed); } // dsm($typed, 'typed'); if ($typed) { global $language; global $user; # retrieve viewmode and then use it to define the query range $viewmode = isset($user->data['materiosearchapi_viewmode']) ? $user->data['materiosearchapi_viewmode'] : variable_get('defaultviewmode', 'full'); $limit = variable_get($viewmode.'_limite', '10'); $offset = pager_find_page() * $limit; //$page*$limit;// # Normal search if(user_access('use materio search api')){ // dsm('normal search'); $results = msa_solrquery_materiauxbreves($typed, $language, $user, $offset, $limit); } # only breves search (+ related materials) else if(user_access('use materio search api for breves')){ // dsm('limited search'); $results = msa_solrquery_breves($typed, $language, $user, $offset, $limit); } // for all case $ret['results']['#results'] = $results; $ret['results']['#items'] = $results['items']; $ret['results']['#index'] = $results['index']; $ret['results']['#theme'] = 'materio_search_api_results'; $ret['results']['#keys'] = $typed; $ret['results']['#view_mode'] = $viewmode; // page title $page_title = $typed; drupal_set_title(''.check_plain($page_title), PASS_THROUGH); // render results if(isset($results)){ // Load pager. // if ($results['result count'] > $page->options['per_page']) { pager_default_initialize($results['result count'], $limit); $ret['results']['#pager'] = theme('pager'); // } if (!empty($results['ignored'])) { drupal_set_message( t('The following search keys are too short or too common and were therefore ignored: "@list".', array( '@list' => implode(t('", "'), $results['ignored']) ) ), 'warning' ); } if (!empty($results['warnings'])) { foreach ($results['warnings'] as $warning) { drupal_set_message($warning, 'warning'); } } } } // dsm($ret, 'ret'); return $ret; } function msa_solrquery_materiauxbreves($typed, $language, $user, $offset, $limit){ // dsm($offset, 'offset'); // dsm($limit, 'limit'); // -- communs --// # define default bundle option (materiaux, breves) $default_bundles = array(); if(isset($taxo_index->options['data_alter_callbacks']['search_api_alter_bundle_filter']['settings']['bundles'])){ $indexed_bundles = $taxo_index->options['data_alter_callbacks']['search_api_alter_bundle_filter']['settings']['bundles']; foreach ($indexed_bundles as $bundle) { $default_bundles[] = $bundle; } } # choose solr query bundle option $bundles_filter = isset($user->data['materiosearchapi_bundlesfilter']) ? $user->data['materiosearchapi_bundlesfilter'] : $default_bundles; # choose solr query options $query_options = array('conjunction'=>'OR', 'parse mode'=>'direct'); // -- -- taxo search -- -- // # define search api solr index $taxo_index_machine_name = variable_get('taxonomysearchindex_'.$language->language, -1); $taxo_index = search_api_index_load($taxo_index_machine_name); #create the solr query for taxonomy search $taxo_query = search_api_query($taxo_index_machine_name, $query_options) ->keys($typed); # apply bundle options to solr query if usefull if(count($bundles_filter)){ $filter = $taxo_query->createFilter('OR'); foreach ($bundles_filter as $type) $filter->condition('type', $type, '='); $taxo_query->filter($filter); } // $query->setOption('search_api_bypass_access', true); # add user access solr query option $taxo_query->setOption('search_api_access_account', $user); #execute first time to get the all items, to be able to filter the full text research $taxo_total_results = $taxo_query->execute(); // dsm($taxo_total_results, "taxo total results"); #add range to retriev the real current results $taxo_query->range($offset, $limit); # execute solr query and record results $taxo_results = $taxo_query->execute(); // dsm($taxo_results, "taxo results"); $taxo_items = $taxo_index->loadItems(array_keys($taxo_results['results'])); // dsm($taxo_items, 'taxo items'); $taxo_results['items'] = $taxo_items; $taxo_results['index'] = $taxo_index;//search_api_index_load($index_machine_name); // -- -- full text search -- -- // #define search api solr index $fulltxt_index_machine_name = variable_get('fulltextsearchindex_'.$language->language, -1); $fulltxt_index = search_api_index_load($fulltxt_index_machine_name); #then calculate the good offset and limit for the complementary search $fulltxt_offset = $offset - $taxo_results['result count']; #create the solr query for taxonomy search $fulltxt_query = search_api_query($fulltxt_index_machine_name, $query_options) ->keys($typed) ->range(($fulltxt_offset > 0 ? $fulltxt_offset : 0), $limit); // change offset to match with the first query (taxonomy) # apply bundle options to solr query if usefull if(count($bundles_filter)){ $filter = $fulltxt_query->createFilter('OR'); foreach ($bundles_filter as $type) $filter->condition('type', $type, '='); $fulltxt_query->filter($filter); } # filter to remove precedent search query # !!!!!! THIS WILL NOT WORK, IT DOESN'T KNOW THE ITEMS FROM PAGES BEFORE THE CURRENT ONE ... $nid_filter = $fulltxt_query->createFilter('AND'); foreach ($taxo_total_results['results'] as $nid => $item) $nid_filter->condition('nid', $nid, '<>'); $fulltxt_query->filter($nid_filter); # add user access solr query option $fulltxt_query->setOption('search_api_access_account', $user); # execute solr query and record results $fulltxt_results = $fulltxt_query->execute(); // dsm($fulltxt_results, "fulltxt_results"); # add the full text result count to the taxo result to have the total of items $taxo_results['result count'] += $fulltxt_results['result count']; # if we are at the end of the first search results list if($fulltxt_offset >= 0){ $fulltxt_items = $fulltxt_index->loadItems(array_keys($fulltxt_results['results'])); // dsm($fulltxt_items, 'full txt items'); $taxo_results['items'] += $fulltxt_items; } # TODO: cache the results with cache graceful : http://drupal.org/project/cache_graceful return $taxo_results; } function msa_solrquery_breves($typed, $language, $user, $offset, $limit){ $index_machine_name = variable_get('brevessearchindex_'.$language->language, -1); // dsm($index_machine_name, '$index_machine_name'); $index = search_api_index_load($index_machine_name); # choose solr query options $query_options = array('conjunction'=>'OR', 'parse mode'=>'direct'); #create the solr query $query = search_api_query($index_machine_name, $query_options) ->keys($typed) ->range($offset, $limit); // $query->setOption('search_api_bypass_access', true); # add user access solr query option $query->setOption('search_api_access_account', $user); # execute solr query and record results $results = $query->execute(); // dsm($results, 'results'); $results['index'] = $index;//search_api_index_load($index_machine_name); #could $could_index_machine_name = variable_get('fulltextsearchindex_'.$language->language, -1); $could_index = search_api_index_load($could_index_machine_name); # in case of free user search, run a real search to indicate how much items you could find $could_query = search_api_query($could_index_machine_name, array('conjunction'=>'OR', 'parse mode'=>'direct')) ->keys($typed); $could_results = $could_query->execute(); // dsm($could_results, 'could_results'); $results['could results'] = $could_results; # add items : breve + materials wich are in the could result $items = array(); $breves = $index->loadItems(array_keys($results['results'])); foreach ($breves as $nid => $breve) { if(!node_access('view', $breve)) continue; $items[] = $breve; $materiaux = field_get_items('node',$breve,'field_materiau_ref'); // dsm($materiaux, 'materiaux'); if($materiaux){ foreach ($materiaux as $value) { if(!isset($could_results['results'][$value['target_id']])) continue; $materiau = node_load($value['target_id']); if(node_access('view', $materiau)) $items[] = $materiau; } } } $results['items'] = $items; $results['breves count'] = $results['result count']; $results['result count'] = count($items); // dsm($results, "results"); # TODO: cache the results with cache graceful : http://drupal.org/project/cache_graceful return $results; } /** * materio_search_api_actuality() * */ function materio_search_api_actuality(){ global $user; if(isset($user->roles[1])){ $date_limit = strtotime('-6 month'); // dsm(date('d m y', $date_limit)); } $viewmode = isset($user->data['materiosearchapi_viewmode']) ? $user->data['materiosearchapi_viewmode'] : user_access('access to materio database') ? variable_get('defaultviewmode', 'cardmedium') : 'cardbig'; $limit = 10;//variable_get($viewmode.'_limite', '10'); $offset = pager_find_page() * $limit; // dsm($offset); $query = new EntityFieldQuery; $query ->entityCondition('entity_type', 'node') ->propertyCondition('status', 1) ->entityCondition('bundle', array('breve')) ->propertyOrderBy('created', 'DESC') ->range($offset,$limit); if(isset($user->roles[1])){ $query->propertyCondition('created', $date_limit, '>'); } $result = $query->execute(); // dsm($result, '$result'); $count_query = new EntityFieldQuery; $count_query ->entityCondition('entity_type', 'node') ->propertyCondition('status', 1) ->entityCondition('bundle', array('breve')); // dsm($count, 'count'); if(isset($user->roles[1])){ $count_query->propertyCondition('created', $date_limit, '>'); } $count = $count_query->count()->execute(); pager_default_initialize($count, $limit); $items = array(); if(isset($result['node'])){ foreach ($result['node'] as $nid => $n) { $breve = node_load($nid); if(!node_access('view', $breve)) continue; $items[] = $breve; // if(user_access('access to materio database')){ $materiaux = field_get_items('node',$breve,'field_materiau_ref'); // dsm($materiaux, 'materiaux'); if($materiaux){ foreach ($materiaux as $value) { $materiau = node_load($value['target_id']); if(node_access('view', $materiau)) $items[] = $materiau; } } // } } } // drupal_set_title(t('Actualities')); drupal_set_title(t('')); return theme('materio_search_api_actuality', array( 'items' => $items, 'view_mode' => $viewmode, 'count' => $count, 'pager' => theme('pager'), )); } function materio_search_api_viewmode_change($vm){ //dsm($vm, 'materio_search_api_viewmode_change'); $rep = _materio_search_api_change_viewmode($vm); //return 'debug mode for materio_search_api_viewmode_change'; // drupal_json_output($rep); drupal_goto(); }