| 
<?php
 /**
 * This is a complex example script for the TM::MyCSV class. It shows how to
 * create and change a table, how to use insert(), delete() and sort().
 *
 * @author Thiemo Mättig (http://maettig.com/)
 */
 
 // The method sort() depends on your locale settings if you use the sorting type
 // flag SORT_LOCALE_STRING.
 setlocale(LC_ALL, "de_DE@euro", "de_DE", "deu_deu");
 
 // Include the PHP class first.
 require_once("MyCSV.class.php");
 
 // Read the file products.csv if exists. If you run the script for the first
 // time, the write() call below will create the file if required.
 $products = new MyCSV("products");
 
 if (isset($_REQUEST['action']) && $_REQUEST['action'] == "delete")
 {
 $products->delete($_REQUEST['id']);
 $products->write();
 }
 
 // Check if something was submitted in the form.
 if (!empty($_POST['name']))
 {
 // Add a new row to the table. If the file does not exist and the table
 // contains no fields, this call also creates the fields. Not that all
 // TM::MyCSV tables will contain an 'id' column. Every row you add to the
 // table will get a new ID (similar to AUTO_INCREMENT from MySQL).
 $products->insert(array(
 'name'  => stripslashes($_POST['name']),
 'price' => stripslashes($_POST['price']),
 ));
 // Save the whole table to disk.
 $products->write();
 }
 
 // Check if the user clicked one of the table headers.
 $sort = isset($_REQUEST['sort']) ? $_REQUEST['sort'] : "";
 $desc = isset($_REQUEST['desc']) ? " DESC" : "";
 
 // It's a very bad idea to use something that the user entered in your SQL
 // statements. This leads to SQL insertions. We do a translation instead. All
 // invalid values, hacking attempts and so on will fall back to the default
 // behaviour.
 switch ($sort)
 {
 case "name":
 // Order by name in ascending or descending order. Two products with the
 // same name will be ordered by price.
 $products->sort("name SORT_LOCALE_STRING SORT_NULL $desc, price SORT_NUMERIC");
 break;
 case "price":
 // Order by price using a numeric comparison. SORT_NULL moves products
 // without a price to the bottom.
 $products->sort("price SORT_NUMERIC SORT_NULL $desc, name SORT_LOCALE_STRING");
 break;
 default:
 // Ordered by ID ("unordered") by default.
 if (!$desc)
 {
 $products->ksort();
 }
 else
 {
 $products->krsort();
 }
 break;
 }
 
 // This is the end of the controller component of the script and the start of
 // the view component. Check http://en.wikipedia.org/wiki/Model–view–controller
 // if you don't know what MVC is. You don't need the frameworks mentioned there.
 // The idea of MVC is simple: Prepare everything in the controller part (above
 // these lines) and display everything in the view part (below these lines).
 // Using code in the view part is not forbidden. However, it's forbidden to
 // change data.
 
 ?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 <html lang="de" xml:lang="de" xmlns="http://www.w3.org/1999/xhtml">
 <head>
 <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" />
 <title>TM::MyCSV Example Script</title>
 <meta name="robots" content="none" />
 <style type="text/css">
 
 /* A little bit of CSS to make the example look nice. */
 
 body
 {
 color: #333;
 font-family: Verdana, sans-serif;
 }
 form div{
 margin: 0.5em 0;
 }
 label
 {
 cursor: pointer;
 float: left;
 padding-right: 0.6em;
 text-align: right;
 width: 10em;
 }
 table
 {
 border-collapse: collapse;
 border-spacing: 0;
 empty-cells: show;
 }
 th, td
 {
 border-bottom:1px solid #CCC;
 padding: 0.4em 1em;
 text-align: left;
 vertical-align: top;
 }
 th, th a
 {
 background: #666;
 color: #FFF;
 }
 
 </style>
 </head>
 <body>
 
 <h1>TM::MyCSV Example Script</h1>
 
 <!-- In most cases I use my TM::Apeform class to create such forms. In this
 case, I don't want another dependency in this example script. -->
 
 <form action="<?php echo $_SERVER['PHP_SELF']?>" method="post">
 <fieldset>
 <legend>Add a new product</legend>
 <div>
 <label for="name">Product name:</label>
 <input id="name" name="name" type="text" />
 </div>
 <div>
 <label for="price">Price:</label>
 <input id="price" name="price" type="text" />
 </div>
 <div>
 <label> </label>
 <input type="submit" value="Add new product" />
 </div>
 </fieldset>
 </form>
 
 <table>
 <tr>
 <th>ID</th>
 <th>
 <a href="<?php echo $_SERVER['PHP_SELF']?>?sort=name<?php
 if ($sort == "name" && !$desc) echo '&desc'?>">Product name</a><?php
 if ($sort == "name") echo $desc ? '▼' : '▲'?>
 </th>
 <th>
 <a href="<?php echo $_SERVER['PHP_SELF']?>?sort=price<?php
 if ($sort == "price" && !$desc) echo '&desc'?>">Price</a><?php
 if ($sort == "price") echo $desc ? '▼' : '▲'?>
 </th>
 <th></th>
 </tr>
 
 <?php
 
 // Sometimes it is easier to use echo statements instead of the mixed HTML and
 // PHP syntax above. I use both depending on the amount of HTML code.
 
 while ($product = $products->each())
 {
 echo '<tr>';
 echo '<td>' . htmlspecialchars($product['id']) . '</td>';
 echo '<td>' . htmlspecialchars($product['name']) . '</td>';
 echo '<td>';
 if (empty($product['price']))
 {
 echo '—';
 }
 else
 {
 echo htmlspecialchars($product['price']) . ' €';
 }
 echo '</td>';
 echo '<td><a href="' . $_SERVER['PHP_SELF'] . '?action=delete&id=' .
 htmlspecialchars($product['id']) . '">Delete</a></td>';
 echo '</tr>';
 }
 
 ?>
 
 </table>
 
 </body>
 </html>
 |