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); preg_match('/^(\+|-)?(.*)$/', trim(array_pop($adv_search_q[0])), $last); $tosearch = isset($last[2]) ? $last[2] : $typed; // build the query $index_machine_name = variable_get('autocompletesearchindex', -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); $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 > 7) 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(){//, $limit = 20, $page = 0 global $user; //dsm("materio_search_api_results_search"); $args = func_get_args(); $typed = implode('/', $args); preg_match_all('/\?page=([0-9]+)/', $typed, $pages); //dsm($pages, '$pages'); if($pages[0]){ $typed = str_replace($pages[0][0], '', $typed); // $page = $pages[1][0]; } // else{ // $page = 0; // } preg_match_all('/\s?[^\s]+\s?/', $typed, $words); // dsm($words, "words"); // $escaper = array("+", "-", "&&", "||", "!", "(", ")", "{", "}", "[", "]", "^", '"', "~", "*", "?", ":", '\\'); foreach ($words[0] as $word) { // $word = preg_replace('/\b-/', '\-', trim($word)); // dsm($word); $keys[] = $word; } $index_machine_name = variable_get('mainsearchindex', -1); $index = search_api_index_load($index_machine_name); $indexed_bundles = $index->options['data_alter_callbacks']['search_api_alter_bundle_filter']['settings']['bundles']; foreach ($indexed_bundles as $bundle) { $default_bundles[] = $bundle; } $bundles_filter = isset($user->data['materiosearchapi_bundlesfilter']) ? $user->data['materiosearchapi_bundlesfilter'] : $default_bundles; // dsm($bundles_filter, 'bundles_filter'); $viewmode = isset($user->data['materiosearchapi_viewmode']) ? $user->data['materiosearchapi_viewmode'] : variable_get('defaultviewmode', 'full'); if ($keys) { try { $limit = variable_get($viewmode.'_limite', '10'); $offset = pager_find_page() * $limit; //$page*$limit;// $query = search_api_query($index_machine_name, array('parse mode'=>'direct')) ->keys(implode(' ', $keys)) // TODO: add bundle filter // ->condition('type', 'breve') ->range($offset, $limit); $filter = $query->createFilter('OR'); foreach ($bundles_filter as $type) { $filter->condition('type', $type, '='); } // dsm($filter, 'filter'); $query->filter($filter); // $bundle_query_filter = $query->createFilter(); // $bundle_query_filter->condition('type', 'materiau');//$bundles_filter); // $query->filter($bundle_query_filter); $results = $query->execute(); } catch (SearchApiException $e) { $ret['message'] = t('An error occurred while executing the search. Please try again or contact the site administrator if the problem persists.'); watchdog('materiobasemod', 'An error occurred while executing a search: !msg.', array('!msg' => $e->getMessage()), WATCHDOG_ERROR, l(t('search page'), $_GET['q'])); } // dsm($results, 'results'); // $accessible_results = array(); // foreach ($results['results'] as $nid => $entity) { // if(node_access('view', node_load($nid))) // $accessible_results[$nid] = $entity; // } // $results['results'] = $accessible_results; // $results['result count'] = count($accessible_results); # Load spellcheck. // if (isset($results['search_api_spellcheck'])) { // $ret['results']['#spellcheck'] = array( // '#theme' => 'search_api_spellcheck', // '#spellcheck' => $results['search_api_spellcheck'], // // Let the theme function know where the key is stored by passing its arg // // number. We can work this out from the number of args in the page path. // '#options' => array( // 'arg' => array(count(arg(NULL, $page->path))), // ), // '#prefix' => '
', // '#suffix' => '
', // ); // } $ret['results']['#theme'] = 'materio_search_api_results'; /* TODO choose index in module settings */ $ret['results']['#index'] = search_api_index_load('materiaux_breves'); $ret['results']['#results'] = $results; $ret['results']['#view_mode'] = $viewmode; $ret['results']['#keys'] = $keys; // 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'); } } } return $ret; } /** * materio_search_api_actuality() * */ function materio_search_api_actuality(){ $date = strtotime('-6 month'); $limit = 10;//variable_get($viewmode.'_limite', '10'); $offset = pager_find_page() * $limit; $query = new EntityFieldQuery; $query ->entityCondition('entity_type', 'node') ->propertyCondition('status', 1) ->entityCondition('bundle', array('breve')) ->propertyCondition('created', $date, '>') ->propertyOrderBy('created', 'DESC') ->range($offset,$limit); $result = $query->execute(); // dsm($result, '$result'); $count_query = new EntityFieldQuery; $count = $count_query ->entityCondition('entity_type', 'node') ->propertyCondition('status', 1) ->entityCondition('bundle', array('breve')) ->propertyCondition('created', $date, '>') ->count()->execute(); // dsm($count, 'count'); pager_default_initialize($count, $limit); foreach ($result['node'] as $nid => $n) { $breve = node_load($nid); 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) { $materiau = node_load($value['target_id']); if(node_access('view', $materiau)) $items[] = $materiau; } } } return theme('materio_search_api_actuality', array( 'items' => $items, 'view_mode' => 'cardmedium', 'count' => $count, 'pager' => theme('pager'), )); }