franck@0: 'checkbox', franck@0: '#default_value' => variable_get('popups_reference_show_add_link_'. $field_name, TRUE), franck@0: '#title' => t('Show the "Add New: Node Type" Popup links'), franck@0: '#description' => t("Activate Popups:Add and Reference behavior for this reference.") franck@0: ); franck@0: $form['#submit'][] = '_popups_reference_manage_fields_submit'; franck@0: } franck@0: elseif (isset($form['type'])) { franck@0: // Add the "Add New: Node Type" links. franck@0: $node = $form['#node']; franck@0: if ($form['type']['#value'] .'_node_form' == $form_id) { franck@10: $form['#after_build'][] = 'popups_reference_after'; franck@10: } franck@10: } franck@10: } franck@10: franck@10: function popups_reference_after($form, &$form_state) { franck@10: $fields = content_fields(); franck@10: foreach ($form as $key => $item) { franck@10: if (element_child($key) && is_array($item)) { franck@10: $type = $item['#type']; franck@10: if ($type == 'fieldset' || is_numeric($key)) { // Loop through all the subitems. franck@10: $form[$key] = popups_reference_after($form[$key], $form_state); franck@10: } franck@10: else { franck@10: popups_reference_alter_item($form, $key, $item, $fields); franck@0: } franck@0: } franck@0: } franck@10: return $form; franck@0: } franck@0: franck@0: /** franck@0: * Implementation of hook_nodeapi(). franck@0: * Add cookies with node info when a new node is created. franck@0: * These cookies will be found by the popups_reference behavior and used franck@0: * to select the newly created node in the reference widget. franck@0: */ franck@0: function popups_reference_nodeapi($node, $op) { franck@0: if ($op == 'insert') { franck@0: $five = time()+300; // 5 minutes in the future. franck@0: setcookie("PopupRefNid", $node->nid, $five, '/'); franck@5: // setcookie("PopupRefTitle", $node->title, $five, '/'); franck@1: setrawcookie("PopupRefTitle", rawurlencode($node->title), $five, '/'); franck@0: } franck@0: } franck@0: franck@0: /** franck@0: * Submit added to the the nodereference settings form. franck@0: * Set a variable for each nodereference field. franck@0: */ franck@0: function _popups_reference_manage_fields_submit($form, &$form_state) { franck@0: $field_name = $form['#field']['field_name']; franck@0: variable_set('popups_reference_show_add_link_'. $field_name, $form_state['values']['show_add_link']); franck@0: } franck@0: franck@0: /** franck@0: * Run on every element in the basic node form. franck@0: * Wrap the enabled nodereference fields, and add the popup links. franck@0: * franck@0: * @param $form - the form (or fieldgroup). franck@0: * @param $key - form element name. franck@0: * @param $item - the form element array. franck@0: * @param $fields - all fields info. franck@0: */ franck@0: function popups_reference_alter_item(&$form, $key, $item, $fields) { franck@0: $field_name = strstr($key, 'field_'); // Check if $key starts with 'field_'; franck@0: if (isset($fields[$field_name]) && franck@0: $fields[$field_name]['type'] == 'nodereference' && franck@0: variable_get('popups_reference_show_add_link_'. $field_name, TRUE)) { franck@0: $type = $form['type']['#value']; franck@5: $field = content_fields($field_name, $type); franck@5: franck@0: $wrapper_id = 'popups-reference-' . _popups_reference_counter(); franck@0: $links = _popups_reference_links($field, $type, $wrapper_id, $field['widget']['type']); franck@0: if ($links) { franck@0: // Put the nodereference widget and links in an wrapper. franck@0: // Makes it easy to find for Ahah targeting, and popups_reference behavior selecting. franck@10: $form[$key]['#prefix'] = '
' . $form[$key]['#prefix']; franck@10: $form[$key]['#suffix'] = $form[$key]['#suffix'] . '
Add New: ' . implode(', ', $links) .'
'; franck@0: } franck@0: } franck@0: } franck@0: franck@4: function popups_reference_after_build($form_element) { franck@4: $form_element['#prefix'] = $form_element['#popups_reference_prefix'] . $form_element['#prefix']; franck@4: $form_element['#suffix'] .= $form_element['#popups_reference_suffix']; franck@4: return $form_element; franck@4: } franck@4: franck@0: /** franck@0: * Generates 'Add new...' link franck@0: * for each allowed content type franck@0: * franck@0: * @param $field franck@0: * @param $src_type - the type of base node. franck@0: * @param $wrapper_id - id for the wrapper around the node reference. franck@5: * @param $type - the type of widget. franck@0: * @return Array of html links. franck@0: */ franck@5: function _popups_reference_links($field, $src_type, $wrapper_id, $widget_type) { franck@5: if ($widget_type == 'nodereference_select' || $widget_type == 'nodereference_buttons') { franck@0: // Target the wrapper for replacing. franck@0: popups_add_popups(array('a.'.$wrapper_id=>array('targetSelectors'=>array('#'.$wrapper_id)))); franck@0: } franck@7: else if ($widget_type == 'nodereference_autocomplete' || $widget_type == 'noderef_view_autocomplete') { franck@0: // Don't replace the autocomplete when done. franck@0: popups_add_popups(array('a.'.$wrapper_id=>array('noUpdate'=>TRUE))); franck@0: } franck@0: else { // Unsupported type. franck@0: return; franck@0: } franck@0: $options = array( franck@0: 'attributes' => array( franck@0: 'class' => $wrapper_id . ' popups-reference', franck@0: 'rel' => $wrapper_id, franck@0: ), franck@0: 'query' => array('destination' => 'node/add/' . str_replace('_', '-', $src_type)), franck@0: ); franck@0: $links = array(); franck@0: $all_types = node_get_types(); franck@0: foreach ($field['referenceable_types'] as $add_type => $value) { franck@5: if (!empty($value) && (user_access("create $add_type content") || user_access('administer nodes'))) { franck@5: //if (!empty($value) && user_access("create $add_type content")) { franck@0: drupal_add_js(drupal_get_path('module', 'popups_reference') .'/popups_reference.js'); franck@0: $path = 'node/add/' . str_replace('_', '-', $add_type); franck@5: $name = $all_types[$add_type]->name; franck@5: $links[] = l("Add $name", $path, $options); franck@0: } franck@0: } franck@0: return $links; franck@0: } franck@0: franck@0: /** franck@0: * A counter for generating unique element id's. franck@0: * franck@0: * @return int: next integer. franck@0: */ franck@0: function _popups_reference_counter() { franck@0: static $count = 0; franck@0: return $count++; franck@0: } franck@0: