1 |
<?php |
2 |
/** |
3 |
* This file contains the DataListSource class |
4 |
* that gets the data from a CSV formatted file. |
5 |
* |
6 |
* |
7 |
* $Id: CSVFILEDataListSource.inc,v 1.6 2004/03/24 22:44:19 hemna Exp $ |
8 |
* |
9 |
* @author Walter A. Boring IV <waboring@buildabetterweb.com> |
10 |
* @package phpHtmlLib |
11 |
*/ |
12 |
|
13 |
require_once($phphtmllib."/widgets/data_list/ArrayDataListSource.inc"); |
14 |
|
15 |
|
16 |
|
17 |
/** |
18 |
* |
19 |
* This DataListSource child class gets the data from a |
20 |
* CSV (comma seperated values) file on disk. |
21 |
* |
22 |
* The CSV MUST have a 'header' line before any data. |
23 |
* The 'header' line is a CSV line that provides a name |
24 |
* for each column of data in the file. |
25 |
* |
26 |
* All lines that start with '#' or '//' are ignored as |
27 |
* comments. |
28 |
* |
29 |
* |
30 |
* @author Walter A. Boring IV <waboring@buildabetterweb.com> |
31 |
* @package phpHtmlLib |
32 |
*/ |
33 |
class CSVFILEDataListSource extends ArrayDataListSource { |
34 |
|
35 |
|
36 |
/** |
37 |
* The csv file name/path on disk |
38 |
* |
39 |
*/ |
40 |
var $_filename = NULL; |
41 |
|
42 |
/** |
43 |
* The file descriptor pointer |
44 |
* |
45 |
*/ |
46 |
var $_fp = NULL; |
47 |
|
48 |
|
49 |
/** |
50 |
* this holds the headers read |
51 |
* from the top of the csv file |
52 |
*/ |
53 |
var $_csv_headers = array(); |
54 |
|
55 |
/** |
56 |
* The length of the longest |
57 |
* line in the csv file |
58 |
* (so we read the line properly) |
59 |
*/ |
60 |
var $_maxlinelength=4096; |
61 |
|
62 |
|
63 |
|
64 |
/** |
65 |
* The constructor. |
66 |
* |
67 |
* @param string - the path to the CSV file on |
68 |
* on disk to use as the data source. |
69 |
* |
70 |
*/ |
71 |
function CSVFILEDataListSource( $filename, $maxline=4096 ) { |
72 |
if (!file_exists($filename)) { |
73 |
user_error("CSVFILEDataListSource:: (".$filename.") ". |
74 |
"can't be found."); |
75 |
} else { |
76 |
$this->_filename = $filename; |
77 |
$this->_fp = fopen( $filename, 'r'); |
78 |
if (!$this->_fp) { |
79 |
user_error("CSVFILEDataListSource:: (".$filename.") ". |
80 |
"cannot be opened"); |
81 |
} |
82 |
} |
83 |
$this->_maxlinelength = $maxline; |
84 |
} |
85 |
|
86 |
|
87 |
/** |
88 |
* The prequery. We use this to read the file |
89 |
* into memory so we can do operations on the data |
90 |
* (search, sort, etc.) |
91 |
*/ |
92 |
function do_prequery() { |
93 |
$this->_get_header(); |
94 |
} |
95 |
|
96 |
/** |
97 |
* This function does the query |
98 |
* and search/sort |
99 |
*/ |
100 |
function do_query() { |
101 |
|
102 |
//we always want to filter. |
103 |
//because we read the entry, |
104 |
//then filter it. |
105 |
$this->_prequery_filter(); |
106 |
|
107 |
$count = count($this->_data); |
108 |
|
109 |
if ($count > 0) { |
110 |
$this->set_total_rows( $count ); |
111 |
$this->sort(); |
112 |
return true; |
113 |
} else { |
114 |
return false; |
115 |
} |
116 |
} |
117 |
|
118 |
/** |
119 |
* Lets walk the file and read the entry, and |
120 |
* filter what we don't want. |
121 |
* |
122 |
*/ |
123 |
function _prequery_filter() { |
124 |
$count=0; |
125 |
while ($line = fgets($this->_fp, $this->_maxlinelength)) { |
126 |
if ($this->add_data_row( $this->_construct_row(trim($line)))) { |
127 |
$count++; |
128 |
} |
129 |
} |
130 |
|
131 |
//close the file |
132 |
fclose($this->_fp); |
133 |
} |
134 |
|
135 |
|
136 |
/** |
137 |
* This file trys to get the CSV header. |
138 |
* |
139 |
*/ |
140 |
function _get_header() { |
141 |
$done = FALSE; |
142 |
while (!$done) { |
143 |
$line = trim(fgets($this->_fp,$this->_maxlinelength)); |
144 |
if (strncmp('#', $line, 1) != 0 && |
145 |
strncmp('//', $line, 2) != 0 && !empty($line)) { |
146 |
$this->_csv_headers = explode(',', $line); |
147 |
$done = TRUE; |
148 |
} |
149 |
} |
150 |
} |
151 |
|
152 |
|
153 |
/** |
154 |
* this is used to build a row |
155 |
* from a csv line |
156 |
* |
157 |
* @param string - the original csv line from the file |
158 |
* @return array |
159 |
*/ |
160 |
function _construct_row( $line ) { |
161 |
$row = NULL; |
162 |
if (strncmp('#', $line, 1) != 0 && |
163 |
strncmp('//', $line, 2) != 0 && !empty($line)) { |
164 |
$tmp = explode(",", $line); |
165 |
|
166 |
$row = array(); |
167 |
foreach( $this->_csv_headers as $index => $name ) { |
168 |
$row[$name] = $tmp[$index]; |
169 |
} |
170 |
} |
171 |
return $row; |
172 |
} |
173 |
|
174 |
|
175 |
|
176 |
/** |
177 |
* This function adds a row of data |
178 |
* if necesarry to the data array |
179 |
* |
180 |
*/ |
181 |
function add_data_row($row) { |
182 |
if ($row != NULL) { |
183 |
if ($this->get_searchby_value()) { |
184 |
//user wants to search the data |
185 |
if ($this->_find_data($row) ) { |
186 |
$this->_data[] = $row; |
187 |
return TRUE; |
188 |
} else { |
189 |
return FALSE; |
190 |
} |
191 |
} else { |
192 |
$this->_data[] = $row; |
193 |
return TRUE; |
194 |
} |
195 |
} else { |
196 |
return FALSE; |
197 |
} |
198 |
} |
199 |
} |
200 |
?> |