# 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 -->');
--- /dev/null
+<?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);
+}
+
+function fdb_delete($key) {
+ $key = fdb_fix_key($key);
+ $path = fdb_get_dir() . "/$key";
+ if(file_exists($path)) {
+ return unlink($path);
+ }
+ return false;
+}
+
+?>
--- /dev/null
+<?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);
+}
+
+?>
}
function format_yesno($str) {
- if($str) {
- return "Yes";
+ if($str && $str != 'No') {
+ return 'Yes';
} else {
- return "No";
+ return 'No';
}
}
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(
'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)'),
'yesno' => array('checkbox', 'yesno', 'varchar(3)'),
'delete' => array('checkbox', 'yesno', 'n/a'),
'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']);
+ $GLOBALS['opt_http_pass'] = format_yesno($_REQUEST['opt_http_pass']);
+ tem_set('opt_http_pass', $GLOBALS['opt_http_pass']);
} 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]; }
# 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']);
$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 {
}
}
-function view_template() {
+function view_html() {
view_headers();
- echo make_template();
+ echo make_html();
}
}
} else {
$tem->sub('formats');
- $tem->sub('tem_sets');
}
+ $tem->sub('tem_sets');
if(!$always_field and $input != 'checkbox' and $input != 'radio') {
$always_field = $name;
}
$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');
+ }
+ if($GLOBALS['opt_http_pass'] == 'Yes') {
+ $tem->sub('opt_http_pass_1');
+ $tem->sub('opt_http_pass_2');
+ }
return $tem->run();
}
$url = ereg_replace('view_php=[^&]*', 'edit=yes', $url);
$url = ereg_replace('download_tar=[^&]*', 'edit=yes', $url);
$url = ereg_replace('/[a-z0-9_.]*\?', '/?', $url);
+ $url = str_replace('jasonwoof.l', 'jasonwoof.com', $url); # so that code generated on Jason's home computer will display a publically accessible link.
return $url;
}
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();
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();
+
?>
<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><input type="checkbox" name="opt_http_pass~opt_http_pass.checked~" value="Yes" /> Password protect this form (with HTTP authentication).</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
<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="opt_http_pass" value="~opt_http_pass.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="opt_http_pass" value="~opt_http_pass.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>
--- /dev/null
+RewriteEngine on
+RewriteRule ^$ /~form~/run.php
+RewriteRule ^[^/]*\.html$ /~form~/run.php
<head>
<title>~form_name~ entry</title>
<style type="text/css"><!--
+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><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~--><!--~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 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~~-->
#
# ~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~--><!--~opt_http_pass_1 start~-->
+# Define the username and password required to view this form:
+define('AUTH_REALM', '~form_name~ administration area');
+define('AUTH_USER', 'fixme');
+define('AUTH_PASS', 'fixme');
<!--~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() {
- $fields = array();
- <!--~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~-->
+ if($_FILE['~name~'] && $_FILE['~name~']['error'] == 0) {
+ $~name~ = substr(save_uploaded_image('~name~', $GLOBALS['upload_directory']), strlen($GLOBALS['upload_directory']));
+ } else {
+ $~name~ = format_filename($_REQUEST['old_~name~']);
+ }<!--~end~-->
<!--~tem_sets start~-->
tem_set('~name~', $~name~);<!--~end~-->
return array(~php_fields~);
}
-function ~form_name~() {
+function ~form_name~() {<!--~opt_http_pass_2 start~-->
+ # To remove password protection, just delete this block:
+ if (!isset($_SERVER['PHP_AUTH_USER']) || $_SERVER['PHP_AUTH_USER'] != AUTH_USER || $_SERVER['PHP_AUTH_PW'] != AUTH_PASS) {
+ header('WWW-Authenticate: Basic realm="' . AUTH_REALM . '"');
+ header('HTTP/1.0 401 Unauthorized');
+ echo '401 Unauthorized';
+ exit;
+ }
+ <!--~end~--><!--~opt_db_3 start~-->
$edit_id = format_int($_REQUEST['~form_name~_edit_id']);
unset($_REQUEST['~form_name~_edit_id']);
if($edit_id) {
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') {
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'])) {
tem_sub('error');
$error = true;
}
- }
+ }<!--~end~-->
if($error !== true) {
tem_load('~form_name~.html');
tem_sub('thankyou');
# 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');
# 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);
require_once('code/wfpl/file_run.php');
require_once('code/wfpl/http.php');
+require_once('code/wfpl/template.php');
function run_php($basename = false) {
- if($basename) {
- $html_file = "$basename.html";
- $php_file = "$basename.php";
- } else {
- $html_file = $_SERVER['REDIRECT_URL'];
- $html_file = ereg_replace('.*/', '', $html_file);
- if($html_file == '') {
- $html_file = 'index.html';
+ if(!$basename) {
+ $basename = $_SERVER['REDIRECT_URL'];
+ $basename = ereg_replace('.*/', '', $basename);
+ $basename = ereg_replace('\.html$', '', $basename);
+ if($basename == '') {
+ $basename = 'index';
}
- $php_file = ereg_replace('\.html$', '.php', $html_file);
}
- if($php_file != $html_file && file_exists($php_file)) {
- require_once('code/wfpl/template.php');
- if(file_exists($html_file)) {
- $GLOBALS['wfpl_template'] = new tem();
- tem_load($html_file);
- }
- $other = file_run($php_file);
- if($other) {
- if(strpos($other, ':')) {
- redirect($other);
- exit();
- }
- run_php($other);
- return;
- }
- if(file_exists($html_file)) tem_output();
- } else {
+
+ $html_file = "$basename.html";
+ $php_file = "$basename.php";
+
+ if(!file_exists($php_file)) {
if(file_exists($html_file)) {
readfile($html_file);
} else {
echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html><head><title>404</title></head><body><h1>404 File Not Found</h1></body></html>';
}
}
+ exit();
+ }
+
+ if(file_exists($html_file)) {
+ $GLOBALS['wfpl_template'] = new tem();
+ tem_load($html_file);
+ }
+
+ $other = file_run($php_file);
+ if($other) {
+ if(strpos($other, ':')) {
+ redirect($other);
+ exit();
+ }
+ run_php($other);
+ return;
+ }
+
+ if($GLOBALS['wfpl_template']) {
+ if(file_exists('template.html')) {
+ $tem = new tem();
+ $tem->load("template.html");
+ $sections = tem_top_subs();
+ if($sections) foreach($sections as $name => $val) {
+ $tem->set($name, $val);
+ }
+
+ if(file_exists("$basename.css")) {
+ $tem->set('css_link', "$basename.css");
+ $tem->sub('css_links');
+ }
+
+ $GLOBALS['wfpl_template'] = $tem;
+ }
+
+ if(function_exists('display_messages')) {
+ display_messages();
+ }
+ tem_output();
}
}
}
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)) {
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'");
}
# 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
# the type you specified, it will convert the image for you.
-
$GLOBALS['mime_to_ext'] = array(
'text/plain' => 'txt',
'text/html' => 'html',
'image/jpeg' => 'jpg',
+ 'image/jpe' => 'jpg',
'image/jpg' => 'jpg',
'image/gif' => 'gif',
'image/png' => 'png',
# replace symbols with underscores
$filename = ereg_replace('[^a-z0-9_.]', '_', $filename);
- # remove dots from the begning (no invisible files)
+ # remove dots from the beginning (no invisible files)
$filename = ereg_replace('^\.*', '', $filename);
# fix extension
}
if(!move_uploaded_file($_FILES[$key]['tmp_name'], $filename)) {
- die('file upload failed');
+ return false;
}
return $filename;
}
+function path_to_convert() {
+ if(!isset($GLOBALS['path_to_convert'])) {
+ $convert = '/usr/local/bin/convert';
+ if(!file_exists($convert)) {
+ $convert = '/usr/bin/convert';
+ }
+ if(!file_exists($convert)) {
+ $convert = `which convert`;
+ }
+ if($convert == '' || !file_exists($convert)) {
+ die("can't find imagemagick's 'convert' program");
+ }
+
+ $GLOBALS['path_to_convert'] = $convert;
+ }
+
+ return $GLOBALS['path_to_convert'];
+}
+
# returns new filename with .png extension
function gif_to_png($filename, $new_filename = 'just change extension') {
$new_filename .= '.png';
}
- $convert = '/usr/local/bin/convert';
- if(!file_exists($convert)) {
- $convert = '/usr/bin/convert';
- }
- if(!file_exists($convert)) {
- $convert = `which convert`;
- }
- if(!file_exists($convert)) {
- die("can't find imagemagick's 'convert' program");
- }
-
+ $convert = path_to_convert();
+
$command = "$convert " . escapeshellarg($filename) . ' ' . escapeshellarg($new_filename);
exec($command, $dummy, $ret);
return $new_filename;
}
+# make a thumbnail image.
+#
+# Thumbnail will have the same filename, except "_thumb" will be added right
+# before the dot preceding the extension. so foo.png yields foo_thumb.png
+#
+# Thumbnail will retain aspect ratio, and be either $max_width wide or
+# $max_height tall (or, if the aspect is just right, both)
+function make_thumbnail($filename, $max_width = '70', $max_height = '70') {
+ $thumb = ereg_replace('[.]([a-z]+)$', "_thumb.\\1", $filename);
+ if($thumb == $filename) {
+ die("couldn't make thumbnail because filename has no extension.");
+ }
+
+ $convert = path_to_convert();
+
+ # can't be too careful
+ $max_width = ereg_replace('[^0-9]', '', $max_width);
+ if($max_width == '') {
+ $max_width = '70';
+ }
+ $max_height = ereg_replace('[^0-9]', '', $max_height);
+ if($max_height == '') {
+ $max_height = '70';
+ }
+
+ $command = "$convert -geometry ${max_width}x$max_height " . escapeshellarg($filename) . ' ' . escapeshellarg($thumb);
+
+ exec($command, $dummy, $ret);
+ if($ret != 0) {
+ die("Thumbnail creatin failed. convert did exit($ret)");
+ }
+
+ return $thumb;
+}
+
# like save_uploaded_file() (above) except it converts gifs to pngs.
#
# FIXME: if a filename is passed in the end of path, we should check if the file type matches, and if not run convert.