advanced search : all ajax form behaviours are working

This commit is contained in:
Bachir Soussi Chiadmi
2017-10-10 12:43:45 +02:00
parent 7bc3c13ad6
commit c90cfa63e4
5 changed files with 328 additions and 75 deletions

View File

@@ -735,7 +735,8 @@ function materio_search_api_advanced_search_form($form, &$form_state){
// dsm($form_state, 'form_state');
// dsm($form, 'form');
// global $user;
$form = array();
// $form = array();
$values = $form_state['values'];
// add a back to search/base home bouton if on explore/foo
$args = arg();
@@ -751,124 +752,194 @@ function materio_search_api_advanced_search_form($form, &$form_state){
);
}
// filters
// filters form container
$form['filters'] = array(
'#type' => 'container',
'#prefix' => '<div id="advancedsearch-filters">',
'#suffix' => '</div>',
);
// building first level texonomy tree
$taxotree = taxonomy_get_tree(15, 0, 1, false);
// dsm($taxotree, "taxotree");
$level_0_ops = array(0=>t("Choose a filter"));
foreach ($taxotree as $index => $term) {
$level_0_ops[$term->tid] = $term->name;
// define default number of lines, 1 or more if some were already added
$form_state['filterlines'] =
isset($form_state['filterlines'])
? $form_state['filterlines']
: 1;
$trigger = FALSE;
if (!empty($form_state['triggering_element']['#name'])) {
$trigger = $form_state['triggering_element'];
}
$filterlines = isset($form_state['values']['filterlines']) ? $form_state['values']['filterlines'] : 1;
$rmline = false;
if ($trigger) {
// dsm($form_state['triggering_element'], $form_state['triggering_element']['#name']);
// dsm($values, 'form state values');
if (!empty($form_state['triggering_element'])) {
dsm($form_state['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'];
}
}
if(isset($form_state['triggering_element']['#name']) && $form_state['triggering_element']['#name'] == 'addfilters'){
$filterlines = $filterlines + 1;
}
$form['filterlines'] = array(
'#type' => 'hidden',
'#value' => $filterlines,
);
// build filters lines (ajax enabled)
for ($i=0; $i < $filterlines; $i++) {
for ($l=0; $l < $form_state['filterlines']; $l++) {
$form['filters']['filterline-'.$i] = array(
// if rmline this line,
// continue the loop withour 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")
)
);
$form['filters']['filterline-'.$i]['filter-'.$i.'-0'] = array(
// build first level taxonomy tree and select options
$taxotree = taxonomy_get_tree(15, 0, 1, false);
$level_0_ops = array(0=>t("Choose a filter"));
foreach ($taxotree as $index => $term) {
$level_0_ops[$term->tid] = t($term->name);
}
// form select element for first level
$form['filters']['filterline-'.$ll]['filter-'.$ll.'-0'] = array(
'#type' => 'select',
'#options' => $level_0_ops,
'#name' => 'filter-'.$ll.'-0',
'#default_value' => 0,
'#ajax' => array(
'callback' => 'materio_search_api_advanced_search_callback',
'callback' => 'materio_search_api_advanced_search_select_callback',
'wrapper' => 'advancedsearch-filters',
// 'methode' => 'replace',
// 'effect' => 'fade',
),
);
// add level 1 filter if level 0 chosen
if(isset($form_state["values"]['filter-'.$i.'-0'])
& $form_state["values"]['filter-'.$i.'-0']
if(isset($values['filter-'.$l.'-0'])
&& $values['filter-'.$l.'-0']
){
$default = $values['filter-'.$l.'-0'];
$form['filters']['filterline-'.$ll]['filter-'.$ll.'-0']['#default_value'] = $default;
$value = $form_state["values"]['filter-'.$i.'-0'];
$taxotree1 = taxonomy_get_tree(15, $value, 1, false);
dsm($taxotree1, "taxotree1");
$level_1_ops = array(
0=>t("Choose a filter")
);
// build second level taxonomy tree and select options
$taxotree1 = taxonomy_get_tree(15, $default, 1, false);
$level_1_ops = array(0=>t("Choose a filter"));
foreach ($taxotree1 as $index => $term) {
$level_1_ops[$term->tid] = $term->name;
$level_1_ops[$term->tid] = t($term->name);
}
$form['filters']['filterline-'.$i]['filter-'.$i.'-1'] = array(
// form select element for second level
$form['filters']['filterline-'.$ll]['filter-'.$ll.'-1'] = array(
'#type' => 'select',
'#options' => $level_1_ops,
'#name' => 'filter-'.$ll.'-1',
'#default_value' => 0,
'#ajax' => array(
'callback' => 'materio_search_api_advanced_search_callback',
'callback' => 'materio_search_api_advanced_search_select_callback',
'wrapper' => 'advancedsearch-filters',
'methode' => 'replace',
// 'effect' => 'fade',
),
);
// add level 2 filter if level 1 chosen
if(isset($values['filter-'.$l.'-1'])
&& $values['filter-'.$l.'-1']
){
$default = $values['filter-'.$l.'-1'];
$form['filters']['filterline-'.$ll]['filter-'.$ll.'-1']['#default_value'] = $default;
// build second level taxonomy tree and select options
$taxotree2 = taxonomy_get_tree(15, $default, 1, false);
if(count($taxotree2)){
$level_2_ops = array(0=>t("Choose a filter"));
foreach ($taxotree2 as $index => $term) {
$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',
'#default_value' => 0,
);
}
}
}
// 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;
}
// add a new line of criterias
$form['addfilters'] = array(
// 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'),
'#default_value' => 0,
'#return_value' => 1,
'#name' => "addfilters",
'#executes_submit_callback' => false,
'#return_value' => "add",
'#ajax' => array(
'callback' => 'materio_search_api_advanced_search_callback',
'callback' => 'materio_search_api_advanced_search_addfilter_callback',
'wrapper' => 'advancedsearch-filters',
'trigger_as' => array("name"=>"addfilters"),
// 'methode' => 'replacewith',
// 'speed' => 5000,
// 'effect' => 'slide',
),
'#executes_submit_callback' => false,
);
// submit
// $form['create'] = array(
// '#type' => 'image_button',
// '#src' => drupal_get_path('module', 'materio_search_api') . '/images/search.png',
// '#value' => t('Search'),
// '#name' => "search",
// '#executes_submit_callback' => false,
// );
// submit the search
$form['search'] = array(
'#type' => 'image_button',
'#src' => drupal_get_path('module', 'materio_search_api') . '/images/search.png',
'#title' => t('Search'),
'#name' => "search",
'#return_value' => "search",
);
return $form;
}
function materio_search_api_advanced_search_callback($form, $form_state) {
// dsm($form_state, "callback form state");
// $form["filters"]['test']= array(
// "#markup" => "test",
// );
function materio_search_api_advanced_search_select_callback($form, &$form_state) {
return $form['filters'];
}
function materio_search_api_advanced_search_addfilter_callback($form, &$form_state) {
return $form['filters'];
}
function materio_search_api_advanced_search_rmline_callback($form, &$form_state) {
return $form['filters'];
}