diff -ur faceted_search_old/faceted_search.admin.inc faceted_search/faceted_search.admin.inc --- faceted_search_old/faceted_search.admin.inc 2009-05-04 19:08:03.000000000 -0400 +++ faceted_search/faceted_search.admin.inc 2009-06-19 10:36:05.000000000 -0400 @@ -11,12 +11,26 @@ */ function faceted_search_list_page() { $items = array(); - foreach (faceted_search_get_env_ids() as $env_id) { - $env = faceted_search_env_load($env_id); - $links = array( - array('title' => t('Edit'), 'href' => 'admin/settings/faceted_search/'. $env_id), - array('title' => t('Delete'), 'href' => 'admin/settings/faceted_search/delete/'. $env_id), - ); + foreach (faceted_search_get_env_names(TRUE) as $env_name) { + $env = faceted_search_env_load($env_name); + $links = array(); + if($env->get_is_default()) { + $links[] = array('title' => t('Override'), 'href' => 'admin/settings/faceted_search/'. $env_name); + } else { + $links[] = array('title' => t('Edit'), 'href' => 'admin/settings/faceted_search/'. $env_name); + if($env->get_is_overridden()) { + $links[] = array('title' => t('Revert'), 'href' => 'admin/settings/faceted_search/delete/'. $env_name); + } else { + $links[] = array('title' => t('Delete'), 'href' => 'admin/settings/faceted_search/delete/'. $env_name); + } + } + + $links[] = array('title' => t('Export'), 'href' => 'admin/settings/faceted_search/export/'. $env_name); + if($env->get_is_enabled()) { + $links[] = array('title' => t('Disable'), 'href' => 'admin/settings/faceted_search/disable/'. $env_name); + } else { + $links[] = array('title' => t('Enable'), 'href' => 'admin/settings/faceted_search/enable/'. $env_name); + } // Check that the base_path is a valid setting, because it is a // faceted_search_ui thing that faceted_search, as the parent class, // should normally not know about. @@ -74,6 +88,102 @@ $form_state['redirect'] = 'admin/settings/faceted_search'; } +function faceted_search_export_form($form_state, $env) { + + // Gather all implemented facets. + $facets = $env->get_filter_settings(); + $env = (array)$env; + foreach ($facets as $k1 => $facet) { + foreach ($facet as $k2 => $instance) { + unset($facets[$k1][$k2]['env_id']); + } + } + $env['_filter_settings'] = $facets; + unset($env['env_id']); + + $form['exportval'] = array ( + '#type' => 'textarea', + '#rows' => 30, + '#title' => t('Exported'), + '#default_value' => '$'."searches['".$env['name']."'] = ". var_export($env, true) .';', + ); + + return $form; +} + +function faceted_search_import_form($form_state) { + $form['importval'] = array ( + '#type' => 'textarea', + '#rows' => 30, + '#title' => t('Import'), + '#default_value' => '', + ); + $form['import'] = array( + '#type' => 'submit', + '#value' => t('Import'), + ); + return $form; +} + +function faceted_search_import_form_submit($form, &$form_state) { + + eval($form_state['values']['importval']); + $faceted_search = reset($searches); + //mimic a database object in ways expected + $faceted_search['settings'] = serialize($faceted_search['settings']); + $faceted_search = new faceted_search((object)$faceted_search); + + // Save to database, obtaining a new env_id if not updating an existing + // environment. + drupal_write_record('faceted_search_env', $faceted_search, NULL); + + // Save filter settings. + if ($faceted_search->_filter_settings) { + $flattened = array(); + foreach($faceted_search->_filter_settings as $facet){ + foreach($facet as $instance) { + $flattened[] = $instance; + } + } + faceted_search_save_filter_settings($faceted_search->env_id, $flattened); + } + + // Rebuild the menus, if only for updating titles. + menu_rebuild(); + + drupal_set_message(t('The faceted search environment %name has been imported.', array('%name' => $faceted_search->name))); + + $form_state['redirect'] = 'admin/settings/faceted_search/'. $env->env_id; +} + +/** + * Page callback for the Views enable page + */ +function faceted_search_disable_page($env) { + if(!$env->name) { + return; + } + $fs_status = variable_get('faceted_search_defaults', array()); + $fs_status[$env->name] = TRUE; // True is disabled + variable_set('faceted_search_defaults', $fs_status); + menu_rebuild(); + drupal_goto('admin/settings/faceted_search'); +} +/** + * Page callback for the Views enable page. + */ +function faceted_search_enable_page($env) { + if(!$env->name) { + return; + } + + $fs_status = variable_get('faceted_search_defaults', array()); + $fs_status[$env->name] = FALSE; // false is enabled + variable_set('faceted_search_defaults', $fs_status); + menu_rebuild(); + drupal_goto('admin/settings/faceted_search'); +} + /** * Form for editing an environment. * @@ -161,7 +271,7 @@ ); // Gather every possible facet. - $all_filter_settings = faceted_search_load_filter_settings($env, TRUE); + $all_filter_settings = faceted_search_load_all_filter_settings($env); $facets = array(); foreach (module_implements('faceted_search_collect') as $module) { $hook = $module .'_faceted_search_collect'; diff -ur faceted_search_old/faceted_search.inc faceted_search/faceted_search.inc --- faceted_search_old/faceted_search.inc 2009-01-04 14:36:25.000000000 -0500 +++ faceted_search/faceted_search.inc 2009-06-19 09:49:30.000000000 -0400 @@ -873,6 +873,13 @@ * Collection of filters currently used by this search. */ var $_filters = array(); + + /** + * Filter settings for this search + */ + var $_filter_settings = array(); + var $_overridden = FALSE; + var $_enabled = TRUE; /** * Constructor. Initialize the search environment. @@ -955,6 +962,33 @@ } /** + * Return the filter settings of this search environment + */ + function get_filter_settings() { + $ret = array(); + if(!$this->_filter_settings && $this->env_id) { + $results = db_query("SELECT * FROM {faceted_search_filters} WHERE env_id = %d AND status = 1", $this->env_id); + while ($settings = db_fetch_array($results)) { + $this->_filter_settings[$settings['filter_key']][$settings['filter_id']] = $settings; + } + } + return $this->_filter_settings; + } + + /** + * Return whether this is a default environment from code or not + */ + function get_is_default() { + return ($this->env_id > 0) ? FALSE : TRUE; + } + + function get_is_overridden() { + return $this->_overridden; + } + function get_is_enabled() { + return $this->_enabled; + } + /** * Return the specified filter. */ function get_filter($index) { @@ -974,7 +1008,7 @@ /** * Prepare the complete search environment (with its filters), parsing the - * given search text. Requires that an env_id has been assigned previously. + * given search text. * * @param $text * Optional search text. Defaults to the empty string. @@ -982,15 +1016,12 @@ * TRUE is the search environment could be successfully built. */ function prepare($text = '') { - if (!$this->env_id) { - return FALSE; - } $this->_text = $text; - $this->_results_table = 'temp_faceted_search_results_'. $this->env_id; + $this->_results_table = 'temp_faceted_search_results_'. $this->name; // Load settings for all enabled filters in this search environment. - $all_filter_settings = faceted_search_load_filter_settings($this); + $all_filter_settings = $this->get_filter_settings(); // Make a selection with all enabled filters. $selection = faceted_search_get_filter_selection($all_filter_settings); diff -ur faceted_search_old/faceted_search.install faceted_search/faceted_search.install --- faceted_search_old/faceted_search.install 2009-01-04 14:36:25.000000000 -0500 +++ faceted_search/faceted_search.install 2009-06-19 12:18:28.000000000 -0400 @@ -35,6 +35,7 @@ ), ), 'primary key' => array('env_id'), + 'unique keys' => array('name' => array('name')), ); $schema['faceted_search_filters'] = array( @@ -184,3 +185,6 @@ return $ret; } +function faceted_search_update_6001() { + db_query("CREATE UNIQUE INDEX name ON {faceted_search_env} (name)"); +} \ No newline at end of file diff -ur faceted_search_old/faceted_search.module faceted_search/faceted_search.module --- faceted_search_old/faceted_search.module 2009-05-04 19:08:03.000000000 -0400 +++ faceted_search/faceted_search.module 2009-06-19 10:54:32.000000000 -0400 @@ -61,6 +61,39 @@ 'type' => MENU_CALLBACK, 'file' => 'faceted_search.admin.inc', ); + $items['admin/settings/faceted_search/export/%faceted_search_env'] = array( + 'load arguments' => array(5), + 'page callback' => 'drupal_get_form', + 'page arguments' => array('faceted_search_export_form', 4), + 'access arguments' => array('administer faceted search'), + 'type' => MENU_CALLBACK, + 'file' => 'faceted_search.admin.inc', + ); + $items['admin/settings/faceted_search/disable/%faceted_search_env'] = array( + 'load arguments' => array(5), + 'page callback' => 'faceted_search_disable_page', + 'page arguments' => array(4), + 'access arguments' => array('administer faceted search'), + 'type' => MENU_CALLBACK, + 'file' => 'faceted_search.admin.inc', + ); + $items['admin/settings/faceted_search/enable/%faceted_search_env'] = array( + 'load arguments' => array(5), + 'page callback' => 'faceted_search_enable_page', + 'page arguments' => array(4), + 'access arguments' => array('administer faceted search'), + 'type' => MENU_CALLBACK, + 'file' => 'faceted_search.admin.inc', + ); + $items['admin/settings/faceted_search/import'] = array( + 'title' => 'Import environment', + 'page callback' => 'drupal_get_form', + 'page arguments' => array('faceted_search_import_form'), + 'access callback' => 'user_access', + 'access arguments' => array('administer faceted search'), + 'type' => MENU_LOCAL_TASK, + 'file' => 'faceted_search.admin.inc', + ); $items['admin/settings/faceted_search/%faceted_search_env'] = array( 'load arguments' => array(4), 'page callback' => 'drupal_get_form', @@ -162,7 +195,7 @@ case 'refresh': if ($group == 'faceted_search') { - foreach (faceted_search_get_env_ids() as $env_id) { + foreach (faceted_search_get_env_names() as $env_id) { $env = faceted_search_env_load($env_id); faceted_search_env_locale_refresh($env); } @@ -214,55 +247,73 @@ * * This function also acts as an argument loader for the menu system. */ -function faceted_search_env_load($env_id) { +function faceted_search_env_load($env_name) { static $env = NULL; - if (!is_numeric($env_id)) { - return FALSE; - } - if (!isset($env[$env_id])) { - $results = db_query('SELECT * FROM {faceted_search_env} WHERE env_id = %d', $env_id); + if (!isset($env[$env_name])) { + $allhooks = module_invoke_all("faceted_search_env_define"); + if($allhooks[$env_name]) { + $allhooks[$env_name]['settings'] = serialize($allhooks[$env_name]['settings']); + $env[$env_name] = new faceted_search((object)($allhooks[$env_name])); + } + $results = db_query("SELECT * FROM {faceted_search_env} WHERE name = '%s'", $env_name); if ($record = db_fetch_object($results)) { - $env[$env_id] = new faceted_search($record); + if($env[$env_name]) { + //is an overridden default: mark as such + $record->_overridden = TRUE; + } + $env[$env_name] = new faceted_search($record); + } + $fs_status = variable_get('faceted_search_defaults', array()); + if($fs_status[$env_name]) { + $env[$env_name]->_enabled = FALSE; } } - return isset($env[$env_id]) ? $env[$env_id] : FALSE; + return isset($env[$env_name]) ? $env[$env_name] : FALSE; } /** * Return the ids of all existing environments. */ -function faceted_search_get_env_ids() { - static $env_ids = array(); - if (!$env_ids) { - $results = db_query('SELECT env_id FROM {faceted_search_env}'); +function faceted_search_get_env_names($disabled = FALSE) { + static $env_names = array(); + if (!$env_names) { + $allhooks = module_invoke_all("faceted_search_env_define"); + foreach($allhooks as $key => $val) { + $env_names[$key] = $key; + } + $results = db_query('SELECT name FROM {faceted_search_env}'); while ($result = db_fetch_object($results)) { - $env_ids[$result->env_id] = $result->env_id; + $env_names[$result->name] = $result->name; + } + if (!$disabled) { + $fs_status = variable_get('faceted_search_defaults', array()); + foreach($fs_status AS $key => $stat) { + if($stat){ + unset($env_names[$key]); + } + } } } - return $env_ids; + return $env_names; } /** - * Load filter settings into an array. + * Load filter settings into an array. Add on status=0 ones to the ones stored in the $env variable itself. * * @param $env * Environment whose filters should be loaded. - * @param $include_disabled - * Optional. When FALSE, only retrieve the settings of filters that are enabled. When - * TRUE, retrieve all settings. Defaults to FALSE. * @param $filter_key * Optional. Filter key to load the settings for. When not set, settings are * retrieved for all filters. * @return * Array of filters settings keyed by filter key and filter id. */ -function faceted_search_load_filter_settings($env, $include_disabled = FALSE, $filter_key = NULL) { - $filter_settings = array(); +function faceted_search_load_all_filter_settings($env, $filter_key = NULL) { + $filter_settings = $env->get_filter_settings(); if ($env->env_id) { - $where_status = $include_disabled ? '' : 'AND status = 1'; $where_filter_key = isset($filter_key) ? "AND filter_key = '%s'" : ''; - $results = db_query("SELECT * FROM {faceted_search_filters} WHERE env_id = %d $where_status $where_filter_key", $env->env_id, $filter_key); + $results = db_query("SELECT * FROM {faceted_search_filters} WHERE env_id = %d AND status = 0 $where_filter_key", $env->env_id, $filter_key); while ($settings = db_fetch_array($results)) { $filter_settings[$settings['filter_key']][$settings['filter_id']] = $settings; } diff -ur faceted_search_old/faceted_search_ui.module faceted_search/faceted_search_ui.module --- faceted_search_old/faceted_search_ui.module 2009-04-16 15:50:49.000000000 -0400 +++ faceted_search/faceted_search_ui.module 2009-06-19 09:28:57.000000000 -0400 @@ -21,8 +21,8 @@ */ function faceted_search_ui_forms() { $forms = array(); - foreach (faceted_search_get_env_ids() as $env_id) { - $forms['faceted_search_ui_form_'. $env_id]['callback'] = 'faceted_search_ui_form'; + foreach (faceted_search_get_env_names() as $env_name) { + $forms['faceted_search_ui_form_'. $env_name]['callback'] = 'faceted_search_ui_form'; } return $forms; } @@ -32,39 +32,39 @@ */ function faceted_search_ui_menu() { // TODO: hook_menu() is invoked when uninstalling a module, and in this case - // faceted_search_get_env_ids() tries to access the {faceted_search_env} + // faceted_search_get_env_names() tries to access the {faceted_search_env} // table, which no longer exists since faceted_search.module gets uninstalled // first. This causes an error message. The real issue is the module // dependency tree being ignored when uninstalling // (http://drupal.org/node/151452). $items = array(); - foreach (faceted_search_get_env_ids() as $env_id) { + foreach (faceted_search_get_env_names() as $env_id) { $env = faceted_search_env_load($env_id); $base_path = $env->settings['base_path']; $items[$base_path] = array( 'title callback' => 'faceted_search_ui_menu_title', - 'title arguments' => array((string)$env_id), + 'title arguments' => array($env->name), 'page callback' => 'faceted_search_ui_stage_select', - 'page arguments' => array((string)$env_id), + 'page arguments' => array($env->name), 'access arguments' => array('use faceted search'), 'type' => MENU_CALLBACK, ); $items[$base_path .'/results'] = array( 'page callback' => 'faceted_search_ui_stage_results', - 'page arguments' => array((string)$env_id), + 'page arguments' => array($env->name), 'access arguments' => array('use faceted search'), 'type' => MENU_CALLBACK, ); $items[$base_path .'/facet'] = array( 'page callback' => 'faceted_search_ui_stage_facet', - 'page arguments' => array((string)$env_id), + 'page arguments' => array($env->name), 'access arguments' => array('use faceted search'), 'type' => MENU_CALLBACK, ); $items[$base_path .'/categories'] = array( 'page callback' => 'faceted_search_ui_stage_categories', - 'page arguments' => array((string)$env_id), + 'page arguments' => array($env->name), 'access arguments' => array('use faceted search'), 'type' => MENU_CALLBACK, ); @@ -82,34 +82,34 @@ function faceted_search_ui_block($op = 'list', $delta = 0, $edit = array()) { if ($op == 'list') { $blocks = array(); - foreach (faceted_search_get_env_ids() as $env_id) { - $env = faceted_search_env_load($env_id); + foreach (faceted_search_get_env_names() as $env_name) { + $env = faceted_search_env_load($env_name); if ($env->settings['current_block']) { - $blocks[$env_id .'_current'] = array( + $blocks[$env_name .'_current'] = array( 'info' => t('@env - Current search', array('@env' => $env->name)), 'cache' => BLOCK_CACHE_PER_PAGE | BLOCK_CACHE_PER_USER, ); } if ($env->settings['keyword_block']) { - $blocks[$env_id .'_keyword'] = array( + $blocks[$env_name .'_keyword'] = array( 'info' => t('@env - Keyword search', array('@env' => $env->name)), 'cache' => BLOCK_CACHE_PER_PAGE | BLOCK_CACHE_PER_ROLE, ); } if ($env->settings['guided_block']) { - $blocks[$env_id .'_guided'] = array( + $blocks[$env_name .'_guided'] = array( 'info' => t('@env - Guided search', array('@env' => $env->name)), 'cache' => BLOCK_CACHE_PER_PAGE | BLOCK_CACHE_PER_USER, ); } if ($env->settings['related_block']) { - $blocks[$env_id .'_related'] = array( + $blocks[$env_name .'_related'] = array( 'info' => t('@env - Related categories', array('@env' => $env->name)), 'cache' => BLOCK_CACHE_PER_PAGE | BLOCK_CACHE_PER_USER, ); } if ($env->settings['sort_block']) { - $blocks[$env_id .'_sort'] = array( + $blocks[$env_name .'_sort'] = array( 'info' => t('@env - Sort options', array('@env' => $env->name)), 'cache' => BLOCK_CACHE_PER_PAGE, ); @@ -119,9 +119,9 @@ } elseif ($op == 'view' && user_access('use faceted search')) { // Determine the environment id and requested block. - list($env_id, $delta) = explode('_', $delta, 2); + list($env_name, $delta) = explode('_', $delta, 2); - $env = faceted_search_env_load($env_id); + $env = faceted_search_env_load($env_name); if (!$env || $env->ui_state['stage'] == 'select' || ($env->ui_state['stage'] == 'facet' && $delta != 'sort')) { // We don't show blocks in this context. return; @@ -358,14 +358,14 @@ * @param $text * The search text. */ -function faceted_search_ui_stage_results($env_id, $text = '') { +function faceted_search_ui_stage_results($env_name, $text = '') { // If the menu system has splitted the search text because of slashes, glue it back. if (func_num_args() > 2) { $args = func_get_args(); $text .= '/'. implode('/', array_slice($args, 2)); } - $env = faceted_search_env_load($env_id); + $env = faceted_search_env_load($env_name); // Initialize the current search. $env->prepare($text); @@ -405,38 +405,41 @@ /** * Menu callback to display the search page. */ -function faceted_search_ui_stage_select($env_id, $text = '') { +function faceted_search_ui_stage_select($env_name, $text = '') { // If the menu system has splitted the search text because of slashes, glue it back. if (func_num_args() > 2) { $args = func_get_args(); $text .= '/'. implode('/', array_slice($args, 2)); } - $env = faceted_search_env_load($env_id); - - // Initialize the current search. - $env->prepare($text); - $env->ui_state['stage'] = 'select'; + if ($env = faceted_search_env_load($env_name)) { + // Initialize the current search. + $env->prepare($text); + $env->ui_state['stage'] = 'select'; - faceted_search_ui_add_robots_directive($env); - faceted_search_ui_add_css(); + faceted_search_ui_add_robots_directive($env); + faceted_search_ui_add_css(); - // Build the search results, which are required to count nodes per category - $env->execute(); + // Build the search results, which are required to count nodes per category + $env->execute(); - faceted_search_ui_set_title($env); + faceted_search_ui_set_title($env); - $keyword_block_content = faceted_search_ui_keyword_block($env); - $guided_block_content = faceted_search_ui_guided_block($env); - if ($output = theme('faceted_search_ui_stage_select', $env, $keyword_block_content, $guided_block_content)) { - return theme('faceted_search_ui_page', $env, $output); + $keyword_block_content = faceted_search_ui_keyword_block($env); + $guided_block_content = faceted_search_ui_guided_block($env); + if ($output = theme('faceted_search_ui_stage_select', $env, $keyword_block_content, $guided_block_content)) { + return theme('faceted_search_ui_page', $env, $output); + } + } + else { + return drupal_not_found(); } } /** * Menu callback to display a facet's categories. */ -function faceted_search_ui_stage_facet($env_id, $facet_key_id = '', $facet_sort = '', $text = '') { +function faceted_search_ui_stage_facet($env_name, $facet_key_id = '', $facet_sort = '', $text = '') { if (!$facet_key_id || !$facet_sort) { drupal_not_found(); return; @@ -448,7 +451,7 @@ $text .= '/'. implode('/', array_slice($args, 4)); } - $env = faceted_search_env_load($env_id); + $env = faceted_search_env_load($env_name); // Initialize the current search. $env->prepare($text); @@ -460,7 +463,7 @@ faceted_search_ui_add_robots_directive($env); faceted_search_ui_add_css(); - faceted_search_ui_add_tooltips($env_id); + faceted_search_ui_add_tooltips($env_name); // Build the search results, which are required to count nodes per category $env->execute(); @@ -481,7 +484,7 @@ * Menu callback to display an HTML chunk with categories related to a given * facet (using AJAX). */ -function faceted_search_ui_stage_categories($env_id, $facet_key_id = '', $facet_sort = '', $text = '') { +function faceted_search_ui_stage_categories($env_name, $facet_key_id = '', $facet_sort = '', $text = '') { if (!$facet_key_id || !$facet_sort) { exit(); } @@ -492,7 +495,7 @@ $text .= '/'. implode('/', array_slice($args, 4)); } - $env = faceted_search_env_load($env_id); + $env = faceted_search_env_load($env_name); // Initialize the current search. $env->prepare($text); @@ -571,7 +574,7 @@ * Display the keyword search form. */ function faceted_search_ui_keyword_block($search) { - return drupal_get_form('faceted_search_ui_form_'. $search->env_id, $search); + return drupal_get_form('faceted_search_ui_form_'. $search->name, $search); } /** @@ -616,7 +619,7 @@ } // Load settings for all enabled facets in this search environment. - $all_filter_settings = faceted_search_load_filter_settings($env); + $all_filter_settings = $env->get_filter_settings(); // Make a selection with all enabled facets. $selection = faceted_search_get_filter_selection($all_filter_settings); @@ -714,11 +717,11 @@ /** * Callback for the menu title. */ -function faceted_search_ui_menu_title($env_id) { - $env = faceted_search_env_load($env_id); +function faceted_search_ui_menu_title($env_name) { + $env = faceted_search_env_load($env_name); $title = $env->settings['title']; if (module_exists('i18nstrings')) { - $title = tt("faceted_search:$env_id:title", $title); + $title = tt("faceted_search:$env_name:title", $title); } return check_plain($title); } @@ -768,7 +771,7 @@ // TODO: This ought to be cached and greatly simplified... { // Load settings for all enabled filters in this search environment. - $all_filter_settings = faceted_search_load_filter_settings($search); + $all_filter_settings = $search->get_filter_settings(); // Make a selection with all enabled filters. $selection = faceted_search_get_filter_selection($all_filter_settings);