settings['programmatic']) { $rows = array(); $rows[] = array( array( 'data' => ''. check_plain($finder->title) .'', 'class' => 'finder-title', ), array( 'data' => l(t('Edit'), 'admin/build/finder/'. $finder->finder_id .'/edit') . t(' | ') . l(t('Delete'), 'admin/build/finder/'. $finder->finder_id .'/delete'), 'class' => 'finder-ops', 'align' => 'right', ), ); $rows[] = array( array( 'data' => '
'. t('Type') .': '. t($finder->base_handler['#title']) .'
'. t('Path') .': '. l($finder->path, $finder->path) .'
', 'class' => 'finder-summary', ), array( 'data' => '
'. check_markup($finder->description) .'
', 'class' => 'finder-desc description', ), ); $output .= theme('table', array(), $rows, array('class' => 'finder-table finder-'. $finder->finder_id)); } } } $output .= drupal_get_form('finder_admin_add_form'); return $output; } /** * Admin finder add form. */ function finder_admin_add_form($form_state) { $form = array(); $form['base'] = array( '#type' => 'select', '#title' => t('Add a new finder'), '#default_value' => '', '#options' => finder_admin_get_base_options(), '#description' => t('Choose what kind of finder to create.', array('!save_button' => t('Save finder'))), '#required' => TRUE, '#weight' => 20, ); $form['submit'] = array( '#type' => 'submit', '#value' => t('Add finder'), '#weight' => 22, ); return $form; } /** * Submit function for admin finder add form. */ function finder_admin_add_form_submit($form, &$form_state) { $values = &$form_state['values']; $finder = (object)array('base' => $values['base']); finder_save($finder); $finder->title = t('Finder !1', array('!1' => $finder->finder_id)); $finder->path = 'finder/'. $finder->finder_id; finder_save($finder); drupal_set_message(t('A finder was added. Configure the finder below.')); menu_rebuild(); drupal_goto('admin/build/finder/'. $finder->finder_id .'/edit'); } /** * Admin finder edit page. */ function finder_admin_edit($form_state, $finder) { // allow modules to change the finder here finder_invoke_finderapi($finder, 'finder_admin_edit', $form, $form_state); $form_state['storage']['finder'] = $finder; // build the form $form = array(); $form['#tree'] = TRUE; $form['finder_id'] = array( '#type' => 'value', '#value' => $finder->finder_id ? $finder->finder_id : 'add', '#weight' => 0, ); $form['links'] = array( '#type' => 'markup', '#value' => theme('finder_admin_links', $finder), '#weight' => 0, ); $form['base'] = array( '#type' => 'select', '#title' => t('Finder type'), '#default_value' => $finder->base, '#options' => finder_admin_get_base_options(), '#description' => t('You cannot change this.'), '#required' => TRUE, '#disabled' => TRUE, '#weight' => 5, ); $form['title'] = array( '#type' => 'textfield', '#title' => t('Title'), '#default_value' => $finder->title, '#size' => 40, '#maxlength' => 255, '#required' => TRUE, '#weight' => 10, ); $form['description'] = array( '#type' => 'textfield', '#title' => t('Description'), '#default_value' => $finder->description, '#size' => 80, '#description' => t('This will appear on the finder administration page.'), '#weight' => 20, ); $form['path'] = array( '#type' => 'textfield', '#title' => t('Path'), '#default_value' => $finder->path, '#description' => t('Finder needs a URL path for some functionality. No leading or trailing slash.'), '#size' => 30, '#maxlength' => 128, '#required' => TRUE, '#weight' => 40, ); $form['block'] = array( '#type' => 'checkbox', '#title' => t('Provide block'), '#default_value' => $finder->block, '#weight' => 50, '#description' => t('Create a block for the finder form.'), ); $form['settings'] = array( '#weight' => 60, ); $form['settings']['form_on_page'] = array( '#type' => 'checkbox', '#title' => t('Form on page'), '#default_value' => $finder->settings['form_on_page'], '#weight' => 10, '#description' => t('Put a finder form on the path given above.'), ); $form['settings']['form'] = array( '#type' => 'fieldset', '#title' => t('Finder form settings'), '#weight' => 100, '#collapsible' => TRUE, '#collapsed' => TRUE, ); $form['settings']['form']['prefix'] = array( '#type' => 'textarea', '#title' => t('Prefix'), '#default_value' => isset($finder->settings['form']['prefix']) ? $finder->settings['form']['prefix'] : '', '#weight' => 10, '#description' => t('Displayed before the form.'), ); $form['settings']['form']['suffix'] = array( '#type' => 'textarea', '#title' => t('Suffix'), '#default_value' => isset($finder->settings['form']['suffix']) ? $finder->settings['form']['suffix'] : '', '#weight' => 20, '#description' => t('Displayed after the form.'), ); $form['settings']['form']['button_text'] = array( '#type' => 'textfield', '#title' => t('Button text'), '#default_value' => isset($finder->settings['form']['button_text']) ? $finder->settings['form']['button_text'] : t('Find'), '#weight' => 100, '#description' => t('Text to display on the submit button.'), ); $form['settings']['form']['go_text'] = array( '#type' => 'textfield', '#title' => t('Go text'), '#default_value' => isset($finder->settings['form']['go_text']) ? $finder->settings['form']['go_text'] : t('Go'), '#weight' => 120, '#description' => t('Text to display on the go button. Only used with redirect to result "go" button option under Advanced settings.'), ); $form['settings']['advanced'] = array( '#type' => 'fieldset', '#title' => t('Advanced settings'), '#weight' => 200, '#collapsible' => TRUE, '#collapsed' => TRUE, ); $form['settings']['advanced']['filter'] = array( '#type' => 'checkbox', '#title' => t('Show results on results page even before the form has been completed'), '#default_value' => isset($finder->settings['advanced']['filter']) ? $finder->settings['advanced']['filter'] : 0, '#weight' => 10, '#description' => t('Allows this finder to behave more as a filter.'), ); $form['settings']['advanced']['submission'] = array( '#type' => 'checkbox', '#title' => t('Use submit button'), '#default_value' => isset($finder->settings['advanced']['submission']) ? $finder->settings['advanced']['submission'] : 1, '#weight' => 20, '#description' => t('Gives the finder a submit button.'), ); $form['settings']['advanced']['ahah'] = array( '#type' => 'checkbox', '#title' => t('Use AHAH on submit button'), '#default_value' => isset($finder->settings['advanced']['ahah']) ? $finder->settings['advanced']['ahah'] : 0, '#weight' => 30, '#description' => t('Dynamically update the form and results with AHAH javascript replacement instead of loading a whole new page.'), ); $form['settings']['advanced']['ahah_effect'] = array( '#type' => 'radios', '#title' => t('AHAH effect'), '#default_value' => isset($finder->settings['advanced']['ahah_effect']) ? $finder->settings['advanced']['ahah_effect'] : 'none', '#weight' => 32, '#description' => t('If using AHAH, this will be the transition effect when the update occurs.'), '#options' => array( 'none' => t('None'), 'fade' => t('Fade'), 'slide' => t('Slide'), ), ); $form['settings']['advanced']['element_combination'] = array( '#type' => 'radios', '#title' => t('Multiple element result combination'), '#default_value' => isset($finder->settings['advanced']['element_combination']) ? $finder->settings['advanced']['element_combination'] : 0, '#weight' => 40, '#description' => t('With multiple elements, how should the results of each element be combined on the results page?'), '#options' => array( 0 => t('Match all elements.'), 1 => t('Match any element.'), ), ); $form['settings']['advanced']['pager'] = array( '#type' => 'textfield', '#title' => t('Pager'), '#default_value' => isset($finder->settings['advanced']['pager']) ? $finder->settings['advanced']['pager'] : '10', '#description' => t('Number of items to show per results page. Set to 0 to disable pager.'), '#size' => 5, '#maxlength' => 8, '#weight' => 50, ); $operators = finder_match_operator(); foreach ($operators as $k => $v) { $operators[$k] = $v['description']; } $form['settings']['advanced']['match'] = array( '#type' => 'radios', '#title' => t('Result matching'), '#default_value' => isset($finder->settings['advanced']['match']) ? $finder->settings['advanced']['match'] : 'equals', '#options' => $operators, '#weight' => 60, '#description' => t('"Equals" is the most common result matching method.'), ); $form['settings']['advanced']['goto'] = array( '#type' => 'radios', '#title' => t('Redirect to result'), '#default_value' => $finder->settings['advanced']['goto'] ? $finder->settings['advanced']['goto'] : '', '#weight' => 80, '#options' => array( '' => t('Never redirect to result, always use results page.'), 'best' => t('Redirect to the only result, or show results page if there are multiple results.'), 'always' => t('Always redirect to the first result.'), 'go' => t('Use a seperate "go" button for the first result, otherwise use results page.'), // 'separate' is intentionally written as 'seperate' here. ), ); $form['settings']['advanced']['hide_args'] = array( '#type' => 'checkbox', '#title' => t('Hide URL arguments on results page'), '#default_value' => isset($finder->settings['advanced']['hide_args']) ? $finder->settings['advanced']['hide_args'] : 0, '#weight' => 160, '#description' => t("Use the user's session to store submitted values across multiple pages. Also creates a token for multipage results to identify the stored submission."), ); $form['settings']['advanced']['arg_sep'] = array( '#type' => 'textfield', '#title' => t('Multiple value URL arguments separator'), '#default_value' => isset($finder->settings['advanced']['arg_sep']) ? $finder->settings['advanced']['arg_sep'] : ',', '#weight' => 170, '#description' => t('Must contain at least one non-alphanumeric character other than \'/\', \'_\', and \'-\'. If this string exists within a keyword, the keyword must be enclosed in double quotes to prevent parsing issues.'), '#size' => 5, '#required' => TRUE, ); $form['settings']['advanced']['show_links'] = array( '#type' => 'checkbox', '#title' => t('Show finder links'), '#default_value' => isset($finder->settings['advanced']['show_links']) ? $finder->settings['advanced']['show_links'] : 1, '#weight' => 180, '#description' => t('Show the finder links.'), ); $form['settings']['advanced']['show_admin_links'] = array( '#type' => 'checkbox', '#title' => t('Show finder admin links'), '#default_value' => isset($finder->settings['advanced']['show_admin_links']) ? $finder->settings['advanced']['show_admin_links'] : 1, '#weight' => 182, '#description' => t('Show the finder admin links.'), ); if (!empty($finder->elements)) { $form['elements'] = array( '#title' => t('Elements'), '#weight' => 2000, '#theme' => 'finder_admin_edit_elements_table', ); foreach ($finder->elements as $key => $value) { $element_output = '
'; $element_output .= '
'. check_plain($value->title) .'
'; $element_output .= '
'.t('Element').': '. $value->element_handler['#title'] .'
'; $element_output .= '
'; $form['elements'][$value->finder_element_id]['value']['#value'] = $element_output; $form['elements'][$value->finder_element_id]['ops']['#value'] = l(t('Edit'), 'admin/build/finder/'. $finder->finder_id .'/edit/'. $value->finder_element_id .'/edit') . t(' | ') . l(t('Delete'), 'admin/build/finder/'. $finder->finder_id .'/edit/'. $value->finder_element_id .'/delete'); $form['elements'][$value->finder_element_id]['weight'] = array( '#type' => 'weight', '#delta' => count($finder->elements), '#default_value' => $key, ); } } else { $form['no_elements'] = array( '#value' => '
' . t('There are currently no elements configured for this finder.') .'
', '#weight' => 100, ); } $form['add_element'] = array( '#type' => 'select', '#title' => t('Add element'), '#default_value' => '', '#options' => finder_admin_get_element_options(), '#description' => t('Choose the form element to use and press %save_button.', array('%save_button' => t('Save finder'))), '#weight' => 10000, ); $form['submit'] = array( '#type' => 'submit', '#value' => t('Save finder'), '#weight' => 10010, ); $form['delete'] = array( '#type' => 'submit', '#value' => t('Delete finder'), '#weight' => 10020, ); return $form; } /** * Validate function for admin finder add/edit page. */ function finder_admin_edit_validate($form, &$form_state) { $values = &$form_state['values']; $arg_sep = preg_replace("/[a-zA-Z0-9\-\_\s]/", "", $values['settings']['advanced']['arg_sep']); if (!$arg_sep) { form_set_error('arg_sep', t('Multiple value URL arguments separator must contain at least one non-alphanumeric character that is not \'/\', \'-\', or \'_\'.')); } } /** * Submit function for admin finder add/edit page. */ function finder_admin_edit_submit($form, &$form_state) { $values = &$form_state['values']; if ($form_state['clicked_button']['#id'] == 'edit-delete') { drupal_goto('admin/build/finder/'. $values['finder_id'] .'/delete'); } else { $finder = (object)array( 'finder_id' => $values['finder_id'], 'base' => $values['base'], 'title' => $values['title'], 'description' => $values['description'], 'path' => $values['path'], 'block' => $values['block'], 'settings' => $values['settings'], ); finder_save($finder); if (is_array($values['elements'])) { foreach ($values['elements'] as $finder_element_id => $value) { $finder_element = (object)array( 'finder_element_id' => $finder_element_id, 'weight' => $value['weight'], ); finder_element_save($finder_element); } } drupal_set_message(t('The finder was saved.')); menu_rebuild(); if ($values['add_element']) { $finder_element = (object)array( 'finder_id' => $values['finder_id'], 'element' => $values['add_element'], ); finder_element_save($finder_element); $finder_element->title = t('Finder element !1', array('!1' => $finder_element->finder_element_id)); finder_element_save($finder_element); drupal_set_message(t('A finder element was added. Configure the element below.')); drupal_goto('admin/build/finder/'. $values['finder_id'] .'/edit/'. $finder_element->finder_element_id .'/edit/'); } else { drupal_goto('admin/build/finder/'. $values['finder_id'] .'/edit/'); } } } /** * Admin finder delete page. */ function finder_admin_delete($form_state, $finder) { // allow modules to change the finder here finder_invoke_finderapi($finder, 'finder_admin_delete'); $form_state['storage']['finder'] = $finder; // build the form $form = array(); $form['#tree'] = TRUE; $form['finder_id'] = array( '#type' => 'value', '#value' => $finder->finder_id, ); return confirm_form($form, t('Are you sure you want to delete the %ft finder?', array('%ft' => $finder->title)), $_GET['destination'] ? $_GET['destination'] : 'admin/build/finder', t('This action cannot be undone.'), t('Delete'), t('Cancel')); } /** * Submit function for admin finder delete page. */ function finder_admin_delete_submit($form, &$form_state) { $finder_id = &$form_state['values']['finder_id']; finder_delete($finder_id); menu_rebuild(); drupal_goto('admin/build/finder'); } /** * Admin finder element add/edit page. * Must have a Finder object at this point. */ function finder_admin_element_edit($form_state, $finder, $finder_element_id) { $element = &finder_element($finder, $finder_element_id); // allow modules to change the element here finder_invoke_finderapi($element, 'finder_admin_element_edit'); $module = &$finder->base_handler['#module']; $fields = module_invoke($module, 'finder_fields', $finder, $finder_element_id); $form_state['storage']['finder'] = $finder; $form_state['storage']['finder_element_id'] = $finder_element_id; $form_state['storage']['finder_element_defaults'] = $element; $form = array(); $form['#tree'] = TRUE; $form['finder_id'] = array( '#type' => 'value', '#value' => $finder->finder_id, '#weight' => 0, ); $form['finder_element_id'] = array( '#type' => 'value', '#value' => $finder_element_id, '#weight' => 2, ); $form['element'] = array( '#type' => 'select', '#title' => t('Element'), '#default_value' => $element->element ? $element->element : '', '#options' => finder_admin_get_element_options(), '#description' => t('The form element to use.'), '#required' => TRUE, '#weight' => 10, ); $form['title'] = array( '#type' => 'textfield', '#title' => t('Title'), '#default_value' => $element->title ? $element->title : '', '#size' => 40, '#maxlength' => 255, '#required' => TRUE, '#weight' => 20, '#description' => t('The label on the form element.'), ); $form['settings'] = array( '#weight' => 30, ); $form['settings']['form'] = array( '#type' => 'fieldset', '#title' => t('Finder form element settings'), '#weight' => 0, '#collapsible' => TRUE, '#collapsed' => TRUE, ); $form['settings']['form']['description'] = array( '#type' => 'textfield', '#title' => t('Description'), '#default_value' => isset($element->settings['form']['description']) ? $element->settings['form']['description'] : '', '#weight' => 10, '#description' => t('The description or help message to display with the form element.'), ); $form['settings']['form']['prefix'] = array( '#type' => 'textarea', '#title' => t('Prefix'), '#default_value' => isset($element->settings['form']['prefix']) ? $element->settings['form']['prefix'] : '', '#weight' => 20, '#description' => t('Displayed before the form element.'), ); $form['settings']['form']['suffix'] = array( '#type' => 'textarea', '#title' => t('Suffix'), '#default_value' => isset($element->settings['form']['suffix']) ? $element->settings['form']['suffix'] : '', '#weight' => 30, '#description' => t('Displayed after the form element.'), ); $form['settings']['form']['default_value'] = array( '#type' => 'textfield', '#title' => t('Default value'), '#default_value' => isset($element->settings['form']['default_value']) ? $element->settings['form']['default_value'] : '', '#weight' => 40, '#description' => t('Default value of the form element.'), ); $form['settings']['form']['required'] = array( '#type' => 'checkbox', '#title' => t('Required'), '#default_value' => isset($element->settings['form']['required']) ? $element->settings['form']['required'] : 0, '#weight' => 50, '#description' => t('Enforce user input in this field.'), ); $form['settings']['choices'] = array( '#type' => 'fieldset', '#title' => t('Possible choices'), '#weight' => 60, '#collapsible' => TRUE, '#collapsed' => FALSE, ); if ($fields) { $form['settings']['choices']['field'] = array( '#type' => 'select', '#title' => t('Find items by this field'), '#default_value' => $element->settings['choices']['field'], '#options' => $fields, '#description' => t('This is the field that will be searched on. If you pick multiple fields performance may be affected.'), '#weight' => 20, '#required' => TRUE, '#multiple' => TRUE, '#size' => min(6, count($fields)+1), ); } else { $form['settings']['choices']['no_field'] = array( '#value' => t("There are currently no fields to choose from."), '#weight' => 20, ); } $form['settings']['choices']['sort'] = array( '#type' => 'checkbox', '#title' => t('Sort options'), '#default_value' => $element->settings['choices']['sort'], '#weight' => 100, '#description' => t('Will put the list into order for easier scanning.'), ); $form['submit'] = array( '#type' => 'submit', '#value' => t('Save finder element'), '#weight' => 10000, ); $form['delete'] = array( '#type' => 'submit', '#value' => t('Delete finder element'), '#weight' => 10020, ); return $form; } /** * Submit function for admin finder add/edit page. */ function finder_admin_element_edit_submit($form, &$form_state) { $values = &$form_state['values']; if ($form_state['clicked_button']['#id'] == 'edit-delete') { drupal_goto('admin/build/finder/'. $values['finder_id'] .'/edit/'. $values['finder_element_id'] .'/delete'); } else { $finder_element = (object)array( 'finder_element_id' => $values['finder_element_id'], 'finder_id' => $values['finder_id'], 'element' => $values['element'], 'title' => $values['title'], 'weight' => $values['weight'], 'settings' => $values['settings'], ); finder_element_save($finder_element); drupal_set_message(t('The finder element was saved.')); drupal_goto('admin/build/finder/'. $values['finder_id'] .'/edit'); } } /** * Admin finder delete page */ function finder_admin_element_delete($form_state, $finder, $finder_element_id) { $element = &finder_element($finder, $finder_element_id); // allow modules to change the element here finder_invoke_finderapi($element, 'finder_admin_element_delete'); $form = array(); $form['#tree'] = TRUE; $form['finder_element_id'] = array( '#type' => 'value', '#value' => $finder_element_id, ); $form['finder_id'] = array( '#type' => 'value', '#value' => $finder->finder_id, ); return confirm_form($form, t('Are you sure you want to delete the finder element %fet ?', array('%fet' => $element->title)), $_GET['destination'] ? $_GET['destination'] : 'admin/build/finder/'. $finder->finder_id .'/edit', t('This action cannot be undone.'), t('Delete'), t('Cancel')); } /** * Submit function for admin finder delete page. */ function finder_admin_element_delete_submit($form, &$form_state) { $finder_element_id = &$form_state['values']['finder_element_id']; $finder_id = &$form_state['values']['finder_id']; finder_element_delete($finder_element_id); drupal_goto('admin/build/finder/'. $finder_id .'/edit'); } /** * Get base handlers and convert to options array. */ function finder_admin_get_base_options() { $bases = finder_base_handlers(); $base_options = array('' => t('- Select a finder type -')); if (!empty($bases)) { foreach ($bases as $base_key => $base_data) { $base_options[$base_key] = $base_data['#title']; } } else { drupal_set_message(t('Error: You must activate a finder base handler module such as Finder Views or Finder Node to begin.'), 'error'); return array('' => t('- No finder types to choose from -')); } return $base_options; } /** * Get element handlers and convert to options array. */ function finder_admin_get_element_options() { $elements = finder_element_handlers(); $element_options = array('' => t('- Select an element type -')); if (!empty($elements)) { foreach ($elements as $element_key => $element_data) { $element_options[$element_key] = t($element_data['#title']); } } else { drupal_set_message(t('Error: You must activate a finder element handler module such as Finder Autocomplete or Finder Optionwidgets to begin.'), 'error'); return array('' => t('- No element types to choose from -')); } return $element_options; } /** * Admin finder import page. */ function finder_admin_import() { global $user; $output; if ($_POST['finder_code']) { $finder_code = trim($_POST['finder_code']); $import = finder_import($finder_code); if (is_array($import)) { foreach ($import as $finder) { $new_finder = finder_clone($finder); drupal_set_message(t("Imported !finder", array('!finder' => l(check_plain($new_finder->title), 'admin/build/finder/'. $new_finder->finder_id .'/edit')))); } drupal_goto('admin/build/finder'); } else { $new_finder = finder_clone($import); drupal_set_message(t("Imported !finder", array('!finder' => l(check_plain($new_finder->title), 'admin/build/finder/'. $new_finder->finder_id .'/edit')))); drupal_goto('admin/build/finder/'. $new_finder->finder_id .'/edit'); } } return drupal_get_form('finder_admin_import_form', $form); } /** * Admin finder import form. */ function finder_admin_import_form($form_state) { $form['#prefix'] = t('

You may import a finder by copy-and-pasting the results of an exported finder.

'); $form['finder_code'] = array( '#type' => 'textarea', '#title' => t('Finder code'), '#default_value' => '', '#required' => TRUE, '#rows' => 30, '#description' => t('Paste the finder code here.'), ); $form['#redirect'] = FALSE; $form['submit'] = array( '#type' => 'submit', '#value' => t('Import'), ); return $form; } /** * Admin finder export page. * * Set $return_code to TRUE to not return form but the code instead. */ function finder_admin_export($original_finder, $return_code = FALSE) { $finder = drupal_clone($original_finder); drupal_set_title(t('Export of !title', array('!title' => check_plain($finder->title)))); finder_invoke_finderapi($finder, 'finder_export'); $finder_code = finder_export($finder); return ($return_code ? $finder_code : drupal_get_form('finder_admin_export_form', $finder_code)); } /** * Admin finder export form. */ function finder_admin_export_form($form_state, $code) { $form = array(); $form['export'] = array( '#type' => 'textarea', '#title' => t('Finder code'), '#default_value' => $code, '#rows' => 30, '#description' => t('Copy this code and then on the site you want to import to, go to the "Finder import" link on the finder admin page, and paste it in there.'), '#attributes' => array( 'style' => 'width: 97%;', ), ); return $form; }