JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
fixed conflict
authorJason Woofenden <jason183@herkamire.com>
Tue, 5 Jun 2007 08:40:20 +0000 (04:40 -0400)
committerJason Woofenden <jason183@herkamire.com>
Tue, 5 Jun 2007 08:40:20 +0000 (04:40 -0400)
13 files changed:
dwt.php
fdb.php [new file with mode: 0644]
file.php [new file with mode: 0644]
format.php
metaform.php
metaform/main.html
metaform/preview.html
metaform/template.htaccess [new file with mode: 0644]
metaform/template.html
metaform/template.php
misc.php
tar.php
template.php

diff --git a/dwt.php b/dwt.php
index 78daa54..49fac82 100644 (file)
--- a/dwt.php
+++ b/dwt.php
@@ -18,7 +18,7 @@
 #  along with wfpl; if not, write to the Free Software Foundation, Inc., 51
 #  Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 
-require_once('code/wfpl/misc.php');
+require_once('code/wfpl/file.php');
 
 function dwt_reset() {
        $GLOBALS['_dwt_keys'] = array('<!-- TemplateEndEditable -->');
diff --git a/fdb.php b/fdb.php
new file mode 100644 (file)
index 0000000..9eab198
--- /dev/null
+++ b/fdb.php
@@ -0,0 +1,140 @@
+<?php
+
+#  Copyright (C) 2007 Jason Woofenden
+#
+#  This file is part of wfpl.
+#
+#  wfpl is free software; you can redistribute it and/or modify it under the
+#  terms of the GNU Lesser General Public License as published by the Free
+#  Software Foundation; either version 2.1 of the License, or (at your option)
+#  any later version.
+#
+#  wfpl is distributed in the hope that it will be useful, but WITHOUT ANY
+#  WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+#  FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for
+#  more details.
+#
+#  You should have received a copy of the GNU Lesser General Public License
+#  along with wfpl; if not, write to the Free Software Foundation, Inc., 51
+#  Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+
+# This file contains code to use a web-writeable directory full of files as a
+# very simple database.
+
+# Keys are truncated to 32 bytes, made lowercase, and all characters that are
+# not alpha/numeric are replaced with underscores. Periods and hyphens are only
+# replaced if they are at the begining.
+
+# Data can be either a string or an array.
+
+# To set up the database, make a directory that's writeable by PHP and call
+# fdb_set_dir() passing the path to that directory.
+
+
+require_once('code/wfpl/file.php');
+
+# call this to set what directory is used to store the files
+function fdb_set_dir($dir) {
+       $GLOBALS['fdb_dir'] = $dir;
+}
+
+function fdb_get_dir() {
+       if(!isset($GLOBALS['fdb_dir'])) {
+               die('you must call fdb_set_dir() before calling other functions in code/wfpl/fdb.php');
+       }
+       return $GLOBALS['fdb_dir'];
+}
+
+# return a 4 bytes that represent the passed integer as a big-endian binary number
+function to_raw_int($int) {
+       return chr($int >> 24) . chr(($int >> 16) & 0xff) . chr(($int >> 8) & 0xff) . chr($int & 0xff);
+}
+
+# return a php number from the string you pass in. The first 4 bytes of the
+# string are read in as a binary value in big-endian format.
+function from_raw_int($quad) {
+       return (ord(substr($quad, 0, 1)) << 24) + (ord(substr($quad, 1, 1)) << 16) + (ord(substr($quad, 2, 1)) << 8) + ord(substr($quad, 3, 1));
+}
+
+function int_at($string, $index) {
+       return from_raw_int(substr($string, $index * 4, 4));
+}
+
+# remove the first 4 bytes of the string, and return them as an int
+function pop_int(&$string) {
+       $int = from_raw_int(substr($string, 0, 4));
+       $string = substr($string, 4);
+       return $int;
+}
+
+
+function fdb_fix_key($key) {
+       $key = ereg_replace('[^a-z0-9.-]', '_', strtolower($key));
+       $key = ereg_replace('^[-.]', '_', strtolower($key));
+       return substr($key, 0, 32);
+}
+
+
+function fdb_get_raw($key) {
+       $key = fdb_fix_key($key);
+       return read_whole_file_or_false(fdb_get_dir() . "/$key");
+}
+
+function fdb_set_raw($key, $data) {
+       $key = fdb_fix_key($key);
+       write_whole_file(fdb_get_dir() . "/$key", $data);
+}
+
+# like fdb_get() except it returns an array even when there's just one element
+function fdb_geta($key) {
+       $key = fdb_fix_key($key);
+       $data = fdb_get_raw($key);
+       if($data === false) {
+               return false;
+       }
+       $header_count = pop_int($data);
+       $out = array();
+       while($header_count--) {
+               $size = pop_int($data);
+               $out[] = substr($data, 0, $size);
+               $data = substr($data, $size);
+       }
+       return $out;
+}
+
+# returns:
+#
+# false if the key is not found in the database
+#
+# an array from the file otherwise
+#
+# a string if there's one field in that file (use fdb_geta() if you want an
+# array in this case too)
+function fdb_get($key) {
+       $ret = fdb_geta($key);
+       if($ret == false) {
+               return false;
+       }
+       if(count($ret) == 1) {
+               return $ret[0];
+       } else {
+               return $ret;
+       }
+}
+
+# data can be a string or array
+function fdb_set($key, $data) {
+       $key = fdb_fix_key($key);
+       if(!is_array($data)) {
+               $data = array($data);
+       }
+       $out = to_raw_int(count($data));
+       foreach($data as $dat) {
+               $out .= to_raw_int(strlen($dat));
+               $out .= $dat;
+       }
+       fdb_set_raw($key, $out);
+}
+
+?>
diff --git a/file.php b/file.php
new file mode 100644 (file)
index 0000000..9d9965e
--- /dev/null
+++ b/file.php
@@ -0,0 +1,51 @@
+<?php
+
+#  Copyright (C) 2007 Jason Woofenden
+#
+#  This file is part of wfpl.
+#
+#  wfpl is free software; you can redistribute it and/or modify it under the
+#  terms of the GNU Lesser General Public License as published by the Free
+#  Software Foundation; either version 2.1 of the License, or (at your option)
+#  any later version.
+#
+#  wfpl is distributed in the hope that it will be useful, but WITHOUT ANY
+#  WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+#  FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for
+#  more details.
+#
+#  You should have received a copy of the GNU Lesser General Public License
+#  along with wfpl; if not, write to the Free Software Foundation, Inc., 51
+#  Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+
+# This exists because file_get_contents() is not documented well. (It says that
+# the second parameter is optional, but does not specify the default behavior.)
+function read_whole_file($name) {
+       $fd = fopen($name, 'r');
+       if($fd === false) {
+               die("Failed to read file: '$name'");
+       }
+       $file_data = fread($fd, filesize($name));
+       fclose($fd);
+       return $file_data;
+}
+
+# This exists because file_put_contents() is not included in PHP4.
+function write_whole_file($name, $data) {
+       $fd = fopen($name, 'w');
+       if($fd === false) {
+               die("Failed to read file: '$name'");
+       }
+       fwrite($fd, $data);
+       fclose($fd);
+}
+
+function read_whole_file_or_false($name) {
+       if(!file_exists($name)) {
+               return false;
+       }
+       return read_whole_file($name);
+}
+
+?>
index a513722..cf59504 100644 (file)
@@ -52,10 +52,10 @@ function format_unix($str) {
 }
 
 function format_yesno($str) {
-       if($str) {
-               return "Yes";
+       if($str && $str != 'No') {
+               return 'Yes';
        } else {
-               return "No";
+               return 'No';
        }
 }
 
index 88dd437..7bfa9f7 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>
 
diff --git a/metaform/template.htaccess b/metaform/template.htaccess
new file mode 100644 (file)
index 0000000..eb2ad6d
--- /dev/null
@@ -0,0 +1,3 @@
+RewriteEngine  on
+RewriteRule    ^$  /~form~/run.php
+RewriteRule    ^[^/]*\.html$  /~form~/run.php
index bd641dd..a7c0e88 100644 (file)
@@ -8,20 +8,31 @@ td.field { vertical-align: bottom; }
 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 class="field"><input type="file" name="~name~" /><input type="hidden" name="old_~name~" value="~~~name~.attr~~" /></td><!--~end~--><!--~textbox start~--><td class="caption">~caption.html~: </td><td class="field"><input type="text" name="~name~" value="~~~name~.attr~~" /></td><!--~end~--><!--~password start~--><td class="caption">~caption.html~: </td><td class="field"><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 class="field"><input type="radio" name="~name~~~~name~.checked~~" /></td><!--~end~--><!--~checkbox start~--><td class="caption">~caption.html~: </td><td class="field"><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 class="field"><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>
 <!--~end~--><!--~~end~~-->
index 754b710..84755d4 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~-->
        if($_FILE['~name~'] && $_FILE['~name~']['error'] == 0) {
                $~name~ = substr(save_uploaded_image('~name~', $GLOBALS['upload_directory']), strlen($GLOBALS['upload_directory']));
@@ -45,7 +44,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) {
@@ -67,20 +66,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') {
@@ -93,7 +86,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'])) {
@@ -113,7 +106,7 @@ function ~form_name~() {
                                        tem_sub('error');
                                        $error = true;
                                }
-                       }
+                       }<!--~end~-->
                        if($error !== true) {
                                tem_load('~form_name~.html');
                                tem_sub('thankyou');
@@ -124,11 +117,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');
index 18a1a41..5678b67 100644 (file)
--- a/misc.php
+++ b/misc.php
 #  along with wfpl; if not, write to the Free Software Foundation, Inc., 51
 #  Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 
-# This exists because file_get_contents() is not documented well. (It says that
-# the second parameter is optional, but does not specify what happens when you
-# do not pass anything.) And because it's nice to work in PHP4.2
-function read_whole_file($name) {
-       $fd = fopen($name, 'r');
-       if($fd === false) {
-               die("Failed to read file: '$name'");
-       }
-       $file_data = fread($fd, filesize($name));
-       fclose($fd);
-       return $file_data;
-}
-
 function unix_newlines($str) {
        $str = str_replace("\r\n", "\n", $str);
        return str_replace("\r", "\n", $str);
diff --git a/tar.php b/tar.php
index f514a6b..342fc99 100644 (file)
--- a/tar.php
+++ b/tar.php
@@ -50,11 +50,22 @@ function make_tar($dirname, $files, $extra = '') {
        }
        mkdir("$tmpdir/$dirname");
        foreach($files as $filename => $file_data) {
+               if(substr($filename, -3) == ' ->') {
+                       $filename = substr($filename, 0, -3);
+                       $link = true;
+               } else {
+                       $link = false;
+               }
                $filename_fixed = ereg_replace('[^a-zA-Z0-9_.-]', '', $filename);
                if($filename != $filename_fixed) {
                        die("Invalid filename for tar archive");
                }
-               write_file("$tmpdir/$dirname/$filename", $file_data);
+               if($link) {
+                       $target = ereg_replace('[^a-zA-Z0-9_./-]', '', $file_data);
+                       system("/bin/ln -s $file_data \"$tmpdir/$dirname/$filename\"");
+               } else {
+                       write_file("$tmpdir/$dirname/$filename", $file_data);
+               }
        }
 
        if(function_exists($extra)) {
@@ -73,9 +84,8 @@ function make_wfpl_tar($dirname, $files) {
 
 function add_wfpl_dir($dir) {
        mkdir("$dir/code");
-       system("/bin/cp -HRp 'code/wfpl' '$dir/code/'", $return_code);
+       system("rsync -plr --exclude=\".git\" --exclude=\"*.swp\" 'code/wfpl/' '$dir/code/wfpl/'", $return_code);
        if($return_code != 0) {
-               die("ERROR: while trying to copy wfpl into archive: cp returned $return_code");
+               die("ERROR: while trying to copy wfpl into archive: rsync returned $return_code");
        }
-       system("/bin/rm -rf '$dir/code/wfpl/.git'");
 }
index 43cceae..80201e0 100644 (file)
@@ -36,7 +36,8 @@
 # them is run
 
 require_once('code/wfpl/encode.php');
-require_once('code/wfpl/misc.php'); # to get read_whole_file()
+require_once('code/wfpl/misc.php');
+require_once('code/wfpl/file.php');
 
 class tem {
        var $keyval;        # an array containing key/value pairs