--- nodereference_asmselect.module 2008-11-27 14:50:04.000000000 +0100 +++ nodereference_asmselect.module.new 2008-11-27 14:49:37.000000000 +0100 @@ -1,5 +1,6 @@ ASM_SELECT_FILTER_PATH, - 'callback' => 'nodereference_asmselect_options', - 'type' => MENU_CALLBACK, - 'access' => user_access('access content') - ); - } - - return $items; +function nodereference_asmselect_menu($may_cache) { + $items = array(); + + if ($may_cache) { + $items[] = array( + 'path' => ASM_SELECT_FILTER_PATH, + 'callback' => 'nodereference_asmselect_options', + 'type' => MENU_CALLBACK, + 'access' => user_access('access content') + ); + } + + return $items; } -function nodereference_asmselect_options() -{ +function nodereference_asmselect_options() { $filters = explode(',', check_plain($_POST['filters'])); $filters_array = array(); - foreach ($filters as $key => $filter) - { - $properties = explode('=', $filter); - $filters_array[$key]['type'] = $properties[0]; - $filters_array[$key]['value'] = $properties[1]; + foreach ($filters as $key => $filter) { + $properties = explode('=', $filter); + $filters_array[$key]['type'] = $properties[0]; + $filters_array[$key]['value'] = $properties[1]; } $field_name = $json_array['field_name']; @@ -52,29 +49,26 @@ function nodereference_asmselect_options $output = ''; - foreach ($nodes as $value => $title) - { - $output .= ''; + foreach ($nodes as $value => $title) { + $output .= ''; } echo $output; } -function _nodereference_asmselect_add_filters_js($id, $field_name) -{ - drupal_add_js(ASM_SELECT_MODULE_PATH . '/nodereference_asmselect.js'); - $js = "$(document).ready(function() - { - NodeReferenceAsmSelect.settings.filterPath = '" . base_path() . ASM_SELECT_FILTER_PATH . "'; - - NodeReferenceAsmSelect.fn.termIdFiltersChange('$id', '$field_name'); - - // simulate change so that the initial filter settings would be taken into account - $('#$id-filters select.asmselect-filter:first').change(); - - });"; - - drupal_add_js($js, 'inline'); +function _nodereference_asmselect_add_filters_js($id, $field_name) { + drupal_add_js(ASM_SELECT_MODULE_PATH .'/nodereference_asmselect.js'); + $js = "$(document).ready(function() { + NodeReferenceAsmSelect.settings.filterPath = '". base_path() . ASM_SELECT_FILTER_PATH ."'; + + NodeReferenceAsmSelect.fn.termIdFiltersChange('$id', '$field_name'); + + // simulate change so that the initial filter settings would be taken into account + $('#$id-filters select.asmselect-filter:first').change(); + + });"; + + drupal_add_js($js, 'inline'); } /** @@ -89,124 +83,115 @@ function nodereference_asmselect_widget_ ); } -function _nodereference_asmselect_add_vocabulary_filters(&$node, $field) -{ - $id = form_clean_id($field['field_name']); - - $taxonomy_field = array( - '#type' => 'fieldset', - '#title' => t('Filters'), - '#collapsible' => TRUE, - '#attributes' => array('id' => $id . '-filters'), - '#collapsed' => FALSE - ); - - $vocabs = taxonomy_get_vocabularies($node->type); - - $filters = array(); - - foreach ($vocabs as $vocab) - { - // should I add a filter for this vocabulary? - if (in_array($vocab->vid, $field['widget']['vocabulary_filters'])) - { - $terms = taxonomy_node_get_terms_by_vocabulary($node->nid, $vocab->vid); - $filter = taxonomy_form($vocab->vid, $node->taxonomy); - $filter['#id'] = $id . '-filter-vocab-' . $vocab->vid; - $filter['#attributes']['class'] = 'asmselect-filter'; - $filter['#default_value'] = $terms ? array_keys($terms) : null; - - $filters[$vocab->name] = $filter; - } - } - - _nodereference_asmselect_add_filters_js($id, $field['field_name']); - - if (count($filters)) - { - return array_merge($taxonomy_field, $filters); - } +function _nodereference_asmselect_add_vocabulary_filters(&$node, $field) { + $id = form_clean_id($field['field_name']); + + $taxonomy_field = array( + '#type' => 'fieldset', + '#title' => t('Filters'), + '#collapsible' => TRUE, + '#attributes' => array('id' => $id .'-filters'), + '#collapsed' => FALSE + ); + + $vocabs = taxonomy_get_vocabularies($node->type); + + $filters = array(); + + foreach ($vocabs as $vocab) { + // should I add a filter for this vocabulary? + if (in_array($vocab->vid, $field['widget']['vocabulary_filters'])) { + $terms = taxonomy_node_get_terms_by_vocabulary($node->nid, $vocab->vid); + $filter = taxonomy_form($vocab->vid, $node->taxonomy); + $filter['#id'] = $id .'-filter-vocab-'. $vocab->vid; + $filter['#attributes']['class'] = 'asmselect-filter'; + $filter['#default_value'] = $terms ? array_keys($terms) : NULL; + + $filters[$vocab->name] = $filter; + } + } + + _nodereference_asmselect_add_filters_js($id, $field['field_name']); + + if (count($filters)) { + return array_merge($taxonomy_field, $filters); + } } /** * @param $field * @param $filters array of arrays ['type', 'value'] */ -function _nodereference_asmselect_get_filtered_options($field, $filters) -{ - if (module_exists('views') && isset($field['advanced_view'])) { - $view = null; - - if ($field['advanced_view'] != '--') { - $view = views_get_view($field['advanced_view']); - } - - // if view does not exist, create one on the fly - if (!$view) - { - $view = views_create_view('candidate_nodes', ''); - - foreach ($field['referenceable_types'] as $related_type) { - if ($related_type) { - views_view_add_filter($view, 'node', 'type', '=', $related_type, null); - } - } - - } - - // arguments for the view - $view_args = array(); - if (isset($field['advanced_view_args'])) { - // TODO: Support Tokens using token.module ? - $view_args = array_map(trim, explode(',', $field['advanced_view_args'])); - } - - if (isset($filters) && is_array($filters) && count($filters) > 0) { - foreach ($filters as $filter) - { - switch ($filter['type']) - { - case 'tid'; - views_view_add_filter($view, 'term_node', 'tid', '=', array($filter['value']), 20); - break; - - //TODO: other types? - } - } - } - - // we do need title field, so add it if not present (unlikely, but...) - $has_title = array_reduce($view->field, create_function('$a, $b', 'return ($b["field"] == "title") || $a;'), false); - if (!$has_title) { - views_view_add_field($view, 'node', 'title', ''); - } - views_load_cache(); - views_sanitize_view($view); - - // make sure the fields get included in the query - $view->page = true; - $view->page_type = 'list'; - - // make sure the query is not cached - unset($view->query); // Views 1.5- - $view->is_cacheable = FALSE; // Views 1.6+ - - $view_result = views_build_view('result', $view, $view_args); - $result = $view_result['result']; - } - - $rows = array(); - - while ($node = db_fetch_object($result)) { - if ($return_full_nodes) { - $rows[$node->nid] = $node; - } - else { - $rows[$node->nid] = $node->node_title; - } - } +function _nodereference_asmselect_get_filtered_options($field, $filters) { + if (module_exists('views') && isset($field['advanced_view'])) { + $view = NULL; + + if ($field['advanced_view'] != '--') { + $view = views_get_view($field['advanced_view']); + } + + // if view does not exist, create one on the fly + if (!$view) { + $view = views_create_view('candidate_nodes', ''); + + foreach ($field['referenceable_types'] as $related_type) { + if ($related_type) { + views_view_add_filter($view, 'node', 'type', '=', $related_type, NULL); + } + } + } + + // arguments for the view + $view_args = array(); + if (isset($field['advanced_view_args'])) { + // TODO: Support Tokens using token.module ? + $view_args = array_map(trim, explode(',', $field['advanced_view_args'])); + } + + if (isset($filters) && is_array($filters) && count($filters) > 0) { + foreach ($filters as $filter) { + switch ($filter['type']) { + case 'tid': + views_view_add_filter($view, 'term_node', 'tid', '=', array($filter['value']), 20); + break; + + //TODO: other types? + } + } + } + + // we do need title field, so add it if not present (unlikely, but...) + $has_title = array_reduce($view->field, create_function('$a, $b', 'return ($b["field"] == "title") || $a;'), FALSE); + if (!$has_title) { + views_view_add_field($view, 'node', 'title', ''); + } + views_load_cache(); + views_sanitize_view($view); + + // make sure the fields get included in the query + $view->page = TRUE; + $view->page_type = 'list'; + + // make sure the query is not cached + unset($view->query); // Views 1.5- + $view->is_cacheable = FALSE; // Views 1.6+ + + $view_result = views_build_view('result', $view, $view_args); + $result = $view_result['result']; + } + + $rows = array(); - return $rows; + while ($node = db_fetch_object($result)) { + if ($return_full_nodes) { + $rows[$node->nid] = $node; + } + else { + $rows[$node->nid] = $node->node_title; + } + } + + return $rows; } /** @@ -214,81 +199,78 @@ function _nodereference_asmselect_get_fi */ function nodereference_asmselect_widget($op, &$node, $field, &$items) { if ($field['widget']['type'] == 'nodereference_asm_select') { - // call node reference module, pass a dummy field so that a regular select field is returned - $nodereference_field = $field; - $nodereference_field['widget']['type'] = 'nodereference_select'; - - $ret = nodereference_widget($op, $node, $nodereference_field, $items); - - if ($op == 'form' && !isset($node->cck_dummy_node_form)) { - // set new id - $id = form_clean_id('edit-' . $field['field_name'] . '-nids'); - + // call node reference module, pass a dummy field so that a regular select field is returned + $nodereference_field = $field; + $nodereference_field['widget']['type'] = 'nodereference_select'; + + $ret = nodereference_widget($op, $node, $nodereference_field, $items); + + if ($op == 'form' && !isset($node->cck_dummy_node_form)) { + // set new id + $id = form_clean_id('edit-'. $field['field_name'] .'-nids'); + $ret[$field['field_name']]['nids']['#id'] = $id; - + // remove the option $options = &$ret[$field['field_name']]['nids']['#options']; - - if (array_key_exists(0, $options)) - { - unset($options[0]); + + if (array_key_exists(0, $options)) { + unset($options[0]); } - $path = drupal_get_path('module', 'nodereference_asmselect'); - - drupal_add_js($path . '/asmselect/jquery.asmselect.js'); - drupal_add_css($path . '/asmselect/jquery.asmselect.css'); - - if ($field['widget']['sortable']) { - // add list sorting - jquery_ui_add(array('ui.draggable', 'ui.droppable', 'ui.sortable')); - } - - // add sortable multiple select widget - $js = " - $(document).ready(function() { - $('#" . $id . "').asmSelect({ - addItemTarget: '" . (isset($field['widget']['add_item_target']) ? $field['widget']['add_item_target'] : 'bottom') . "', - sortable: " . (isset($field['widget']['sortable']) ? $field['widget']['sortable'] : 'false') . ", - animate: " . (isset($field['widget']['animate']) ? $field['widget']['animate'] : 'true') . ", - highlight: " . (isset($field['widget']['highlight']) ? $field['widget']['highlight'] : 'true') .", - removeLabel: '" . t('Remove') . "', - highlightAddedLabel: '" . t('Added ') . "', - highlightRemovedLabel: '" . t('Removed ') . "' - }); - });"; - - drupal_add_js($js, 'inline'); - - // add vocabulary filters? - if ( isset($field['widget']['vocabulary_filters'])) { - - $ret[$field['field_name']]['filters'] = _nodereference_asmselect_add_vocabulary_filters($node, $field); - } - - // add the "new node" buttons - if ($field['widget']['create_new']) - { - // add "create new" button for each referencable type - $create_new_fieldset = array( - '#type' => 'fieldset', - '#collapsible' => TRUE, - '#collapsed' => FALSE - ); - - foreach ($field['referenceable_types'] as $type => $is_referenceable) { - if ($is_referenceable) { - $create_new_fieldset[$type] = array( - '#value' => theme('asm_select_create_new_button', $type, $id) - ); - } - } - - $ret[$field['field_name']]['create_new'] = $create_new_fieldset; - } + $path = drupal_get_path('module', 'nodereference_asmselect'); + + drupal_add_js($path .'/asmselect/jquery.asmselect.js'); + drupal_add_css($path .'/asmselect/jquery.asmselect.css'); + + if ($field['widget']['sortable']) { + // add list sorting + jquery_ui_add(array('ui.draggable', 'ui.droppable', 'ui.sortable')); + } + + // add sortable multiple select widget + $js = " + $(document).ready(function() { + $('#". $id ."').asmSelect({ + addItemTarget: '". (isset($field['widget']['add_item_target']) ? $field['widget']['add_item_target'] : 'bottom') ."', + sortable: ". (isset($field['widget']['sortable']) ? $field['widget']['sortable'] : 'false') .", + animate: ". (isset($field['widget']['animate']) ? $field['widget']['animate'] : 'true') .", + highlight: ". (isset($field['widget']['highlight']) ? $field['widget']['highlight'] : 'true') .", + removeLabel: '". t('Remove') ."', + highlightAddedLabel: '". t('Added ') ."', + highlightRemovedLabel: '". t('Removed ') ."' + }); + });"; + + drupal_add_js($js, 'inline'); + + // add vocabulary filters? + if (isset($field['widget']['vocabulary_filters'])) { + $ret[$field['field_name']]['filters'] = _nodereference_asmselect_add_vocabulary_filters($node, $field); + } + + // add the "new node" buttons + if ($field['widget']['create_new']) { + // add "create new" button for each referencable type + $create_new_fieldset = array( + '#type' => 'fieldset', + '#collapsible' => TRUE, + '#collapsed' => FALSE + ); + + foreach ($field['referenceable_types'] as $type => $is_referenceable) { + if ($is_referenceable) { + $create_new_fieldset[$type] = array( + '#value' => theme('asm_select_create_new_button', $type, $id) + ); + } + } + + $ret[$field['field_name']]['create_new'] = $create_new_fieldset; + } } } - + return $ret; } @@ -301,12 +283,12 @@ function nodereference_asmselect_widget_ $form = array(); // add some settings for this field (these are all ASM Select settings) - $form['asm_settings'] = array ( + $form['asm_settings'] = array( '#type' => 'fieldset', '#title' => t('ASM Select Settings') ); - $form['asm_settings']['add_item_target'] = array ( + $form['asm_settings']['add_item_target'] = array( '#type' => 'select', '#title' => t('Add Item Target'), '#description' => t('Where to place new selected items that are added to the list.'), @@ -318,28 +300,28 @@ function nodereference_asmselect_widget_ '#required' => TRUE, ); - $form['asm_settings']['sortable'] = array ( + $form['asm_settings']['sortable'] = array( '#type' => 'checkbox', '#title' => 'Sortable', '#description' => t('May the user drag and drop to sort the list of elements they have selected?'), '#default_value' => isset($widget['sortable']) ? $widget['sortable'] : false ); - $form['asm_settings']['animate'] = array ( + $form['asm_settings']['animate'] = array( '#type' => 'checkbox', '#title' => 'Animate', '#description' => t('Animate the adding or removing of items from the list?'), '#default_value' => isset($widget['animate']) ? $widget['animate'] : true ); - $form['asm_settings']['highlight'] = array ( + $form['asm_settings']['highlight'] = array( '#type' => 'checkbox', '#title' => 'Highlight', '#description' => t('Show a quick highlight of what item was added or removed?'), '#default_value' => isset($widget['highlight']) ? $widget['highlight'] : true ); - $form['asm_settings']['create_new'] = array ( + $form['asm_settings']['create_new'] = array( '#type' => 'checkbox', '#title' => 'Allow Create', '#description' => t('Add a link to create a new node of the referenced type (will open in a new window)?'), @@ -349,18 +331,17 @@ function nodereference_asmselect_widget_ $vocabularies = taxonomy_get_vocabularies(); $options = array(); - - foreach ($vocabularies as $vocabulary) - { - $options[$vocabulary->vid] = $vocabulary->name; + + foreach ($vocabularies as $vocabulary) { + $options[$vocabulary->vid] = $vocabulary->name; } - $form['asm_settings']['vocabulary_filters'] = array ( - '#type' => 'checkboxes', - '#title' => t('Vocabulary Filters'), - '#description' => t('Which vocabularies to use in order to filter this select?'), - '#options' => $options, - '#default_value' => isset($widget['vocabulary_filters']) ? $widget['vocabulary_filters'] : null + $form['asm_settings']['vocabulary_filters'] = array( + '#type' => 'checkboxes', + '#title' => t('Vocabulary Filters'), + '#description' => t('Which vocabularies to use in order to filter this select?'), + '#options' => $options, + '#default_value' => isset($widget['vocabulary_filters']) ? $widget['vocabulary_filters'] : null ); return $form; @@ -379,8 +360,8 @@ function nodereference_asmselect_widget_ */ function nodereference_asmselect_form_alter($form_id, &$form) { // should I work on this form? - if (strpos($form_id, 'node_form') !== false && isset($_GET['asmSelect'])) { - $_SESSION[ASM_SELECT_WIDGET_ID] = $_GET['asmSelect']; + if (strpos($form_id, 'node_form') !== FALSE && isset($_GET['asmSelect'])) { + $_SESSION[ASM_SELECT_WIDGET_ID] = $_GET['asmSelect']; $form['#submit']['nodereference_asmselect_node_create_callback'] = array(); } } @@ -432,10 +413,11 @@ function nodereference_asmselect_nodeapi /** * @param $type the node type to create a button for */ -function theme_asm_select_create_new_button($type, $selectId) { +function theme_asm_select_create_new_button($type, $select_id) { $node_names = node_get_types('names'); - $path = url("node/add/$type") . "&asmSelect=" . $selectId; + $path = url("node/add/$type") ."&asmSelect=". $select_id; - return '' . t('Create new !type', array('!type' => $node_names[$type])) . ''; + return ''. t('Create new !type', array('!type' => $node_names[$type])) .''; } +