public function action_index() { // clear buffer helper_ob::clean_all(); // validating do { $options = application::get('flag.numbers.backend.cron.base'); // token if (!empty($options['token']) && request::input('token') != $options['token']) { break; } // ip if (!empty($options['ip']) && !in_array(request::ip(), $options['ip'])) { break; } // get date parts $date_parts = format::now('parts'); print_r($date_parts); echo "GOOD\n"; } while (0); // we need to validate token //$token = request::input('token'); echo "OK\n"; // exit exit; }
/** * Destroy everything */ public static function destroy() { $__run_only_bootstrap = application::get(['flag', 'global', '__run_only_bootstrap']); // we need to set working directory again chdir(application::get(['application', 'path_full'])); // error processing if (empty(error_base::$flag_error_already)) { $last_error = error_get_last(); $flag_render = false; if (in_array($last_error['type'], [E_COMPILE_ERROR, E_PARSE, E_ERROR])) { error_base::error_handler($last_error['type'], $last_error['message'], $last_error['file'], $last_error['line']); error_base::$flag_error_already = true; $flag_render = true; } if ($flag_render || error_base::$flag_exception) { error_base::$flag_error_already = true; if ($__run_only_bootstrap) { helper_ob::clean_all(); print_r(error_base::$errors); } else { // set mvc + process application::set_mvc('/error/_error/500'); application::process(); } } } // write sessions session_write_close(); // final benchmark if (debug::$debug) { debug::benchmark('application end'); } // debugging toolbar last if (debug::$toolbar && !$__run_only_bootstrap) { echo str_replace('<!-- [numbers: debug toolbar] -->', debug::render(), helper_ob::clean()); } // flush data to client flush(); // closing caches before db $cache = factory::get(['cache']); if (!empty($cache)) { foreach ($cache as $k => $v) { $object = $v['object']; if (!empty(cache::$reset_caches[$k])) { $object->gc(1, cache::$reset_caches[$k]); } $object->close(); } } // destroy i18n if (i18n::$initialized) { i18n::destroy(); } // close db connections $dbs = factory::get(['db']); if (!empty($dbs)) { foreach ($dbs as $k => $v) { $object = $v['object']; $object->close(); } } // emails with erros if (debug::$debug && !empty(debug::$email)) { debug::send_errors_to_admin(); } }
public static function process($options = []) { // start buffering helper_ob::start(true); $controller_class = self::$settings['mvc']['controller_class']; // if we are handling error message and controller class has not been loaded if ($controller_class == 'controller_error' && error_base::$flag_error_already && !class_exists('controller_error')) { require './controller/error.php'; } $controller = new $controller_class(); // processing options if (!empty($options)) { foreach ($options as $k => $v) { $controller->{$k} = $v; } } // put action into controller $controller->action = ['code' => self::$settings['mvc']['controller_action_code'], 'full' => self::$settings['mvc']['controller_action']]; // check ACL if ($controller_class != 'controller_error') { helper_acl::merge_data_with_db($controller, self::$settings['mvc']['controller_class']); if (helper_acl::can_be_executed($controller, true) == false) { throw new Exception('Permission denied!', -1); } } else { // important to unset controller data application::set('controller', null); } // auto populating input property in controller if (!empty(self::$settings['application']['controller']['input'])) { $controller->input = request::input(null, true, true); } // init method if (method_exists($controller, 'init')) { call_user_func(array($controller, 'init')); } // check if action exists if (!method_exists($controller, $controller->action['full'])) { throw new Exception('Action does not exists!'); } // calling action echo call_user_func(array($controller, $controller->action['full'])); // auto rendering view only if view exists, processing extension order as specified in .ini file $temp_reflection_obj = new ReflectionClass($controller); $controller_dir = pathinfo($temp_reflection_obj->getFileName(), PATHINFO_DIRNAME) . '/'; $controller_file = end(self::$settings['mvc']['controllers']); $view = self::$settings['mvc']['controller_view']; $flag_view_found = false; if (!empty($view)) { $extensions = explode(',', isset(self::$settings['application']['view']['extension']) ? self::$settings['application']['view']['extension'] : 'html'); foreach ($extensions as $extension) { $file = $controller_dir . $controller_file . '.' . $view . '.' . $extension; if (file_exists($file)) { $controller = new view($controller, $file, $extension); $flag_view_found = true; break; } } // if views are mandatory if (!empty(self::$settings['application']['view']['mandatory']) && !$flag_view_found) { throw new Exception('View ' . $view . ' does not exists!'); } } // autoloading media files layout::include_media($controller_dir, $controller_file, $view, $controller_class); // appending view after controllers output $controller->view = ($controller->view ?? '') . helper_ob::clean(); // if we have to render debug toolbar if (debug::$toolbar) { helper_ob::start(); } // call pre rendering method in bootstrap bootstrap::pre_render(); // rendering layout $__skip_layout = application::get('flag.global.__skip_layout'); if (!empty(self::$settings['mvc']['controller_layout']) && empty($__skip_layout)) { helper_ob::start(); if (file_exists(self::$settings['mvc']['controller_layout_file'])) { $controller = new layout($controller, self::$settings['mvc']['controller_layout_file'], self::$settings['mvc']['controller_layout_extension']); } // session expiry dialog before replaces session::expiry_dialog(); // buffer output and handling javascript files, chicken and egg problem $from = ['<!-- [numbers: messages] -->', '<!-- [numbers: title] -->', '<!-- [numbers: document title] -->', '<!-- [numbers: actions] -->', '<!-- [numbers: breadcrumbs] -->', '<!-- [numbers: javascript links] -->', '<!-- [numbers: javascript data] -->', '<!-- [numbers: css links] -->', '<!-- [numbers: layout onload] -->', '<!-- [numbers: layout onhtml] -->']; $to = [layout::render_messages(), layout::render_title(), layout::render_document_title(), layout::render_actions(), layout::render_breadcrumbs(), layout::render_js(), layout::render_js_data(), layout::render_css(), layout::render_onload(), layout::$onhtml]; echo str_replace($from, $to, helper_ob::clean()); } else { echo $controller->view; } // ajax calls that has not been processed by application if (application::get('flag.global.__ajax')) { layout::render_as(['success' => false, 'error' => [i18n(null, 'Could not process ajax call!')]], 'application/json'); } }
/** * Render debug toolbar * * @return string */ public static function render() { $loaded_classes = application::get(['application', 'loaded_classes']); self::$data['session'] = []; if (!empty($_SESSION)) { self::$data['session'] = [$_SESSION]; } $application = application::get(); $result = '<div class="container" dir="ltr">'; $result .= '<table cellpadding="2" cellspacing="2" width="100%">'; $result .= '<tr>'; $result .= '<td>'; $result .= '<table width="100%">'; $result .= '<tr>'; $result .= '<td nowrap> ' . html::a(['value' => 'Hide All', 'href' => 'javascript:void(0);', 'onclick' => "\$('.debuging_toolbar_class').hide();"]) . ' </td>'; foreach (self::$data as $k => $v) { if ($k == 'errors') { $count = count(error_base::$errors); } else { if ($k == 'classes') { $count = count($loaded_classes); } else { if ($k == 'application') { $count = count($application); } else { if ($k == 'phpinfo') { $count = 1; } else { $count = count($v); } } } } $result .= '<td nowrap> ' . html::a(['value' => ucwords($k) . ' (' . $count . ')', 'id' => "debuging_toolbar_{$k}_a", 'href' => 'javascript:void(0);', 'onclick' => "\$('#debuging_toolbar_{$k}').toggle();"]) . ' </td>'; } $result .= '<td width="50%" align="right">' . html::a(['href' => '/numbers/frontend/system/controller/dev', 'value' => 'Dev. Portal']) . '</td>'; $result .= '</tr>'; $result .= '</table>'; $result .= '</td>'; $result .= '</tr>'; // errors $result .= '<tr id="debuging_toolbar_errors" class="debuging_toolbar_class" style="display: none;">'; $result .= '<td>'; $result .= '<h3>Errors (' . count(error_base::$errors) . ')</h3>'; $result .= '<table border="1" cellpadding="2" cellspacing="2" width="100%">'; foreach (error_base::$errors as $k => $v) { $result .= '<tr>'; $result .= '<td><b>' . error_base::$error_codes[$v['errno']] . ' (' . $v['errno'] . ') - ' . implode('<br/>', $v['error']) . '</b></td>'; $result .= '</tr>'; $result .= '<tr>'; $result .= '<td>File: ' . $v['file'] . ', Line: ' . $v['line'] . '</td>'; $result .= '</tr>'; $result .= '<tr>'; $result .= '<td><pre>' . $v['code'] . '</pre></td>'; $result .= '</tr>'; $result .= '<tr>'; $result .= '<td><pre>' . implode("\n", $v['backtrace']) . '</pre></td>'; $result .= '</tr>'; } $result .= '</table>'; $result .= '</td>'; $result .= '</tr>'; // suppressed $result .= '<tr id="debuging_toolbar_suppressed" class="debuging_toolbar_class" style="display: none;">'; $result .= '<td>'; $result .= '<h3>Suppressed (' . count(self::$data['suppressed']) . ')</h3>'; $result .= '<table border="1" cellpadding="2" cellspacing="2" width="100%">'; foreach (self::$data['suppressed'] as $k => $v) { $result .= '<tr>'; $result .= '<td><b>' . error_base::$error_codes[$v['errno']] . ' (' . $v['errno'] . ') - ' . implode('<br/>', $v['error']) . '</b></td>'; $result .= '</tr>'; $result .= '<tr>'; $result .= '<td>File: ' . $v['file'] . ', Line: ' . $v['line'] . '</td>'; $result .= '</tr>'; $result .= '<tr>'; $result .= '<td><pre>' . $v['code'] . '</pre></td>'; $result .= '</tr>'; } $result .= '</table>'; $result .= '</td>'; $result .= '</tr>'; // javascript $result .= '<tr id="debuging_toolbar_js" class="debuging_toolbar_class" style="display: none;">'; $result .= '<td>'; $result .= '<h3>Javascript Errors (' . count(self::$data['js']) . ')</h3>'; $result .= '<table border="1" cellpadding="2" cellspacing="2" width="100%">'; foreach (self::$data['js'] as $k => $v) { $result .= '<tr>'; $result .= '<td><b>' . implode('<br/>', $v['error']) . '</b></td>'; $result .= '</tr>'; $result .= '<tr>'; $result .= '<td>File: ' . $v['file'] . ', Line: ' . $v['line'] . '</td>'; $result .= '</tr>'; } $result .= '</table>'; $result .= '<div id="debuging_toolbar_js_data">'; $result .= ' '; $result .= '</div>'; $result .= '</td>'; $result .= '</tr>'; // benchmark first $result .= '<tr id="debuging_toolbar_benchmark" class="debuging_toolbar_class" style="display: none;">'; $result .= '<td>'; $result .= '<h3>Benchmark (' . count(self::$data['benchmark']) . ')' . '</h3>'; $result .= '<table border="1" cellpadding="2" cellspacing="2" width="100%">'; $result .= '<tr>'; $result .= '<th>Name</th>'; $result .= '<th>Time</th>'; $result .= '<th>Start</th>'; $result .= '<th>Total</th>'; $result .= '<th>Memory</th>'; $result .= '</tr>'; foreach (self::$data['benchmark'] as $k => $v) { $result .= '<tr>'; $result .= '<td>' . $v['name'] . '</td>'; $result .= '<td align="right">' . $v['time'] . '</td>'; $result .= '<td align="right">' . $v['start'] . '</td>'; $result .= '<td align="right">' . $v['total'] . '</td>'; $result .= '<td align="right">' . format::memory($v['memory'], 'm') . '</td>'; $result .= '</tr>'; } $result .= '</table>'; $result .= '</td>'; $result .= '</tr>'; // sql $result .= '<tr id="debuging_toolbar_sql" class="debuging_toolbar_class" style="display: none;">'; $result .= '<td>'; $result .= '<h3>Sql (' . count(self::$data['sql']) . ')' . '</h3>'; $result .= '<table border="1" cellpadding="2" cellspacing="2" width="100%">'; $result .= '<tr>'; $result .= '<th>Sql</th>'; $result .= '<th>Error</th>'; $result .= '<th>Errno</th>'; $result .= '<th>Num Rows</th>'; $result .= '<th>Affected Rows</th>'; //$result.= '<th>Rows</th>'; $result .= '<th>Key</th>'; $result .= '<th>Structure</th>'; $result .= '<th>Time</th>'; $result .= '</tr>'; foreach (self::$data['sql'] as $k => $v) { $temp = is_array($v['key']) ? implode('<br/>', $v['key']) : $v['key']; // header first $result .= '<tr>'; $result .= '<td valign="top"><pre style="width: 500px;">' . nl2br($v['sql']) . '</pre></td>'; $result .= '<td valign="top">' . implode('<br/>', $v['error']) . ' - ' . implode('<br/>', $v['error_original'] ?? []) . '</td>'; $result .= '<td valign="top">' . $v['errno'] . '</td>'; $result .= '<td valign="top">' . $v['num_rows'] . '</td>'; $result .= '<td valign="top">' . $v['affected_rows'] . '</td>'; //$result.= '<td valign="top">' . html::table(['options' => $v['rows']]) . '</td>'; $result .= '<td valign="top">' . $temp . '</td>'; $result .= '<td valign="top">' . html::table(['options' => $v['structure']]) . '</td>'; $result .= '<td valign="top">' . $v['time'] . '</td>'; $result .= '</tr>'; // results second if (!empty($v['rows'])) { $temp = array_keys(current($v['rows'])); $header = array_combine($temp, $temp); if (!empty($header)) { $result .= '<tr>'; $result .= '<td valign="top" colspan="8" style="max-width: 1000px; overflow: scroll;">' . html::table(['header' => $header, 'options' => $v['rows']]) . '</td>'; $result .= '</tr>'; } } } $result .= '</table>'; $result .= '</td>'; $result .= '</tr>'; // cache $result .= '<tr id="debuging_toolbar_cache" class="debuging_toolbar_class" style="display: none;">'; $result .= '<td>'; $result .= '<h3>Cache (' . count(self::$data['cache']) . ')' . '</h3>'; $result .= '<table border="1" cellpadding="2" cellspacing="2" width="100%">'; $result .= '<tr>'; $result .= '<th>Type</th>'; $result .= '<th>Link</th>'; $result .= '<th>Cache #</th>'; $result .= '<th>Has Data</th>'; $result .= '</tr>'; foreach (self::$data['cache'] as $k => $v) { $result .= '<tr>'; $result .= '<td valign="top">' . $v['type'] . '</td>'; $result .= '<td valign="top">' . $v['link'] . '</td>'; $result .= '<td valign="top">' . $v['cache_id'] . '</td>'; $result .= '<td valign="top">' . ($v['have_data'] ? 'Yes' : 'No') . '</td>'; $result .= '</tr>'; } $result .= '</table>'; $result .= '</td>'; $result .= '</tr>'; // dump $result .= '<tr id="debuging_toolbar_dump" class="debuging_toolbar_class" style="display: none;">'; $result .= '<td>'; $result .= '<h3>Dump (' . count(self::$data['dump']) . ')' . '</h3>'; $result .= '<table border="1" cellpadding="2" cellspacing="2" width="100%">'; $result .= '<tr>'; $result .= '<th>Name</th>'; $result .= '<th>Dump</th>'; $result .= '</tr>'; foreach (self::$data['dump'] as $k => $v) { $result .= '<tr>'; $result .= '<td valign="top">' . $v['name'] . '</td>'; $result .= '<td valign="top"><pre>' . print_r($v['value'], true) . '</pre></td>'; $result .= '</tr>'; } $result .= '</table>'; $result .= '</td>'; $result .= '</tr>'; // input $result .= '<tr id="debuging_toolbar_input" class="debuging_toolbar_class" style="display: none;">'; $result .= '<td>'; $result .= '<h3>Input (' . count(self::$data['input']) . ')' . '</h3>'; $result .= '<table border="1" cellpadding="2" cellspacing="2" width="100%">'; $result .= '<tr>'; $result .= '<th>Input</th>'; $result .= '</tr>'; foreach (self::$data['input'] as $k => $v) { $result .= '<tr>'; $result .= '<td valign="top"><pre>' . print_r($v, true) . '</pre></td>'; $result .= '</tr>'; } $result .= '</table>'; $result .= '</td>'; $result .= '</tr>'; // session $result .= '<tr id="debuging_toolbar_session" class="debuging_toolbar_class" style="display: none;">'; $result .= '<td>'; $result .= '<h3>Session (' . count(self::$data['session']) . ')' . '</h3>'; $result .= '<table border="1" cellpadding="2" cellspacing="2" width="100%">'; $result .= '<tr>'; $result .= '<th>Session</th>'; $result .= '</tr>'; foreach (self::$data['session'] as $k => $v) { $result .= '<tr>'; $result .= '<td valign="top"><pre>' . print_r($v, true) . '</pre></td>'; $result .= '</tr>'; } $result .= '</table>'; $result .= '</td>'; $result .= '</tr>'; // autoloaded classes $result .= '<tr id="debuging_toolbar_classes" class="debuging_toolbar_class" style="display: none;">'; $result .= '<td>'; $result .= '<h3>Loaded Classes (' . count($loaded_classes) . ')</h3>'; $result .= '<table border="1" cellpadding="2" cellspacing="2" width="100%">'; $result .= '<tr>'; $result .= '<th>Class Name</th>'; $result .= '<th>File</th>'; $result .= '<th>Media</th>'; $result .= '</tr>'; foreach ($loaded_classes as $k => $v) { $result .= '<tr>'; $result .= '<td><b>' . $v['class'] . '</b></td>'; $result .= '<td>' . $v['file'] . '</td>'; $result .= '<td>' . html::table(['options' => $v['media']]) . '</td>'; $result .= '</tr>'; } $result .= '</table>'; $result .= '</td>'; $result .= '</tr>'; // application $result .= '<tr id="debuging_toolbar_application" class="debuging_toolbar_class" style="display: none;">'; $result .= '<td>'; $result .= '<h3>Application (' . count($application) . ')</h3>'; $result .= print_r2($application, true); $result .= '</td>'; $result .= '</tr>'; // phpinfo $result .= '<tr id="debuging_toolbar_phpinfo" class="debuging_toolbar_class" style="display: none;">'; $result .= '<td>'; $result .= '<h3>PHPInfo</h3>'; helper_ob::start(); phpinfo(); $str = helper_ob::clean(); $str = preg_replace('%^.*<body>(.*)</body>.*$%ms', '$1', $str); $str .= <<<TTT \t\t\t\t\t\t\t<style type="text/css"> \t\t\t\t\t\t\t\t#phpinfo table { \t\t\t\t\t\t\t\t\tborder: 1px solid #000; \t\t\t\t\t\t\t\t} \t\t\t\t\t\t\t\t#phpinfo table tr { \t\t\t\t\t\t\t\t\tborder-bottom: 1px solid #000; \t\t\t\t\t\t\t\t} \t\t\t\t\t\t\t</style> TTT; $result .= '<div id="phpinfo">' . $str . '</div>'; $result .= '</td>'; $result .= '</tr>'; // acls $result .= '<tr id="debuging_toolbar_acls" class="debuging_toolbar_class" style="display: none;">'; $result .= '<td>'; $result .= '<h3>Acls (' . count(debug::$data['acls']) . ')</h3>'; $result .= print_r2(debug::$data['acls'], true); $result .= '</td>'; $result .= '</tr>'; $result .= '</table>'; $result .= '</div>'; return $result; }
/** * Render * * @param string $type * @return string */ public function render($type) { $result = ''; $session = new session(); // main switch switch ($type) { case 'pdf': // document properties $this->header['pdf']['orientation'] = isset($this->header['pdf']['orientation']) ? $this->header['pdf']['orientation'] : 'P'; $this->header['pdf']['unit'] = 'mm'; $this->header['pdf']['format'] = isset($this->header['pdf']['format']) ? $this->header['pdf']['format'] : 'LETTER'; $this->header['pdf']['encoding'] = isset($this->header['pdf']['encoding']) ? $this->header['pdf']['encoding'] : 'UTF-8'; $this->header['pdf']['font'] = isset($this->header['pdf']['font']) ? $this->header['pdf']['font'] : array('family' => 'helvetica', 'style' => '', 'size' => 8); //include 'tcpdf/tcpdf.php'; // create new PDF document $pdf = new TCPDF($this->header['pdf']['orientation'], $this->header['pdf']['unit'], $this->header['pdf']['format'], true, $this->header['pdf']['encoding'], false); // set margins $pdf->SetMargins(0, 0, 0); $pdf->setPrintHeader(false); // disable auto break $pdf->SetAutoPageBreak(false, 0); // set default font subsetting mode $pdf->setFontSubsetting(true); // set color for background $pdf->SetFillColor(255, 255, 255); // set font $pdf->SetFont($this->header['pdf']['font']['family'], $this->header['pdf']['font']['style'], $this->header['pdf']['font']['size']); // stats $page_counter = 1; $page_y = 0; $flag_new_page = true; $flag_filter = true; $flag_first_row = true; $columns = array(); $all_columns = array(); // gethering all columns foreach ($this->data as $k => $v) { if ($v['t'] == 'columns') { $all_columns[] = $v; } } // looping through the data foreach ($this->data as $k => $v) { if ($v['t'] == 'columns') { continue; } if ($flag_new_page) { // add new page $pdf->AddPage($this->header['pdf']['orientation'], '', true); // drawing header $pdf->MultiCell(40, 5, format::datetime(format::now()), 0, 'L', 1, 0, 5, 5, true, 0, false, true, 10, 'T'); // company + book name $pw = $pdf->getPageWidth(); $pdf->SetFont($this->header['pdf']['font']['family'], 'B', $this->header['pdf']['font']['size']); // todo: fix here $pdf->MultiCell($pw - 90, 5, $session->company_name . ': ' . $session->book_name, 0, 'C', 1, 0, 40, 5, true, 0, false, true, 10, 'T'); // page counter $pdf->SetFont($this->header['pdf']['font']['family'], '', $this->header['pdf']['font']['size']); $pdf->MultiCell(40, 5, 'Page ' . $page_counter, 0, 'R', 1, 0, $pw - 45, 5, true, 0, false, true, 10, 'T'); // report name $pdf->SetFont($this->header['pdf']['font']['family'], 'B', $this->header['pdf']['font']['size']); $report_name = $this->header['name'] . ' (' . implode('-', application::get(array('mvc', 'controllers'))) . ')'; $pdf->MultiCell($pw - 10, 5, $report_name, 0, 'L', 1, 0, 5, 10, true, 0, false, true, 10, 'T'); if (isset($this->header['description'])) { $pdf->SetFont($this->header['pdf']['font']['family'], 'B', $this->header['pdf']['font']['size']); $pdf->MultiCell(205, 5, $this->header['description'], 0, 'L', 1, 0, 5, 15, true, 0, false, true, 10, 'T'); $page_y = 25; } else { $page_y = 20; } // if we need to add a filter if ($flag_filter) { if (isset($this->header['filter'])) { foreach ($this->header['filter'] as $k2 => $v2) { $pdf->SetFont($this->header['pdf']['font']['family'], 'B', $this->header['pdf']['font']['size']); $pdf->MultiCell(50, 5, $k2 . ':', 0, 'L', 1, 0, 5, $page_y, true, 0, false, true, 10, 'T'); $pdf->SetFont($this->header['pdf']['font']['family'], '', $this->header['pdf']['font']['size']); $number_of_cells = $pdf->MultiCell($pdf->getPageWidth() - 60, 5, $v2, 0, 'L', 1, 0, 55, $page_y, true, 0, false, true, 10, 'T'); if ($number_of_cells > 1) { $page_y += 5 * ($number_of_cells - 1); } $page_y += 5; } } $flag_filter = false; // adding one line space $page_y += 5; } // page counter $page_counter++; $flag_new_page = false; } // rendering rows if ($flag_first_row) { if (empty($columns)) { $columns = current($all_columns); // repopulate width $count_empty = 0; $taken = 0; foreach ($columns['d'] as $k2 => $v2) { if (empty($v2['w'])) { $count_empty++; } else { $taken += $v2['w']; } } if (!empty($count_empty)) { $new_width = floor(($pdf->getPageWidth() - 10 - $taken) / $count_empty); foreach ($v['d'] as $k2 => $v2) { $columns['d'][$k2]['w'] = $new_width; } } } $flag_first_row = false; // columns foreach ($all_columns as $k20 => $v20) { $x = 5; foreach ($columns['d'] as $k10 => $v10) { foreach (array('v', 'c', 'a', 'b', 's', 't', 'u') as $v30) { if (isset($v20['d'][$k10][$v30])) { $v10[$v30] = $v20['d'][$k10][$v30]; } } $new_width = @$v10['w']; if (!empty($v10['c'])) { // we need to get width of next elements for ($i = $k10 + 1; $i < $k10 + $v10['c']; $i++) { $new_width += $columns['d'][$k10]['w']; } } $align = str_replace(array('left', 'right', 'center'), array('L', 'R', 'C'), @$v10['a']); if (empty($align)) { $align = 'L'; } if (@$v10['b']) { $pdf->SetFont($this->header['pdf']['font']['family'], 'B', $this->header['pdf']['font']['size']); } else { $pdf->SetFont($this->header['pdf']['font']['family'], '', $this->header['pdf']['font']['size']); } $pdf->MultiCell($new_width, 5, @$v10['v'], $this->flag_pdf_show_borders, $align, 1, 0, $x, $page_y, true, 0, false, true, 10, 'T'); // underline if (@$v10['u']) { $pdf->SetLineStyle(array('width' => 0, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(0, 0, 0))); $pdf->Line($x, $page_y + 5, $x + @$v10['w'], $page_y + 5); } $x += @$v10['w']; } $page_y += 5; } } $pdf->SetFont($this->header['pdf']['font']['family'], '', $this->header['pdf']['font']['size']); $x = 5; foreach ($columns['d'] as $k10 => $v10) { // we do do render cells if no data if (isset($v['d'][$k10]['v'])) { $align = str_replace(array('left', 'right', 'center'), array('L', 'R', 'C'), @$v['d'][$k10]['a']); if (empty($align)) { $align = 'L'; } if (@$v['d'][$k10]['b']) { $pdf->SetFont($this->header['pdf']['font']['family'], 'B', $this->header['pdf']['font']['size']); } else { $pdf->SetFont($this->header['pdf']['font']['family'], '', $this->header['pdf']['font']['size']); } // if we override width $width = $v10['w']; if (isset($v['d'][$k10]['w'])) { $width = $v['d'][$k10]['w']; } else { if (isset($v['d'][$k10]['c'])) { // colspan // we need to get width of next elements for ($i = $k10 + 1; $i < $k10 + $v['d'][$k10]['c']; $i++) { $width += @$columns['d'][$i]['w']; } } } $value = @$v['d'][$k10]['v']; $value = str_replace(' ', ' ', $value); // rendering cell $pdf->MultiCell($width, 5, $value, $this->flag_pdf_show_borders, $align, 1, 0, $x, $page_y, true, 0, false, true, 10, 'T'); // underline if (@$v['d'][$k10]['u']) { $pdf->SetLineStyle(array('width' => 0, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(0, 0, 0))); $pdf->Line($x, $page_y + 5, $x + $v10['w'], $page_y + 5); } // subtotal if (@$v['d'][$k10]['s']) { $pdf->SetLineStyle(array('width' => 0, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(0, 0, 0))); $pdf->Line($x + 1, $page_y, $x + $v10['w'] - 1, $page_y); } // total if (@$v['d'][$k10]['t']) { $pdf->SetLineStyle(array('width' => 0, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(0, 0, 0))); $pdf->Line($x + 1, $page_y, $x + $v10['w'] - 1, $page_y); $pdf->Line($x + 1, $page_y - 0.75, $x + $v10['w'] - 1, $page_y - 0.75); } } $x += @$v10['w']; } // incrementing $page_y += 5; if ($page_y > $pdf->getPageHeight() - 10) { $flag_new_page = true; $flag_first_row = true; } } $pdf->Output($this->header['name'] . '.pdf', 'I'); exit; break; case 'csv': case 'txt': case 'xlsx': $sheet = strip_tags($this->header['name']); $sheet = str_replace(['/', '\\'], '', $sheet); // generating header $header = []; $header[$sheet][] = [format::datetime(format::now()), '', $session->company_name . ': ' . $session->book_name, '', 'Page 1']; $controllers = application::get(['mvc', 'controllers']); $header[$sheet][] = [strip_tags($this->header['name']) . ' (' . implode('-', $controllers) . ')']; if (isset($this->header['description'])) { $header[$sheet][] = [$this->header['description']]; } $header[$sheet][] = [' ']; $temp = $header; // displaying filter if (isset($this->header['filter'])) { $temp2 = []; foreach ($this->header['filter'] as $k => $v) { $temp[$sheet][] = [strip_tags($k), strip_tags($v)]; } $temp[$sheet][] = [' ']; } // converting data foreach ($this->data as $k => $v) { $temp2 = []; foreach ($v['d'] as $k2 => $v2) { if (is_array($v2)) { $value = $v2['v'] ?? null; } else { $value = $v2; } // replaces $value = str_replace(' ', ' ', $value); $temp2[] = strip_tags($value); } $temp[$sheet][] = $temp2; } // get output buffering helper_ob::clean_all(); // content switch ($type) { case 'xlsx': echo io::array_to_excel($temp, io::$formats[$type]['excel_code'], null); break; default: // csv or text header('Content-Type: ' . numbers_frontend_exports_csv_base::$formats[$type]['content_type']); header('Content-Disposition: attachment; filename="' . $sheet . '.' . $type . '"'); header('Cache-Control: max-age=0'); echo numbers_frontend_exports_csv_base::array_to_csv($temp, numbers_frontend_exports_csv_base::$formats[$type]['delimiter'], numbers_frontend_exports_csv_base::$formats[$type]['enclosure']); } exit; break; case 'html': case 'html2': default: // rendering data $table = ['options' => []]; $counter = 1; foreach ($this->data as $k => $v) { $flag_colspan = 0; $row = []; if (!empty($v['d'])) { foreach ($v['d'] as $k2 => $v2) { if ($flag_colspan > 0) { $flag_colspan--; continue; } $colspan = ''; if ($v2['c'] ?? null) { $colspan = $v2['c']; $flag_colspan = $v2['c'] - 1; } $align = 'left'; $title = ''; $style = ''; if (is_array($v2)) { $value = $v2['v'] ?? null; if (!empty($v2['h'])) { $v2['h']['value'] = $value; $value = html::a($v2['h']); } if (!empty($v2['a'])) { $align = $v2['a']; } if (!empty($v2['l'])) { $title = $v2['l']; } // bold lines if ($v2['b'] ?? null) { $value = '<b>' . $value . '</b>'; } // todo: convert styles to classes if ($v2['s'] ?? null) { $style .= 'border-top: 1px solid #000;'; } if ($v2['t'] ?? null) { $style .= 'border-top: 3px double #000;'; } if ($v2['u'] ?? null) { $style .= 'border-bottom: 1px solid #000;'; } } else { $value = $v2; } $row[$k2] = ['value' => $value, 'align' => $align, 'colspan' => $colspan, 'style' => $style, 'title' => $title, 'nowrap' => true]; } } else { $row[0] = ['value' => ' ']; } $table['options'][$counter] = $row; $counter++; } $result = html::table($table); // printable export if ($type == 'html2') { $header = ['options' => []]; $header['options'][] = [0 => format::datetime(format::now()), 1 => '', 2 => $session->company_name . ': ' . $session->book_name, 3 => '', 4 => 'Page 1']; $controllers = application::get(['mvc', 'controllers']); $header['options'][] = [['value' => strip_tags($this->header['name']) . ' (' . implode('-', $controllers) . ')', 'colspan' => 5]]; if (isset($this->header['description'])) { $header['options'][] = [$this->header['description']]; } $header['options'][] = [' ']; // displaying filter if (isset($this->header['filter'])) { $temp2 = []; foreach ($this->header['filter'] as $k => $v) { $header['options'][] = [strip_tags($k) . ':', strip_tags($v)]; } $header['options'][] = [' ']; } $header = html::table($header); layout::render_as($header . $result, 'text/html'); } } return $result; }
/** * Render as content type, non html output should go though this function * * @param mixed $data * @param string $content_type */ public static function render_as($data, $content_type) { // clena up output buffer helper_ob::clean_all(); application::set('flag.global.__content_type', $content_type); application::set('flag.global.__skip_layout', 1); header("Content-type: " . $content_type); switch ($content_type) { case 'application/json': echo json_encode($data); break; case 'text/html': helper_ob::start(); require application::get(['application', 'path_full']) . 'layout/blank.html'; $from = ['<!-- [numbers: document title] -->', '<!-- [numbers: document body] -->']; $to = [layout::render_document_title(), $data]; echo str_replace($from, $to, helper_ob::clean()); break; default: echo $data; } exit; }