PHP 8.3.27
Preview: class.import.php Size: 6.90 KB
/home7/doctorbruno/public_html/taeionline.com/support/include/class.import.php
<?php
/*********************************************************************
    class.import.php

    Utilities for importing objects and data (usually via CSV)

    Peter Rotich <peter@osticket.com>
    Jared Hancock <jared@osticket.com>
    Copyright (c)  2006-2015 osTicket
    http://www.osticket.com

    Released under the GNU General Public License WITHOUT ANY WARRANTY.
    See LICENSE.TXT for details.

    vim: expandtab sw=4 ts=4 sts=4:
**********************************************************************/

class ImportError extends Exception {}
class ImportDataError extends ImportError {}

class CsvImporter {
    // Bytes sequence of common BOM
    const BOMs = array(
                 'UTF8' => "\xEF\xBB\xBF",
                 'UTF16_BE' => "\xFE\xFF",
                 'UTF16_LE' => "\xFF\xFE",
                 'UTF32_BE' => "\x00\x00\xFE\xFF",
                 'UTF32_LE' => "\xFF\xFE\x00\x00");
    var $stream;

    function __construct($stream) {
        // File upload
        if (is_array($stream) && !$stream['error']) {
            $this->stream = fopen($stream['tmp_name'], 'r');
            // Skip Byte Order Mark (BOM) if present
            if (!self::isBOM(fgets($this->stream, 4)))
                rewind($this->stream);
        }
        // Open file
        elseif (is_resource($stream)) {
            $this->stream = $stream;
        }
        // Text from standard-in
        elseif (is_string($stream)) {
            $this->stream = fopen('php://temp', 'w+');
            fwrite($this->stream, $stream);
            rewind($this->stream);
        }
        else {
            throw new ImportError(__('Unable to parse submitted csv: ').print_r(Format::htmlchars($stream), true));
        }
    }

    function __destruct() {
        fclose($this->stream);
    }

    function importCsv($all_fields=array(), $defaults=array()) {
        $named_fields = array();
        $has_header = true;
        foreach ($all_fields as $f)
            if ($f->get('name'))
                $named_fields[$f->get('name')] = $f;

        // Read the first row and see if it is a header or not
        if (!($data = fgetcsv($this->stream, 1000, ",", "\"", "")))
            throw new ImportError(__('Whoops. Perhaps you meant to send some CSV records'));

        $headers = array();
        foreach (Format::htmlchars($data) as $h) {
            $h = trim($h);
            $found = false;
            foreach ($all_fields as $f) {
                if (in_array(mb_strtolower($h), array(
                        mb_strtolower($f->get('name')), mb_strtolower($f->get('label'))))) {
                    $found = true;
                    if (!$f->get('name'))
                        throw new ImportError(sprintf(__(
                            '%s: Field must have `variable` set to be imported'), Format::htmlchars($h)));
                    $headers[$f->get('name')] = $f->get('label');
                    break;
                }
            }
            if (!$found) {
                $has_header = false;
                if (count($data) == count($named_fields)) {
                    // Number of fields in the user form matches the number
                    // of fields in the data. Assume things line up
                    $headers = array();
                    foreach ($named_fields as $f)
                        $headers[$f->get('name')] = $f->get('label');
                    break;
                }
                else {
                    throw new ImportError(sprintf(
                                __('%s: Unable to map header to the object field'), Format::htmlchars($h)));
                }
            }
        }

        if (!$has_header)
            fseek($this->stream, 0);

        $objects = $fields = array();
        foreach ($headers as $h => $label) {
            if (!isset($named_fields[$h]))
                continue;

            $f = $named_fields[$h];
            $name = $f->get('name');
            $fields[$name] = $f;
        }

        // Add default fields (org_id, etc).
        foreach ($defaults as $key => $val) {
            // Don't apply defaults which are also being imported
            if (isset($header[$key]))
                unset($defaults[$key]);
        }

        // Avoid reading the entire CSV before yielding the first record.
        // Use an iterator. This will also allow row-level errors to be
        // continuable such that the rows with errors can be handled and the
        // iterator can continue with the next row.
        return new CsvImportIterator($this->stream, $headers, $fields, $defaults);
    }

    // Check if a string matches a BOM
    static function isBOM($str) {
        return in_array($str, self::BOMs);
    }
}

class CsvImportIterator
implements Iterator {
    var $stream;
    var $start = 0;
    var $headers;
    var $fields;
    var $defaults;

    var $current = true;
    var $row = 0;

    function __construct($stream, $headers, $fields, $defaults) {
        $this->stream = $stream;
        $this->start = ftell($stream);
        $this->headers = $headers;
        $this->fields = $fields;
        $this->defaults = $defaults;
    }

    // Iterator interface -------------------------------------
    function rewind() {
        @fseek($this->stream, $this->start);
        if (ftell($this->stream) != $this->start)
            throw new RuntimeException('Stream cannot be rewound');
        $this->row = 0;
        $this->next();
    }
    function valid() {
        return $this->current;
    }
    function current() {
        return $this->current;
    }
    function key() {
        return $this->row;
    }

    function next() {
        do {
            if (($csv = fgetcsv($this->stream, 4096, ",", "\"", "")) === false) {
                // Read error
                $this->current = false;
                break;
            }

            if (count($csv) == 1 && $csv[0] == null)
                // Skip empty rows
                continue;
            elseif (count($csv) != count($this->headers))
                throw new ImportDataError(sprintf(__('Bad data. Expected: %s'),
                    implode(', ', $this->headers)));

            // Validate according to field configuration
            $i = 0;
            $this->current = $this->defaults;
            foreach ($this->headers as $h => $label) {
                $f = $this->fields[$h];
                $f->_errors = array();
                $T = $f->parse(trim($csv[$i]));
                if ($f->validateEntry($T) && $f->errors())
                    throw new ImportDataError(sprintf(__(
                        /* 1 will be a field label, and 2 will be error messages */
                        '%1$s: Invalid data: %2$s'),
                        $label, implode(', ', $f->errors())));
                // Convert to database format
                $this->current[$h] = $f->to_database($T);
                $i++;
            }
        }
        // Use the do-loop only for the empty line skipping
        while (false);
        $this->row++;
    }
}

Directory Contents

Dirs: 11 × Files: 132
Name Size Perms Modified Actions
cli DIR
- drwxr-xr-x 2026-10-02 10:08:28
Edit Download
client DIR
- drwxr-xr-x 2026-10-02 10:08:28
Edit Download
config DIR
- drwxr-xr-x 2017-09-15 04:26:55
Edit Download
fpdf DIR
- drwxr-xr-x 2026-10-02 10:08:28
Edit Download
i18n DIR
- drwxr-xr-x 2026-10-02 10:08:28
Edit Download
- drwxr-xr-x 2026-10-02 10:08:28
Edit Download
mpdf DIR
- drwxr-xr-x 2026-10-02 10:08:28
Edit Download
pear DIR
- drwxr-xr-x 2026-10-02 10:08:29
Edit Download
plugins DIR
- drwxr-xr-x 2026-10-02 10:08:29
Edit Download
staff DIR
- drwxr-xr-x 2026-10-02 10:08:29
Edit Download
upgrader DIR
- drwxr-xr-x 2026-10-02 10:08:29
Edit Download
14 B lrw-r--r-- 2025-02-04 09:58:56
Edit Download
194.97 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
7.29 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
4.61 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
9.76 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
13.03 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
2.33 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
1006 B lrw-r--r-- 2025-02-04 09:58:56
Edit Download
874 B lrw-r--r-- 2025-02-04 09:58:56
Edit Download
13.84 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
5.10 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
2.93 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
2.05 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
11.73 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
2.15 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
4.29 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
12.72 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
3.20 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
11.62 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
33.87 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
8.81 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
79.70 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
1.66 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
2.24 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
18.33 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
1.06 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
10.36 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
7.76 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
1.45 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
15.31 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
1.49 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
6.95 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
50.73 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
6.44 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
2.58 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
4.07 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
7.08 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
9.05 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
1.73 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
11.14 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
3.41 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
9.48 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
15.39 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
5.65 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
2.65 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
60.36 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
1.15 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
3.60 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
18.92 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
2.38 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
33.21 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
7.12 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
6.23 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
64.98 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
49.00 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
1.69 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
32.92 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
15.05 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
34.59 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
31.90 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
23.67 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
44.30 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
195.58 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
7.16 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
24.28 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
6.90 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
2.71 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
5.80 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
42.00 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
4.05 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
1.55 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
35.76 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
25.75 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
9.72 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
30.99 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
6.42 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
5.20 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
7.50 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
2.30 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
14.15 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
2.39 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
4.04 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
22.45 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
120.90 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
20.64 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
21.86 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
10.59 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
5.53 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
1.21 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
3.83 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
36.13 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
1.81 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
103.51 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
11.76 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
11.27 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
46.28 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
61.66 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
7.27 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
19.25 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
3.55 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
4.16 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
9.11 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
60.21 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
56.21 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
12.31 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
23.45 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
108.96 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
17.08 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
167.39 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
21.94 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
20.06 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
34.79 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
13.76 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
43.40 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
7.55 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
10.07 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
12.94 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
11.93 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
3.23 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
1.15 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
33.71 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
53.53 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
37 B lrw-r--r-- 2025-02-04 09:58:56
Edit Download
44 B lrw-r--r-- 2026-10-02 10:08:28
Edit Download
33.13 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
9.55 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
5.63 KB lr--r--r-- 2017-09-16 04:37:08
Edit Download
6.24 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
6.92 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
31.74 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
19.82 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
8.61 KB lrw-r--r-- 2025-02-04 09:58:56
Edit Download
If ZipArchive is unavailable, a .tar will be created (no compression).