Advertisement
Bloke

txp_form with arbitrary types

Jan 4th, 2012
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 10.21 KB | None | 0 0
  1. <?php
  2.  
  3. /*
  4.     This is Textpattern
  5.  
  6.     Copyright 2005 by Dean Allen
  7.     www.textpattern.com
  8.     All rights reserved
  9.  
  10.     Use of this software indicates acceptance of the Textpattern license agreement
  11.  
  12. $HeadURL: https://textpattern.googlecode.com/svn/development/4.x/textpattern/include/txp_form.php $
  13. $LastChangedRevision: 3560 $
  14.  
  15. */
  16.  
  17.     if (!defined('txpinterface')) die('txpinterface is undefined.');
  18.  
  19.     global $vars;
  20.     $vars = array('Form','type','new_type','name','savenew','oldname');
  21.     $essential_forms = array('comments','comments_display','comment_form','default','Links','files');
  22.  
  23.     if ($event == 'form') {
  24.         require_privs('form');
  25.  
  26.         bouncer($step,
  27.             array(
  28.                 'form_edit'       => false,
  29.                 'form_create'     => false,
  30.                 'form_delete'     => true,
  31.                 'form_multi_edit' => true,
  32.                 'form_save'       => true,
  33.                 'save_pane_state' => true
  34.             )
  35.         );
  36.  
  37.         switch(strtolower($step)) {
  38.             case "":                form_edit();             break;
  39.             case "form_edit":       form_edit();             break;
  40.             case "form_create":     form_create();           break;
  41.             case "form_delete":     form_delete();           break;
  42.             case "form_multi_edit": form_multi_edit();       break;
  43.             case "form_save":       form_save();             break;
  44.             case "save_pane_state": form_save_pane_state();  break;
  45.         }
  46.  
  47.     }
  48.  
  49. // -------------------------------------------------------------
  50.     function form_list($curname)
  51.     {
  52.         global $step,$essential_forms;
  53.         $out[] = '<p class="action-create smallerbox">'.sLink('form','form_create',gTxt('create_new_form')).'</p>';
  54.  
  55.         $methods = array('delete'=>gTxt('delete'));
  56.  
  57.         $rs = safe_rows_start("*", "txp_form", "1 order by type asc, name asc");
  58.  
  59.         if ($rs) {
  60.             $ctr = 1;
  61.             $prev_type = '';
  62.             while ($a = nextRow($rs)){
  63.                 extract($a);
  64.                 $editlink = ($curname!=$name)
  65.                     ?   eLink('form','form_edit','name',$name,$name)
  66.                     :   htmlspecialchars($name);
  67.                 $modbox = (!in_array($name, $essential_forms))
  68.                     ?   '<input type="checkbox" name="selected_forms[]" value="'.$name.'" />'
  69.                     :   '';
  70.  
  71.                 if ($prev_type != $type) {
  72.                     $visipref = 'pane_form_'.$type.'_visible';
  73.                     //TODO: Add 'article', 'comment', 'misc' to rpc server for gTxt()
  74.                     $group_start = '<div class="form-list-group '.$type.'"><h3 class="plain lever'.(get_pref($visipref) ? ' expanded' : '').'"><a href="#'.$type.'">'.ucfirst(gTxt($type)).'</a></h3>'.n.
  75.                         '<div id="'.$type.'" class="toggle form-list" style="display:'.(get_pref($visipref) ? 'block' : 'none').'">'.n.
  76.                         '<ul class="plain-list">'.n;
  77.                     $group_end = ($ctr > 1) ? '</ul></div></div>'.n : '';
  78.                 } else {
  79.                     $group_start = $group_end = '';
  80.                 }
  81.  
  82.                 $out[] = $group_end.$group_start;
  83.                 $out[] = '<li class="'.(($ctr%2 == 0) ? 'even' : 'odd').'">'.n.'<span class="form-list-action">'.$modbox.'</span><span class="form-list-name">'.$editlink.'</span></li>';
  84.                 $prev_type = $type;
  85.                 $ctr++;
  86.             }
  87.  
  88.             $out[] = '</ul></div></div>';
  89.             $out[] = eInput('form').sInput('form_multi_edit');
  90.             $out[] = graf(selectInput('edit_method',$methods,'',1).sp.gTxt('selected').sp.
  91.                 fInput('submit','form_multi_edit',gTxt('go'),'smallerbox')
  92.                 , ' align="right"');
  93.  
  94.             return form( join('',$out),'',"verify('".gTxt('are_you_sure')."')", 'post', '', '', 'allforms_form' );
  95.         }
  96.     }
  97.  
  98. // -------------------------------------------------------------
  99.  
  100.     function form_multi_edit()
  101.     {
  102.         global $essential_forms;
  103.  
  104.         $method = ps('edit_method');
  105.         $forms = ps('selected_forms');
  106.  
  107.         if ($forms and is_array($forms))
  108.         {
  109.             if ($method == 'delete')
  110.             {
  111.                 foreach ($forms as $name)
  112.                 {
  113.                     if (!in_array($name, $essential_forms) && form_delete($name))
  114.                     {
  115.                         $deleted[] = $name;
  116.                     }
  117.                 }
  118.  
  119.                 $message = gTxt('forms_deleted', array('{list}' => join(', ', $deleted)));
  120.  
  121.                 form_edit($message);
  122.             }
  123.         }
  124.  
  125.         else
  126.         {
  127.             form_edit();
  128.         }
  129.     }
  130.  
  131. // -------------------------------------------------------------
  132.     function form_create()
  133.     {
  134.         form_edit();
  135.     }
  136.  
  137. // -------------------------------------------------------------
  138.     function form_edit($message='')
  139.     {
  140.         global $event,$step,$essential_forms;
  141.         pagetop(gTxt('edit_forms'),$message);
  142.  
  143.         extract(gpsa(array('Form','name','type')));
  144.         $name = trim(preg_replace('/[<>&"\']/', '', $name));
  145.  
  146.         if ($step=='form_create') {
  147.             $inputs = fInput('submit','savenew',gTxt('save_new'),'publish').
  148.                 eInput("form").sInput('form_save');
  149.         } else {
  150.             $name = (!$name or $step=='form_delete') ? 'default' : $name;
  151.             $rs = safe_row("*", "txp_form", "name='".doSlash($name)."'");
  152. //          if ($rs)
  153.  {
  154.                 extract($rs);
  155.                 $inputs = fInput('submit','save',gTxt('save'),'publish').
  156.                     eInput("form").sInput('form_save').hInput('oldname',$name);
  157.             }
  158.         }
  159.  
  160.         if (!in_array($name, $essential_forms))
  161.             $changename = graf(gTxt('form_name').br.fInput('text','name',$name,'edit','','',15));
  162.         else
  163.             $changename = graf(gTxt('form_name').br.tag($name, 'em').hInput('name',$name));
  164.  
  165.         // Generate the tagbuilder links
  166.         // Format of each entry is popTagLink -> array ( gTxt string, class/ID, popHelp ref )
  167.         $tagbuild_items = array(
  168.             'article' => array('articles', 'article-tags', 'form_articles'),
  169.             'link' => array('links', 'link-tags', 'form__place_link'),
  170.             'comment' => array('comments', 'comment-tags', 'form_comments'),
  171.             'comment_details' => array('comment_details', 'comment-detail-tags', 'form_comment_details'),
  172.             'comment_form' => array('comment_form', 'comment-form-tags', 'form_comment_form'),
  173.             'search_result' => array('search_results_form', 'search-result-tags', 'form_search_results'),
  174.             'file_download' => array('file_download_tags', 'file-tags', 'form_file_download_tags'),
  175.             'category' => array('category_tags', 'category-tags', 'form_category_tags'),
  176.             'section' => array('section_tags', 'section-tags', 'form_section_tags'),
  177.         );
  178.  
  179.         $tagbuild_links = '';
  180.         foreach ($tagbuild_items as $tb => $item) {
  181.             $tagbuild_links .= '<div class="'.$item[1].'">'.hed('<a href="#'.$item[1].'">'.gTxt($item[0]).'</a>'.
  182.                     sp.popHelp($item[2]), 3, ' class="plain lever'.(get_pref('pane_form_'.$item[1].'_visible') ? ' expanded' : '').'"').
  183.                     '<div id="'.$item[1].'" class="toggle on" style="display:'.(get_pref('pane_form_'.$item[1].'_visible') ? 'block' : 'none').'">'.popTagLinks($tb).'</div></div>';
  184.         }
  185.  
  186.         $out =
  187.             '<div id="'.$event.'_container" class="txp-container txp-edit">'.
  188.             startTable('edit').
  189.             tr(
  190.                 tdtl(
  191.                     '<div id="tagbuild_links">'.hed(gTxt('tagbuilder'), 2).
  192.                     $tagbuild_links.
  193.                     '</div>'
  194.                 , ' class="column"').
  195.                 tdtl(
  196.                     '<form action="index.php" method="post" id="form_form">'.
  197.                         '<div id="main_content">'.
  198.                         '<div class="edit-title">'.gTxt('you_are_editing_form').sp.strong(($name) ? $name : gTxt('untitled')).'</div>'.
  199.                         '<textarea id="form" class="code" name="Form" cols="60" rows="20">'.htmlspecialchars($Form).'</textarea>'.
  200.  
  201.                     $changename.
  202.  
  203.                     graf(gTxt('form_type').br.
  204.                         formtypes($type)).
  205.                     (empty($type) ? graf(gTxt('only_articles_can_be_previewed')) : '').
  206.                     (empty($type) || $type == 'article' ? fInput('submit','form_preview',gTxt('preview'),'smallbox') : '' ).
  207.                     graf($inputs).
  208.                     '</div>'.
  209.                     n.tInput().
  210.                     n.'</form>'
  211.  
  212.                 , ' class="column"').
  213.                 tdtl(
  214.                     '<div id="content_switcher" class="list">'.hed(gTxt('all_forms'), 2).
  215.                     form_list($name).
  216.                     '</div>'
  217.                 , ' class="column"')
  218.             ).endTable().'</div>';
  219.  
  220.         echo $out;
  221.     }
  222.  
  223. // -------------------------------------------------------------
  224.  
  225.     function form_save()
  226.     {
  227.         global $vars, $step, $essential_forms;
  228.  
  229.         extract(doSlash(gpsa($vars)));
  230.         $name = doSlash(trim(preg_replace('/[<>&"\']/', '', gps('name'))));
  231.  
  232.         if (!$name)
  233.         {
  234.             $step = 'form_create';
  235.             $message = gTxt('form_name_invalid');
  236.  
  237.             return form_edit(array($message, E_ERROR));
  238.         }
  239.  
  240.         if ($new_type != '') {
  241.             $type = trim($new_type);
  242.         }
  243.  
  244.         if ($type == '')
  245.         {
  246.             $step = 'form_create';
  247.             $message = gTxt('form_type_missing');
  248.  
  249.             return form_edit(array($message, E_ERROR));
  250.         }
  251.  
  252.         if ($savenew)
  253.         {
  254.             $exists = safe_field('name', 'txp_form', "name = '$name'");
  255.  
  256.             if ($exists)
  257.             {
  258.                 $step = 'form_create';
  259.                 $message = gTxt('form_already_exists', array('{name}' => $name));
  260.  
  261.                 return form_edit(array($message, E_ERROR));
  262.             }
  263.  
  264.             safe_insert('txp_form', "Form = '$Form', type = '$type', name = '$name'");
  265.  
  266.             update_lastmod();
  267.  
  268.             $message = gTxt('form_created', array('{name}' => $name));
  269.  
  270.             return form_edit($message);
  271.         }
  272.  
  273.         safe_update('txp_form', "Form = '$Form', type = '$type', name = '$name'", "name = '$oldname'");
  274.  
  275.         update_lastmod();
  276.  
  277.         $message = gTxt('form_updated', array('{name}' => $name));
  278.  
  279.         form_edit($message);
  280.     }
  281.  
  282. // -------------------------------------------------------------
  283.     function form_delete($name)
  284.     {
  285.         global $essential_forms;
  286.         if (in_array($name, $essential_forms)) return false;
  287.         $name = doSlash($name);
  288.         if (safe_delete("txp_form","name='$name'")) {
  289.             return true;
  290.         }
  291.         return false;
  292.     }
  293.  
  294. // -------------------------------------------------------------
  295.     function formTypes($type)
  296.     {
  297.         $all_types = safe_column('type', 'txp_form', '1=1 GROUP BY type');
  298.         $fixed_types = array(''=>'','article'=>'article','category'=>'category','comment'=>'comment',
  299.             'file'=>'file','link'=>'link','misc'=>'misc','section'=>'section');
  300.         $types = array_merge($fixed_types, $all_types);
  301.         natsort($types);
  302.         return selectInput('type', $types, $type) . fInput('text', 'new_type', '', 'edit', '', '', 15);
  303.     }
  304.  
  305. // -------------------------------------------------------------
  306.     function form_save_pane_state()
  307.     {
  308.         global $event;
  309.         $all_types = safe_column('type', 'txp_form', '1=1 GROUP BY type');
  310.         $panes = array('article', 'category', 'comment', 'file', 'link', 'misc', 'section', 'article-tags', 'link-tags', 'comment-tags', 'comment-detail-tags', 'comment-form-tags', 'search-result-tags', 'file-tags', 'category-tags', 'section-tags');
  311.         $pane = gps('pane');
  312.         if (in_array($pane, $panes + $all_types))
  313.         {
  314.             set_pref("pane_form_{$pane}_visible", (gps('visible') == 'true' ? '1' : '0'), $event, PREF_HIDDEN, 'yesnoradio', 0, PREF_PRIVATE);
  315.             send_xml_response();
  316.         } else {
  317.             send_xml_response(array('http-status' => '400 Bad Request'));
  318.         }
  319.     }
  320.  
  321. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement