From 51cf6721f37220e1277c71545b87dcc01fbf7e81 Mon Sep 17 00:00:00 2001
From: Jason Woofenden
Date: Mon, 11 Aug 2014 13:20:54 -0400
Subject: [PATCH] metaform: enter captions and optionally field names
---
encode.php | 10 ++-
metaform.php | 165 +++++++++++++++++++++++++++++++-----------------
metaform/main.html | 13 ++--
metaform/template.html | 2 +-
metaform/template.php | 15 ++++-
5 files changed, 138 insertions(+), 67 deletions(-)
diff --git a/encode.php b/encode.php
index 38de080..e79dae2 100644
--- a/encode.php
+++ b/encode.php
@@ -28,10 +28,18 @@ function enc_cap($str) {
return $str;
}
+# quote for placing between single quotes in php
+function enc_phpsq($str) {
+ $str = str_replace("\\", "\\\\", $str);
+ $str = str_replace("'", "\\'", $str);
+ return $str;
+}
+
function enc_jsdq($str) {
$str = enc_sql($str);
$str = str_replace("\n", "\\n", $str);
- return str_replace("\r", "\\r", $str);
+ $str = str_replace("\r", "\\r", $str);
+ return $str;
}
# encode for putting within double-quotes in SQL
diff --git a/metaform.php b/metaform.php
index 1cfb70c..411a9b2 100644
--- a/metaform.php
+++ b/metaform.php
@@ -176,18 +176,62 @@ function get_fields() {
foreach($fields as $field) {
$field = trim($field);
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;
+ # FIXME restore parsing of option lists for pulldowns
} 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'];
@@ -214,13 +258,12 @@ function make_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', '""');
@@ -238,15 +281,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';
}
@@ -265,48 +307,55 @@ 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($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), 'name' => $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';
@@ -400,18 +449,19 @@ function make_php() {
$db_fields = '';
$always_field = find_always_field($fields);
$image_included_yet = false;
+ $name_to_caption = array();
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');
@@ -419,33 +469,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');
@@ -491,12 +544,11 @@ function make_email() {
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');
@@ -528,9 +580,8 @@ 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();
diff --git a/metaform/main.html b/metaform/main.html
index c0057c2..0103f65 100644
--- a/metaform/main.html
+++ b/metaform/main.html
@@ -35,19 +35,18 @@
But with publicly accessible submission form
But with publicly accessible view page.
- 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: , ~type html~.
+ Below, specify the fields you'd like in your form, one field per line. You can (optional) add a field type at the beginning of the line. The following field types are available: , ~type html~.
You can start a labeled fieldset by putting a {
at the end of a line with the caption. Then end the fieldset with a }
on a line by itself
Example:
-email textbox
+email
contact info (all required) {
-name textbox
-phone phone
+ name
+ phone
}
-comments textarea
-color pulldown Red,Green,Blue
-agree yesno
+textarea comments
+yesno agree
Fields:
diff --git a/metaform/template.html b/metaform/template.html
index f0adb15..bdd5a01 100644
--- a/metaform/template.html
+++ b/metaform/template.html
@@ -78,7 +78,7 @@