Пример #1
0
 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;
 }
Пример #2
0
 /**
  * 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();
     }
 }
Пример #3
0
 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');
     }
 }
Пример #4
0
    /**
     * 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>&nbsp;' . html::a(['value' => 'Hide All', 'href' => 'javascript:void(0);', 'onclick' => "\$('.debuging_toolbar_class').hide();"]) . '&nbsp;</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>&nbsp;' . html::a(['value' => ucwords($k) . ' (' . $count . ')', 'id' => "debuging_toolbar_{$k}_a", 'href' => 'javascript:void(0);', 'onclick' => "\$('#debuging_toolbar_{$k}').toggle();"]) . '&nbsp;</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 .= '&nbsp;';
        $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;
    }
Пример #5
0
 /**
  * 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('&nbsp;', ' ', $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('&nbsp;', ' ', $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' => '&nbsp;'];
                 }
                 $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'][] = ['&nbsp;'];
                 // 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'][] = ['&nbsp;'];
                 }
                 $header = html::table($header);
                 layout::render_as($header . $result, 'text/html');
             }
     }
     return $result;
 }
Пример #6
0
 /**
  * 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;
 }