diff -u nodereferrer_create_d5/nodereferrer_create.info nodereferrer_create_d6/nodereferrer_create.info --- nodereferrer_create_d5/nodereferrer_create.info 2008-06-11 18:34:07.000000000 +0100 +++ nodereferrer_create_d6/nodereferrer_create.info 2008-06-16 11:11:03.000000000 +0100 @@ -1,10 +1,10 @@ name = "Nodereferrer Create" description = "Allow site architects to add tabs to nodes for creating new related nodes" -dependancies = nodereferrer +dependencies[] = nodereferrer package = CCK +core = 6.x ; Information added by drupal.org packaging script on 2007-08-30 -version = "5.x-1.x-dev" +version = "6.x-1.x-dev" project = "nodereferrer_create" datestamp = "1188432365" - diff -u nodereferrer_create_d5/nodereferrer_create.module nodereferrer_create_d6/nodereferrer_create.module --- nodereferrer_create_d5/nodereferrer_create.module 2008-06-11 18:34:07.000000000 +0100 +++ nodereferrer_create_d6/nodereferrer_create.module 2008-06-16 11:11:03.000000000 +0100 @@ -5,64 +5,143 @@ * @file nodereferrer_create.module * allow site admins to easily add inline forms to nodes for creating new referencing nodes * - * todo: - * - correctly alter autocomplete widgets - * - review and optimize permission checking routines */ + /** * Implementation of hook_menu(). */ - -function nodereferrer_create_menu($may_cache) { +function nodereferrer_create_menu() { $items = array(); + + // Admin page + $items['admin/settings/ndrfc'] = array( + 'title' => 'Nodereferrer create', + 'description' => 'Lets you create items of related content', + 'page callback' => 'drupal_get_form', + 'page arguments' => array('_nodereferrer_create_admin'), + 'access arguments' => array('administer nodereferrer create'), + 'type' => MENU_NORMAL_ITEM, + ); + + // Local tasks for creating items + for ($i = 1; $i <= variable_get('nodereferrer_create_max', 5); $i++) { + $items["node/%node/create_referrer/$i"] = array( + 'access callback' => '_nodereferrer_create_menu_access', + 'access arguments' => array(1, "$i"), + 'title callback' => '_nodereferrer_create_menu_title', + 'title arguments' => array(1, "$i"), + 'page callback' => '_nodereferrer_create_add', + 'page arguments' => array(1, "$i"), + 'type' => MENU_LOCAL_TASK, + ); + } + + return $items; +} - if (!$may_cache) { - if (arg(0) == 'node' AND is_numeric(arg(1))) { - if ($node = node_load(arg(1))) { - // Todo: this is all very inefficient - $type = content_types($node->type); - foreach($type['fields'] AS $name => $field) { - if ($field['type'] == 'nodereferrer' AND $field['widget']['type'] == 'nodereferrer_create_list' AND is_array($field['referrer_types'])) { - // May the user create at least one of the node-types covered by this field? - foreach(array_filter($field['referrer_types']) AS $reftype) { - if (node_access('create', $reftype)) { - $items[] = array( - 'path' => 'node/'.arg(1).'/add/'.substr($name, strlen('field_')), - 'title' => $field['widget']['title'], - 'type' => MENU_LOCAL_TASK, - 'callback' => 'nodereferrer_create_add', - 'callback arguments' => array($field, $node), - 'weight' => 10, - ); - break; - } - } - } - } +/** + * Admin page - set the max number of referrers to create on a page + */ +function _nodereferrer_create_admin() { + + menu_rebuild(); + + $form = array(); + $form['nodereferrer_create_max'] = array( + '#type' => 'textfield', + '#title' => t('Maximum number of referrers'), + '#default_value' => variable_get('nodereferrer_create_max', 5), + '#size' => 3, + '#maxlength' => 3, + '#description' => t("The maximum number of menu items added to create referrers"), + '#required' => TRUE, + ); + + $form['nodereferrer_create_title'] = array( + '#type' => 'textfield', + '#title' => t('Title of the local task'), + '#default_value' => variable_get('nodereferrer_create_title', 'Create @label'), + '#size' => 80, + '#maxlength' => 128, + '#description' => t("The title of the generated local task. @label is replaced by the label of the referrer field"), + '#required' => TRUE, + ); + + return system_settings_form($form); +} + +/** + * Validate admin page setting + */ +function _nodereferrer_create_admin_validate($form, &$form_state) { + $max = $form_state['values']['nodereferrer_create_max']; + if (!is_numeric($max)) { + form_set_error('nodereferrer_create_max', t('You must select a number for the maximum number of referrers.')); + } + else if ($max <= 0) { + form_set_error('nodereferrer_create_max', t('Maximum number of referrers must be positive.')); + } +} + +/** + * Check whether we are allowed to create referrers for a given node + */ +function _nodereferrer_create_menu_access($node, $num) { + $list = _nodereferrer_get_referrers($node); + return count($list) >= intval($num); +} + +/** + * Generates the title of the given menu + */ +function _nodereferrer_create_menu_title($node, $num) { + $list = _nodereferrer_get_referrers($node); + $title = t(variable_get('nodereferrer_create_title', 'Create @label'), + array('@label' => t($list[$num-1]['field']['widget']['label']))); + return $title; +} + +/** + * Helper function : given a node, return the list of referrers the + * current user is allowed to create, as an array mapping the referrer + * field to the list of associated referrer nodes + */ +function _nodereferrer_get_referrers($node) { + $list = array(); + $type = content_types($node->type); + + foreach($type['fields'] as $name => $field) { + if ($field['type'] != 'nodereferrer' || + /*$field['widget']['type'] != 'nodereferrer_create_list' ||*/ + !is_array($field['referrer_types'])) { + continue; + } + + foreach(array_filter($field['referrer_types']) as $reftype) { + if (node_access('create', $reftype)) { + $list[] = array( + 'name' => substr($name, strlen('field_')), + 'field' => $field, + ); } } } - return $items; + + return $list; } + /** - * Adapted from node_add - * - * @param $base_field - * nodereferrer field array - * @param $base_node - * base node object - * @param $type - * type of node to create - * @param $alter_field - * name of field to alter - * @return - * themed form + * Page to add the node */ -function nodereferrer_create_add($base_field, $base_node, $type=NULL, $alter_field=NULL) { +function _nodereferrer_create_add($base_node, $field_num, $type=NULL, $alter_field=NULL) { global $user; $output = ''; + + $list = _nodereferrer_get_referrers($base_node); + $base_field = $list[$field_num-1]['field']; + drupal_set_title(check_plain($base_node->title)); foreach(array_filter($base_field['referrer_types']) AS $reftype) { if (node_access('create', $reftype)) { @@ -81,6 +160,9 @@ //signal that form should be altered nodereferrer_create_alter_signal(array('type' => $type, 'field' => $alter_field, 'nid' => $base_node->nid)); + // Make sure we have the pages we want + module_load_include('pages.inc', 'node'); + //Initialize new node $node = array('uid' => $user->uid, 'name' => $user->name, 'type' => $type); $output .= drupal_get_form($type .'_node_form', $node); @@ -115,48 +197,18 @@ else return $return; } -function nodereferrer_create_form_alter($form_id, &$form) { +function nodereferrer_create_form_alter(&$form, $form_state, $form_id) { if ($signal = nodereferrer_create_alter_signal() AND $form_id == $signal['type'].'_node_form') { - // This only works if the widget type is select list, not for autocomplete - $form[$signal['field']]['nids'] = array( '#type' => 'value', '#value' => $signal['nid']); + if (isset($form[$signal['field']]['#default_value'])) { + $form[$signal['field']]['#default_value'] = array(array('nid' => $signal['nid'])); + } + $i = 0; + while (isset($form[$signal['field']][$i])) { + if (isset($form[$signal['field']][$i]['#default_value'])) { + $form[$signal['field']][$i]['#default_value'] = array(array('nid' => $signal['nid'])); + } + $i++; + } } } -/** - * Implementation of hook_widget_info(). - */ -function nodereferrer_create_widget_info() { - return array( - 'nodereferrer_create_list' => array( - 'label' => t('Read-Only List With Context Adding'), - 'field types' => array('nodereferrer'), - ), - ); -} - -/** - * Implementation of hook_widget(). - */ -function nodereferrer_create_widget($op, &$node, $field, &$node_field) { - return nodereferrer_widget($op, &$node, $field, &$node_field); -} - -function nodereferrer_create_widget_settings($op, $widget) { - switch ($op) { - case 'form': - $form = array(); - $form['title'] = array( - '#type' => 'textfield', - '#title' => t('Title for create tab'), - '#default_value' => $widget['title']? $widget['title']:'Add '.$widget['label'], - '#required' => TRUE, - ); - return $form; - - case 'validate': - break; - case 'save': - return array('title'); - } -} -