From 0306ed3d68f51db7bc8b90c52c4ddb258b63bf12 Mon Sep 17 00:00:00 2001 From: Robert Date: Thu, 22 Dec 2022 19:08:03 -0500 Subject: [PATCH] Fixed old ex project. --- public/assets/ex/fonts/JennaSue.ttf | Bin 0 -> 42948 bytes src/ex/cli_controllers/app/home_ctrl.php | 21 +++ src/ex/controllers/app/home_ctrl.php | 56 ++++---- src/ex/controllers/bills/notices_ctrl.php | 39 ++++++ src/ex/controllers/cronjobs/daily_ctrl.php | 14 -- src/ex/inputs/app/home_in.php | 55 +++++--- src/ex/logic/app/home_logic.php | 37 ++++++ src/ex/models/app/home_model.php | 86 +++++++----- src/ex/outputs/app/home_out.php | 65 +++++---- src/ex/outputs/bills/notices_out.php | 43 ++++++ src/ex/routes/cli_routes.php | 15 +++ src/ex/routes/routes.php | 15 +++ src/ex/routes/test_routes.php | 14 ++ src/ex/templates/main.php | 2 +- src/ex/test_controllers/app/first_ctrl.php | 23 ++++ src/ex/views/default/app/footer.php | 15 ++- src/ex/views/default/app/home_index.php | 12 +- src/ex/views/default/app/name_demo.php | 19 +-- src/ex/views/default/app/name_demo_post.php | 22 ++++ .../bills/notice_of_late_payment_css.php | 124 ++++++++++++++++++ .../bills/notice_of_late_payment_pdf.tpl | 20 +++ 21 files changed, 564 insertions(+), 133 deletions(-) create mode 100644 public/assets/ex/fonts/JennaSue.ttf create mode 100644 src/ex/cli_controllers/app/home_ctrl.php create mode 100644 src/ex/controllers/bills/notices_ctrl.php delete mode 100644 src/ex/controllers/cronjobs/daily_ctrl.php create mode 100644 src/ex/logic/app/home_logic.php create mode 100644 src/ex/outputs/bills/notices_out.php create mode 100644 src/ex/routes/cli_routes.php create mode 100644 src/ex/routes/routes.php create mode 100644 src/ex/routes/test_routes.php create mode 100644 src/ex/test_controllers/app/first_ctrl.php create mode 100644 src/ex/views/default/app/name_demo_post.php create mode 100644 src/ex/views/default/bills/notice_of_late_payment_css.php create mode 100644 src/ex/views/includes/bills/notice_of_late_payment_pdf.tpl diff --git a/public/assets/ex/fonts/JennaSue.ttf b/public/assets/ex/fonts/JennaSue.ttf new file mode 100644 index 0000000000000000000000000000000000000000..667a55112dd47eed376f983864a2f9a703eed3a6 GIT binary patch literal 42948 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 literal 0 HcmV?d00001 diff --git a/src/ex/cli_controllers/app/home_ctrl.php b/src/ex/cli_controllers/app/home_ctrl.php new file mode 100644 index 0000000..ae375c6 --- /dev/null +++ b/src/ex/cli_controllers/app/home_ctrl.php @@ -0,0 +1,21 @@ +set_author("Robert Strutts, plus ME!"); $view = new \tts\view(); $view->set('html', $html); @@ -21,30 +19,44 @@ class home_ctrl { $view->render($this, "app/home_index"); } - public function name_demo() { - $input = \ex\inputs\app\home_in::name_demo(); - - \tts\main\registry::set('db', \tts\main\registry::get('di')->get_service('db_mocker') ); // Grabs DB - $model = new \ex\models\app\home_model(\tts\main\registry::get('db')); - $model->init_name_demo_table(); // Create Table if NOT exists! - $model->populate(10); // INSERT 10 random rows of data - $model->save_new_user($input); // Save user from Users Request Data - - $input['model'] = $model->get_users(); + public function name_demo() { + $view = new \tts\view(); + $view->set('html', new \tts\html_document()); + $view->set_template('main'); + $view->include("app/name_demo"); + $view->render($this); + } + + public function name_demo_post() { + \tts\main\registry::set('db', \tts\main\registry::get('di')->get_service('db_mocker') ); + + $input = \prj\ex\inputs\app\home_in::name_demo(); - $output = \ex\outputs\app\home_out::name_demo($input); -//asd(); - $html = new \tts\html_document(); - $html->set_footer('


By BBV-Soft'); + \prj\ex\logic\app\home_logic::name_demo($input); + + $output = \prj\ex\outputs\app\home_out::name_demo($input); $view = new \tts\view(); - $view->set('html', $html); // set view's local variables - $view->set_template('main'); + $view->set('html', new \tts\html_document()); $view->set('output', $output); - $view->include("app/name_demo"); // Alias to add_view/set_view + $view->set_template('main'); + $view->include("app/name_demo_post"); $view->render($this); } + public function test($id) { + \tts\common::real_time_output(); + + echo "bla $id"; + echo PHP_EOL; + + for ($i=0; $i<10;$i++){ + echo $i; + echo str_pad('', 14960); + sleep(1); + } + } + public function error() { tts_broken_error(); } // Needed: To show Live Page for Broken Pages } \ No newline at end of file diff --git a/src/ex/controllers/bills/notices_ctrl.php b/src/ex/controllers/bills/notices_ctrl.php new file mode 100644 index 0000000..4a8d8cb --- /dev/null +++ b/src/ex/controllers/bills/notices_ctrl.php @@ -0,0 +1,39 @@ +set('html', $html); + $view->set_template('main'); + } + $view->set('view_as_pdf', $view_as_pdf); + $view->set('template_assigns', $output); + $view->set('font_url', TTS_PROJECT_BASE_REF . 'assets/fonts/JennaSue.ttf'); + if (! $view_as_pdf) { + $view->add_view('bills/notice_of_late_payment_css.php'); + } + $view->add_view('bills/notice_of_late_payment_pdf.tpl'); + $html_code = $view->fetch($this); + + if (! $view_as_pdf) { + echo $html_code; + exit; + } + + // Makes PDF output + \prj\ex\outputs\bills\notices_out::gen_pdf_for_late_payment($html_code); + } + +} diff --git a/src/ex/controllers/cronjobs/daily_ctrl.php b/src/ex/controllers/cronjobs/daily_ctrl.php deleted file mode 100644 index 0975fb6..0000000 --- a/src/ex/controllers/cronjobs/daily_ctrl.php +++ /dev/null @@ -1,14 +0,0 @@ - - [ - 'input' => \tts\INPUTS::get, // Others: _post, _json (REQUIRED param) - 'skip_db' => false, // this is an Optional value (DEFAULT: false) - 'field' => \tts\FIELD_FILTER::raw, // Others: raw, (DEFAULT: string), email, url, float, int - 'html' => \tts\HTML_FLAG::purify, // Others: strip, encode, purify, (DEFAULT: escape) - 'rule' => 'required' // Others: email, valid_email_domain, - // min, max, between, same, secure (password), alphanumeric - ], - 'age' => - [ - 'input' => \tts\INPUTS::get, - 'field' => \tts\FIELD_FILTER::integer_number, - 'rule' => 'greater_than: 18', //'number_range: 18, 24' - 'message' => ['greater_than' => 'Must be an Adult!'] - ], - ]); + \tts\safer_io::init_json(); // Staticly set JSON data if any + + $required_post_string_field = new IO(); + $required_post_string_field->input_type = INPUTS::post; + $required_post_string_field->field_filter = FIELD_FILTER::raw_string; + $required_post_string_field->escape_html = HTML_FLAG::escape; + $required_post_string_field->validation_rule = 'required|max: 75'; + $required_post_string_field->use_db_filter = DB_FILTER::OFF; + $required_post_string_field->skip_the_db = false; + + $adult_post_int_age_field = new IO(); + $adult_post_int_age_field->input_type = INPUTS::post; + $adult_post_int_age_field->field_filter = FIELD_FILTER::integer_number; + $adult_post_int_age_field->validation_rule = 'greater_than: 18'; + $adult_post_int_age_field->validation_message = ['greater_than' => 'The %s must be an Adult over %d!']; - return $safer_data; // Makes an Array of: fields, html, and errrors + return [ + 'first_name' => $required_post_string_field, + 'last_name' => $required_post_string_field, + 'age' => $adult_post_int_age_field + ]; } } \ No newline at end of file diff --git a/src/ex/logic/app/home_logic.php b/src/ex/logic/app/home_logic.php new file mode 100644 index 0000000..54dca42 --- /dev/null +++ b/src/ex/logic/app/home_logic.php @@ -0,0 +1,37 @@ +init_name_demo_table(); // Create Table if NOT exists! + $model->populate(10); // INSERT 10 random rows of data + + $success = $model->save_new_user($input); // Save data from Request Data + $input['model'] = ($success===true) ? + $model->get_users(15) : + $model->get_users(0); + } else { + $input['model'] = $model->get_users(0); + } + } + +} diff --git a/src/ex/models/app/home_model.php b/src/ex/models/app/home_model.php index 7ac1bf0..6fb1e22 100644 --- a/src/ex/models/app/home_model.php +++ b/src/ex/models/app/home_model.php @@ -2,16 +2,36 @@ declare(strict_types=1); -namespace ex\models\app; +namespace prj\ex\models\app; class home_model { private $dbh; private $name_demo_table = "test_names"; + private $db_helper; public function __construct($dbh) { +// \tts\exceptions\DB_Exception::$error_message = "Home Model Error"; $this->dbh = $dbh; + $this->db_helper = new \tts\database\help_save($this->dbh, $this->name_demo_table); } - + + public function is_valid(array $data): bool { + return \tts\database\help_load::is_valid($data); + } + + public function pre_save(): bool { + $missing = $this->db_helper->get_missing(); + if (count($missing)) { + echo "Required fields not set " . implode(",", $missing) . "!"; + return false; + } + + if ($this->db_helper->dump_diff()) { + return false; // Opps forgot a field! + } + return true; + } + public function init_name_demo_table(): void { $create_table_sql = "CREATE TABLE IF NOT EXISTS `{$this->name_demo_table}`( `id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, @@ -19,7 +39,11 @@ class home_model { `last_name` TEXT, `age` INTEGER )"; + try { $this->dbh->query($create_table_sql); + } catch (\PDOException $e) { + echo \tts\exceptions\DB_Exception::customMessage($e, "Unable to make table!"); + } } public function populate($rows): void { @@ -27,45 +51,43 @@ class home_model { $data = [ 'first_name' => \tts\arrays\mocking\rnd_names::get_first_names(), 'last_name' => \tts\arrays\mocking\rnd_names::get_last_names(), 'age' => \tts\arrays\mocking\rnd_names::mock_age() ]; + try { $dummy->add_dummy_data($this->name_demo_table, $rows, $data); + } catch (\PDOException $e) { + echo \tts\exceptions\DB_Exception::customMessage($e, "Unable to populate table!"); + } } + public function get_member(string $member): ?string { + return $this->db_helper->get_member($member); + } + public function save_new_user(array $input): bool { - $db_helper = new \tts\database\help_save($this->dbh, $this->name_demo_table); - - $db_helper->set_member('last_name', "Manning"); // Needs this Missing field - - $set = $db_helper->set_members_by_array($input); + $set = $this->db_helper->set_members_by_generator($input); if ($set === false) { return false; // Found Validation issues in input } - - $status = $db_helper->save($this); - if ($status === $db_helper::successful_save) { - return true; + try { + $status = $this->db_helper->save($this); + } catch (\PDOException $e) { + echo \tts\exceptions\DB_Exception::customMessage($e, "Unable to save changes!"); + } + if ($status === $this->db_helper::successful_save) { + return true; // It saved } - return false; + return false; // It did not save } - - public function get_users(): array { - $sql = "SELECT * FROM {$this->name_demo_table} LIMIT 12"; - $result = $this->dbh->query($sql); - return $result->fetchAll(\PDO::FETCH_ASSOC); - } -/* - private function save(array $input) { - if ($input['errors']) { - return []; + + public function get_users(int $number_of_users_to_get = 12): \Generator { + if ($number_of_users_to_get === 0) { + return \tts\database\help_load::empty_generator(); } - - $insert_sql = "INSERT INTO `{$this->table}`" - . "(`first_name`, `last_name`, `age`)" - . " VALUES (:first_name, :last_name, :age)"; - $r = $this->dbh->prepare($insert_sql); - $r->bindParam(':first_name', $input['fields']['first_name'], \PDO::PARAM_STR); - $r->bindValue(':last_name', "Manning", \PDO::PARAM_STR); - $r->bindParam(':age', $input['fields']['age'], \PDO::PARAM_INT); - $r->execute(); + try { + $sql = "SELECT * FROM {$this->name_demo_table} LIMIT {$number_of_users_to_get}"; + $result = $this->dbh->query($sql); + return \tts\database\help_load::pdo_fetch_lazy($result); + } catch (\PDOException $e) { + echo \tts\exceptions\DB_Exception::customMessage($e); + } } -*/ } \ No newline at end of file diff --git a/src/ex/outputs/app/home_out.php b/src/ex/outputs/app/home_out.php index cd38eea..154b064 100644 --- a/src/ex/outputs/app/home_out.php +++ b/src/ex/outputs/app/home_out.php @@ -2,41 +2,49 @@ declare(strict_types=1); -namespace ex\outputs\app; +namespace prj\ex\outputs\app; + +use \tts\safer_io as SafeIO; class home_out { - public static function name_demo(array $input): array { - - $age = $input['html']['age']; + public static function name_demo(array & $input): array { + $ret['model'] = $input['model']; + unset($input['model']); // Free up some space - $first_name = $input['html']['first_name']; + $submitted = $input['submitted'] ?? false; - if ($first_name === "Chris") { - $more = "I think you will like this!"; - } else { - // Lets make a HyperLink as an Example for Chris - $more = "38,'first_name'=>"Chris"] - ) . "\">See Chris"; - } + if ($submitted) { + $html_output = []; + $errors = []; + foreach(SafeIO::html_escape_and_sanitize($input) as $html) { + $key = $html['name'] ?? ""; + $html_output[$key] = $html['html']; - if ($input['errors']) { - $ret['main'] = $more; + if (\tts\common::get_count($html['errors'])) { + $errors[$key] = $html['errors'][$key]; + } + } + + $age = $html_output['age'] ?? 0; + $first_name = $html_output['first_name'] ?? "Unknown"; + $last_name = $html_output['last_name'] ?? "Unknown"; + + $ret['main'] = (\tts\common::get_count($errors)) ? "" : "Hello, {$first_name} {$last_name}, you are {$age} years old!" . PHP_EOL; + $ret['errors'] = $errors; } else { - $ret['main'] = "Hello {$first_name}, You are {$age} years old!" . PHP_EOL . $more; + $ret['main'] = "Welcome"; + $ret['errors'] = []; } - $ret['errors'] = $input['errors']; - $ret['model'] = $input['model']; + unset($input); // Free up some space return $ret; } - + public static function show_errors(array $errors): string { if ($errors) { - $message = "Sorry, but we had the following errors: "; + $message = "Please correct the following errors: "; $i = 0; foreach($errors as $error) { $i++; @@ -44,14 +52,17 @@ class home_out { } return $message; } - return "Yeah, no errors were made!"; + return ""; // No Errors to return here } - public static function show_user_details(array $input): void { - if (! count($input)) { - return; + public static function show_user_details(\Generator $input): void { + if (! $input->current()) { + return; // No Data, so Bail here } - \tts\html::show_table(['ID', 'First Name', 'Last Name', 'Age'], $input); + \tts\html::show_table_from_generator( + ['ID', 'First Name', 'Last Name', 'Age'], + $input + ); } -} \ No newline at end of file +} diff --git a/src/ex/outputs/bills/notices_out.php b/src/ex/outputs/bills/notices_out.php new file mode 100644 index 0000000..edaf7ed --- /dev/null +++ b/src/ex/outputs/bills/notices_out.php @@ -0,0 +1,43 @@ + 'legal_date')); + $output['wrap'] = ($view_as_pdf) ? "" : 'class="non-pdf-paper-wrap"'; + $output['apt'] = '208'; + $output['signatures'] = [ + ['here' => 'Manager', 'name' => 'Mark Smith'], + ['here' => 'Customer'] + ]; + return $output; + } + + public static function gen_pdf_for_late_payment(string $html_code): void { + $style_sheet = file_get_contents(\tts\site_helper::get_root() . \tts\site_helper::get_project() . 'views/default/bills/notice_of_late_payment_css.php'); + + require_once TTS_VENDOR . 'autoload.php'; + $mpdf = new \Mpdf\Mpdf(['tempDir' => \tts\site_helper::get_root() . '/tmp/mpdf']); // chown www-data, chmod 775 + + $mpdf->AddFontDirectory(PROJECT_ASSETS_DIR . '/fonts'); + $mpdf->fontdata['jennasue'] = ['R'=>"JennaSue.ttf"]; + $mpdf->available_unifonts[] = 'jennasue'; + $mpdf->AddFont('jennasue', 'R'); + $mpdf->SetFont('jennasue'); + + $mpdf->WriteHTML($style_sheet,\Mpdf\HTMLParserMode::HEADER_CSS); + $mpdf->WriteHTML($html_code,\Mpdf\HTMLParserMode::HTML_BODY); + $mpdf->Output(); + } +} + diff --git a/src/ex/routes/cli_routes.php b/src/ex/routes/cli_routes.php new file mode 100644 index 0000000..7ad9806 --- /dev/null +++ b/src/ex/routes/cli_routes.php @@ -0,0 +1,15 @@ + - + diff --git a/src/ex/test_controllers/app/first_ctrl.php b/src/ex/test_controllers/app/first_ctrl.php new file mode 100644 index 0000000..bcc180f --- /dev/null +++ b/src/ex/test_controllers/app/first_ctrl.php @@ -0,0 +1,23 @@ + [], ]; +const JS_TSR = [ "js/trouble_shooting_routes.js" =>[] ]; + const JS_FILES = [ - "js/testing.js" => [], + "js/router_loader.js" => [], + "js/routes.js" => [], ]; -$JS = "tts_set_project(\"" . rtrim(\tts\site_helper::get_project(), '/') ."\");" . PHP_EOL; /* Set JS Error Handler */ -$JS .= "var ajax_folder = \"" . $AJAX_FOLDER . "\"" . PHP_EOL; /* assets AJAX foldername and path */ +$JS = "var ajax_folder = \"" . $AJAX_FOLDER . "\"" . PHP_EOL; /* assets AJAX foldername and path */ $JS .= "var debug = 1; /* Debug mode 1 = true */" . PHP_EOL; $JS .= "function debug_print(msg) { if (debug === 1) console.log(msg); }" . PHP_EOL; -$JS .= \tts\assets::get_ajax_files(\tts\site_helper::get_root() . $AJAX_FOLDER . "/"); +$JS .= \tts\assets::get_ajax_files(PROJECT_ASSETS_DIR . "/ajax/"); $html->add_to_javascript($JS); $html->set_assets_from_array(JS_CDN_FILES, 'main_js', 'cdn'); -//$html->set_assets_from_array(JS_FILES, 'main_js'); \ No newline at end of file +$html->set_assets_from_array(JS_TSR, 'js', 'assets'); +$html->set_assets_from_array(JS_FILES, 'js', 'project'); \ No newline at end of file diff --git a/src/ex/views/default/app/home_index.php b/src/ex/views/default/app/home_index.php index edfbc75..9cd570b 100644 --- a/src/ex/views/default/app/home_index.php +++ b/src/ex/views/default/app/home_index.php @@ -1,10 +1,16 @@ -

Welcome...to Example Codes

- -View Name Demo \ No newline at end of file +

Welcome...to your Example Project

+ +View Name Demo

+ +View Late Payment Signing \ No newline at end of file diff --git a/src/ex/views/default/app/name_demo.php b/src/ex/views/default/app/name_demo.php index cda9530..b971270 100644 --- a/src/ex/views/default/app/name_demo.php +++ b/src/ex/views/default/app/name_demo.php @@ -1,16 +1,19 @@ -

BLA BLA BLA okay...

+ - - - - +declare(strict_types=1); +$route_name_demo = "app/home"; +$method_name_demo_post = "name_demo_post"; +?>

-
+
+

- \ No newline at end of file +
+
+ +">Back to Main \ No newline at end of file diff --git a/src/ex/views/default/app/name_demo_post.php b/src/ex/views/default/app/name_demo_post.php new file mode 100644 index 0000000..562635a --- /dev/null +++ b/src/ex/views/default/app/name_demo_post.php @@ -0,0 +1,22 @@ + +Back + +

BLA BLA BLA okay...

+ +
+
+
+ + + + + +
+
+Back \ No newline at end of file diff --git a/src/ex/views/default/bills/notice_of_late_payment_css.php b/src/ex/views/default/bills/notice_of_late_payment_css.php new file mode 100644 index 0000000..a44694a --- /dev/null +++ b/src/ex/views/default/bills/notice_of_late_payment_css.php @@ -0,0 +1,124 @@ +'; ?> + +.page { + width: 8.5in; + height: 11in; + margin: 0mm auto; +} + +body { + font-family: FreeSans, sans-serif; + font-size: ; +} + +/* DivTable.com */ +.divTable{ + display: table; +} +.divTableRow { + display: table-row; +} +.divTableHeading { + display: table-header-group; +} +.divTableCell, .divTableHead { + display: table-cell; +} +.divTableHeading { + display: table-header-group; + font-weight: bold; +} +.divTableFoot { + display: table-footer-group; + font-weight: bold; +} +.divTableBody { + display: table-row-group; +} +/* End of DivTable */ + +.div-table-tr { + height: 35pt; +} + +.table-tr { + height: 35pt; +} + +.table-todays-date { font-weight: 500; } + +.div-table-todays-date { font-weight: 500; } + +.table-blank-td-space { + padding-left: 100px; +} + +.div-table-blank-td-space { + padding-left: 100px; +} + +.signers-table-fix { + font-size: 29pt; + height: 14pt; + line-height: 16px; + margin: 0; +} + +.signers-div-table-fix { + font-size: 32pt; + height: 18pt; + line-height: 26px; + margin: 0; +} + +.address { + max-width: 4in; + width: 3in; + margin-bottom: 2.5mm; + padding-bottom: 0.2mm; + border-bottom: 0.25mm solid #000000; +} + +.late-notice { + font-size: 15pt; + text-transform: uppercase; + text-align: center; +} + +.big-spaces { + padding-bottom: 0.75in; +} + +.small-spaces { + padding-bottom: 0.45in; +} + +.sign-here-line { + max-width: 3in; + width: 2.5in; + border-bottom: 0.25mm solid #000000; +} + +.non-pdf-paper-wrap { + width: 80ch; + word-break: break-normal; + white-space: normal; +} + +@font-face { + font-family: jennasue; + +} + +.cursive { + font-family: jennasue; + font-style: normal; + font-variant: normal; + font-weight: 400; +} + +.centered-text { + text-align:center; +} + +'; \ No newline at end of file diff --git a/src/ex/views/includes/bills/notice_of_late_payment_pdf.tpl b/src/ex/views/includes/bills/notice_of_late_payment_pdf.tpl new file mode 100644 index 0000000..cd01ea3 --- /dev/null +++ b/src/ex/views/includes/bills/notice_of_late_payment_pdf.tpl @@ -0,0 +1,20 @@ +{% for sign in signatures %} + + + + + + + + + + + + +
{{ todays_date }}  + {% unless sign.here == 'Tenant' %} + {{ sign.name }} + {% endunless %} +
Date {{ sign.here }}
+
+{% endfor %} \ No newline at end of file