diff --git a/sites/all/modules/gui/materiobasemod/materio_search_api.admin.inc b/sites/all/modules/gui/materiobasemod/materio_search_api.admin.inc index aaed56e7..04f150ad 100755 --- a/sites/all/modules/gui/materiobasemod/materio_search_api.admin.inc +++ b/sites/all/modules/gui/materiobasemod/materio_search_api.admin.inc @@ -12,6 +12,10 @@ function materio_search_api_settings(){ $languages = locale_language_list(); // dsm($languages, 'languages'); + $form = array(); + + + // Solr indexes by language foreach ($languages as $lcode => $name) { $form['fulltextsearchindex_'.$lcode] = array( '#type'=>'select', @@ -44,6 +48,7 @@ function materio_search_api_settings(){ } + // view modes // TODO: select the activated viewmodes for change view mode and selected view mode $entity_infos = entity_get_info(); // dsm($entity_infos, 'entity_infos'); @@ -66,7 +71,7 @@ function materio_search_api_settings(){ '#title' => t('Defalut View mode'), ); - + // limits by view mode foreach (variable_get('availableviewmodes', array()) as $viewmode => $value) { $form[$viewmode.'_limite'] = array( '#type'=>'textfield', @@ -76,5 +81,74 @@ function materio_search_api_settings(){ ); } + // advanced search vocabulary + $vocs = taxonomy_get_vocabularies(); + // dsm($vocs, 'vocs'); + $vocs_options = array(); + foreach ($vocs as $vid => $voc) { + $vocs_options[$vid] = $voc->name; + } + $form['msa-advancedsearchvocabulary'] = array( + '#type' => 'select', + '#options' => $vocs_options, + '#default' => variable_get('msa-advancedsearchvocabulary', null), + '#title' => t('advanced search vocabulary'), + '#description' => 'Choose which vocabulary will be used for advanced search form', + ); + + // advanced search hide some taxonomy terms + if($vid = variable_get('msa-advancedsearchvocabulary', null)){ + $tree = msa_taxonomy_get_nested_tree(taxonomy_get_tree($vid)); + // dsm($tree, "tree"); + + $tree_options = array(); + msa_get_nested_tree_options($tree, $tree_options); + // dsm($tree_options, 'tree_options'); + + $form['msa-hiddentaxoterms'] = array( + '#type' => 'select', + '#options' => $tree_options, + '#default_value' => variable_get('msa-hiddentaxoterms', array()), + '#multiple' => TRUE, + '#title' => t('Hidden taxonomy terms'), + '#description' => t('Select terms which will be hidden from advanced search form') + ); + + } + return system_settings_form($form); } + +function msa_taxonomy_get_nested_tree($terms = array(), $max_depth = NULL, $parent = 0, $parents_index = array(), $depth = 0) { + if (is_int($terms)) { + $terms = taxonomy_get_tree($terms); + } + + foreach($terms as $term) { + foreach($term->parents as $term_parent) { + if ($term_parent == $parent) { + $return[$term->tid] = $term; + } + else { + $parents_index[$term_parent][$term->tid] = $term; + } + } + } + + foreach($return as &$term) { + if (isset($parents_index[$term->tid]) && (is_null($max_depth) || $depth < $max_depth)) { + $term->children = msa_taxonomy_get_nested_tree($parents_index[$term->tid], $max_depth, $term->tid, $parents_index, $depth + 1); + } + } + + return $return; + } + +function msa_get_nested_tree_options($tree, &$options, $prefix = ""){ + foreach ($tree as $tid => $term) { + $options[$tid] = $prefix . $term->name; + if(isset($term->children)){ + msa_get_nested_tree_options($term->children, $options, $prefix."$term->name - "); + } + } +} diff --git a/sites/all/modules/gui/materiobasemod/materio_search_api.module b/sites/all/modules/gui/materiobasemod/materio_search_api.module index 56dd227f..8362ceed 100755 --- a/sites/all/modules/gui/materiobasemod/materio_search_api.module +++ b/sites/all/modules/gui/materiobasemod/materio_search_api.module @@ -751,291 +751,303 @@ function materio_search_api_advanced_search_form($form, &$form_state){ // $form = array(); // TODO: get vid from settings - $vid = 15; // onthologie - $voc = taxonomy_vocabulary_load($vid); - $voc_machinename = $voc->machine_name; - // dsm($voc, "voc"); + $vid = variable_get('msa-advancedsearchvocabulary', null); + if($vid){ - $values = isset($form_state['values']) ? $form_state['values'] : null; - // dsm($values, "values"); + $voc = taxonomy_vocabulary_load($vid); + $voc_machinename = $voc->machine_name; + // dsm($voc, "voc"); - $args = arg(); - // dsm($args, 'args'); + $hidden_terms = variable_get('msa-hiddentaxoterms', array()); + // dsm($hidden_terms, 'hidden_terms'); - // get the first elemt of url args - $path = array_shift($args); - if (isset($args[0]) && $args[0] == "filters") { - $path .= '/'.array_shift($args); - } - // get the keywords from args and reconstruct the filter lines with default values - $args_values = array(); - if($path == 'explore/filters' && $args[0] !== "ajax"){ - $keywords = explode("+", $args[0]); - // TODO: what if a keyword contains a + - // dsm($keywords, 'keywords'); - foreach ($keywords as $key => $value) { - $name = str_replace('"', '', $value); - //Get the term - $terms = taxonomy_get_term_by_name($name, $voc_machinename); - $term = array_shift($terms); - // dsm($term, $term->tid.' : '.$term->name); - // get parents - if(isset($term->tid)){ - $parents = taxonomy_get_parents_all($term->tid); - // dsm($parents, 'parents'); - // build default values - for ($p=count($parents)-1; $p >=0 ; $p--) { - $args_values[$key][] = $parents[$p]->tid; + $values = isset($form_state['values']) ? $form_state['values'] : null; + // dsm($values, "values"); + + $args = arg(); + // dsm($args, 'args'); + + // get the first elemt of url args + $path = array_shift($args); + if (isset($args[0]) && $args[0] == "filters") { + $path .= '/'.array_shift($args); + } + // get the keywords from args and reconstruct the filter lines with default values + $args_values = array(); + if($path == 'explore/filters' && $args[0] !== "ajax"){ + $keywords = explode("+", $args[0]); + // TODO: what if a keyword contains a + + // dsm($keywords, 'keywords'); + foreach ($keywords as $key => $value) { + $name = str_replace('"', '', $value); + //Get the term + $terms = taxonomy_get_term_by_name($name, $voc_machinename); + $term = array_shift($terms); + // dsm($term, $term->tid.' : '.$term->name); + // get parents + if(isset($term->tid)){ + $parents = taxonomy_get_parents_all($term->tid); + // dsm($parents, 'parents'); + // build default values + for ($p=count($parents)-1; $p >=0 ; $p--) { + $args_values[$key][] = $parents[$p]->tid; + } } } } - } - // dsm($args_values, 'args_values'); - // TODO: show result count live - // TODO: filter next select form item + // dsm($args_values, 'args_values'); + // TODO: show result count live + // TODO: filter next select form item - // define number of lines, - // 1 by default - // or from url arguments - // or let it as it is if already chanched by ajax - if(!isset($form_state['filterlines'])){ - if(count($args_values)){ - $form_state['filterlines'] = count($args_values); - }else{ - $form_state['filterlines'] = 1; + // define number of lines, + // 1 by default + // or from url arguments + // or let it as it is if already chanched by ajax + if(!isset($form_state['filterlines'])){ + if(count($args_values)){ + $form_state['filterlines'] = count($args_values); + }else{ + $form_state['filterlines'] = 1; + } } - } - // dsm($form_state['filterlines'], "form_state['filterlines']"); + // dsm($form_state['filterlines'], "form_state['filterlines']"); - // filters form container - $form['filters'] = array( - '#type' => 'container', - '#prefix' => '
', - '#suffix' => '
', - ); - - $trigger = FALSE; - if (!empty($form_state['triggering_element']['#name'])) { - $trigger = $form_state['triggering_element']; - } - - $rmline = false; - if ($trigger) { - // dsm($form_state['triggering_element'], $form_state['triggering_element']['#name']); - // dsm($values, 'form state values'); - - // add a line if needed - if($trigger['#name'] == 'addfilters'){ - $form_state['filterlines'] = $form_state['filterlines']+1; - } - - // remove a line if needed - if(strpos($trigger['#name'], 'rm-filter-') === 0){ - // $form_state['filterlines'] = $form_state['filterlines']+1; - $rmline = $trigger['#return_value']; - // dsm($rmline, "rmline"); - } - } - - // build first level taxonomy tree and select options - $taxotree = taxonomy_get_tree($vid, 0, 1, false); - foreach ($taxotree as $index => $term) { - // TODO: get translated tag name - $level_0_ops[$term->tid] = t($term->name); - } - - // build filters lines (ajax enabled) - for ($l=0; $l < $form_state['filterlines']; $l++) { - - // if rmline this line, - // continue the loop without creating the line - if($l === $rmline){ - continue; - } - // if we are after the removed line, - // create a second counter ($ll) to keep a continuous order for form items - // and keep the current counter ($l) to retrieve de current values - // if before removed line or no removed line at all, $l = $ll - if($rmline !== false && $l >= $rmline){ - $ll = $l-1; - }else{ - $ll = $l; - } - // dsm("l : ".$l." | ll : ".$ll); - - $form['filters']['filterline-'.$ll] = array( + // filters form container + $form['filters'] = array( '#type' => 'container', - '#attributes' => array( - 'class' => array("filter-line") - ) + '#prefix' => '
', + '#suffix' => '
', ); - // get the default value - // from from_state values if ajax - // or from url args - // or 0 - $default0 = null; - if(isset($values['filter-'.$l.'-0']) && $values['filter-'.$l.'-0']){ - $default0 = $values['filter-'.$l.'-0']; - }elseif(isset($args_values[$l][0])){ - $default0 = $args_values[$l][0]; - } - // dsm($default0, "default 0"); - - // form select element for first level - $form['filters']['filterline-'.$ll]['filter-'.$ll.'-0'] = array( - '#type' => 'select', - '#options' => $level_0_ops, - '#name' => 'filter-'.$ll.'-0', - '#empty_option' => t("Choose a filter"), - // '#empty_values' => 0, - '#default_value' => $default0, - '#ajax' => array( - 'callback' => 'materio_search_api_advanced_search_select_callback', - 'wrapper' => 'advancedsearch-filters', - ), - ); - // without this line, form api will mess with default values - $form_state["input"]['filter-'.$ll.'-0'] = $default0; - - // add level 1 filter if level 0 chosen - if($default0){ - - // build second level taxonomy tree and select options - $taxotree1 = taxonomy_get_tree($vid, $default0, 1, false); - $level_1_ops = array(); - foreach ($taxotree1 as $index => $term) { - // TODO: get translated tag name - $level_1_ops[$term->tid] = t($term->name); - } - - // get the default value - // from from_state values if ajax - // or from url args - // or 0 - $default1 = null; - if(isset($values['filter-'.$l.'-1']) && $values['filter-'.$l.'-1']){ - $default1 = $values['filter-'.$l.'-1']; - }elseif(isset($args_values[$l][1])){ - $default1 = $args_values[$l][1]; - } - // dsm($default1, "default 1"); - - // form select element for second level - $form['filters']['filterline-'.$ll]['filter-'.$ll.'-1'] = array( - '#type' => 'select', - '#options' => $level_1_ops, - '#name' => 'filter-'.$ll.'-1', - '#empty_option' => t("Choose a filter"), - // '#empty_values' => 0, - '#default_value' => $default1, - '#ajax' => array( - 'callback' => 'materio_search_api_advanced_search_select_callback', - 'wrapper' => 'advancedsearch-filters', - ), - ); - // without this line, form api will mess with default values - $form_state["input"]['filter-'.$ll.'-1'] = $default1; - - // add level 2 filter if level 1 chosen - if($default1){ - - // build second level taxonomy tree and select options - $taxotree2 = taxonomy_get_tree($vid, $default1, 1, false); - if(count($taxotree2)){ - // $default2 = isset($args_values[$l][2]) ? $args_values[$l][2] : 0; - $default2 = null; - if(isset($values['filter-'.$l.'-2']) && $values['filter-'.$l.'-2']){ - $default2 = $values['filter-'.$l.'-2']; - }elseif(isset($args_values[$l][2])){ - $default2 = $args_values[$l][2]; - } - // dsm($default2, "default 2"); - - $level_2_ops = array(); - foreach ($taxotree2 as $index => $term) { - // TODO: get translated tag name - $level_2_ops[$term->tid] = t($term->name); - } - // form select element for third level - $form['filters']['filterline-'.$ll]['filter-'.$ll.'-2'] = array( - '#type' => 'select', - '#options' => $level_2_ops, - '#name' => 'filter-'.$ll.'-2', - '#empty_option' => t("Choose a filter"), - // '#empty_values' => 0, - '#default_value' => $default2, - ); - // without this line, form api will mess with default values - $form_state["input"]['filter-'.$ll.'-2'] = $default2; - } - } + $trigger = FALSE; + if (!empty($form_state['triggering_element']['#name'])) { + $trigger = $form_state['triggering_element']; } - // add remove the line button - $form['filters']['filterline-'.$ll]['rm-filter-'.$ll] = array( + $rmline = false; + if ($trigger) { + // dsm($form_state['triggering_element'], $form_state['triggering_element']['#name']); + // dsm($values, 'form state values'); + + // add a line if needed + if($trigger['#name'] == 'addfilters'){ + $form_state['filterlines'] = $form_state['filterlines']+1; + } + + // remove a line if needed + if(strpos($trigger['#name'], 'rm-filter-') === 0){ + // $form_state['filterlines'] = $form_state['filterlines']+1; + $rmline = $trigger['#return_value']; + // dsm($rmline, "rmline"); + } + } + + // build first level taxonomy tree and select options + $taxotree = taxonomy_get_tree($vid, 0, 1, false); + foreach ($taxotree as $index => $term) { + // TODO: get translated tag name + if(!in_array($term->tid, $hidden_terms)){ + $level_0_ops[$term->tid] = t($term->name); + } + } + + // build filters lines (ajax enabled) + for ($l=0; $l < $form_state['filterlines']; $l++) { + + // if rmline this line, + // continue the loop without creating the line + if($l === $rmline){ + continue; + } + // if we are after the removed line, + // create a second counter ($ll) to keep a continuous order for form items + // and keep the current counter ($l) to retrieve de current values + // if before removed line or no removed line at all, $l = $ll + if($rmline !== false && $l >= $rmline){ + $ll = $l-1; + }else{ + $ll = $l; + } + // dsm("l : ".$l." | ll : ".$ll); + + $form['filters']['filterline-'.$ll] = array( + '#type' => 'container', + '#attributes' => array( + 'class' => array("filter-line") + ) + ); + + // get the default value + // from from_state values if ajax + // or from url args + // or 0 + $default0 = null; + if(isset($values['filter-'.$l.'-0']) && $values['filter-'.$l.'-0']){ + $default0 = $values['filter-'.$l.'-0']; + }elseif(isset($args_values[$l][0])){ + $default0 = $args_values[$l][0]; + } + // dsm($default0, "default 0"); + + // form select element for first level + $form['filters']['filterline-'.$ll]['filter-'.$ll.'-0'] = array( + '#type' => 'select', + '#options' => $level_0_ops, + '#name' => 'filter-'.$ll.'-0', + '#empty_option' => t("Choose a filter"), + // '#empty_values' => 0, + '#default_value' => $default0, + '#ajax' => array( + 'callback' => 'materio_search_api_advanced_search_select_callback', + 'wrapper' => 'advancedsearch-filters', + ), + ); + // without this line, form api will mess with default values + $form_state["input"]['filter-'.$ll.'-0'] = $default0; + + // add level 1 filter if level 0 chosen + if($default0){ + + // build second level taxonomy tree and select options + $taxotree1 = taxonomy_get_tree($vid, $default0, 1, false); + $level_1_ops = array(); + foreach ($taxotree1 as $index => $term) { + // TODO: get translated tag name + $level_1_ops[$term->tid] = t($term->name); + } + + // get the default value + // from from_state values if ajax + // or from url args + // or 0 + $default1 = null; + if(isset($values['filter-'.$l.'-1']) && $values['filter-'.$l.'-1']){ + $default1 = $values['filter-'.$l.'-1']; + }elseif(isset($args_values[$l][1])){ + $default1 = $args_values[$l][1]; + } + // dsm($default1, "default 1"); + + // form select element for second level + $form['filters']['filterline-'.$ll]['filter-'.$ll.'-1'] = array( + '#type' => 'select', + '#options' => $level_1_ops, + '#name' => 'filter-'.$ll.'-1', + '#empty_option' => t("Choose a filter"), + // '#empty_values' => 0, + '#default_value' => $default1, + '#ajax' => array( + 'callback' => 'materio_search_api_advanced_search_select_callback', + 'wrapper' => 'advancedsearch-filters', + ), + ); + // without this line, form api will mess with default values + $form_state["input"]['filter-'.$ll.'-1'] = $default1; + + // add level 2 filter if level 1 chosen + if($default1){ + + // build second level taxonomy tree and select options + $taxotree2 = taxonomy_get_tree($vid, $default1, 1, false); + if(count($taxotree2)){ + // $default2 = isset($args_values[$l][2]) ? $args_values[$l][2] : 0; + $default2 = null; + if(isset($values['filter-'.$l.'-2']) && $values['filter-'.$l.'-2']){ + $default2 = $values['filter-'.$l.'-2']; + }elseif(isset($args_values[$l][2])){ + $default2 = $args_values[$l][2]; + } + // dsm($default2, "default 2"); + + $level_2_ops = array(); + foreach ($taxotree2 as $index => $term) { + // TODO: get translated tag name + $level_2_ops[$term->tid] = t($term->name); + } + // form select element for third level + $form['filters']['filterline-'.$ll]['filter-'.$ll.'-2'] = array( + '#type' => 'select', + '#options' => $level_2_ops, + '#name' => 'filter-'.$ll.'-2', + '#empty_option' => t("Choose a filter"), + // '#empty_values' => 0, + '#default_value' => $default2, + ); + // without this line, form api will mess with default values + $form_state["input"]['filter-'.$ll.'-2'] = $default2; + } + } + } + + // add remove the line button + $form['filters']['filterline-'.$ll]['rm-filter-'.$ll] = array( + '#type' => 'image_button', + '#src' => drupal_get_path('module', 'materio_search_api') . '/images/rmfilter.png', + '#title' => t('Remove this filter line'), + '#name' => 'rm-filter-'.$ll, + '#return_value' => $ll, + '#executes_submit_callback' => false, + '#ajax' => array( + 'callback' => 'materio_search_api_advanced_search_rmline_callback', + 'wrapper' => 'advancedsearch-filters', + // 'trigger_as' => array("name"=>"rmfilters".$l), + ), + "#attributes" => array('class'=>array('rm-btn')), + ); + + } // end of lines loop + + if($rmline !== false){ + $form_state['filterlines'] = $form_state['filterlines']-1; + } + + // button to add a new line of criterias + $form['filters']['addfilters'] = array( '#type' => 'image_button', - '#src' => drupal_get_path('module', 'materio_search_api') . '/images/rmfilter.png', - '#title' => t('Remove this filter line'), - '#name' => 'rm-filter-'.$ll, - '#return_value' => $ll, - '#executes_submit_callback' => false, + '#src' => drupal_get_path('module', 'materio_search_api') . '/images/addfilter.png', + '#title' => t('Add a filter line'), + '#name' => "addfilters", + '#return_value' => "add", '#ajax' => array( - 'callback' => 'materio_search_api_advanced_search_rmline_callback', + 'callback' => 'materio_search_api_advanced_search_addfilter_callback', 'wrapper' => 'advancedsearch-filters', - // 'trigger_as' => array("name"=>"rmfilters".$l), ), - "#attributes" => array('class'=>array('rm-btn')), + '#executes_submit_callback' => false, + '#attributes' => array( + 'class'=>array('add-filter') + ), ); - } // end of lines loop + // buttons form container + $form['rightcol'] = array( + '#type' => 'container', + ); + // add a back to search/base home bouton if on explore/foo + if ($path == 'explore' || $path == 'explore/filters' || $path == 'bookmarks' || $path == 'lists' ) { + $link = l('', base_path().'actuality', array( + 'html'=>true, + 'attributes'=>array('class'=>'back-search-home') + )); + $form['rightcol']['actu'] = array( + '#type' => 'markup', + '#markup' => $link, + ); + } - if($rmline !== false){ - $form_state['filterlines'] = $form_state['filterlines']-1; - } + // submit the search + $form['rightcol']['search'] = array( + '#type' => 'image_button', + '#src' => drupal_get_path('module', 'materio_search_api') . '/images/search.png', + '#title' => t('Search'), + '#name' => "search", + '#return_value' => "search", + ); - // button to add a new line of criterias - $form['filters']['addfilters'] = array( - '#type' => 'image_button', - '#src' => drupal_get_path('module', 'materio_search_api') . '/images/addfilter.png', - '#title' => t('Add a filter line'), - '#name' => "addfilters", - '#return_value' => "add", - '#ajax' => array( - 'callback' => 'materio_search_api_advanced_search_addfilter_callback', - 'wrapper' => 'advancedsearch-filters', - ), - '#executes_submit_callback' => false, - '#attributes' => array( - 'class'=>array('add-filter') - ), - ); - - // buttons form container - $form['rightcol'] = array( - '#type' => 'container', - ); - // add a back to search/base home bouton if on explore/foo - if ($path == 'explore' || $path == 'explore/filters' || $path == 'bookmarks' || $path == 'lists' ) { - $link = l('', base_path().'actuality', array( - 'html'=>true, - 'attributes'=>array('class'=>'back-search-home') - )); - $form['rightcol']['actu'] = array( - '#type' => 'markup', - '#markup' => $link, + }else{ + $form['novoc'] = array( + '#markup' => "Please choose a vocabulary to search from in materio search api settings" ); } - - // submit the search - $form['rightcol']['search'] = array( - '#type' => 'image_button', - '#src' => drupal_get_path('module', 'materio_search_api') . '/images/search.png', - '#title' => t('Search'), - '#name' => "search", - '#return_value' => "search", - ); - // dsm($form, 'form'); return $form; } @@ -1391,11 +1403,6 @@ function template_preprocess_materio_search_api_actuality(&$vars){ // $vars['actualities_infos'] = t('Actualities by materiO\''); $vars['actualities_infos'] = t(''); } -// -// function template_preprocess_materio_search_api_advanced_search_block(&$vars){ -// // dsm($vars, "vars"); -// $vars['searchform'] = drupal_get_form("materio_search_api_advanced_search_form"); -// } function theme_materio_search_api_form_element($variables) { // dsm($variables, 'variables');