annotate popups_reference.module @ 10:108ced764a40 tip

Fix compatibility with CCK Multigroup
author Franck Deroche <franck@defr.org>
date Thu, 26 Mar 2009 14:59:27 +0100
parents 571a89603e2b
children
rev   line source
franck@0 1 <?php
franck@5 2 // $Id: popups_reference.module,v 1.1.2.12 2009/03/07 06:54:25 starbow Exp $
franck@0 3
franck@0 4 /**
franck@0 5 * @file
franck@0 6 * Modify the Node Reference widget to use a popup to add a new node.
franck@0 7 */
franck@0 8
franck@0 9
franck@0 10 /**
franck@0 11 * Implementation of hook_form_alter().
franck@0 12 *
franck@0 13 * Modifies the nodereference setting form and the basic node form.
franck@0 14 */
franck@0 15 function popups_reference_form_alter(&$form, $form_state, $form_id) {
franck@5 16 if ($form_id == 'content_field_edit_form' && $form['#field']['type'] == 'nodereference') {
franck@0 17 // Add a checkbox to the nodereference settings page.
franck@0 18 $field_name = $form['#field']['field_name'];
franck@0 19 $form['field']['show_add_link'] = array(
franck@0 20 '#type' => 'checkbox',
franck@0 21 '#default_value' => variable_get('popups_reference_show_add_link_'. $field_name, TRUE),
franck@0 22 '#title' => t('Show the "Add New: Node Type" Popup links'),
franck@0 23 '#description' => t("Activate Popups:Add and Reference behavior for this reference.")
franck@0 24 );
franck@0 25 $form['#submit'][] = '_popups_reference_manage_fields_submit';
franck@0 26 }
franck@0 27 elseif (isset($form['type'])) {
franck@0 28 // Add the "Add New: Node Type" links.
franck@0 29 $node = $form['#node'];
franck@0 30 if ($form['type']['#value'] .'_node_form' == $form_id) {
franck@10 31 $form['#after_build'][] = 'popups_reference_after';
franck@10 32 }
franck@10 33 }
franck@10 34 }
franck@10 35
franck@10 36 function popups_reference_after($form, &$form_state) {
franck@10 37 $fields = content_fields();
franck@10 38 foreach ($form as $key => $item) {
franck@10 39 if (element_child($key) && is_array($item)) {
franck@10 40 $type = $item['#type'];
franck@10 41 if ($type == 'fieldset' || is_numeric($key)) { // Loop through all the subitems.
franck@10 42 $form[$key] = popups_reference_after($form[$key], $form_state);
franck@10 43 }
franck@10 44 else {
franck@10 45 popups_reference_alter_item($form, $key, $item, $fields);
franck@0 46 }
franck@0 47 }
franck@0 48 }
franck@10 49 return $form;
franck@0 50 }
franck@0 51
franck@0 52 /**
franck@0 53 * Implementation of hook_nodeapi().
franck@0 54 * Add cookies with node info when a new node is created.
franck@0 55 * These cookies will be found by the popups_reference behavior and used
franck@0 56 * to select the newly created node in the reference widget.
franck@0 57 */
franck@0 58 function popups_reference_nodeapi($node, $op) {
franck@0 59 if ($op == 'insert') {
franck@0 60 $five = time()+300; // 5 minutes in the future.
franck@0 61 setcookie("PopupRefNid", $node->nid, $five, '/');
franck@5 62 // setcookie("PopupRefTitle", $node->title, $five, '/');
franck@1 63 setrawcookie("PopupRefTitle", rawurlencode($node->title), $five, '/');
franck@0 64 }
franck@0 65 }
franck@0 66
franck@0 67 /**
franck@0 68 * Submit added to the the nodereference settings form.
franck@0 69 * Set a variable for each nodereference field.
franck@0 70 */
franck@0 71 function _popups_reference_manage_fields_submit($form, &$form_state) {
franck@0 72 $field_name = $form['#field']['field_name'];
franck@0 73 variable_set('popups_reference_show_add_link_'. $field_name, $form_state['values']['show_add_link']);
franck@0 74 }
franck@0 75
franck@0 76 /**
franck@0 77 * Run on every element in the basic node form.
franck@0 78 * Wrap the enabled nodereference fields, and add the popup links.
franck@0 79 *
franck@0 80 * @param $form - the form (or fieldgroup).
franck@0 81 * @param $key - form element name.
franck@0 82 * @param $item - the form element array.
franck@0 83 * @param $fields - all fields info.
franck@0 84 */
franck@0 85 function popups_reference_alter_item(&$form, $key, $item, $fields) {
franck@0 86 $field_name = strstr($key, 'field_'); // Check if $key starts with 'field_';
franck@0 87 if (isset($fields[$field_name]) &&
franck@0 88 $fields[$field_name]['type'] == 'nodereference' &&
franck@0 89 variable_get('popups_reference_show_add_link_'. $field_name, TRUE)) {
franck@0 90 $type = $form['type']['#value'];
franck@5 91 $field = content_fields($field_name, $type);
franck@5 92
franck@0 93 $wrapper_id = 'popups-reference-' . _popups_reference_counter();
franck@0 94 $links = _popups_reference_links($field, $type, $wrapper_id, $field['widget']['type']);
franck@0 95 if ($links) {
franck@0 96 // Put the nodereference widget and links in an wrapper.
franck@0 97 // Makes it easy to find for Ahah targeting, and popups_reference behavior selecting.
franck@10 98 $form[$key]['#prefix'] = '<div id="'. $wrapper_id .'">' . $form[$key]['#prefix'];
franck@10 99 $form[$key]['#suffix'] = $form[$key]['#suffix'] . '<div>Add New: ' . implode(', ', $links) .'</div></div>';
franck@0 100 }
franck@0 101 }
franck@0 102 }
franck@0 103
franck@4 104 function popups_reference_after_build($form_element) {
franck@4 105 $form_element['#prefix'] = $form_element['#popups_reference_prefix'] . $form_element['#prefix'];
franck@4 106 $form_element['#suffix'] .= $form_element['#popups_reference_suffix'];
franck@4 107 return $form_element;
franck@4 108 }
franck@4 109
franck@0 110 /**
franck@0 111 * Generates 'Add new...' link
franck@0 112 * for each allowed content type
franck@0 113 *
franck@0 114 * @param $field
franck@0 115 * @param $src_type - the type of base node.
franck@0 116 * @param $wrapper_id - id for the wrapper around the node reference.
franck@5 117 * @param $type - the type of widget.
franck@0 118 * @return Array of html links.
franck@0 119 */
franck@5 120 function _popups_reference_links($field, $src_type, $wrapper_id, $widget_type) {
franck@5 121 if ($widget_type == 'nodereference_select' || $widget_type == 'nodereference_buttons') {
franck@0 122 // Target the wrapper for replacing.
franck@0 123 popups_add_popups(array('a.'.$wrapper_id=>array('targetSelectors'=>array('#'.$wrapper_id))));
franck@0 124 }
franck@7 125 else if ($widget_type == 'nodereference_autocomplete' || $widget_type == 'noderef_view_autocomplete') {
franck@0 126 // Don't replace the autocomplete when done.
franck@0 127 popups_add_popups(array('a.'.$wrapper_id=>array('noUpdate'=>TRUE)));
franck@0 128 }
franck@0 129 else { // Unsupported type.
franck@0 130 return;
franck@0 131 }
franck@0 132 $options = array(
franck@0 133 'attributes' => array(
franck@0 134 'class' => $wrapper_id . ' popups-reference',
franck@0 135 'rel' => $wrapper_id,
franck@0 136 ),
franck@0 137 'query' => array('destination' => 'node/add/' . str_replace('_', '-', $src_type)),
franck@0 138 );
franck@0 139 $links = array();
franck@0 140 $all_types = node_get_types();
franck@0 141 foreach ($field['referenceable_types'] as $add_type => $value) {
franck@5 142 if (!empty($value) && (user_access("create $add_type content") || user_access('administer nodes'))) {
franck@5 143 //if (!empty($value) && user_access("create $add_type content")) {
franck@0 144 drupal_add_js(drupal_get_path('module', 'popups_reference') .'/popups_reference.js');
franck@0 145 $path = 'node/add/' . str_replace('_', '-', $add_type);
franck@5 146 $name = $all_types[$add_type]->name;
franck@5 147 $links[] = l("Add $name", $path, $options);
franck@0 148 }
franck@0 149 }
franck@0 150 return $links;
franck@0 151 }
franck@0 152
franck@0 153 /**
franck@0 154 * A counter for generating unique element id's.
franck@0 155 *
franck@0 156 * @return int: next integer.
franck@0 157 */
franck@0 158 function _popups_reference_counter() {
franck@0 159 static $count = 0;
franck@0 160 return $count++;
franck@0 161 }
franck@0 162