Projet

Général

Profil

Paste
Télécharger (6,04 ko) Statistiques
| Branche: | Révision:

root / drupal7 / sites / all / modules / ctools / plugins / contexts / node_edit_form.inc @ e4c061ad

1
<?php
2

    
3
/**
4
 * @file
5
 *
6
 * Plugin to provide a node_edit_form context
7
 */
8

    
9
/**
10
 * Plugins are described by creating a $plugin array which will be used
11
 * by the system that includes this file.
12
 */
13
$plugin = array(
14
  'title' => t("Node edit form"),
15
  'description' => t('A node edit form.'),
16
  'context' => 'ctools_context_create_node_edit_form',
17
  'edit form' => 'ctools_context_node_edit_form_settings_form',
18
  'defaults' => array('nid' => ''),
19
  'keyword' => 'node_edit',
20
  'context name' => 'node_edit_form',
21
  'convert list' => 'ctools_context_node_edit_convert_list',
22
  'convert' => 'ctools_context_node_edit_convert',
23
  'placeholder form' => array(
24
    '#type' => 'textfield',
25
    '#description' => t('Enter the node ID of a node for this argument:'),
26
  ),
27
);
28

    
29
/**
30
 * It's important to remember that $conf is optional here, because contexts
31
 * are not always created from the UI.
32
 */
33
function ctools_context_create_node_edit_form($empty, $node = NULL, $conf = FALSE) {
34
  static $creating = FALSE;
35
  $context = new ctools_context(array('form', 'node_edit', 'node_form',  'node_edit_form', 'node', 'entity:node'));
36
  $context->plugin = 'node_edit_form';
37

    
38
  if ($empty || ($creating)) {
39
    return $context;
40
  }
41
  $creating = TRUE;
42

    
43
  if ($conf) {
44
    // In this case, $node is actually our $conf array.
45
    $nid = is_array($node) && isset($node['nid']) ? $node['nid'] : (is_object($node) ? $node->nid : 0);
46

    
47
    if (module_exists('translation')) {
48
      if ($translation = module_invoke('translation', 'node_nid', $nid, $GLOBALS['language']->language)) {
49
        $nid = $translation;
50
        $reload = TRUE;
51
      }
52
    }
53

    
54
    if (is_array($node) || !empty($reload)) {
55
      $node = node_load($nid);
56
    }
57
  }
58

    
59
  if (!empty($node)) {
60
    $form_id = $node->type . '_node_form';
61

    
62
    $form_state = array('want form' => TRUE, 'build_info' => array('args' => array($node)));
63

    
64
    $file = drupal_get_path('module', 'node') . '/node.pages.inc';
65
    require_once DRUPAL_ROOT . '/' . $file;
66
    // This piece of information can let other modules know that more files
67
    // need to be included if this form is loaded from cache:
68
    $form_state['build_info']['files'] = array($file);
69

    
70
    $form = drupal_build_form($form_id, $form_state);
71

    
72
    // Fill in the 'node' portion of the context
73
    $context->data     = $node;
74
    $context->title    = isset($node->title) ? $node->title : '';
75
    $context->argument = isset($node->nid) ? $node->nid : $node->type;
76

    
77
    $context->form       = $form;
78
    $context->form_state = &$form_state;
79
    $context->form_id    = $form_id;
80
    $context->form_title = isset($node->title) ? $node->title : '';
81
    $context->node_type  = $node->type;
82
    $context->restrictions['type'] = array($node->type);
83
    $context->restrictions['form'] = array('form');
84

    
85
    $creating = FALSE;
86
    return $context;
87
  }
88
  $creating = FALSE;
89
}
90

    
91
function ctools_context_node_edit_form_settings_form($form, &$form_state) {
92
  $conf = &$form_state['conf'];
93

    
94
  $form['node'] = array(
95
    '#title' => t('Enter the title or NID of a node'),
96
    '#type' => 'textfield',
97
    '#maxlength' => 512,
98
    '#autocomplete_path' => 'ctools/autocomplete/node',
99
    '#weight' => -10,
100
  );
101

    
102
  if (!empty($conf['nid'])) {
103
    $info = db_query('SELECT * FROM {node} WHERE nid = :nid', array(':nid' => $conf['nid']))->fetchObject();
104
    if ($info) {
105
      $link = l(t("'%title' [node id %nid]", array('%title' => $info->title, '%nid' => $info->nid)), "node/$info->nid", array('attributes' => array('target' => '_blank', 'title' => t('Open in new window')), 'html' => TRUE));
106
      $form['node']['#description'] = t('Currently set to !link', array('!link' => $link));
107
    }
108
  }
109

    
110
  $form['nid'] = array(
111
    '#type' => 'value',
112
    '#value' => $conf['nid'],
113
  );
114

    
115
  $form['set_identifier'] = array(
116
    '#type' => 'checkbox',
117
    '#default_value' => FALSE,
118
    '#title' => t('Reset identifier to node title'),
119
    '#description' => t('If checked, the identifier will be reset to the node title of the selected node.'),
120
  );
121

    
122
  return $form;
123
}
124

    
125
/**
126
 * Validate a node.
127
 */
128
function ctools_context_node_edit_form_settings_form_validate($form, &$form_state) {
129
  // Validate the autocomplete
130
  if (empty($form_state['values']['nid']) && empty($form_state['values']['node'])) {
131
    form_error($form['node'], t('You must select a node.'));
132
    return;
133
  }
134

    
135
  if (empty($form_state['values']['node'])) {
136
    return;
137
  }
138

    
139
  $nid          = $form_state['values']['node'];
140
  $preg_matches = array();
141
  $match        = preg_match('/\[id: (\d+)\]/', $nid, $preg_matches);
142
  if (!$match) {
143
    $match = preg_match('/^id: (\d+)/', $nid, $preg_matches);
144
  }
145

    
146
  if ($match) {
147
    $nid = $preg_matches[1];
148
  }
149
  if (is_numeric($nid)) {
150
    $node = db_query('SELECT nid, status FROM {node} WHERE nid = :nid', array(':nid' => $nid))->fetchObject();
151
  }
152
  else {
153
    $node = db_query('SELECT nid, status FROM {node} WHERE LOWER(title) = LOWER(:title)', array(':title' => $nid))->fetchObject();
154
  }
155

    
156
  // Do not allow unpublished nodes to be selected by unprivileged users
157
  if (!$node || (empty($node->status) && !(user_access('administer nodes')))) {
158
    form_error($form['node'], t('Invalid node selected.'));
159
  }
160
  else {
161
    form_set_value($form['nid'], $node->nid, $form_state);
162
  }
163
}
164

    
165
function ctools_context_node_edit_form_settings_form_submit($form, &$form_state) {
166
  if ($form_state['values']['set_identifier']) {
167
    $node = node_load($form_state['values']['nid']);
168
    $form_state['values']['identifier'] = $node->title;
169
  }
170

    
171
  // This will either be the value set previously or a value set by the
172
  // validator.
173
  $form_state['conf']['nid'] = $form_state['values']['nid'];
174
}
175

    
176
/**
177
 * Provide a list of ways that this context can be converted to a string.
178
 */
179
function ctools_context_node_edit_convert_list() {
180
  // Pass through to the "node" context convert list.
181
  $plugin = ctools_get_context('node');
182
  return ctools_context_node_convert_list();
183
}
184

    
185
/**
186
 * Convert a context into a string.
187
 */
188
function ctools_context_node_edit_convert($context, $type) {
189
  // Pass through to the "node" context convert list.
190
  $plugin = ctools_get_context('node');
191
  return ctools_context_node_convert($context, $type);
192
}