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 |