X-Git-Url: https://jasonwoof.com/gitweb/?p=wfpl.git;a=blobdiff_plain;f=metaform.php;h=e31a9a4bf435e3e86a2d9844733b8bc3903a0ffb;hp=35652c806f23881e9ed5cbcd0c8401283bbd1b3a;hb=HEAD;hpb=7da703686e6dd157999a52aa021a4dde6417a4ea diff --git a/metaform.php b/metaform.php index 35652c8..e31a9a4 100644 --- a/metaform.php +++ b/metaform.php @@ -1,57 +1,48 @@ . +# This program is in the public domain within the United States. Additionally, +# we waive copyright and related rights in the work worldwide through the CC0 +# 1.0 Universal public domain dedication, which can be found at +# http://creativecommons.org/publicdomain/zero/1.0/ # This file writes the code for you (sql, php, html, email) to handle a form. -require_once('code/wfpl/template.php'); -require_once('code/wfpl/http.php'); -require_once('code/wfpl/tar.php'); -require_once('code/wfpl/format.php'); +require_once(__DIR__.'/'.'template.php'); +require_once(__DIR__.'/'.'http.php'); +require_once(__DIR__.'/'.'tar.php'); +require_once(__DIR__.'/'.'format.php'); -# see code/wfpl/metaform/template.html for the html templates for these elements +# see wfpl/metaform/template.html for the html templates for these elements $GLOBALS['types'] = array( # type input format sql - 'varname' => array('textbox', 'varname', 'varchar(50)'), - 'name' => array('textbox', 'oneline', 'varchar(200)'), - 'textbox' => array('textbox', 'oneline', 'varchar(200)'), + 'varname' => array('textbox', 'varname', 'varchar(50) binary'), + 'name' => array('textbox', 'oneline', 'varchar(200) binary'), + 'textbox' => array('textbox', 'oneline', 'varchar(200) binary'), 'int' => array('textbox', 'int', 'int'), - 'decimal' => array('textbox', 'decimal', 'decimal(12,12)'), - 'bigint' => array('textbox', 'int', 'varchar(100)'), # up to 100 digits, stored as a string - 'zip' => array('textbox', 'zip', 'varchar(20)'), - 'email' => array('textbox', 'email', 'varchar(100)'), - 'phone' => array('textbox', 'phone', 'varchar(32)'), - 'state' => array('states', 'oneline', 'varchar(2)'), - 'money' => array('textbox', 'money', 'varchar(32)'), - 'date' => array('date', 'mdy_to_ymd', 'char(10)'), - 'dollars' => array('textbox', 'dollars', 'varchar(32)'), - 'url' => array('textbox', 'url', 'varchar(200)'), - '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', 'varchar(100)'), - 'radio' => array('radio', 'options', 'varchar(100)'), + 'decimal' => array('textbox', 'decimal', 'decimal(12,2)'), + 'bigint' => array('textbox', 'int', 'varchar(100) binary'), # up to 100 digits, stored as a string + 'zip' => array('textbox', 'zip', 'varchar(20) binary'), + 'email' => array('email', 'email', 'varchar(100) binary'), + 'search' => array('search', 'oneline', 'varchar(200) binary'), + 'phone' => array('textbox', 'phone', 'varchar(32) binary'), + 'state' => array('states', 'oneline', 'varchar(2) binary'), + 'money' => array('textbox', 'money', 'varchar(32) binary'), + 'date' => array('date', 'mdy_to_ymd', 'char(10) binary'), + 'dollars' => array('textbox', 'dollars', 'varchar(32) binary'), + 'url' => array('textbox', 'url', 'varchar(200) binary'), + 'hidden' => array('hidden', 'unix', 'varchar(200) binary'), + 'password' => array('password', 'oneline', 'varchar(200) binary'), + 'textarea' => array('textarea', 'unix', 'text binary'), + 'html' => array('html', 'unix', 'mediumtext binary'), + 'pulldown' => array('pulldown', 'options', 'varchar(100) binary'), + 'radio' => array('radio', 'options', 'varchar(100) binary'), 'checkbox' => array('checkbox', 'bool', 'int(1)'), - 'yesno' => array('checkbox', 'yesno', 'varchar(3)'), + 'yesno' => array('checkbox', 'yesno', 'varchar(3) binary'), 'delete' => array('checkbox', 'yesno', 'n/a'), - 'image' => array('image', 'oneline', 'varchar(120)'), - 'thumb' => array('image', 'oneline', 'varchar(240)'), - 'file' => array('file', 'oneline', 'varchar(100)'), + 'image' => array('image', 'oneline', 'varchar(120) binary'), + 'thumb' => array('image', 'oneline', 'varchar(240) binary'), + 'file' => array('file', 'oneline', 'varchar(100) binary'), 'submit' => array('submit', 'n/a', 'n/a'), '{' => array('fieldset', 'n/a', 'n/a'), '}' => array('end_fieldset','n/a', 'n/a') @@ -70,6 +61,7 @@ function list_available_types() { function tem_set_globals(&$tem) { $vars = array( 'file_name', + 'public_file_name', 'table_name', 'plural', 'singular'); @@ -84,32 +76,41 @@ function tem_set_globals(&$tem) { 'opt_display', 'opt_pass', 'opt_public_form', - 'opt_public_display'); + 'opt_public_display', + 'opt_public_something'); foreach($bools as $bool) { - if($GLOBALS[$bool]) { + if(isset($GLOBALS[$bool]) && $GLOBALS[$bool]) { $tem->set($bool); } } } -function metaform() { +function metaform_main() { if(isset($_REQUEST['singular'])) { - $GLOBALS['file_name'] = format_varname($_REQUEST['file_name']); - $GLOBALS['table_name'] = format_varname($_REQUEST['table_name']); - $GLOBALS['plural'] = format_oneline($_REQUEST['plural']); + $GLOBALS['file_name'] = format_varname(_REQUEST_cut('file_name')); + $GLOBALS['table_name'] = format_varname(_REQUEST_cut('table_name')); + $GLOBALS['plural'] = format_oneline(_REQUEST_cut('plural')); # backwards compatibility: if(isset($_REQUEST['form_name'])) { - $GLOBALS['file_name'] = $GLOBALS['table_name'] = $GLOBALS['plural'] = format_varname($_REQUEST['form_name']); + $GLOBALS['file_name'] = $GLOBALS['table_name'] = $GLOBALS['plural'] = format_varname(_REQUEST_cut('form_name')); } - $GLOBALS['singular'] = format_oneline($_REQUEST['singular']); - $GLOBALS['opt_email'] = format_bool($_REQUEST['opt_email']); - $GLOBALS['opt_db'] = format_bool($_REQUEST['opt_db']); - $GLOBALS['opt_listing'] = format_bool($_REQUEST['opt_listing']); - $GLOBALS['opt_display'] = format_bool($_REQUEST['opt_display']); - $GLOBALS['opt_pass'] = format_bool($_REQUEST['opt_pass']); - $GLOBALS['opt_public_form'] = format_bool($_REQUEST['opt_public_form']); - $GLOBALS['opt_public_display'] = format_bool($_REQUEST['opt_public_display']); + $GLOBALS['singular'] = format_oneline(_REQUEST_cut('singular')); + $GLOBALS['opt_email'] = format_bool(_REQUEST_cut('opt_email')); + $GLOBALS['opt_db'] = format_bool(_REQUEST_cut('opt_db')); + $GLOBALS['opt_listing'] = format_bool(_REQUEST_cut('opt_listing')); + $GLOBALS['opt_display'] = format_bool(_REQUEST_cut('opt_display')); + $GLOBALS['opt_pass'] = format_bool(_REQUEST_cut('opt_pass')); + $GLOBALS['opt_public_form'] = format_bool(_REQUEST_cut('opt_public_form')); + $GLOBALS['opt_public_display'] = format_bool(_REQUEST_cut('opt_public_display')); + + $GLOBALS['public_file_name'] = $GLOBALS['file_name']; + if($GLOBALS['opt_public_form'] || $GLOBALS['opt_public_display']) { + $GLOBALS['opt_public_something'] = 1; + $GLOBALS['file_name'] = $GLOBALS['file_name'] . _admin; + } else { + $GLOBALS['opt_public_something'] = 0; + } tem_init(); tem_set_globals($GLOBALS['wfpl_template']); @@ -144,9 +145,10 @@ function metaform() { set_form_action(); - tem_load('code/wfpl/metaform/main.html'); + tem_load(__DIR__.'/'.'metaform/main.html'); list_available_types(); tem_output(); + exit(); # in case we're being called by wfpl_main or something } @@ -163,26 +165,77 @@ function get_fields() { $fields_str = unix_newlines($_REQUEST['fields']); $GLOBALS['gotten_fields'] = array(); $fields_str = rtrim($fields_str); - $fields = split("\n", $fields_str); + $fields = explode("\n", $fields_str); foreach($fields as $field) { + $first_char = substr($field, 0, 1); $field = trim($field); + if ($first_char === ' ' || $first_char === "\t") { + $i = count($GLOBALS['gotten_fields']); + if($i > 0) { + $i -= 1; + if (!$GLOBALS['gotten_fields'][$i]['options']) { + $GLOBALS['gotten_fields'][$i]['options'] = array(); + } + $GLOBALS['gotten_fields'][$i]['options'][] = $field; + continue; + } + } if(substr($field, -1) == '{') { - $name = trim(substr($field, 0, -1)); # FIXME: stop this from getting enc_caption()ed + $caption = trim(substr($field, 0, -1)); + $name = format_varname($caption); $type = '{'; $options = null; - } elseif(substr($field, -1) == '{') { - $name = 'ignored'; - $type = '}'; - $options = null; } else { - list($name, $type, $options) = split(' *', $field); - if($options) $options = explode(',', $options); - if(!$type) $type = $name; + $options = null; + $type = null; + $div = strpos($field, ' '); + if ($div === false) { + $div = strpos($field, "\t"); + } + if ($div === false) { + if (isset($GLOBALS['types'][$field])) { + # if just one word, and it's a type, use it as name/caption and type + $type = $field; + } + } else { + $first_word = trim(substr($field, 0, $div)); + if (isset($GLOBALS['types'][$first_word])) { + # if the first word (of multiple) is a type, remove it from the name/caption + $type = $first_word; + $field = trim(substr($field, $div + 1)); + } + } + # see if there's an explicit name/caption splitter + $div = strpos($field, '|'); + if ($div !== false) { + $name = trim(substr($field, 0, $div)); + $caption = trim(substr($field, $div + 1)); + if (isset($GLOBALS['types'][$name])) { + $type = $name; + } elseif (isset($GLOBALS['types'][strtolower($caption)])) { + $type = strtolower($caption); + } + } else { + $name = format_varname($field); + $caption = format_caption($field); + } + + if ($type === null) { + $type = 'textbox'; + } } $input = field_input($type); $format = field_format($type); $sql = field_sql($type); - $GLOBALS['gotten_fields'][] = array($name, $type, $input, $format, $sql, $options); + $GLOBALS['gotten_fields'][] = array( + 'caption' => $caption, + 'name' => $name, + 'type' => $type, + 'input' => $input, + 'format' => $format, + 'sql' => $sql, + 'options' => $options + ); } return $GLOBALS['gotten_fields']; @@ -190,7 +243,7 @@ function get_fields() { # this one, that you're using to create forms function set_form_action() { - $action = ereg_replace('.*/', '', $_SERVER['REQUEST_URI']); + $action = preg_replace('|.*/|', '', $_SERVER['REQUEST_URI']); if($action == '') $action = './'; tem_set('form_action', $action); } @@ -205,17 +258,16 @@ function view_headers() { function make_sql() { $tem = new tem(); - $tem->load('code/wfpl/metaform/template.sql'); + $tem->load(__DIR__.'/'.'metaform/template.sql'); tem_set_globals($tem); $fields = get_fields(); foreach($fields as $field) { - list($name, $type, $input, $format, $sql) = $field; - if($sql != 'n/a') { - $tem->set('name', $name); - $tem->set('type', $sql); - if(substr($sql, 0, 3) == 'int' || substr($sql, 0, 7) == 'decimal') { + if($field['sql'] != 'n/a') { + $tem->set('name', $field['name']); + $tem->set('type', $field['sql']); + if(substr($field['sql'], 0, 3) == 'int' || substr($field['sql'], 0, 7) == 'decimal') { $tem->set('default', '0'); - } elseif($format == 'yesno') { + } elseif($field['format'] == 'yesno') { $tem->set('default', '"No"'); } else { $tem->set('default', '""'); @@ -233,15 +285,14 @@ function view_sql() { } # always_field is a form field that always submits (unlike say, checkboxes). It's used to detect if the form has submitted or not. -function find_always_field($fields) { +function find_always_field(&$fields) { foreach($fields as $field) { - list($name, $type, $input, $format, $sql) = $field; - if($input != 'submit' && $input != 'image' && $input != 'file' && $input != 'checkbox' && $input != 'radio' && $type != '{') { - return $name; + if($field['input'] != 'submit' && $field['input'] != 'image' && $field['input'] != 'file' && $field['input'] != 'checkbox' && $field['input'] != 'radio' && $field['type'] != '{' && $field['type'] != '}') { + return $field['name']; } } - return false; + return 'FIXME'; } @@ -250,7 +301,7 @@ function find_always_field($fields) { function make_html($whole_file = true) { $has_html_editors = false; $tem = new tem(); - $tem->load('code/wfpl/metaform/template.html'); + $tem->load(__DIR__.'/'.'metaform/template.html'); tem_set_globals($tem); $fields = get_fields(); $tem->set('always_field', find_always_field($fields)); @@ -260,48 +311,69 @@ function make_html($whole_file = true) { $listing_headers = array(); $listing_fields = array(); foreach($fields as $field) { - list($name, $type, $input, $format, $sql) = $field; - if($input == 'hidden') { - $hidden_fields[] = array('name' => $name); + if($field['input'] == 'hidden') { + $hidden_fields[] = array('name' => $field['name']); } else { - $visible_fields[] = array($input => array( - 'name' => $name, - 'caption' => format_caption($name))); + $visible_fields[] = array( + $field['input'] => array( + 'name' => $field['name'], + 'caption' => $field['caption'] + ) + ); + if($field['type'] == 'radio') { + $i = 0; + $opts = array(); + foreach ($field['options'] as $row) { + if (is_array($row)) { + $cap = $row[1]; + } else { + $cap = $row; + } + $opts[] = array('i' => $i, 'option_caption' => $cap); + $i += 1; + } + $visible_fields[count($visible_fields) - 1]['options'] = $opts; + } } - if($input == 'image' || $input == 'file') { + if($field['input'] == 'image' || $field['input'] == 'file') { $tem->set('uploads'); $tem->set('enctype_attr', '" enctype="multipart/form-data'); - } elseif($input == 'html') { + } elseif($field['input'] == 'html') { $has_html_editors = true; - $tem->set('html_field_name', $name); + $tem->set('html_field_name', $field['name']); $tem->set('replace_textarea'); } - switch($input) { + switch($field['input']) { case 'image': case 'checkbox': case 'date': case 'textarea': case 'html': - $display_type = $input; + $display_type = $field['input']; break; default: $display_type = 'short'; } - if($format != 'n/a') { + if($field['format'] != 'n/a') { $display_fields[] = array($display_type => array( - 'name' => $name, 'caption' => format_caption($name))); + 'name' => $field['name'], 'caption' => $field['caption'])); } - if(show_in_listing($type, $input, $format, $sql)) { - $listing_headers[] = array('caption' => format_caption($name)); - $listing_field = array('name' => $name); - if($format == 'bool' || $format == 'yesno') { + if(show_in_listing($field['type'], $field['input'], $field['format'], $field['sql'])) { + $listing_headers[] = array( + 'caption' => $field['caption'], + 'name' => $field['name'] + ); + $listing_field = array( + 'name' => $field['name'] + ); + if($field['format'] == 'bool' || $field['format'] == 'yesno') { $listing_field['enc'] = 'yesno'; - } elseif($input == 'date') { + } elseif($field['input'] == 'date') { $listing_field['enc'] = 'mmddyyyy'; - } elseif($type == 'thumb') { + } elseif($field['type'] == 'thumb') { $listing_field['thumb'] = true; } else { $listing_field['enc'] = 'html'; @@ -321,9 +393,12 @@ function make_html($whole_file = true) { 'caption' => 'Save')); } - $tem->set('form', array( - 'visible_fields' => $visible_fields, - 'hidden_fields' => $hidden_fields)); + $form_fields = array(); + $form_fields['visible_fields'] = $visible_fields; + if($hidden_fields) { + $form_fields['hidden_fields'] = $hidden_fields; + } + $tem->set('form', $form_fields); # opt_display and opt_listing control whether these are actually displayed $tem->set('display_fields', $display_fields); @@ -386,24 +461,26 @@ function pulldown_options_array($options) { function make_php() { $has_html_editors = false; $tem = new tem(); - $tem->load('code/wfpl/metaform/template.php'); + $tem->load(__DIR__.'/'.'metaform/template.php'); tem_set_globals($tem); $fields = get_fields(); $db_fields = ''; $always_field = find_always_field($fields); $image_included_yet = false; + $name_to_caption = array(); + $has_uploads = false; foreach($fields as $field) { - list($name, $type, $input, $format, $sql, $options) = $field; - if($input != 'submit') { - $tem->set('format', $format); - $tem->set('name', $name); + $name_to_caption[] = array('name' => $field['name'], 'caption' => $field['caption']); + if($field['input'] != 'submit') { + $tem->set('format', $field['format']); + $tem->set('name', $field['name']); $tem->set('db_field', ''); # we don't want to use the value from last time - if($sql != 'n/a') { + if($field['sql'] != 'n/a') { if($db_fields != '') $db_fields .= ','; - $db_fields .= $name; + $db_fields .= $field['name']; } - if($input == 'image') { - if($type == 'thumb') { + if($field['input'] == 'image') { + if($field['type'] == 'thumb') { $tem->show('thumb_settings'); $tem->show('thumb_upload_params'); $tem->show('thumb_w_h'); @@ -411,32 +488,36 @@ function make_php() { $tem->show('image_settings'); $tem->show('image_upload'); $has_uploads = true; - } else if($input == 'file') { + } else if($field['input'] == 'file') { $tem->show('file_settings'); $tem->show('file_upload'); $has_uploads = true; } else { - if($input == 'html') { + if($field['input'] == 'html') { $has_html_editors = true; - } elseif($input == 'pulldown' || $input == 'radio') { - $pulldown_options = pulldown_options_array($options); + } elseif($field['input'] == 'pulldown' || $field['input'] == 'radio') { + $pulldown_options = pulldown_options_array($field['options']); $tem->set('pulldown_options', $pulldown_options); + $tem->set('has_pulldowns'); $tem->show('pulldowns'); $tem->show('pulldown_format_extra'); } - if($format != 'n/a') { + if($field['format'] != 'n/a') { $tem->show('formats'); } } } if($GLOBALS['opt_listing']) { - if(show_in_listing($type, $input, $format, $sql)) { + if(show_in_listing($field['type'], $field['input'], $field['format'], $field['sql'])) { $tem->show('listing_fields_1'); $tem->show('listing_fields_2'); } } } + + $tem->set('name_to_caption', $name_to_caption); + if($has_uploads) { $tem->show('uploads_include'); $tem->show('upload_max'); @@ -464,10 +545,9 @@ function make_php() { # make a URL for the edit page with all the fields filled in function edit_url() { $url = this_url(); - $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. + $url = preg_replace('|view_php=[^&]*|', 'edit=yes', $url); + $url = preg_replace('|download_tar=[^&]*|', 'edit=yes', $url); + $url = preg_replace('|/[a-z0-9_.]*\?|', '/?', $url); return $url; } @@ -478,16 +558,15 @@ function view_php() { function make_email() { $tem = new tem(); - $tem->load('code/wfpl/metaform/template.email.txt'); + $tem->load(__DIR__.'/'.'metaform/template.email.txt'); tem_set_globals($tem); $fields = get_fields(); foreach($fields as $field) { - list($name, $type, $input, $format, $sql) = $field; - $tem->set('name', $name); - $tem->set('caption', format_caption($name)); - if($type == 'textarea') { + $tem->set('name', $field['name']); + $tem->set('caption', $field['caption']); + if($field['type'] == 'textarea') { $tem->show('multi_line'); - } elseif($type == 'checkbox') { + } elseif($field['type'] == 'checkbox') { $tem->show('checkbox'); } else { $tem->show('normal'); @@ -500,7 +579,7 @@ function make_email() { function make_htaccess() { $tem = new tem(); $tem->set('form', $GLOBALS['file_name']); - return $tem->run('code/wfpl/metaform/htaccess'); + return $tem->run(__DIR__.'/'.'metaform/htaccess'); } function view_email() { @@ -509,7 +588,7 @@ function view_email() { } function preview() { - tem_load('code/wfpl/metaform/preview.html'); + tem_load(__DIR__.'/'.'metaform/preview.html'); tem_set_globals($GLOBALS['wfpl_template']); tem_set('fields', $_REQUEST['fields']); $preview_tem = new tem(); @@ -519,14 +598,13 @@ function preview() { } $fields = get_fields(); foreach($fields as $field) { - list($name, $type, $input, $format, $sql, $options) = $field; - if($type == 'pulldown' || $type == 'radio') { - pulldown($name, eval('return ' . pulldown_options_array($options) . ';')); + if($field['type'] == 'pulldown' || $field['type'] == 'radio') { + pulldown($field['name'], eval('return ' . pulldown_options_array($field['options']) . ';')); } } $preview = $preview_tem->run(); unset($preview_tem); - $preview = ereg_replace('type="submit"', 'type="submit" disabled="disabled"', $preview); + $preview = preg_replace('|type="submit"|', 'type="submit" disabled="disabled"', $preview); tem_set('preview', $preview); tem_show('hiddens'); set_form_action(); @@ -534,23 +612,26 @@ function preview() { } function download_tar() { - $name = $GLOBALS['file_name']; - $data = array( - "INSTALL" => read_whole_file('code/wfpl/metaform/INSTALL'), + $admin_name = $GLOBALS['file_name']; + $nice_name = $GLOBALS['public_file_name']; + $files = array( + "README" => "These files are meant to work with wfpl.\n\nSee: http://sametwice.com/wfpl\n", ".htaccess" => make_htaccess(), - #"run.php ->" => 'code/wfpl/run.php', - "style.css" => read_whole_file('code/wfpl/metaform/style.css'), - "$name.html" => make_html(), - "$name.php" => make_php()); + "config.php" => " read_whole_file(__DIR__.'/'.'metaform/wfpl_main.php'), + "styl.styl" => read_whole_file(__DIR__.'/'.'metaform/styl.styl'), + "template.html" => read_whole_file(__DIR__.'/'.'metaform/site-template.html'), + "$admin_name.html" => make_html(), + "$admin_name.php" => make_php()); + if($GLOBALS['opt_public_something']) { + $files["$nice_name.html ->"] = "$admin_name.html"; + $files["$nice_name.php ->"] = "$admin_name.php"; + } if($GLOBALS['opt_db']) { - $data["$name.sql"] = make_sql(); + $files["$nice_name.sql"] = make_sql(); } if($GLOBALS['opt_email']) { - $data["$name.email.txt"] = make_email(); + $files["$nice_name.email.txt"] = make_email(); } - make_tar($name, $data); + make_tar($nice_name, $files); } - - -metaform(); -exit();