Working on new access system...
[estigi.git] / core / node / node.edit
blobdf66bde37b4f5efc618b32cba33ea919e52bc616
1 <?php
2 /** @file node.edit
3  * Edit functions for nodes
4  * Used in edit, new, delete and so on.
5  */
7 function node_form_edit($action = 'new'){
9         global $db, $node_type, $node, $user;
11         if($node_type['title_label'] != '<no-title>'){
13                 $form['nodes']['title'] = array(
14                         'type' => 'text',
15                         'value' => $node['title'],
16                         'size' => 50,
17                         'text' => $node_type['title_label']
18                         );
19         }
21         if($node_type['body_label'] != '<no-body>'){
23                 $form['nodes']['body'] = array(
24                         'type' => 'textarea',
25                         'value' => $node['body'],
26                         'text' => $node_type['body_label'],
27                         'cols' => 80,
28                         'rows' => 15,
29                         'help' => $node_type['help'],
30                         'inline' => 0
31                 );
33                 $form['nodes']['teaser_full'] = array(
34                         'type' => 'checkbox',
35                         'checked' => ($node['teaser_full'] == 1 ? 'checked' : ''),
36                         'text' => 'Display teaser in full view',
37                         'inline' => 1
38                         );
39         }
41         if(user_access('admin nodes', 'node')){
43                 $form['nodes']['fieldset_admin'] = array(
44                         'type' => 'fieldset',
45                         'legend' => 'Moderation settings'
46                 );
48                 $form['nodes']['fieldset_admin']['author'] = array(
49                         'type' => 'text',
50                         'value' => ($action == 'edit' ? $node['author'] : $user['name']),
51                         'text' => 'Authored by',
52                         'help' => 'Leave blank for ' . core_variable_get('guest_name', 'Guest')
53                 );
55                 $form['nodes']['fieldset_admin']['post_time'] = array(
56                         'type' => 'text',
57                         'value' => ($node['timestamp'] != '' ? date('m-d-Y H:i:s', $node['timestamp']) : ''),
58                         'text' => 'Posting time',
59                         'help' => 'Use the form \'mm-dd-yyyy hh:mm:ss\' For example: 12-18-2009 18:24:06'
60                 );
62                 $form['nodes']['fieldset_admin']['published'] = array(
63                         'type' => 'checkbox',
64                         'checked' => ($node['status'] == 1 ? 'checked' : ''),
65                         'text' => 'Published',
66                         'inline' => 1
67                         );
69                 $form['nodes']['fieldset_admin']['promoted'] = array(
70                         'type' => 'checkbox',
71                         'checked' => ($node['promote'] == 1 ? 'checked' : ''),
72                         'text' => 'Promoted to front page',
73                         'inline' => 1
74                         );
76                 $form['nodes']['fieldset_admin']['sticky'] = array(
77                         'type' => 'checkbox',
78                         'checked' => ($node['sticky'] == 1 ? 'checked' : ''),
79                         'text' => 'Sticky',
80                         'inline' => 1
81                         );
82         }
84         if($action == 'edit'){
85                 $form['nodes']['nid'] = array(
86                         'type' => 'hidden',
87                         'value' => $node['nid']
88                 );
89                 $form['nodes']['revision'] = array(
90                         'type' => 'hidden',
91                         'value' => $node['revision']
92                 );
93                 //Revisions
94                 if(user_access('edit reviews'.$node_type['type'], 'node')){
96                         $form['nodes']['fieldset_revisions'] = array(
97                                 'type' => 'fieldset',
98                                 'legend' => 'Review Log'
99                         );
101                         $form['nodes']['fieldset_revisions']['create_rev'] = array(
102                                 'type' => 'checkbox',
103                                 'text' => 'Create new revision',
104                                 'inline' => 1
105                                 );
106                         $form['nodes']['fieldset_revisions']['log'] = array(
107                                 'type' => 'text',
108                                 'value' => $node['log'],
109                                 'text' => 'Revision Log',
110                                 size => 55
111                         );
113                 }
114         }
116         $form['nodes']['uid'] = array(
117                 'type' => 'hidden',
118                 'value' => ($action == 'edit' ? $node['uid'] : $user['uid'])
119         );
121         $form['nodes']['submit'] = array(
122                 'type' => 'submit',
123                 'value' => 'Submit'
124                 );
126         if($action == 'edit' && ((user_access('edit own '.$node_type['name'], 'node') && $node['uid'] == $user['uid']) || user_access('edit any'.$node_type['name'], 'node'))){
127                 $form['nodes']['form_delete'] = array(
128                         'type' => 'submit',
129                         'value' => 'Delete'
130                         );
131         }
133         return $form;
139  * Helper function to Delete nodes, deletes revisions
140  * @param nid
141  *  Node Id to be deleted
142  * @param rev
143  *  Revision to be deleted NULL means ALL revisions for this node
144  */
145 function _node_delete_revision($nid, $rev = NULL){
147         $q = 'DELETE FROM {PRE_}node_revisions WHERE nid = ' . $nid . ($rev ? ' AND revision = ' . $rev : '');
148         db_query($q);
153  * Helper function to Delete nodes, deletes the node
154  * @param nid
155  *  Node Id to be deleted
156  */
157 function _node_delete($nid){
159         $q = 'DELETE FROM {PRE_}node WHERE nid = ' . $nid;
160         db_query($q);
165  * Delete nodes
166  * Helper function to delete nodes
167  * @todo
168  *  Add user access
169  */
170 function node_delete($nid = NULL, $rev = NULL){
172         global $db, $user;
174         if(!$nid){
175                 path_redirect(core_variable_get('site_frontpage', 'node')); 
176         }
178         hooks_invoke('node_delete', $nid, $rev);
179         //Delete revisions
180         _node_delete_revision($nid, $rev);
182         //delete main post
183         if(!$rev && $db['error'] == NULL){
184                 _node_delete($nid);
185                 system_warnings("Your content has been succesfully deleted");
186         }
187         //redirect and go back where?
188         return TRUE;
192  * Save new nodes
193  * Main function to save nodes, this will only save them.
194  * @todo
195  * Change the query in order to use the internal query function
196  */
197 function node_save_new(&$form){
199         global $user, $db, $node_type;
201         //Main node registry THE TITLE SHOULD BE REMOVED FROM HERE
202         mysql_query("INSERT INTO ".$db['pre']."node 
203                                         (type, title, uid, status, created, promote, sticky)
204                                         values('".$form['nodes']['data']['type']."',
205                                                          '".$form['nodes']['title']['value']."',
206                                                          ".$form['nodes']['uid']['value'].",
207                                                          ".$form['nodes']['published']['value'].",
208                                                          ".$form['nodes']['fieldset_admin']['post_time']['value'].",
209                                                          ".$form['nodes']['promoted']['value'].",
210                                                          ".$form['nodes']['sticky']['value'].")
211                                         ");
213         $nid = mysql_fetch_assoc(mysql_query("SELECT MAX(nid) as nid FROM ".$db['pre']."node WHERE uid = ".$form['nodes']['uid']['value'].""));
214         $nid = $nid['nid'];
216         _node_revision_save($nid, $form);
218         //Add some more information about the publishing options and so on.
219         system_warnings('Your '.$node_type['name'].' has been created.');
220         path_redirect('node/' . $nid);
225  * Save an edited node
227  */
228 function _node_save_edit($nid, &$form){
230         global $user, $db;
232         //Main node registry
233         mysql_query("UPDATE ".$db['pre']."node 
234                                         SET uid = ".$form['nodes']['uid']['value'].",
235                                         status = ".$form['nodes']['published']['value'].",
236                                         promote    = ".$form['nodes']['promoted']['value'].",
237                                         sticky     = ".$form['nodes']['sticky']['value']."
238                                         WHERE nid = ".$nid."");
240         return TRUE;
244 function _node_revision_save($nid, &$form, $rev = 0){
246         global $db;
248         //New revisions
249         if($rev == 0){
251                 //Get the latest revision if needed
252                 $rev = mysql_fetch_assoc(mysql_query("SELECT MAX(revision) as rev FROM ".$db['pre']."node_revisions WHERE nid = ".$nid.""));
253                 $rev = ++$rev['rev'];
255                 //Get rid of the current revision
256                 if($rev != 0){
257                         mysql_query("UPDATE ".$db['pre']."node_revisions SET current = 0 WHERE nid = ".$nid."");
258                 }
259                 else{
260                         $rev = 1;
261                 }
262                         //Revision registry
263                         mysql_query("INSERT INTO ".$db['pre']."node_revisions (nid, uid, title, body, teaser_full, log, timestamp, current, revision)
264                                         values(
265                                         ".$nid.",
266                                         ".$form['nodes']['uid']['value'].",
267                                         '".$form['nodes']['title']['value']."',
268                                         '".$form['nodes']['body']['value']."',
269                                         '".$form['nodes']['teaser_full']['value']."',
270                                         '".$form['nodes']['log']['value']."',
271                                         ".$form['nodes']['fieldset_admin']['post_time']['value'].",
272                                         1, ".$rev.")");
273         }
274         //Update a revision
275         else{
276                 $q = "
277                         UPDATE {PRE_}node_revisions
278                         SET uid        = ".$form['nodes']['uid']['value'].",
279                                  title       = '".$form['nodes']['title']['value']."',
280                                  body        = '".$form['nodes']['body']['value']."',
281                                  teaser_full = ".$form['nodes']['teaser_full']['value'].",
282                                  log         = '".$form['nodes']['log']['value']."',
283                                  timestamp   = ".$form['nodes']['fieldset_admin']['post_time']['value'].",
284                                  revision    = ".$rev."
285                         WHERE nid = ".$nid."
286                         ";
288                 db_query($q);
290         }
294 function node_prepare_save(&$data, &$form, $type){
296         global $user, $db;
298         //Publishing
299         if(user_access('admin nodes', 'node')){
300                 $form['nodes']['published']['value'] = (isset($_POST['published']) ? 1 : 0);
302                 if(isset($_POST['post_time']) && $_POST['post_time'] != ''){
303                         $time = explode(' ', $_POST['post_time']);
304                         $hours = explode(':', $time[1]);
305                         $days = explode('-', $time[0]);
306                         $form['nodes']['fieldset_admin']['post_time']['value'] = mktime((int)$hours[0], (int)$hours[1], (int)$hours[2], $days[0], $days[1], $days[2]);
307                 }
308                         else{
309                                 $form['nodes']['fieldset_admin']['post_time']['value'] = time();
310                         }
312                 //Sticky
313                 $form['nodes']['sticky']['value'] = (isset($_POST['sticky']) ? 1 : 0);
315                 $form['nodes']['promoted']['value'] = (isset($_POST['promoted']) ? 1 : 0);
317                 //Author
318                 if(isset($_POST['author']) && $_POST['author'] != ''){
319                         $uid = mysql_fetch_assoc(mysql_query("SELECT uid FROM ".$db['pre']."users WHERE name = '".$_POST['author']."'"));
320                         $form['nodes']['uid']['value'] = $uid['uid'];
321                         //$form['nodes']['uid']['value'] = $author['uid'];
322                 }
323                 //For anonymous author
324                 elseif($_POST['author'] == ''){
325                         $form['nodes']['uid']['value'] = 0;
326                 }
327                 //just in case the author was not found (it should not happen)
328                 if($form['nodes']['uid']['value'] == ''){
329                         $form['nodes']['uid']['value'] = $user['uid'];
330                 }
332         }
333                 else{
334                         $form['nodes']['published']['value'] = $data['published'];
335                         $form['nodes']['fieldset_admin']['post_time']['value'] = time();
336                         $form['nodes']['sticky']['value']    = $data['sticky'];
337                         $form['nodes']['uid']['value']       = $user['uid'];
338                         $form['nodes']['promoted']['value']  = $data['promoted'];
339                 }
341         $form['nodes']['data']['type'] = $type;
345 function _node_verify(&$data, &$form){
347         global $form_status;
349         //Count the words in the node
350         if(str_word_count($_POST['body']) < $data['min_word_count']){
351                 system_warnings("Minimun word count was not met. You should use at least: " . $data['min_word_count'] . " words", "error");
352                 $form_status = 'with_erros';
353         }
355         //Author
356         if(isset($_POST['author']) && $_POST['author'] != '' && user_access('admin nodes', 'node')){
357                 $form['nodes']['author']['value'] = mysql_fetch_assoc(mysql_query("SELECT uid FROM ".$db['pre']."users WHERE name = '".$_POST['author']."'"));
358                 if($form['nodes']['author']['value'] == ''){
359                 system_warnings("The author does not exist", "error");
360                 $form_status = 'with_erros';
361                 }
362         }
366 function node_get_details($type = NULL){
368         global $db;
370         if($type){
371                 $where = "WHERE type = '".$type."'";
372         }
374         $info = mysql_query("SELECT * FROM ".$db['pre']."node_type ".$where."");
376         while($t = mysql_fetch_assoc($info)){
377                 $data[$t['type']] = $t;
378         }
380         if($data == '')
381                 return FALSE;
382         elseif($type)
383                 return $data[$type];
384         else
385                 return $data;
389 function node_new($type){
391         global $form_status, $user, $xx, $skin, $node_type, $data, $form;
393         //Verify permissions
394         if(!user_access('post new ' . $type, 'node', 'node')){
395                 return 'forbidden';
396         }
398         $node_type = node_get_details($type);
400         $form = node_form_edit('new');
402         if(!$form){
403                 path_redirect('node/new');
404         }
406         if(isset($_POST['form_id'])){
407                 _node_verify($node_type, $form);
408         }
410         $content = form_form($form);
412         $skin['page_title'] = 'Add new ' . $node_type['name'];
414         if($form_status == 'verified'){
415                 node_prepare_save($node_type, $form, $node_type['type']);
416                 node_save_new($form);
417         }
419         return $content;
424  * Node edit form
425  */
426 function node_edit($nid, $rev = NULL){
428         global $db, $user, $skin, $node, $node_type, $xx, $form_status, $form;
430         $node = node_load($nid, $rev);
432         if(!$node){
433                 path_redirect('<front>');
434         }
436         $node_type = node_get_details($node['type']);
438         $skin['page_title'] = 'Edit form for: ' . $node['title'];
440         if(user_access('edit nodes', 'node') || (user_access('edit own '.$node['type'], 'node') && $node['uid'] == $user['uid'])){
442                 if(isset($_POST['form_id'])){
443                         _node_verify($node_type[$node['type']], $form);
444                 }
446                 $form = node_form_edit('edit');
447                 $content = form_form($form, 'post', NULL, (isset($_GET['form']) ? FALSE : TRUE));
449                 if($form_status == 'verified'){
451                         //Update the current node
452                         node_prepare_save($node_type, $form, $node_type['type']);
453                         _node_save_edit($nid, $form);
455                 //Create new revision
456                 if($form['nodes']['create_rev']['value'] == 1){
457                         $form['nodes']['revision']['value'] = 0;
458                 }
460                 _node_revision_save($nid, $form, $form['nodes']['revision']['value']);
461                 system_warnings('Your '.$node_type['type'].' has been modified.');
462                 path_redirect('node/' . $nid);
463                 }
464                         elseif($form_status == 'delete_confirmed'){
465                                 if(node_delete($nid, $rev)){
466                                         path_redirect('system/admin');
467                                 }
468                         }
470         }
471         else{
472                 return 'PATH_NO_ACCESS';
473         }
475         return $content;
479 function node_new_list(){
480         return 'This will be a list of all posible nodes';