Recipe 8.18. Program: Tiny Wiki


The program in Example 8-44 puts together various concepts discussed in this chapter and implements a complete Wiki system'a web site whose pages are all user-editable. It follows a structure common among simple PHP programs of its type. The first part of the code defines various configuration settings. Then comes an if/else section that decides what to do (display a page, save page edits, etc.) based on the values of submitted form or URL variables. The remainder of the program consists of the functions invoked from that if/else section'functions to print the page header and footer, load saved page contents, and display a page-editing form.

The tiny Wiki relies on an external library, PHP Markdown by Michel Fortin, to handle translating from the handy and compact Markdown syntax to HTML. You can get PHP Markdown from http://www.michelf.com/projects/php-markdown/.

Tiny Wiki

<?php // Use the Markdown function from // http://www.michelf.com/projects/php-markdown/ // for Wiki-like text markup require_once 'markdown.php'; // The directory where the Wiki pages will be stored // Make sure the web server user can write to it define('PAGEDIR',dirname(__FILE__) . '/pages'); // Get page name, or use default $page = isset($_GET['page']) ? $_GET['page'] : 'Home'; // Figure out what to do: display an edit form, save an // edit form, or display a page // Display an edit form that's been asked for if (isset($_GET['edit'])) {     pageHeader($page);     edit($page);     pageFooter($page, false); } // Save a submitted edit form else if (isset($_POST['edit'])) {     file_put_contents(pageToFile($_POST['page']), $_POST['contents']);     // Redirect to the regular view of the just-edited page     header('Location: http://'.$_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME'] .            '?page='.urlencode($_POST['page']));     exit(); } // Display a page else {     pageHeader($page);     // If the page exists, display it and the footer with an "Edit" link     if (is_readable(pageToFile($page))) {         // Get the contents of the page from the file it's saved in         $text = file_get_contents(pageToFile($page));         // Convert Markdown syntax (using Markdown() from markdown.php)         $text = Markdown($text);         // Make bare [links] link to other wiki pages         $text = wikiLinks($text);         // Display the page         echo $text;         // Display the footer         pageFooter($page, true);     }     // If the page doesn't exist, display an edit form     // and the footer without an "Edit" link     else {         edit($page, true);         pageFooter($page, false);     } } // The page header -- pretty simple, just the title and the usual HTML // pleasantries function pageheader($page) { ?> <html> <head> <title>Wiki: <?php echo htmlentities($page) ?></title> </head> <body> <h1><?php echo htmlentities($page) ?></h1> <hr/> <?php } // The page footer -- a "last modified" timestamp, an optional // "Edit" link, and a link back to the front page of the Wiki function pageFooter($page, $displayEditLink) {     $timestamp = @filemtime(pageToFile($page));     if ($timestamp) {         $lastModified = strftime('%c', $timestamp);     } else {         $lastModified = 'Never';     }     if ($displayEditLink) {         $editLink = ' - <a href="?page='.urlencode($page).'&edit=true">Edit</a>';     } else {         $editLink = '';     } ?> <hr/> <em>Last Modified: <?php echo $lastModified ?></em> <?php echo $editLink ?> - <a href="<?php echo $_SERVER['SCRIPT_NAME'] ?>">Home</a> </body> </html> <?php } // Display an edit form. If the page already exists, include its current // contents in the form function edit($page, $isNew = false) {     if ($isNew) {         $contents = ''; ?> <p><b>This page doesn't exist yet.</b> To create it, enter its contents below and click the <b>Save</b> button.</p>     <?php } else {         $contents = file_get_contents(pageToFile($page));     } ?> <form method='post' action='<?php echo htmlentities($_SERVER['SCRIPT_NAME']) ?>'> <input type='hidden' name='edit' value='true'/> <input type='hidden' name='page' value='<?php echo htmlentities($page) ?>'/> <textarea name='contents' rows='20' cols='60'> <?php echo htmlentities($contents) ?></textarea> <br/> <input type='submit' value='Save'/> </form> <?php } // Convert a submitted page to a filename. Using md5() prevents naughty // characters in $page from causing security problems function pageToFile($page) {     return PAGEDIR.'/'.md5($page); } // Turn text such as [something] in a page into an HTML link to the // Wiki page "something" function wikiLinks($page) {     if (preg_match_all('/\[([^\]]+?)\]/', $page, $matches, PREG_SET_ORDER)) {         foreach ($matches as $match) {             $page = str_replace($match[0], '<a href="'.$_SERVER['SCRIPT_NAME']. '?page='.urlencode($match[1]).'">'.htmlentities($match[1]).'</a>', $page);         }     }     return $page; } ?>




PHP Cookbook, 2nd Edition
PHP Cookbook: Solutions and Examples for PHP Programmers
ISBN: 0596101015
EAN: 2147483647
Year: 2006
Pages: 445

Similar book on Amazon

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net