/** * Output a scaffold page for database. * */ function db_scaffold() { if (auth() === false) { return; } if (!file_exists(DATABASE_SCAFFOLD_PATH)) { error('db: ' . DATABASE_SCAFFOLD_PATH . ' is not found'); } // initialize $app = 'app/'; $models = $app . 'models/'; $views = $app . 'views/'; $controllers = $app . 'controllers/'; $header_file = $views . 'header.php'; $footer_file = $views . 'footer.php'; $before_file = $app . 'controllers/before.php'; $config_file = $app . 'config.php'; $exclude_prefix = 'levis_'; $primary_key = 'id'; $test = 'test/'; // table $resource = db_query(db_sql('table_list')); $results = db_result($resource); if (count($results) === 0) { error('db: Table not found'); } $scaffold = ''; foreach ($results as $result) { if (DATABASE_TYPE === 'pdo_mysql' || DATABASE_TYPE === 'mysql') { $table_comment = $result['Comment']; } else { $table_comment = null; } $table = array_shift($result); if (regexp_match('^' . DATABASE_PREFIX . $exclude_prefix, $table)) { continue; } // initialize $primary_flag = false; $model_file = $models . $table . '.php'; $view_index_file = $views . $table . '/' . MAIN_DEFAULT_WORK . '.php'; $view_post_file = $views . $table . '/post.php'; $controller_index_file = $controllers . $table . '/' . MAIN_DEFAULT_WORK . '.php'; $controller_post_file = $controllers . $table . '/post.php'; $controller_delete_file = $controllers . $table . '/delete.php'; $test_model_file = $test . 'model_' . $table . '.php'; $test_view_file = $test . 'view_' . $table . '.php'; $test_controller_file = $test . 'controller_' . $table . '.php'; $define_sql = db_sql('table_define', $table); $define_resource = db_query($define_sql); $define_results = db_result($define_resource); $model_validate = ''; $model_default = ''; $view_head = ''; $view_data = ''; $view_form = ''; $controller_validate = ''; $controller_insert = ''; $controller_update = ''; $test_data = ''; // indent $max_length = 0; foreach ($define_results as $define_result) { $field = ''; if (DATABASE_TYPE === 'pdo_mysql' || DATABASE_TYPE === 'mysql') { $field = $define_result['Field']; } elseif (DATABASE_TYPE === 'pdo_pgsql' || DATABASE_TYPE === 'pgsql') { $field = $define_result['column_name']; } elseif (DATABASE_TYPE === 'pdo_sqlite' || DATABASE_TYPE === 'pdo_sqlite2' || DATABASE_TYPE === 'sqlite') { $field = $define_result['name']; } $max_length = strlen($field) > $max_length ? strlen($field) : $max_length; } foreach ($define_results as $define_result) { // define $field = ''; $null = false; if (DATABASE_TYPE === 'pdo_mysql' || DATABASE_TYPE === 'mysql') { $field = $define_result['Field']; $type = $define_result['Type']; $null = $define_result['Null'] === 'YES' ? true : false; $comment = $define_result['Comment']; } elseif (DATABASE_TYPE === 'pdo_pgsql' || DATABASE_TYPE === 'pgsql') { $field = $define_result['column_name']; $type = $define_result['data_type']; $null = $define_result['is_nullable'] === 'YES' ? true : false; $comment = null; } elseif (DATABASE_TYPE === 'pdo_sqlite' || DATABASE_TYPE === 'pdo_sqlite2' || DATABASE_TYPE === 'sqlite') { $field = $define_result['name']; $type = $define_result['type']; $null = $define_result['notnull'] === 0 ? true : false; $comment = null; } if ($field === $primary_key) { $primary_flag = true; } // model $model_validate .= ' // ' . ($comment ? $comment : $field) . "\n"; $model_validate .= ' if (isset($queries[\'' . $field . '\'])) {' . "\n"; if ($field === $primary_key || !$null) { $model_validate .= ' if ($queries[\'' . $field . '\'] === \'\') {' . "\n"; $model_validate .= ' $messages[] = \'The ' . ($comment ? $comment : $field) . ' is required.\';' . "\n"; $model_validate .= ' }' . "\n"; } $model_validate .= ' }' . "\n"; $model_validate .= "\n"; $space = str_repeat(' ', $max_length - strlen($field)); if ($field === $primary_key) { $model_default .= ' \'' . $field . '\' ' . $space . '=> null,' . "\n"; } elseif ($null) { $model_default .= ' \'' . $field . '\' ' . $space . '=> null,' . "\n"; } elseif (regexp_match('(BLOB|TEXT|CHAR)', $type)) { $model_default .= ' \'' . $field . '\' ' . $space . '=> \'\',' . "\n"; } else { $model_default .= ' \'' . $field . '\' ' . $space . '=> 0,' . "\n"; } // view $view_head .= ' <th>' . ($comment ? $comment : $field) . '</th>' . "\n"; if ($field === $primary_key) { $view_data .= ' <td><a href="<?php t(MAIN_FILE) ?>/' . $table . '/post?' . $primary_key . '=<?php t($data[\'' . $primary_key . '\']) ?>"><?php h($data[\'' . $field . '\']) ?></a></td>' . "\n"; } else { $view_data .= ' <td><?php h($data[\'' . $field . '\']) ?></td>' . "\n"; } if (regexp_match('(BLOB|TEXT)', $type)) { $input = '<textarea name="' . $field . '" rows="10" cols="50"><?php t($_view[\'data\'][\'' . $field . '\']) ?></textarea>'; } elseif (regexp_match('(CHAR)', $type)) { $input = '<input type="text" name="' . $field . '" size="30" value="<?php t($_view[\'data\'][\'' . $field . '\']) ?>" />'; } else { $input = '<input type="text" name="' . $field . '" size="10" value="<?php t($_view[\'data\'][\'' . $field . '\']) ?>" />'; } if ($field === $primary_key) { $view_form .= ' <dt>' . ($comment ? $comment : $field) . ($null ? '' : '(required)') . '</dt>' . "\n"; $view_form .= ' <dd>' . "\n"; $view_form .= ' <?php if (empty($_GET[\'' . $primary_key . '\'])) : ?>' . "\n"; $view_form .= ' ' . $input . "\n"; $view_form .= ' <?php else : ?>' . "\n"; $view_form .= ' <em><?php h($_view[\'data\'][\'' . $field . '\']) ?></em><input type="hidden" name="' . $field . '" value="<?php t($_view[\'data\'][\'' . $field . '\']) ?>" />' . "\n"; $view_form .= ' <?php endif ?>' . "\n"; $view_form .= ' </dd>' . "\n"; } else { $view_form .= ' <dt>' . ($comment ? $comment : $field) . ($null ? '' : '(required)') . '</dt>' . "\n"; $view_form .= ' <dd>' . $input . '</dd>' . "\n"; } // controller $controller_validate .= ' \'' . $field . '\' ' . $space . '=> $_POST[\'' . $field . '\'],' . "\n"; $controller_insert .= ' \'' . $field . '\' ' . $space . '=> $_POST[\'' . $field . '\'],' . "\n"; if ($field !== $primary_key) { $controller_update .= ' \'' . $field . '\' ' . $space . '=> $_POST[\'' . $field . '\'],' . "\n"; } // test if ($field === $primary_key) { $test_data .= ' \'' . $field . '\' ' . $space . '=> [N],' . "\n"; } elseif ($null) { $test_data .= ' \'' . $field . '\' ' . $space . '=> null,' . "\n"; } elseif (regexp_match('(BLOB|TEXT|CHAR)', $type)) { $test_data .= ' \'' . $field . '\' ' . $space . '=> \'TEST[N]\',' . "\n"; } else { $test_data .= ' \'' . $field . '\' ' . $space . '=> [N],' . "\n"; } } // heading $scaffold .= '[' . $table . ']' . "\n"; // model $buffer = '<?php' . "\n"; $buffer .= "\n"; $buffer .= '/**' . "\n"; $buffer .= ' * Validate for ' . ($table_comment ? $table_comment : $table) . "\n"; $buffer .= ' *' . "\n"; $buffer .= ' * @param array $queries' . "\n"; $buffer .= ' *' . "\n"; $buffer .= ' * @return array' . "\n"; $buffer .= ' */' . "\n"; $buffer .= 'function validate_' . $table . '($queries)' . "\n"; $buffer .= '{' . "\n"; $buffer .= ' $messages = array();' . "\n"; $buffer .= '' . "\n"; $buffer .= $model_validate; $buffer .= ' return $messages;' . "\n"; $buffer .= '}' . "\n"; $buffer .= "\n"; $buffer .= '/**' . "\n"; $buffer .= ' * Default for ' . ($table_comment ? $table_comment : $table) . "\n"; $buffer .= ' *' . "\n"; $buffer .= ' * @return array' . "\n"; $buffer .= ' */' . "\n"; $buffer .= 'function default_' . $table . '()' . "\n"; $buffer .= '{' . "\n"; $buffer .= ' return array(' . "\n"; $buffer .= $model_default; $buffer .= ' );' . "\n"; $buffer .= '}' . "\n"; $scaffold .= db_scaffold_output($model_file, $buffer); // view $buffer = '<?php import(\'app/views/header.php\') ?>' . "\n"; $buffer .= "\n"; $buffer .= ' <h2>' . ($table_comment ? $table_comment : $table) . '</h2>' . "\n"; $buffer .= ' <ul>' . "\n"; $buffer .= ' <li><a href="<?php t(MAIN_FILE) ?>/' . $table . '/post">post</a></li>' . "\n"; $buffer .= ' </ul>' . "\n"; $buffer .= ' <table summary="' . ($table_comment ? $table_comment : $table) . '">' . "\n"; $buffer .= ' <tr>' . "\n"; $buffer .= $view_head; $buffer .= ' </tr>' . "\n"; $buffer .= ' <?php foreach ($_view[\'' . $table . '\'] as $data) : ?>' . "\n"; $buffer .= ' <tr>' . "\n"; $buffer .= $view_data; $buffer .= ' </tr>' . "\n"; $buffer .= ' <?php endforeach ?>' . "\n"; $buffer .= ' </table>' . "\n"; $buffer .= "\n"; $buffer .= '<?php import(\'app/views/footer.php\') ?>' . "\n"; $scaffold .= db_scaffold_output($view_index_file, $buffer); $buffer = '<?php import(\'app/views/header.php\') ?>' . "\n"; $buffer .= "\n"; $buffer .= ' <h2>' . ($table_comment ? $table_comment : $table) . '</h2>' . "\n"; $buffer .= ' <form action="<?php t(MAIN_FILE) ?>/' . $table . '/post' . ($primary_flag ? '<?php $_view[\'data\'][\'' . $primary_key . '\'] ? t(\'?' . $primary_key . '=\' . $_view[\'data\'][\'' . $primary_key . '\']) : \'\' ?>' : '') . '" method="post">' . "\n"; $buffer .= ' <fieldset>' . "\n"; $buffer .= ' <legend>' . ($table_comment ? $table_comment : $table) . '</legend>' . "\n"; $buffer .= ' <dl>' . "\n"; $buffer .= $view_form; $buffer .= ' </dl>' . "\n"; $buffer .= ' <p><input type="submit" value="post" /></p>' . "\n"; $buffer .= ' </fieldset>' . "\n"; $buffer .= ' </form>' . "\n"; if ($primary_flag) { $buffer .= ' <?php if (!empty($_GET[\'' . $primary_key . '\'])) : ?>' . "\n"; $buffer .= ' <h2>delete</h2>' . "\n"; $buffer .= ' <form action="<?php t(MAIN_FILE) ?>/' . $table . '/delete?' . $primary_key . '=\' . t($_view[\'data\'][\'' . $primary_key . '\']) ?>" method="post">' . "\n"; $buffer .= ' <fieldset>' . "\n"; $buffer .= ' <legend>' . ($table_comment ? $table_comment : $table) . '</legend>' . "\n"; $buffer .= ' <input type="hidden" name="' . $primary_key . '" value="<?php t($_view[\'data\'][\'' . $primary_key . '\']) ?>" /></dd>' . "\n"; $buffer .= ' <p><input type="submit" value="delete" /></p>' . "\n"; $buffer .= ' </fieldset>' . "\n"; $buffer .= ' </form>' . "\n"; $buffer .= ' <?php endif ?>' . "\n"; } $buffer .= "\n"; $buffer .= '<?php import(\'app/views/footer.php\') ?>' . "\n"; $scaffold .= db_scaffold_output($view_post_file, $buffer); // controller $buffer = '<?php' . "\n"; $buffer .= "\n"; $buffer .= '$_view[\'' . $table . '\'] = select_' . $table . '(array(' . "\n"; $buffer .= ' \'limit\' => array(' . "\n"; $buffer .= ' \':limit\',' . "\n"; $buffer .= ' array(' . "\n"; $buffer .= ' \'limit\' => $GLOBALS[\'config\'][\'limits\'][\'' . $table . '\'],' . "\n"; $buffer .= ' ),' . "\n"; $buffer .= ' ),' . "\n"; $buffer .= '));' . "\n"; $scaffold .= db_scaffold_output($controller_index_file, $buffer); $buffer = '<?php' . "\n"; $buffer .= "\n"; $buffer .= 'if ($_SERVER[\'REQUEST_METHOD\'] === \'POST\') {' . "\n"; $buffer .= ' $warnings = validate_' . $table . '(normalize_' . $table . '(array(' . "\n"; $buffer .= $controller_validate; $buffer .= ' )));' . "\n"; $buffer .= ' if (!empty($warnings)) {' . "\n"; $buffer .= ' warning($warnings);' . "\n"; $buffer .= ' }' . "\n"; $buffer .= ' if (isset($_GET[\'' . $primary_key . '\'])) {' . "\n"; if ($primary_flag) { $buffer .= ' $resource = update_' . $table . '(array(' . "\n"; $buffer .= ' \'set\' => array(' . "\n"; $buffer .= $controller_update; $buffer .= ' ),' . "\n"; $buffer .= ' \'where\' => array(' . "\n"; $buffer .= ' \'' . $primary_key . ' = :' . $primary_key . '\',' . "\n"; $buffer .= ' array(' . "\n"; $buffer .= ' \'' . $primary_key . '\' => $_POST[\'' . $primary_key . '\'],' . "\n"; $buffer .= ' ),' . "\n"; $buffer .= ' ),' . "\n"; $buffer .= ' ));' . "\n"; $buffer .= ' if (!$resource) {' . "\n"; $buffer .= ' error(\'Update error.\');' . "\n"; $buffer .= ' }' . "\n"; } $buffer .= ' } else {' . "\n"; $buffer .= ' $resource = insert_' . $table . '(array(' . "\n"; $buffer .= ' \'values\' => array(' . "\n"; $buffer .= $controller_insert; $buffer .= ' ),' . "\n"; $buffer .= ' ));' . "\n"; $buffer .= ' if (!$resource) {' . "\n"; $buffer .= ' error(\'Insert error.\');' . "\n"; $buffer .= ' }' . "\n"; $buffer .= ' }' . "\n"; $buffer .= "\n"; $buffer .= ' redirect(\'/' . $table . '/' . MAIN_DEFAULT_WORK . '\');' . "\n"; $buffer .= '} else {' . "\n"; $buffer .= ' if (isset($_GET[\'' . $primary_key . '\'])) {' . "\n"; if ($primary_flag) { $buffer .= ' $' . $table . ' = select_' . $table . '(array(' . "\n"; $buffer .= ' \'where\' => array(' . "\n"; $buffer .= ' \'' . $primary_key . ' = :' . $primary_key . '\',' . "\n"; $buffer .= ' array(' . "\n"; $buffer .= ' \'' . $primary_key . '\' => $_GET[\'' . $primary_key . '\'],' . "\n"; $buffer .= ' ),' . "\n"; $buffer .= ' ),' . "\n"; $buffer .= ' ));' . "\n"; $buffer .= ' if (empty($' . $table . ')) {' . "\n"; $buffer .= ' error(\'Data not found.\');' . "\n"; $buffer .= ' } else {' . "\n"; $buffer .= ' $_view[\'data\'] = $' . $table . '[0];' . "\n"; $buffer .= ' }' . "\n"; } $buffer .= ' } else {' . "\n"; $buffer .= ' $_view[\'data\'] = default_' . $table . '();' . "\n"; $buffer .= ' }' . "\n"; $buffer .= '}' . "\n"; $scaffold .= db_scaffold_output($controller_post_file, $buffer); if ($primary_flag) { $buffer = '<?php' . "\n"; $buffer .= "\n"; $buffer .= 'if ($_SERVER[\'REQUEST_METHOD\'] === \'POST\') {' . "\n"; $buffer .= ' $resource = delete_' . $table . '(array(' . "\n"; $buffer .= ' \'where\' => array(' . "\n"; $buffer .= ' \'' . $primary_key . ' = :' . $primary_key . '\',' . "\n"; $buffer .= ' array(' . "\n"; $buffer .= ' \'' . $primary_key . '\' => $_POST[\'' . $primary_key . '\'],' . "\n"; $buffer .= ' ),' . "\n"; $buffer .= ' ),' . "\n"; $buffer .= ' ));' . "\n"; $buffer .= ' if (!$resource) {' . "\n"; $buffer .= ' error(\'Delete error.\');' . "\n"; $buffer .= ' }' . "\n"; $buffer .= '} else {' . "\n"; $buffer .= ' error(\'Method error.\');' . "\n"; $buffer .= '}' . "\n"; $buffer .= "\n"; $buffer .= 'redirect(\'/' . $table . '/' . MAIN_DEFAULT_WORK . '\');' . "\n"; $scaffold .= db_scaffold_output($controller_delete_file, $buffer); } // test data $test_insert = ''; $test_insert .= ' $insert_' . $table . ' = array(' . "\n"; $test_insert .= ' 1 => array(' . "\n"; $test_insert .= str_replace('[N]', 1, $test_data); $test_insert .= ' ),' . "\n"; $test_insert .= ' 2 => array(' . "\n"; $test_insert .= str_replace('[N]', 2, $test_data); $test_insert .= ' ),' . "\n"; $test_insert .= ' 3 => array(' . "\n"; $test_insert .= str_replace('[N]', 3, $test_data); $test_insert .= ' ),' . "\n"; $test_insert .= ' );' . "\n"; $test_update = ''; $test_update .= ' $update_' . $table . ' = array(' . "\n"; $test_update .= ' 3 => array(' . "\n"; $test_update .= str_replace('[N]', 3, $test_data); $test_update .= ' ),' . "\n"; $test_update .= ' );' . "\n"; // test model $buffer = '<?php' . "\n"; $buffer .= "\n"; $buffer .= 'model(\'' . $table . '.php\');' . "\n"; $buffer .= "\n"; $buffer .= 'db_transaction();' . "\n"; $buffer .= "\n"; $buffer .= '// insert' . "\n"; $buffer .= '{' . "\n"; $buffer .= ' // data' . "\n"; $buffer .= $test_insert; $buffer .= "\n"; $buffer .= ' // insert' . "\n"; $buffer .= ' foreach ($insert_' . $table . ' as $insert_data) {' . "\n"; $buffer .= ' $warnings = validate_' . $table . '(normalize_' . $table . '($insert_data));' . "\n"; $buffer .= ' if (empty($warnings)) {' . "\n"; $buffer .= ' insert_' . $table . '(array(' . "\n"; $buffer .= ' \'values\' => $insert_data,' . "\n"; $buffer .= ' ));' . "\n"; $buffer .= ' } else {' . "\n"; $buffer .= ' debug($warnings);' . "\n"; $buffer .= ' }' . "\n"; $buffer .= ' }' . "\n"; $buffer .= "\n"; $buffer .= ' // test' . "\n"; $buffer .= ' $' . $table . ' = select_' . $table . '(array(' . "\n"; $buffer .= ' \'limit\' => 10,' . "\n"; $buffer .= ' ));' . "\n"; $buffer .= "\n"; $buffer .= ' test_equals(\'count_' . $table . '\', count($' . $table . '), 3);' . "\n"; $buffer .= "\n"; $buffer .= ' for ($i = 1; $i <= 3; $i++) {' . "\n"; $buffer .= ' $inserted_data = array_shift($' . $table . ');' . "\n"; $buffer .= ' $test_data = array(' . "\n"; $buffer .= ' $i => $inserted_data,' . "\n"; $buffer .= ' );' . "\n"; $buffer .= ' test_array_subset(\'insert_' . $table . ' \' . $i, $test_data, $insert_' . $table . '[$i]);' . "\n"; $buffer .= ' }' . "\n"; $buffer .= '}' . "\n"; $buffer .= "\n"; $buffer .= '// update' . "\n"; $buffer .= '{' . "\n"; $buffer .= ' // data' . "\n"; $buffer .= $test_update; $buffer .= "\n"; $buffer .= ' // update' . "\n"; $buffer .= ' $warnings = validate_' . $table . '(normalize_' . $table . '($update_' . $table . '[3]));' . "\n"; $buffer .= ' if (empty($warnings)) {' . "\n"; $buffer .= ' update_' . $table . '(array(' . "\n"; $buffer .= ' \'set\' => $update_' . $table . '[3],' . "\n"; $buffer .= ' \'where\' => \'id = 3\',' . "\n"; $buffer .= ' ));' . "\n"; $buffer .= ' } else {' . "\n"; $buffer .= ' debug($warnings);' . "\n"; $buffer .= ' }' . "\n"; $buffer .= "\n"; $buffer .= ' // test' . "\n"; $buffer .= ' $' . $table . ' = select_' . $table . '(array(' . "\n"; $buffer .= ' \'limit\' => 10,' . "\n"; $buffer .= ' ));' . "\n"; $buffer .= "\n"; $buffer .= ' $updated_data = array_pop($' . $table . ');' . "\n"; $buffer .= ' $test_data = array(' . "\n"; $buffer .= ' 3 => $updated_data,' . "\n"; $buffer .= ' );' . "\n"; $buffer .= ' test_array_subset(\'update_' . $table . '\', $test_data, $update_' . $table . '[3]);' . "\n"; $buffer .= '}' . "\n"; $buffer .= "\n"; $buffer .= '// delete' . "\n"; $buffer .= '{' . "\n"; $buffer .= ' // delete' . "\n"; $buffer .= ' delete_' . $table . '(array(' . "\n"; $buffer .= ' \'where\' => \'id = 3\',' . "\n"; $buffer .= ' ));' . "\n"; $buffer .= "\n"; $buffer .= ' // test' . "\n"; $buffer .= ' $' . $table . ' = select_' . $table . '(array(' . "\n"; $buffer .= ' \'limit\' => 10,' . "\n"; $buffer .= ' ));' . "\n"; $buffer .= "\n"; $buffer .= ' test_equals(\'delete_' . $table . '\', count($' . $table . '), 2);' . "\n"; $buffer .= '}' . "\n"; $buffer .= "\n"; $buffer .= 'db_rollback();' . "\n"; $scaffold .= db_scaffold_output($test_model_file, $buffer); // test view $buffer = '<?php' . "\n"; $buffer .= "\n"; $buffer .= '// index' . "\n"; $buffer .= '{' . "\n"; $buffer .= ' // data' . "\n"; $buffer .= $test_insert; $buffer .= "\n"; $buffer .= ' // assign' . "\n"; $buffer .= ' $_view[\'' . $table . '\'] = $insert_' . $table . ';' . "\n"; $buffer .= "\n"; $buffer .= ' // test' . "\n"; $buffer .= ' $html = view(\'' . $table . '/index.php\', true);' . "\n"; $buffer .= "\n"; $buffer .= ' test_contains(\'' . $table . '/index 1\', $html, \'<td>\' . $insert_' . $table . '[1][\'' . $primary_key . '\'] . \'</td>\');' . "\n"; $buffer .= ' test_contains(\'' . $table . '/index 2\', $html, \'<td>\' . $insert_' . $table . '[2][\'' . $primary_key . '\'] . \'</td>\');' . "\n"; $buffer .= ' test_contains(\'' . $table . '/index 3\', $html, \'<td>\' . $insert_' . $table . '[3][\'' . $primary_key . '\'] . \'</td>\');' . "\n"; $buffer .= '}' . "\n"; $buffer .= "\n"; $buffer .= '// post' . "\n"; $buffer .= '{' . "\n"; $buffer .= ' // test' . "\n"; $buffer .= ' $_view[\'data\'] = $insert_' . $table . '[1];' . "\n"; $buffer .= "\n"; $buffer .= ' $html = view(\'' . $table . '/post.php\', true);' . "\n"; $buffer .= "\n"; $buffer .= ' test_contains(\'' . $table . '/post\', $html, \'value="\' . $insert_' . $table . '[1][\'' . $primary_key . '\'] . \'"\');' . "\n"; $buffer .= '}' . "\n"; $scaffold .= db_scaffold_output($test_view_file, $buffer); // test controller $buffer = '<?php' . "\n"; $buffer .= "\n"; $buffer .= 'model();' . "\n"; $buffer .= "\n"; $buffer .= 'db_transaction();' . "\n"; $buffer .= "\n"; $buffer .= '// index' . "\n"; $buffer .= '{' . "\n"; $buffer .= ' // data' . "\n"; $buffer .= $test_insert; $buffer .= "\n"; $buffer .= ' // insert' . "\n"; $buffer .= ' foreach ($insert_' . $table . ' as $insert_data) {' . "\n"; $buffer .= ' $warnings = validate_' . $table . '(normalize_' . $table . '($insert_data));' . "\n"; $buffer .= ' if (empty($warnings)) {' . "\n"; $buffer .= ' insert_' . $table . '(array(' . "\n"; $buffer .= ' \'values\' => $insert_data,' . "\n"; $buffer .= ' ));' . "\n"; $buffer .= ' } else {' . "\n"; $buffer .= ' debug($warnings);' . "\n"; $buffer .= ' }' . "\n"; $buffer .= ' }' . "\n"; $buffer .= "\n"; $buffer .= ' // test' . "\n"; $buffer .= ' $_params = array(\'' . $table . '\', \'index\');' . "\n"; $buffer .= ' controller(\'' . $table . '/index.php\');' . "\n"; $buffer .= ' $html = view(\'' . $table . '/index.php\', true);' . "\n"; $buffer .= "\n"; $buffer .= ' test_contains(\'' . $table . '/index 1\', $html, \'<td>\' . $insert_' . $table . '[1][\'' . $primary_key . '\'] . \'</td>\');' . "\n"; $buffer .= ' test_contains(\'' . $table . '/index 2\', $html, \'<td>\' . $insert_' . $table . '[2][\'' . $primary_key . '\'] . \'</td>\');' . "\n"; $buffer .= ' test_contains(\'' . $table . '/index 3\', $html, \'<td>\' . $insert_' . $table . '[3][\'' . $primary_key . '\'] . \'</td>\');' . "\n"; $buffer .= '}' . "\n"; $buffer .= "\n"; $buffer .= '// post' . "\n"; $buffer .= '{' . "\n"; $buffer .= ' // test' . "\n"; $buffer .= ' $_params = array(\'' . $table . '\', \'post\');' . "\n"; $buffer .= ' $_GET[\'' . $primary_key . '\'] = 3;' . "\n"; $buffer .= ' controller(\'' . $table . '/post.php\');' . "\n"; $buffer .= ' $html = view(\'' . $table . '/post.php\', true);' . "\n"; $buffer .= "\n"; $buffer .= ' test_contains(\'' . $table . '/post\', $html, \'value="\' . $insert_' . $table . '[3][\'' . $primary_key . '\'] . \'"\');' . "\n"; $buffer .= '}' . "\n"; $buffer .= "\n"; $buffer .= 'db_rollback();' . "\n"; $scaffold .= db_scaffold_output($test_controller_file, $buffer); $scaffold .= "\n"; } // home $view_home_file = $views . MAIN_DEFAULT_MODE . '/' . MAIN_DEFAULT_WORK . '.php'; $controller_home_file = $controllers . MAIN_DEFAULT_MODE . '/' . MAIN_DEFAULT_WORK . '.php'; $scaffold .= '[index]' . "\n"; $buffer = '<?php import(\'app/views/header.php\') ?>' . "\n"; $buffer .= "\n"; $buffer .= ' <ul>' . "\n"; foreach ($results as $result) { if (DATABASE_TYPE === 'pdo_mysql' || DATABASE_TYPE === 'mysql') { $table_comment = $result['Comment']; } else { $table_comment = null; } $table = array_shift($result); if (regexp_match('^' . DATABASE_PREFIX . $exclude_prefix, $table)) { continue; } $buffer .= ' <li><a href="<?php t(MAIN_FILE) ?>/' . $table . '">' . ($table_comment ? $table_comment : $table) . '</a></li>' . "\n"; } $buffer .= ' </ul>' . "\n"; $buffer .= "\n"; $buffer .= '<?php import(\'app/views/footer.php\') ?>' . "\n"; $scaffold .= db_scaffold_output($view_home_file, $buffer); $buffer = '<?php' . "\n"; $scaffold .= db_scaffold_output($controller_home_file, $buffer); // header $buffer = '<!DOCTYPE html>' . "\n"; $buffer .= '<html>' . "\n"; $buffer .= ' <head>' . "\n"; $buffer .= ' <meta charset="<?php t(MAIN_CHARSET) ?>" />' . "\n"; $buffer .= ' <title>scaffold</title>' . "\n"; $buffer .= ' </head>' . "\n"; $buffer .= ' <body>' . "\n"; $buffer .= ' <h1>scaffold</h1>' . "\n"; $scaffold .= db_scaffold_output($header_file, $buffer); // footer $buffer = ' </body>' . "\n"; $buffer .= '</html>' . "\n"; $scaffold .= db_scaffold_output($footer_file, $buffer); // before $buffer = '<?php' . "\n"; $buffer .= "\n"; $buffer .= 'import(\'' . $config_file . '\');' . "\n"; $scaffold .= db_scaffold_output($before_file, $buffer); // config $buffer = '<?php' . "\n"; $buffer .= "\n"; $buffer .= '$GLOBALS[\'config\'][\'limits\'] = array(' . "\n"; $max_length = 0; foreach ($results as $result) { $table = array_shift($result); if (regexp_match('^' . DATABASE_PREFIX . $exclude_prefix, $table)) { continue; } $max_length = strlen($table) > $max_length ? strlen($table) : $max_length; } foreach ($results as $result) { $table = array_shift($result); if (regexp_match('^' . DATABASE_PREFIX . $exclude_prefix, $table)) { continue; } $space = str_repeat(' ', $max_length - strlen($table)); $buffer .= ' \'' . $table . '\' ' . $space . '=> 10,' . "\n"; } $buffer .= ');' . "\n"; $scaffold .= db_scaffold_output($config_file, $buffer); $scaffold .= "\n"; $scaffold .= "Complete\n"; // result echo "<!DOCTYPE html>\n"; echo "<html>\n"; echo "<head>\n"; echo "<meta charset=\"" . t(MAIN_CHARSET, true) . "\" />\n"; echo "<title>DB Scaffold</title>\n"; style(); echo "</head>\n"; echo "<body>\n"; echo "<h1>DB Scaffold</h1>\n"; echo "<pre><code>" . t($scaffold, true) . "</code></pre>\n"; echo "</body>\n"; echo "</html>\n"; exit; }
} } cookie_set('auth[session]', $session, localdate() + $GLOBALS['config']['cookie_expire']); // 古いセッションを削除 $resource = delete_sessions(array('where' => array('expire < :expire', array('expire' => localdate('Y-m-d H:i:s'))))); if (!$resource) { error('データを削除できません。'); } // トランザクションを終了 db_commit(); } } } else { $_view['user'] = array('username' => '', 'password' => '', 'session' => null); } // ログイン確認 if (!empty($_SESSION['auth']['user']['id'])) { if ($_REQUEST['_work'] === 'index') { if (isset($_GET['referer']) && regexp_match('^\\/', $_GET['referer'])) { $url = $_GET['referer']; } else { $url = '/user/home'; } // リダイレクト redirect($url); } else { error('不正なアクセスです。'); } } // タイトル $_view['title'] = 'ログイン';
/** * Test if the actual data not match the expected data. * * @param string $title * @param mixed $actual * @param mixed $expected * * @return void */ function test_not_regexp($title, $actual, $expected) { $result = false; if (!regexp_match($expected, $actual)) { $result = true; } return test_result($title, $result); }
/** * Resize the file. * * @param string $original * @param string $output * @param int $output_width * @param int $output_height * @param int $quality * * @return bool */ function file_resize($original, $output, $output_width, $output_height, $quality = 80) { if (!regexp_match('\\.(gif|jpeg|jpg|jpe|png)$', $original)) { return true; } list($original_width, $original_height) = file_info($original); if ($original_width > $output_width) { $width = $output_width; $height = $width / $original_width * $original_height; } else { $width = $original_width; $height = $original_height; } if ($height > $output_height) { $width = $output_height / $height * $width; $height = $output_height; } if ($original_width === $width && $original_height === $height && $output === null) { header('Content-type: ' . file_mimetype($original)); readfile($original); return true; } if (regexp_match('\\.gif$', $original)) { $file = imagecreatefromgif($original); $bgcolor = imagecolorallocatealpha($file, 0, 0, 0, 127); } elseif (regexp_match('\\.(jpeg|jpg|jpe)$', $original)) { $file = imagecreatefromjpeg($original); $bgcolor = false; } elseif (regexp_match('\\.png$', $original)) { $file = imagecreatefrompng($original); $bgcolor = imagecolorallocatealpha($file, 0, 0, 0, 127); } else { $file = false; $bgcolor = false; } if ($file === false) { return false; } $thumbnail = imagecreatetruecolor($width, $height); if ($thumbnail === false) { return false; } if (regexp_match('\\.gif$', $original)) { imagefill($thumbnail, 0, 0, $bgcolor); imagecolortransparent($thumbnail, $bgcolor); } elseif (regexp_match('\\.png$', $original)) { imagefill($thumbnail, 0, 0, $bgcolor); imagealphablending($thumbnail, false); imagesavealpha($thumbnail, true); imagecolortransparent($thumbnail, $bgcolor); } $result = imagecopyresampled($thumbnail, $file, 0, 0, 0, 0, $width, $height, $original_width, $original_height); if ($result === false) { return false; } if ($output) { if (regexp_match('\\.gif$', $original)) { $result = imagegif($thumbnail, $output); } elseif (regexp_match('\\.(jpeg|jpg|jpe)$', $original)) { $result = imagejpeg($thumbnail, $output, $quality); } elseif (regexp_match('\\.png$', $original)) { $result = imagepng($thumbnail, $output); } else { $result = false; } } else { header('Content-type: ' . file_mimetype($original)); if (regexp_match('\\.gif$', $original)) { $result = imagegif($thumbnail); } elseif (regexp_match('\\.(jpeg|jpg|jpe)$', $original)) { $result = imagejpeg($thumbnail, null, $quality); } elseif (regexp_match('\\.png$', $original)) { $result = imagepng($thumbnail); } else { $result = false; } } if ($result === false) { return false; } imagedestroy($thumbnail); return true; }
/** * Forward to the target. * * @param string|null $target * * @return string|null|void */ function forward($target = null) { global $_params, $_view; static $forwarded = null; if ($target === null) { return $forwarded; } else { $forwarded = $target; if ($regexp = regexp_match('^\\/([_a-zA-Z0-9\\-]+)\\/([_a-zA-Z0-9\\-]+)$', $target)) { $_REQUEST['_mode'] = $regexp[1]; $_REQUEST['_work'] = $regexp[2]; $_params = array($regexp[1], $regexp[2]); controller($regexp[1] . '/' . $regexp[2] . '.php'); view($regexp[1] . '/' . $regexp[2] . '.php'); exit; } else { error('Forward error' . (DEBUG_LEVEL ? ': ' . $target : '')); } } }
/** * Get a form parts for time/date. * * @param mixed $timestamp * @param string $type * @param array $option * * @return string */ function ui_datetime($timestamp, $type = '', $option = array()) { if (!isset($option['format'])) { $option['format'] = '%01d'; } if (!isset($option['prefix'])) { $option['prefix'] = ''; } if (!isset($option['suffix'])) { $option['suffix'] = ''; } if (!isset($option['from'])) { $option['from'] = 0; } if (!isset($option['to'])) { $option['to'] = 0; } if (!isset($option['step'])) { $option['step'] = 1; } switch ($type) { case 'year': $value = $timestamp ? intval(localdate('Y', $timestamp)) : null; $from = $option['from'] ? $option['from'] : date('Y') - 10; $to = $option['to'] ? $option['to'] : date('Y') + 10; break; case 'month': $value = $timestamp ? intval(localdate('m', $timestamp)) : null; $from = $option['from'] ? $option['from'] : 1; $to = $option['to'] ? $option['to'] : 12; break; case 'day': $value = $timestamp ? intval(localdate('d', $timestamp)) : null; $from = $option['from'] ? $option['from'] : 1; $to = $option['to'] ? $option['to'] : 31; break; case 'hour': $value = $timestamp ? intval(localdate('H', $timestamp)) : null; $from = $option['from'] ? $option['from'] : 0; $to = $option['to'] ? $option['to'] : 23; break; case 'minute': $value = $timestamp ? intval(localdate('i', $timestamp)) : null; $from = $option['from'] ? $option['from'] : 0; $to = $option['to'] ? $option['to'] : 59; break; case 'second': $value = $timestamp ? intval(localdate('s', $timestamp)) : null; $from = $option['from'] ? $option['from'] : 0; $to = $option['to'] ? $option['to'] : 59; break; default: return '<option value="">ui_datetime: Incorrect value was specified.</option>'; } if ($regexp = regexp_match('^(\\d\\d\\d\\d)\\-(\\d\\d)\\-(\\d\\d)', $timestamp)) { $year = intval($regexp[1]); $month = intval($regexp[2]); $day = intval($regexp[3]); if (!checkdate($month, $day, $year)) { if ($regexp = regexp_match('(\\d\\d)\\:(\\d\\d)\\:(\\d\\d)$', $timestamp)) { $hour = intval($regexp[1]); $minute = intval($regexp[2]); $second = intval($regexp[3]); } else { $hour = 0; $minute = 0; $second = 0; } switch ($type) { case 'year': $value = $year; break; case 'month': $value = $month; break; case 'day': $value = $day; break; case 'hour': $value = $hour; break; case 'minute': $value = $minute; break; case 'second': $value = $second; break; default: } } } $datetime = ''; for ($i = $from; $i <= $to; $i += $option['step']) { $datetime .= '<option value="' . sprintf('%02d', $i) . '"' . ($value !== null && $i == $value ? ' selected="selected"' : '') . '>' . $option['prefix'] . sprintf($option['format'], $i) . $option['suffix'] . '</option>'; } return $datetime; }