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,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) binary'), 'delete' => array('checkbox', 'yesno', 'n/a'), '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') ); function list_available_types() { ksort($GLOBALS['types']); foreach($GLOBALS['types'] as $key => $value) { tem_set('type', $key); tem_show('types'); tem_show('types_sep'); } } function tem_set_globals(&$tem) { $vars = array( 'file_name', 'public_file_name', 'table_name', 'plural', 'singular'); foreach($vars as $var) { $tem->set($var, $GLOBALS[$var]); } $bools = array( 'opt_email', 'opt_db', 'opt_listing', 'opt_display', 'opt_pass', 'opt_public_form', 'opt_public_display', 'opt_public_something'); foreach($bools as $bool) { if(isset($GLOBALS[$bool]) && $GLOBALS[$bool]) { $tem->set($bool); } } } function metaform_main() { if(isset($_REQUEST['singular'])) { $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_cut('form_name')); } $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']); } 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']); # fall through } else { die("Sorry... couldn't tell which button you pressed"); } } set_form_action(); tem_load(__DIR__.'/'.'metaform/main.html'); list_available_types(); tem_output(); exit(); # in case we're being called by wfpl_main or something } function field_input($type) { return $GLOBALS['types'][$type][0]; } function field_format($type) { return $GLOBALS['types'][$type][1]; } function field_sql($type) { return $GLOBALS['types'][$type][2]; } function get_fields() { # no sense in doing all this so many times if(isset($GLOBALS['gotten_fields'])) { return $GLOBALS['gotten_fields']; } $fields_str = unix_newlines($_REQUEST['fields']); $GLOBALS['gotten_fields'] = array(); $fields_str = rtrim($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) == '{') { $caption = trim(substr($field, 0, -1)); $name = format_varname($caption); $type = '{'; $options = null; } else { $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( 'caption' => $caption, 'name' => $name, 'type' => $type, 'input' => $input, 'format' => $format, 'sql' => $sql, 'options' => $options ); } return $GLOBALS['gotten_fields']; } # this one, that you're using to create forms function set_form_action() { $action = preg_replace('|.*/|', '', $_SERVER['REQUEST_URI']); if($action == '') $action = './'; tem_set('form_action', $action); } # perfect HTTP headers for viewing created files function view_headers() { header('Content-type: text/plain'); } function make_sql() { $tem = new tem(); $tem->load(__DIR__.'/'.'metaform/template.sql'); tem_set_globals($tem); $fields = get_fields(); foreach($fields as $field) { 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($field['format'] == 'yesno') { $tem->set('default', '"No"'); } else { $tem->set('default', '""'); } $tem->show('column'); } } view_headers(); return $tem->run(); } function view_sql() { view_headers(); echo make_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) { foreach($fields as $field) { if($field['input'] != 'submit' && $field['input'] != 'image' && $field['input'] != 'file' && $field['input'] != 'checkbox' && $field['input'] != 'radio' && $field['type'] != '{' && $field['type'] != '}') { return $field['name']; } } return 'FIXME'; } # pass false if you want to exclude the and tag etc. function make_html($whole_file = true) { $has_html_editors = false; $tem = new tem(); $tem->load(__DIR__.'/'.'metaform/template.html'); tem_set_globals($tem); $fields = get_fields(); $tem->set('always_field', find_always_field($fields)); $hidden_fields = array(); $visible_fields = array(); $display_fields = array(); $listing_headers = array(); $listing_fields = array(); foreach($fields as $field) { if($field['input'] == 'hidden') { $hidden_fields[] = array('name' => $field['name']); } else { $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($field['input'] == 'image' || $field['input'] == 'file') { $tem->set('uploads'); $tem->set('enctype_attr', '" enctype="multipart/form-data'); } elseif($field['input'] == 'html') { $has_html_editors = true; $tem->set('html_field_name', $field['name']); $tem->set('replace_textarea'); } switch($field['input']) { case 'image': case 'checkbox': case 'date': case 'textarea': case 'html': $display_type = $field['input']; break; default: $display_type = 'short'; } if($field['format'] != 'n/a') { $display_fields[] = array($display_type => array( 'name' => $field['name'], 'caption' => $field['caption'])); } 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($field['input'] == 'date') { $listing_field['enc'] = 'mmddyyyy'; } elseif($field['type'] == 'thumb') { $listing_field['thumb'] = true; } else { $listing_field['enc'] = 'html'; } $listing_fields[] = $listing_field; } } # Submit/Send button if($GLOBALS['opt_email'] == 'Yes' && !$GLOBALS['opt_db']) { $visible_fields[] = array('submit' => array( 'name' => 'send', 'caption' => 'Send')); } else { $visible_fields[] = array('submit' => array( 'name' => 'save', 'caption' => 'Save')); } $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); $tem->set('listing_headers', $listing_headers); $tem->set('listing_fields', $listing_fields); if($has_html_editors) { $tem->set('html_editor_headers'); } if($whole_file) { return $tem->run(); } else { $tem2 = new tem(); $tem2->load_str(''); $tem2->merge($tem); return $tem2->run(); } } function view_html() { view_headers(); echo make_html(); } function show_in_listing($type, $input, $format, $sql) { switch($input) { case 'submit': case 'hidden': case 'password': case 'textarea': case 'html': case 'fieldset': case 'end_fieldset': return false; } if($type == 'image') { return false; } return true; } function pulldown_options_array($options) { if($options) { $pulldown_options = array(); foreach($options as $option) { $option = preg_replace("/['\\\\]/", '\\\\$0', $option); $pulldown_options[] = "'$option'"; } $pulldown_options = 'array(' . join(', ', $pulldown_options) . ')'; } else { $pulldown_options = "array(array('op1', 'Option One'), array('op2', 'Option Two'), 'n/a')"; } return $pulldown_options; } function make_php() { $has_html_editors = false; $tem = new tem(); $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) { $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($field['sql'] != 'n/a') { if($db_fields != '') $db_fields .= ','; $db_fields .= $field['name']; } if($field['input'] == 'image') { if($field['type'] == 'thumb') { $tem->show('thumb_settings'); $tem->show('thumb_upload_params'); $tem->show('thumb_w_h'); } $tem->show('image_settings'); $tem->show('image_upload'); $has_uploads = true; } else if($field['input'] == 'file') { $tem->show('file_settings'); $tem->show('file_upload'); $has_uploads = true; } else { if($field['input'] == 'html') { $has_html_editors = true; } 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($field['format'] != 'n/a') { $tem->show('formats'); } } } if($GLOBALS['opt_listing']) { 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'); $tem->show('upload_settings'); $image_included_yet = true; } if($has_html_editors) { $tem->show('show_extra_headers'); } $tem->set('always_field', $always_field); $tem->set('db_fields', $db_fields); $tem->set('metaform_url', edit_url()); if($GLOBALS['opt_email']) { $this_domain = $_SERVER['HTTP_HOST']; if(substr($this_domain, -2) == '.l') { $this_domain = substr($this_domain, 0, -1) . 'com'; } $tem->set('this_domain', $this_domain); } return $tem->run(); } # make a URL for the edit page with all the fields filled in function edit_url() { $url = this_url(); $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; } function view_php() { view_headers(); echo make_php(); } function make_email() { $tem = new tem(); $tem->load(__DIR__.'/'.'metaform/template.email.txt'); tem_set_globals($tem); $fields = get_fields(); foreach($fields as $field) { $tem->set('name', $field['name']); $tem->set('caption', $field['caption']); if($field['type'] == 'textarea') { $tem->show('multi_line'); } elseif($field['type'] == 'checkbox') { $tem->show('checkbox'); } else { $tem->show('normal'); } $tem->show('fields'); } return $tem->run(); } function make_htaccess() { $tem = new tem(); $tem->set('form', $GLOBALS['file_name']); return $tem->run(__DIR__.'/'.'metaform/htaccess'); } function view_email() { view_headers(); echo make_email(); } function preview() { tem_load(__DIR__.'/'.'metaform/preview.html'); tem_set_globals($GLOBALS['wfpl_template']); tem_set('fields', $_REQUEST['fields']); $preview_tem = new tem(); $preview_tem->load_str(make_html(false)); if($GLOBALS['opt_db']) { $preview_tem->show('new_msg'); } $fields = get_fields(); foreach($fields as $field) { 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 = preg_replace('|type="submit"|', 'type="submit" disabled="disabled"', $preview); tem_set('preview', $preview); tem_show('hiddens'); set_form_action(); tem_output(); } function download_tar() { $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(), "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']) { $files["$nice_name.sql"] = make_sql(); } if($GLOBALS['opt_email']) { $files["$nice_name.email.txt"] = make_email(); } make_tar($nice_name, $files); }