JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
metaform now supports fckeditor, and email/db parts are optional
authorJason Woofenden <jason183@herkamire.com>
Tue, 5 Jun 2007 08:19:16 +0000 (04:19 -0400)
committerJason Woofenden <jason183@herkamire.com>
Tue, 5 Jun 2007 08:19:16 +0000 (04:19 -0400)
metaform.php
metaform/main.html
metaform/preview.html
metaform/template.html
metaform/template.php

index 5ba0f44..8215394 100644 (file)
@@ -24,6 +24,7 @@
 require_once('code/wfpl/template.php');
 require_once('code/wfpl/http.php');
 require_once('code/wfpl/tar.php');
+require_once('code/wfpl/format.php');
 
 # see code/wfpl/metaform/template.html for the html templates for these elements
 $GLOBALS['types'] = array(
@@ -41,6 +42,7 @@ $GLOBALS['types'] = array(
        'hidden' =>     array('hidden',      'unix',       'varchar(200)'),
        'password' =>   array('password',    'oneline',    'varchar(200)'),
        'textarea' =>   array('textarea',    'unix',       'text'),
+       'html' =>       array('html',        'unix',       'text'),
        'pulldown' =>   array('pulldown',    'options',    'int'),
        'radio' =>      array('radio',       'oneline',    'varchar(200)'),
        'checkbox' =>   array('checkbox',    'yesno',      'varchar(3)'),
@@ -50,43 +52,62 @@ $GLOBALS['types'] = array(
        'submit' =>     array('submit',      'oneline',    'n/a')
 );
 
-if(isset($_REQUEST['form_name'])) {
-       $GLOBALS['form_name'] = ereg_replace('[^a-z0-9_-]', '', $_REQUEST['form_name']);
-} else {
-       $GLOBALS['form_name'] = 'some_form';
+function list_available_types() {
+       $types = '';
+       foreach($GLOBALS['types'] as $key => $value) {
+               if($types) {
+                       $types .= ', ';
+               }
+               $types .= $key;
+       }
+       tem_set('available_types', $types);
 }
 
-if(isset($_REQUEST['fields'])) {
-       if(isset($_REQUEST['view_sql'])) {
-               view_sql();
-               exit();
-       } elseif(isset($_REQUEST['view_php'])) {
-               view_php();
-               exit();
-       } elseif(isset($_REQUEST['view_template'])) {
-               view_template();
-               exit();
-       } elseif(isset($_REQUEST['view_email'])) {
-               view_email();
-               exit();
-       } elseif(isset($_REQUEST['download_tar'])) {
-               download_tar();
-               exit();
-       } elseif(isset($_REQUEST['preview'])) {
-               preview();
-               exit();
-       } elseif(isset($_REQUEST['edit'])) {
-               tem_set('fields', $_REQUEST['fields']);
-               tem_set('form_name', $GLOBALS['form_name']);
-               # fall through
+
+function metaform() {
+       if(isset($_REQUEST['form_name'])) {
+               $GLOBALS['form_name'] = ereg_replace('[^a-z0-9_-]', '', $_REQUEST['form_name']);
+               $GLOBALS['opt_email'] = format_yesno($_REQUEST['opt_email']);
+               tem_set('opt_email', $GLOBALS['opt_email']);
+               $GLOBALS['opt_db'] = format_yesno($_REQUEST['opt_db']);
+               tem_set('opt_db', $GLOBALS['opt_db']);
        } else {
-               die("Sorry... couldn't tell which button you pressed");
+               $GLOBALS['form_name'] = 'some_form';
        }
-}
 
-set_form_action();
-tem_output('code/wfpl/metaform/main.html');
-exit();
+       if(isset($_REQUEST['fields'])) {
+               if(isset($_REQUEST['view_sql'])) {
+                       view_sql();
+                       exit();
+               } elseif(isset($_REQUEST['view_php'])) {
+                       view_php();
+                       exit();
+               } elseif(isset($_REQUEST['view_html'])) {
+                       view_html();
+                       exit();
+               } elseif(isset($_REQUEST['view_email'])) {
+                       view_email();
+                       exit();
+               } elseif(isset($_REQUEST['download_tar'])) {
+                       download_tar();
+                       exit();
+               } elseif(isset($_REQUEST['preview'])) {
+                       preview();
+                       exit();
+               } elseif(isset($_REQUEST['edit'])) {
+                       tem_set('fields', $_REQUEST['fields']);
+                       tem_set('form_name', $GLOBALS['form_name']);
+                       # fall through
+               } else {
+                       die("Sorry... couldn't tell which button you pressed");
+               }
+       }
+
+
+       set_form_action();
+       list_available_types();
+       tem_output('code/wfpl/metaform/main.html');
+}
 
 
 function field_input($type)  { return $GLOBALS['types'][$type][0]; }
@@ -154,8 +175,9 @@ function view_sql() {
        
 
 # pass false if you want to exclude the <head> and <body> tag etc.
-function make_template($whole_file = true) {
+function make_html($whole_file = true) {
        $uploads_output_already = false;
+       $has_html_editors = false;
        $tem = new tem();
        $tem->load('code/wfpl/metaform/template.html');
        $tem->set('form_name', $GLOBALS['form_name']);
@@ -172,13 +194,28 @@ function make_template($whole_file = true) {
                        $tem->sub('uploads');
                        $tem->set('enctype_attr', '" enctype="multipart/form-data');
                        $uploads_output_already = true;
+               } elseif($input == 'html') {
+                       $has_html_editors = true;
+                       $tem->set('html_field_name', $name);
+                       $tem->sub('replace_textarea');
                }
        }
+
+       if($GLOBALS['opt_db'] == 'Yes') {
+               $tem->sub('opt_db_1');
+       } else {
+               $tem->sub('opt_db_1_else');
+       }
        $tem->set('name', 'save');
        $tem->set('caption', 'Save');
        $tem->sub('submit');
        $tem->sub('row');
        $tem->sub('form');
+
+       if($has_html_editors) {
+               $tem->sub('html_editor_headers');
+       }
+
        if($whole_file) {
                return $tem->run();
        } else {
@@ -186,9 +223,9 @@ function make_template($whole_file = true) {
        }
 }
 
-function view_template() {
+function view_html() {
        view_headers();
-       echo make_template();
+       echo make_html();
 }
 
 
@@ -236,6 +273,17 @@ function make_php() {
        $tem->set('db_fields', $db_fields);
        $tem->set('php_fields', $php_fields);
        $tem->set('metaform_url', edit_url());
+       if($GLOBALS['opt_db'] == 'Yes') {
+               $tem->sub('opt_db_1');
+               $tem->sub('opt_db_2');
+               $tem->sub('opt_db_3');
+               $tem->sub('opt_db_4');
+               $tem->sub('opt_db_5');
+       }
+       if($GLOBALS['opt_email'] == 'Yes') {
+               $tem->sub('opt_email_1');
+               $tem->sub('opt_email_2');
+       }
        return $tem->run();
 }
 
@@ -272,6 +320,12 @@ function make_email() {
        return $tem->run();
 }
 
+function make_htaccess() {
+       $tem = new tem();
+       $tem->set('form', $GLOBALS['form_name']);
+       return $tem->run('code/wfpl/metaform/template.htaccess');
+}
+
 function view_email() {
        view_headers();
        echo make_email();
@@ -279,26 +333,33 @@ function view_email() {
 
 
 function preview() {
-       $tem = new tem();
-       $tem->load('code/wfpl/metaform/preview.html');
-       $tem->set('form_name', $GLOBALS['form_name']);
-       $tem->set('fields', $_REQUEST['fields']);
+       tem_load('code/wfpl/metaform/preview.html');
+       tem_set('form_name', $GLOBALS['form_name']);
+       tem_set('fields', $_REQUEST['fields']);
        $preview_tem = new tem();
-       $preview = $preview_tem->run(make_template(false));
+       $preview = $preview_tem->run(make_html(false));
        unset($preview_tem);
-       $tem->set('preview', $preview);
+       tem_set('preview', $preview);
        set_form_action();
-       $tem->output();
+       tem_output();
 }
 
 function download_tar() {
        $name = $GLOBALS['form_name'];
        $data = array(
-               "$name.html" => make_template(),
+               ".htaccess" => make_htaccess(),
+               "run.php ->" => 'code/wfpl/run.php',
+               "$name.html" => make_html(),
                "$name.sql" => make_sql(),
-               "$name.email.txt" => make_email(),
                "$name.php" => make_php());
+       if($GLOBALS['opt_email'] == 'Yes') {
+               $data["$name.email.txt"] = make_email();
+       }
        make_wfpl_tar($name, $data);
 }
 
+
+metaform();
+exit();
+
 ?>
index c33bad3..ffd38fc 100644 (file)
 
     <p>Form name: <input type="text" name="form_name" value="~form_name.attr~" /></p>
 
-       <p>Below, specify the fields you'd like in your form, one field per line. After each field name, put at least one space, then the field type. The following field types are available: name textbox email phone money dollars int hidden password url textarea checkbox yesno submit.</p>
+       <h3>Features</h3>
+
+    <p><input type="checkbox" name="opt_email~opt_email.checked~" value="Yes" /> Send form results vie e-mail.</p>
+
+    <p><input type="checkbox" name="opt_db~opt_db.checked~" value="Yes" /> Save form results to a database.</p>
+
+       <p>Below, specify the fields you'd like in your form, one field per line. After each field name, put at least one space, then the field type. The following field types are available: ~available_types.html~.</p>
        <p>Example:<br /><pre>
 name      textbox
 phone     phone
index 0de8cc0..e847988 100644 (file)
@@ -10,19 +10,19 @@ td.caption { text-align: right; font-weight: bold; }
 
 <body>
   <div style="border: 4px solid black; margin: 40px; padding: 13px; background-color: #555">
-  <h1>This grey thing is a preview. It will NOT work. Don't click buttons in it</h1>
+  <h1>This grey thing is a preview. It will NOT work. Don't click button(s) in it</h1>
 ~preview~
   </div>
-    <p><form action="~form_name~.tgz" method="get"><input type="hidden" name="form_name" value="~form_name.attr~" /><input type="hidden" name="fields" value="~fields.attr~" /><input type="submit" name="download_tar" value="Download tar ball" /></form></p>
+    <p><form action="~form_name~.tgz" method="get"><input type="hidden" name="form_name" value="~form_name.attr~" /><input type="hidden" name="opt_email" value="~opt_email.attr~" /><input type="hidden" name="opt_db" value="~opt_db.attr~" /><input type="hidden" name="fields" value="~fields.attr~" /><input type="submit" name="download_tar" value="Download tar ball" /></form></p>
 
   <form action="~metaform_name~" method="get">
-       <p><input type="hidden" name="form_name" value="~form_name.attr~" /><input type="hidden" name="fields" value="~fields.attr~" /><input type="submit" name="edit" value="Back to editing" /></p>
+       <p><input type="hidden" name="form_name" value="~form_name.attr~" /><input type="hidden" name="opt_email" value="~opt_email.attr~" /><input type="hidden" name="opt_db" value="~opt_db.attr~" /><input type="hidden" name="fields" value="~fields.attr~" /><input type="submit" name="edit" value="Back to editing" /></p>
 
     <p><input type="submit" name="view_sql" value="View SQL" /></p>
 
     <p><input type="submit" name="view_php" value="View PHP" /></p>
 
-    <p><input type="submit" name="view_template" value="View template" /></p>
+    <p><input type="submit" name="view_html" value="View HTML template" /></p>
 
     <p><input type="submit" name="view_email" value="View e-mail" /></p>
 
index 531f416..d5a2a5a 100644 (file)
@@ -7,19 +7,31 @@
 td.caption { text-align: right; vertical-align: top; font-weight: bold; }
 td.errorcaption { text-align: right; vertical-align: top; font-weight: bold; color: red; }
 div.error { border: 2px solid red; padding: 13px; margin: 20px; background: #ffdddd; }
---></style>
+--></style><!--~html_editor_headers start~-->
+<script type="text/javascript" src="fckeditor/fckeditor.js"></script>
+  <script type="text/javascript" src="fckeditor/fckconfig.js"></script>
+  <script type="text/javascript">
+<!--
+       window.onload = function()
+       {<!--~replace_textarea start~-->
+               var fck_~html_field_name~ = new FCKeditor('~html_field_name~');
+               fck_~html_field_name~.Height = 550;
+               fck_~html_field_name~.ReplaceTextarea();<!--~end~-->
+       }
+-->
+  </script><!--~end~-->
 </head>
 
 <body>
 <!--~~form start~~--><!--~form start~-->
-  <h2><!--~~new_msg start~~-->Add a new entry<!--~~end~~--><!--~~edit_msg start~~-->Edit entry "~~name.html~~"<!--~~end~~--></h2>
+  <h2><!--~opt_db_1 start~--><!--~~new_msg start~~-->Add a new entry<!--~~end~~--><!--~~edit_msg start~~-->Edit entry "~~name.html~~"<!--~~end~~--><!--~end~--><!--~opt_db_1_else start~-->~form_name~ entry form<!--~end~--></h2>
 
   <!--~error start~--><div class="error"><h3>~error_message.html~</h3></div><!--~end~-->
 
   <form action="~form_name~.html~enctype_attr~" method="post"><!--~~editing start~~--><input type="hidden" name="~form_name~_edit_id" value="~~~form_name~_edit_id.attr~~" /><!--~~end~~--><!--~uploads start~--><input type="hidden" name="MAX_FILE_SIZE" value="~~upload_max_filesize~~" /><!--~end~-->
     <table cellspacing="0" cellpadding="4" border="0" summary=""><!--~row start~-->
 
-      <tr><!--~image start~--><td class="caption">~caption.html~: </td><td><input type="file" name="~name~" /></td><!--~end~--><!--~textbox start~--><td class="caption">~caption.html~: </td><td><input type="text" name="~name~" value="~~~name~.attr~~" /></td><!--~end~--><!--~password start~--><td class="caption">~caption.html~: </td><td><input type="password" name="~name~" value="~~~name~.attr~~" /></td><!--~end~--><!--~textarea start~--><td class="caption">~caption.html~: </td><td><textarea rows="20" cols="50" name="~name~">~~~name~.html~~</textarea></td><!--~end~--><!--~radio start~--><td class="caption">~caption.html~: </td><td><input type="radio" name="~name~~~~name~.checked~~" /></td><!--~end~--><!--~checkbox start~--><td class="caption">~caption.html~: </td><td><input type="checkbox" name="~name~~~~name~.checked~~" /></td><!--~end~--><!--~submit start~--><td class="submit_row" colspan="2"><input type="submit" name="~name~" value="~caption.attr~" /></td><!--~end~--></tr><!--~end~-->
+      <tr><!--~image start~--><td class="caption">~caption.html~: </td><td><input type="file" name="~name~" /></td><!--~end~--><!--~textbox start~--><td class="caption">~caption.html~: </td><td><input type="text" name="~name~" value="~~~name~.attr~~" /></td><!--~end~--><!--~password start~--><td class="caption">~caption.html~: </td><td><input type="password" name="~name~" value="~~~name~.attr~~" /></td><!--~end~--><!--~textarea start~--><td class="caption">~caption.html~: </td><td><textarea rows="20" cols="50" name="~name~">~~~name~.html~~</textarea></td><!--~end~--><!--~html start~--><td class="caption">~caption.html~: </td><td></td></tr><tr><td colspan="2"><textarea rows="20" cols="50" name="~name~">~~~name~.html~~</textarea></td><!--~end~--><!--~radio start~--><td class="caption">~caption.html~: </td><td><input type="radio" name="~name~~~~name~.checked~~" /></td><!--~end~--><!--~checkbox start~--><td class="caption">~caption.html~: </td><td><input type="checkbox" name="~name~~~~name~.checked~~" /></td><!--~end~--><!--~submit start~--><td class="submit_row" colspan="2"><input type="submit" name="~name~" value="~caption.attr~" /></td><!--~end~--></tr><!--~end~-->
 
     </table>
   </form>
index 14836c7..fc1263b 100644 (file)
@@ -8,31 +8,30 @@
 #
 # ~metaform_url~
 
-# This code can send form results by e-mail and/or save them to a database. See
-# the next two comments to enable either or both.
-
+# SETUP
+<!--~opt_email_1 start~-->
 # To send results by e-mail, all you have to do is set your e-mail address here:
 $GLOBALS['~form_name~_form_recipient'] = "fixme@example.com";
-<!--~upload_settings start~-->
+<!--~end~--><!--~opt_db_1 start~-->
+# To save results to a database, you'll need to create the ~form_name~ table
+# (the file ~form_name~.sql should help with this), and create a file called
+# 'db_connect.php' or 'code/db_connect.php' which calls db_connect() see:
+# code/wfpl/examples/db_connect.php
+<!--~end~--><!--~upload_settings start~-->
 # Set this to the path to your uploads directory. It can be relative to the
 # location of this script. IT MUST END WITH A SLASH
 $GLOBALS['upload_directory'] = 'uploads/';
 <!--~end~-->
-# To save results to a database, you'll need to create the ~form_name~ table
-# (the file ~form_name~.sql should help with this), and create a file called
-# 'db_connect.php' which calls db_connect() see:
-# code/wfpl/examples/db_connect.php
 
 if(!file_exists('code/wfpl/template.php')) { die('This form requires <a href="http://jasonwoof.org/wfpl">wfpl</a>.'); }
 require_once('code/wfpl/template.php');
 require_once('code/wfpl/format.php');
 require_once('code/wfpl/messages.php');
-require_once('code/wfpl/email.php');
-require_once('code/wfpl/db.php');<!--~image_include start~-->
+require_once('code/wfpl/email.php');<!--~opt_db_2 start~-->
+require_once('code/wfpl/db.php');<!--~end~--><!--~image_include start~-->
 require_once('code/wfpl/upload.php');<!--~end~-->
 
-function ~form_name~_get_fields() {
-       <!--~formats start~-->
+function ~form_name~_get_fields() {<!--~formats start~-->
        $~name~ = format_~format~($_REQUEST['~name~']);<!--~end~--><!--~image_upload start~-->
        $~name~ = save_uploaded_image('~name~', $GLOBALS['upload_directory']);<!--~end~-->
        <!--~tem_sets start~-->
@@ -41,7 +40,7 @@ function ~form_name~_get_fields() {
        return array(~php_fields~);
 }
 
-function ~form_name~() {
+function ~form_name~() {<!--~opt_db_3 start~-->
        $edit_id = format_int($_REQUEST['~form_name~_edit_id']);
        unset($_REQUEST['~form_name~_edit_id']);
        if($edit_id) {
@@ -63,20 +62,14 @@ function ~form_name~() {
 
        if(!$edit_id && !$delet_id) {
                tem_sub('new_msg');
-       }
+       }<!--~end~-->
 
        if(isset($_REQUEST['~always_field~'])) {
                list(~php_fields~) = ~form_name~_get_fields();
 
-               if("you're happy with the POSTed values") {
-                       # to enable saving to a database, create a file called 'db_connect.php'
-                       # see: code/wfpl/examples/db_connect.php
-                       if(file_exists('db_connect.php') || file_exists('code/db_connect.php')) {
-                               if(file_exists('db_connect.php') {
-                                       require_once('db_connect.php');
-                               } else {
-                                       require_once('code/db_connect.php');
-                               }
+               if("you're happy with the POSTed values") {<!--~opt_db_4 start~-->
+                       if(file_exists($db_connector = 'db_connect.php') || file_exists($db_connector = 'code/db_connect.php')) {
+                               require_once($db_connector);
                                if($edit_id) {<!--~image_db start~-->
                                        # uploading nothing means leaving it as is.
                                        if(!$~name~ && $delete_~name~ != 'Yes') {
@@ -89,7 +82,7 @@ function ~form_name~() {
                                        db_insert('~form_name~', '~db_fields~', ~php_fields~);
                                        message('Entry saved.');
                                }
-                       }
+                       }<!--~end~--><!--~opt_email_2 start~-->
                        if($GLOBALS['~form_name~_form_recipient'] != "fixme@example.com") {
                                $to = $GLOBALS['~form_name~_form_recipient'];
                                if(isset($_REQUEST['email']) and valid_email($_REQUEST['email'])) {
@@ -109,7 +102,7 @@ function ~form_name~() {
                                        tem_sub('error');
                                        $error = true;
                                }
-                       }
+                       }<!--~end~-->
                        if($error !== true) {
                                tem_load('~form_name~.html');
                                tem_sub('thankyou');
@@ -120,11 +113,11 @@ function ~form_name~() {
                # otherwise, we display the form again. ~form_name~_get_fields() has
                # already put the posted values back into the template engine, so they will
                # show up in the form fields. You should add some message asking people to
-               # fix their entry in whatever way you require.
+               # fix their entry in whatever way you require.<!--~opt_db_5 start~-->
        } elseif($edit_id) {
                # we've recieved an edit id, but no data. So we grab the values to be edited from the database
                list(~php_fields~) = db_get_row('~form_name~', '~db_fields~', 'where id=%i', $edit_id);
-               ~tem_sets.tab~
+               ~tem_sets.tab~<!--~end~-->
        } else {
                # form not submitted, you can set default values like so:
                #tem_set('~always_field~', 'Yes');