Subversion Repositories phpLibraryV2

Rev

Rev 10 | Rev 37 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1 rodolico 1
<?php
2
 
3
   /* 
4
      This class simply extends DBQuery to allow output to be converted to HTML
5
   */
6
 
34 rodolico 7
   require_once( 'DBQuery.class.php' );
1 rodolico 8
 
9
   class DBQueryHTML extends DBQuery {
10
 
11
      /*
12
         Function takes an SQL statement and converts it to an HTML table.
13
         Return Value: HTML table representation of the query
14
         Parameters:
15
            $sql    A valid SQL query to run
16
            $format An optional array of format strings (suitable for printf) for each column (empty strings ignored)
17
            $makeTableDef  If True, the resulting HTML has the <table></table> tags; otherwise starts with header
18
            $append   Arbitrary string that is appended as a single column to each row
19
 
20
            NOTE ON $append
21
               $append may optionally contain variables of the form %colname%, which will be replaced
22
               with values from the current row. $colname is taken from the META data from the query, thus
23
               the query select foo from bar would have a meta of header of foo for column 0.
24
               $append is searched for strings of form %foo% in that case, and the current value of column
25
               foo replaces the tag %foo%.
26
               %foo% is ignored if foo is not a valid column name in a query.
27
               thus, a query such as select zip,city,state from zip_codes and a string of Hello %city% I'm glad
28
               you are in %State% will not replace the second as State is not a column of this query (it is case
29
               sensitive). Also, beware of items like select zip,concat(state,', ', city) from zip_codes. It is
30
               much better to rewrite that as select zip,concat(state,', ', city) mytown from zip_codes.
31
 
32
               If you don't know what all that means, get a book on SQL
33
      */
34
      function queryToTable ( $format = '', $makeTableDef = true, $append='', $headers = '' ) {
35
         print "\n\n<pre>$this->query</pre>\n\n";
36
         $tdTextDefinition = '<td valign=' . HTML_QUOTE_CHAR . 'top' . HTML_QUOTE_CHAR . '>';
37
         $tdNumberDefinition = '<td valign=' . HTML_QUOTE_CHAR .'top' . HTML_QUOTE_CHAR . 'align=' . HTML_QUOTE_CHAR . 'right' . HTML_QUOTE_CHAR . '>';
38
         $html = '';
39
         $rows = array();
40
         $save = $this->useAssociativeArray;
41
         $this->useAssociativeArray = false; // temporarily turn off associative arrays
42
         $this->run();
43
         if ( $this->rowsAffected ) { // we returned at least one row
44
            // Build the searchFor array for $append
45
            $searchFor = array();
46
            foreach ( $this->columnMetaData as $field ) {
47
               $searchFor[] = '%' . $field['name'] . '%';
48
            }
49
            /* special condition where only one row is returned. In that case, $this->returnData is not an array
50
            of associations, but a simple association. In this case, we need to convert it
51
            */
52
            if (count($this->returnData[0]) == 1) { // convert from association to single row array of associations
53
               $temp = array();
54
               foreach ($this->returnData as $column => $value) {
55
                  $temp[0][$column] = $value;
56
               } // foreach
57
               $this->returnData = $temp;
58
            }
59
            if (count($format) > 0 ) { // we have some formats, so let's do it the hard, slow way
60
               for ( $row = 0; $row < count($this->returnData); $row++) {
61
                  $rows[$row] = '';
62
                  for ( $column = 0; $column < count($this->returnData[$row]); $column++  ) {
63
                     $rows[$row] .= strlen($format[$column]) && isset($this->returnData[$row][$column])> 0 ?
64
                                    ( $tdNumberDefinition . sprintf($format[$column],$this->returnData[$row][$column]) . '</td>')
65
                                    : ($tdTextDefinition . $this->returnData[$row][$column] . '</td>');
66
                  } // for $column
67
                  /*
68
                     let's append some stuff to the row if it exists.
69
                     We will take the array of SearchFor containing the column names
70
                     and the array of values from this row, then look for matches and replace them
71
                     with the correct values. Note, the column names in $append should have percent
72
                     signs appended and prepended, thus a column name of joe would be %joe% in %append
73
                  */
74
                  if (strlen($append) > 0) { // let's append some stuff to the row
75
                     $rows[$row] .= $tdTextDefinition . str_replace ( $searchFor, $this->returnData[$row], $append ) . '</td>';
76
                  }
77
               } // for $row
78
            } else { // no formatting, so we just slam the stuff together
79
               for ( $row = 0; $row < count($this->returnData); $row++) {
80
                  $currentValue = $tdTextDefinition . implode( '</td>' . $tdTextDefinition, $this->returnData[$row]) . '</td>';
81
                  if (strlen($append) > 0) { // see explaination in if part of this structure
82
                     $currentValue  .= $tdTextDefinition . str_replace ( $searchFor, $this->returnData[$row], $append ) . '</td>';
83
                  }
84
                  $rows[] = $currentValue;
85
               }
86
            }
87
            // ok, let's get the field headers from the table
88
            $html .= '<tr>';
89
            if ( $headers ) { // user has passed in some header fields for us to use
90
               $html .= '<th>' . implode( '</th><th>',  $headers ) . '</th>';
91
            } else { // no headers, so we just get them from the returned column names
92
               foreach ( $this->columnMetaData as $field ) {
93
                  $html .= '<th>' . $field['name'] . '</th>';
94
               }
95
            } // if headers .. else
96
            $html .= '</tr>';
97
            // we now have all the info, so let's make it into a table
98
            $html .= '<tr>' . implode('</tr><tr>', $rows ) . '</tr>';
99
         } else {
100
            $html = '<tr><td>No rows returned by the query</td></tr>';
101
         }
102
         if ( $makeTableDef ) { // they want the <table> def, so let's give it to them
103
            $html = '<table border=' . HTML_QUOTE_CHAR . '1' . HTML_QUOTE_CHAR . '>' . $html . '</table>';
104
         } // if ( $makeTableDef
105
 
106
         $this->useAssociativeArray = $save;
107
         //return '<pre>' . print_r ($this,true) .  '</pre>';
108
         return $html;
109
      }
110
 
111
      /*
112
         function executes a query, then returns an array containing only the values of the first
113
         field in the return as the keys to an associative array. NOTE: any duplicates will be
114
         discarded. This is useful when you simply want to know if a value exists, ie if you
115
         are building an html select from a query, and a separate query needs to hold the
116
         values that are currently selected
117
      */
118
 
119
      function valuesToKeys () {
120
         $returnValue = array();
121
         $save = $this->useAssociativeArray;
122
         $useAssociativeArray = false; // temporarily turn off associative arrays
123
         $this->run();
124
         if ( $this->rowsAffected ) { // we returned at least one row
125
            foreach ( $info as $key => $value ) { // only thing I know to do is iterate
126
               $returnValue[$this->returnData[0]] = true;
127
            }
128
         } // if
129
         $useAssociativeArray = $save;
130
         return $returnValue;
131
      }
132
 
133
      /* this function will take the result of an SQL query that returns at least two columns.
134
         The first column becomes the keys in an associative array, and the second column
135
         becomes the value.
136
 
137
         Note, because it is an associative array, duplicates of the first column will only contain
138
         the last value.
139
      */
140
 
141
      function ColumnColumnArray () {
142
         $returnValue = array();
143
         $save = $this->useAssociativeArray;
144
         $useAssociativeArray = false; // temporarily turn off associative arrays
145
         $this->run();
146
         if ( $this->rowsAffected ) { // we returned at least one row
147
            foreach ( $info as $key => $value ) { // only thing I know to do is iterate
148
               $returnValue[$this->returnData[0]] = $this->returnData[1];
149
            }
150
         } // if
151
         $useAssociativeArray = $save;
152
         return $returnValue;
153
      }
154
 
155
 
156
      /* the first returned column becomes the value, the second becomes the display element
157
         if $selectedFieldsQuery is begins with 'select', items matching that query will be selected
158
         if  $selectedFieldsQuery is any other value, it is assumed to be the value of the first column
159
 
160
      */
161
      function htmlSelect ( $selectedFieldsQuery = '' ) {
162
         $html = '';
163
         $selectedFields = array();
164
         if (strlen( $selectedFieldsQuery )) {
165
            if (  preg_match ( '/^\s*select/i', $selectedFieldsQuery ) ) { // They passed in a query
166
               if (strlen($selectedFieldsQuery) ) {
167
                  $subSet = new DBQuery($selectedFieldsQuery);
168
                  $subSet->run();
169
                  $selectedFields = $subSet->sqlValuesToKeys();
170
               }
171
            } else { // assume the passed in a value
172
               $selectedFields[$selectedFieldsQuery] = 1;
173
            }
174
         }
175
         $save = $this->useAssociativeArray;
176
         $useAssociativeArray = false; // temporarily turn off associative arrays
177
         $this->run();
178
         if ( $this->rowsAffected ) { // we returned at least one row
179
            foreach ($this->returnData as $rowNumber => $value ) {
180
               $html .= '<option value="' . $value[0] . '"';
181
               if ( $selectedFields[$value[0]] ) {
182
                  $html .= ' selected';
183
               }
184
               $html .= '>' . $value[1] . '</option>';
185
            }
186
         }
187
         $useAssociativeArray = $save;
188
         return $html;
189
      }
190
 
191
      /* function will take a query and turn it into a series of check boxes. It must contain
192
         two columns, with the first becoming the the name of the checkbox
193
         and the second becoming the displayed value. an optional third column will be used
194
         to match if the $checkedValuesQuery is used.
195
         if $checkedValuesQuery is not empty, it will be run to see what boxes need to be
196
         checked by being compared to the third column of the $sql query.
197
         $htmlBefore will be placed before each check box, and $htmlAfter will be placed after
198
         each checkbox.
199
 
200
         if $tableColumns is set to a number, the checkboxes will be embedded in a group of
201
         <tr></tr>, each containing table columns of $tableColumns width. In this case, $htmlBefore
202
         will have <td> prepended and $htmlAfter will have </td> appended, meaning any passed
203
         values will be INSIDE of the td. NOTE: the <table></table> tags are NOT put in.
204
 
205
         NOTE: currently, using the table stuff will leave a dangling row with 0 elements if
206
         the number of elements equal the number of columns.
207
      */
208
 
209
      function htmlCheckBoxes ( $checkedValuesQuery = '', $htmlBefore = '', $htmlAfter = '', $table_columns='' ) {
210
         $html = '';
211
         if ($table_columns) {
212
            $htmlBefore = '<td>' . $htmlBefore;
213
            $htmlAfter .= '</td>';
214
            $html .= '<tr>';
215
         }
216
         $numColumns = 0;
217
         $checkBoxes = queryDatabaseExtended( $sql,0 );
218
         $selectedFields = array();
219
         if (strlen($checkedValuesQuery) ) {
220
            $subSet = new DBQuery($selectedFieldsQuery);
221
            $subSet->run();
222
            $selectedFields = $subSet->sqlValuesToKeys();
223
         }
224
         $save = $this->useAssociativeArray;
225
         $useAssociativeArray = false; // temporarily turn off associative arrays
226
         foreach ($this->returnData as $row => $values) {
227
            if ($table_columns && ++$numColumns == $table_columns) {
228
               $html .= '</tr><tr>';
229
               $numColumns = 0;
230
            }
231
            //objectDebugScreen($row);
232
            $html .= $htmlBefore . '<input type="checkbox" name="' . $values[0] . '"';
233
            if ( $selectedFields[$values[2]] ) {
234
               $html .= ' checked';
235
            }
236
            $html .= '>' . $values[1] . $htmlAfter;
237
            //<INPUT type="checkbox" checked name="temp">
238
         } // foreach
239
         $html .= '</tr>';
240
         $useAssociativeArray = $save;
241
         return $html;
242
      }
243
 
244
   /*   
245
      function CSV ( $sql ) {
246
         $rows = array();
247
         $CSV = '';
248
         $info = array();
249
         if ( $result = queryDatabaseExtended($sql,0) ) {
250
            $meta = $result['meta'];
251
            //objectDebugScreen($result);
252
            $info = $result['data'];
253
            unset ($result);
254
            $headers = array();
255
            foreach ( $meta as $field ) {
256
               $headers[] = $field['name'];
257
            } // foreach
258
            $rows[] = implode("\t", $headers);
259
            // special condition where only one row is returned. In that case, $info is not an array
260
            //  of associations, but a simple association. In this case, we need to convert it
261
 
262
            if (count($info[0]) == 1) { // convert from association to single row array of associations
263
               $temp = array();
264
               foreach ($info as $column => $value) {
265
                  $temp[0][$column] = $value;
266
               } // foreach
267
               $info = $temp;
268
            }
269
            for ( $row = 0; $row < count($info); $row++) {
270
               $rows[] = implode("\t", $info[$row]);
271
            }
272
            // we now have all the info, so let's make it into a table
273
            $CSV .= implode("\n", $rows );
274
         } // if ( $info = queryDatabase($sql,0) )
275
         // print '<pre>';  print_r ($info); print '</pre>';
276
         return $CSV;
277
      }
278
 
279
   */
280
 
281
   } // class DBQueryHTML
282
 
283
?>