PHP & MySQL Everyday Apps for Dummies phần 8 pps

45 250 0
PHP & MySQL Everyday Apps for Dummies phần 8 pps

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

296 Part IV: Building Other Useful Applications LISTING 7-15: (Continued) $page[“body_text”] = “Welcome to our Intranet “ . “where each department shares content with “ . “the whole company. You can update your “ . “own departments content too with our simple “ . “interface.<p>Vist the departments’ “ . “home pages: $body_links”; break; case “department”: #79 $dept_id = $_GET[‘dept_id’]; try { $department = Department::findById($dept_id); #83 } catch(Exception $e) { echo $e->getMessage(); exit(); } $dept_name = $department->getName(); #90 $dept_desc= $department->getDescription(); $page[“left_nav”] = “$dept_name Content”; $page[“body_text”] = “$dept_name - $dept_desc”; $body_links = “”; $content_types = ContentType::findAll(); #97 foreach ($content_types as $content_type) #98 { $link = “$base_url?dept_id=$dept_id” . “&type_id=” . $content_type->getId() . “&browse_level=content”; $page[“left_nav_links”][$link] = $content_type->getName(); $body_links .= “<li><a href=\”” . $link . “\”>” . $content_type->getName() . “</a>”; } $page[“left_nav_header”] = “Content Index”; $page[“top”] = $dept_name; $page[“body_text”] = “$dept_name - $dept_desc “ . “<p>Vist the departments’ “ . “areas: $body_links”; $trail .= “ - <a href=’$base_url?dept_id=$dept_id” . “&browse_level=department’>$dept_name</a>”; break; case “content”: #117 $dept_id = $_GET[‘dept_id’]; $type_id = $_GET[‘type_id’]; try { 14_575872 ch07.qxd 5/27/05 6:27 PM Page 296 297 Chapter 7: Building a Content Management System $department = Department::findById($dept_id); #122 } catch(Exception $e) { echo $e->getMessage(); exit(); } $dept_name = $department->getName(); $body_links = “”; $page[“body_text”] = “”; try { $content_types = ContentType::findAll(); #134 } catch(Exception $e) { echo $e->getMessage(); exit(); } foreach ($content_types as $content_type) { $link = “$base_url?dept_id=$dept_id” . “&type_id=” . $content_type->getId() . “&browse_level=content”; $page[“left_nav_links”][$link] = $content_type->getName(); if ($content_type->getId() == $type_id) $area_name = $content_type->getName(); } $page[“data_rows”] = #151 ContentItem::findByDeptType($dept_id, $type_id); if (sizeof($page[“data_rows”]) == 0) #153 { $page[“body_text”] = “There are no $area_name content items for $dept_name”; } if ($admin) { $page[“body_text”] .= “<p>[<a href=’$base_url?dept_id=$dept_id” . “&browse_level=details&type_id=$type_id” . “&content_id=’>add</a>]”; } $page[“col_headers”][“title”] = “$area_name Title”; $page[“col_headers”][“content_date”] = “$area_name Date”; $page[“col_headers”][“create_date”] = “Created On”; $page[“col_headers”][“created_by”] = “Created By”; $page[“col_headers”][“last_upd_date”] = “Last Updated On”; $page[“col_headers”][“last_upd_by”] = Continued 14_575872 ch07.qxd 5/27/05 6:27 PM Page 297 298 Part IV: Building Other Useful Applications LISTING 7-15: (Continued) “Last Updated By”; $page[“left_nav_header”] = “Content”; $page[“top”] = “$dept_name - $area_name”; $trail .= “ - <a href=’$base_url?dept_id=$dept_id” . “&browse_level=department’>$dept_name</a>”; $trail .= “ - <a href=’$base_url?dept_id=$dept_id” . “&browse_level=content” . “&type_id=$type_id’>$area_name</a>”; break; case “details”: #183 $dept_id = $_GET[‘dept_id’]; $type_id = $_GET[‘type_id’]; $department = Department::findById($dept_id); #186 $dept_name = $department->getName(); $content_type = ContentType::findById($type_id); $area_name = $content_type->getName(); $body_links = “”; $create_date = date(“m/d/y”, time()); $created_by = $_SESSION[“user_name”]; $last_upd_by = $_SESSION[“user_name”]; $content_id = $_GET[“content_id”]; $edit = $admin && (@$_GET[“edit”] == “true” || $content_id == “”); if ($content_id != “”) { #198 $content_item = ContentItem::findById($content_id); $title = $content_item->getName(); #200 $content_date = $content_item->getContentDate(); $description = $content_item->getDescription(); $create_date = $content_item->getCreationDate(); $created_by = $content_item->getCreatedBy(); $last_upd_date = $content_item->getLastUpdDate(); $last_upd_by = $content_item->getLastUpdBy(); $downloads = #207 ContentDownload::findByContentId($content_id); foreach($downloads as $download) #209 { $download_id = $download->getId(); $file_name = $download->getName(); $link = “files/$download_id/$file_name”; $page[“left_nav_links”][$link] = $file_name; if ($edit) $page[“left_nav_links”][$link] .= “</a> [<a href=\”Admin-OO.php” . “?action=DeleteDownload&download_id=$download_id&” . “dept_id=$dept_id&type_id=$type_id\” >del</a>]”; } } foreach ($_GET as $name => $value) 14_575872 ch07.qxd 5/27/05 6:27 PM Page 298 Following is a description of the numbered lines of code that appear in CompanyHome-OO.php, shown in listing 7-15: #11 Lines 11 to 14 ensure that the class definitions are included so that the object model outlined earlier can be put into action. #31 Here the OO login application from Chapter 4 is leveraged. #48 The home page display is handled in this block of the switch statement. 299 Chapter 7: Building a Content Management System $$name = $value; $edit = $admin && (@$_GET[“edit”] == “true” || $content_id == “”); $page[“top”] = “$dept_name - $area_name”; if ($edit) { $page[“body_text”] = “<center><u>Add Downloads</u>”; for ($i = 0; $i < 3; $i++) { $page[“body_text”] .= “<br><input type=’file’ name=’upload_file$i’>”; } $page[“body_text”] .= “ </center> <p /> <center> <input type=’reset’ name=’action’ value =’Reset Form’> <input type=’submit’ name=’action’ value =’Cancel’> <input type=’submit’ name=’action’ value =’Save Changes’> </center>”; $page[“top”] .= “ Edit/Create”; } else { $page[“body_text”] = “<a href=’javascript:history.go(-1)’>Back</a>”; } $page[“left_nav_header”] = “Downloads”; $trail .= “ - <a href=’$base_url?dept_id=$dept_id” . “&browse_level=department’>$dept_name</a>”; $trail .= “ - <a href=’$base_url?dept_id=$dept_id” . “&browse_level=content” . “&type_id=$type_id’>$area_name</a>”; break; } include(“company-OO.inc”); } ?> 14_575872 ch07.qxd 5/27/05 6:27 PM Page 299 #51 The static method call finds all the departments in the intranet. The array returned from this function contains Department objects. #59 Each Department object is examined in this loop so that the depart- ment name and description can be displayed on the home page. #79 The department-level display is handled in this block of the switch statement. #83 At this point in the program’s execution, the user has clicked a spe- cific department. The $department variable becomes an instantiation of the Department class when the findById function returns. #90 Lines 90 and 91 retrieve some details about the department. #97 Line 97 gets the list of content types in the CMS, each content type being represented by a ContentType object. #98 Begins a loop through all the ContentType objects. The objects’ details will be used to build the links to the content areas for the selected department. #117 The content list display is handled in this block of the switch statement. #122 This static function call retrieves an object representing the selected department. #134 The static function call will find all the content types in the system. #151 At line 151 the list of content items is added to a page-level variable so that company-OO.inc will be able to build the display of all the objects’ data. #153 Begins a block of code that will display an informational message if there are no content items for the selected department and content type. #183 The block of code executed when a user is looking at the details for a single content item. #186 Lines 186 to 189 get details for the display from objects. #198 If the $content_id variable contains a value, the details of the con- tent item are retrieved by using the finder function at line 199. #200 Lines 200 to 206 show the details of the content item being extracted from the object using the getter functions. #207 The downloadable files associated with the selected content item are retrieved. #209 Begins the loop that builds links to the downloadable files by using the details from the ContentDownload objects. 300 Part IV: Building Other Useful Applications 14_575872 ch07.qxd 5/27/05 6:27 PM Page 300 Writing company-OO.inc, the main display code Here the objects set up in CompanyHome-OO.php — the file shown in List- ing 7-16 — are leveraged to build the HTML display. Other than the use of these objects, not much else is different from the procedural version of this file, company.inc. 301 Chapter 7: Building a Content Management System LISTING 7-16: BUILDING THE HTML DISPLAY <?php /* File: company-OO.inc * Desc: Contains the code for a Web page that displays * company and department data. */ include_once(“functions_main.inc”); ?> <html> <head><title><?php echo $page[‘title’]?></title></head> <body style=”margin: 0”> <h3 align=”center”><?php echo $page[‘top’] ?></h3> <div style=”font-size: 70%; font-weight: bold”> <?php echo $trail ?></div> <hr size=”10” noshade> <table border=”0” cellpadding=”5” cellspacing=”0”> <?php ############# ## Left Nav # ############# ?> <tr> <td width=”20%” valign=”top” > <p style=”font-size: 110%; font-weight: bold”> <?php echo $page[‘left_nav_header’]?></p> <table border=”0”> <?php foreach($page[“left_nav_links”] as $link => $label) { echo “<tr><td >” . “<a href=\”$link\”>$label<p><p></td></tr>\n”; } if (sizeof($page[“left_nav_links”]) == 0) echo “<i>no items yet</i>”; ?> </table> </td> <! Column that separates the two forms > <td style=”background-color: gray”></td> <?php Continued 14_575872 ch07.qxd 5/27/05 6:27 PM Page 301 302 Part IV: Building Other Useful Applications LISTING 7-16: (Continued) ################### ## Main Content # ################### ?> <td width=”80%” valign=”top”> <form method=”POST” action=”Admin-OO.php” enctype=”multipart/form-data”> <?php if ($page[“browse_level”] == “details”) { include(“fields_content.inc”); include(“content_form.inc”); } else if (sizeof($page[“data_rows”]) > 0) { echo “<table cellspacing=’3’ cellpadding=’3’ width=’100%’bgcolor=’gray’> <tr bgcolor=’lightgray’>\n”; foreach ($page[“col_headers”] as $key => $display) { echo “<th >$display</th>\n”; } echo “<th nowrap>&nbsp;</th>\n”; echo “</tr>\n”; foreach ($page[“data_rows”] as $content_item) { echo “<tr bgcolor=white>\n”; #68 echo “<td nowrap>” . $content_item->getName() . “</th>\n”; echo “<td nowrap>” . $content_item->getContentDate() . “</th>\n”; echo “<td nowrap>” . $content_item->getCreationDate() . “</th>\n”; echo “<td nowrap>” . $content_item->getCreatedBy() . “</th>\n”; echo “<td nowrap>” . $content_item->getLastUpdDate() . “</th>\n”; echo “<td nowrap>” . $content_item->getLastUpdBy() . “</th>\n”; #79 echo “<th nowrap>[“; if ($admin) { echo “<a href=\”Admin-OO.php?action=delete” . “&dept_id=$dept_id&type_id=$type_id&content_id=” . $content_item->getId() . “\”>delete</a>\n”; } echo “<a href=\”CompanyHome-OO.php?” . “&dept_id=$dept_id&type_id=$type_id&content_id=” . $content_item->getId() . Æ “&browse_level=details&edit=false\”>” . “view</a>\n”; 14_575872 ch07.qxd 5/27/05 6:27 PM Page 302 Following is a description of the numbered lines of code that appear in CompanyHome-OO.php (shown in Listing 7-16): #68 Lines 68 to 79 show the use of the objects to get the content item details. For each column displayed in the HTML table, a different func- tion is used to get the value. Keep in mind that the data in this object maps back to data stored in the database. However, this display code doesn’t know about the data, how it is stored, or how it is retrieved. As long as the objects can be leveraged, the display can be constructed. Writing fields_content.inc and content_form.inc The fields_content.inc and content_form.inc files from the procedural code section can be reused for the object-oriented approach to coding the CMS application. Writing Admin-OO.php, the data manipulation code The data manipulation code is simpler than the procedural code in this chapter because the SQL code isn’t executed in the administrative PHP code. Instead, the administrative PHP, Admin-OO.php, operates on objects. 303 Chapter 7: Building a Content Management System if ($admin) { echo “<a href=\”CompanyHome-OO.php?” . “&dept_id=$dept_id&type_id=$type_id&content_id=” . $content_item->getId() . Æ “&browse_level=details&edit=true\”>” . “edit</a>\n”; } echo “]</th></tr>\n”; } echo “</table>\n”; } echo $page[“body_text”]; ?> </form> </td> </tr> </table> <hr size=”10” noshade> <div style=”text-align: center; font-size: 75%”> <?php echo $page[‘bottom’]?> </body> </html> 14_575872 ch07.qxd 5/27/05 6:27 PM Page 303 The save and delete functions of the objects are used to modify the under- lying data. This differs from the procedural Admin.php file, where SQL to manipulate the data is defined within the PHP itself. The OO code removes the need to have SQL in the administrative PHP file. In Listing 7-17, the PHP code simply uses method calls to manipulate the underlying data. 304 Part IV: Building Other Useful Applications LISTING 7-17: UPDATING THE DATABASE AND SAVING UPLOADED FILES <?php /* File: Admin-OO.php * Desc: Perform any data manipulation tasks, like * creating, editing, or deleting content items. */ session_start(); include_once(“functions_main.inc”); include_once(“ContentItem.class”); #8 include_once(“ContentDownload.class”); foreach ($_POST as $name => $value) $$name = $value; foreach ($_GET as $name => $value) $$name = $value; if (!isset($action)) header(“Location: CompanyHome-OO.php”); if (!isset($create_date)) $create_date = date(“Y-m-d”, time()); else $create_date = strtotime($create_date); if (!isset($content_date)) $content_date = date(“Y-m-d”, time()); else $content_date = strtotime($content_date); $content_date = date(“Y-m-d”, $content_date); $last_upd_date = date(“Y-m-d”, time()); if (!isset($created_by)) $created_by = $_SESSION[“user_name”]; $last_upd_by = $_SESSION[“user_name”]; switch ($action) { case “delete”: #37 $content_item = ContentItem::findById($content_id); if (isset($content_item)) try { $content_item->delete(); } catch(Exception $e) { 14_575872 ch07.qxd 5/27/05 6:27 PM Page 304 305 Chapter 7: Building a Content Management System echo $e->getMessage(); exit(); } break; case “Save Changes”: $message_2 = “”; if ($content_date <= 0) $message_2 = “<li>Invalid Content Date”; if ($title == “”) $message_2 .= “<li>Title cannot be left blank”; if ($message_2) $message_2 = “Please correct these errors: $message_2”; if ($message_2 != “”) { include(“CompanyHome-OO.php”); exit(); } if ($content_id) #65 { try { $content_item = ContentItem::findById($content_id); } catch(Exception $e) { echo $e->getMessage(); exit(); } $content_item->setName($title); $content_item->setDescription($description); $content_item->setLastUpdBy($last_upd_by); $content_id = $content_item->save(); } else #81 { $content_item = new ContentItem(NULL, $title, $description, $content_date, $create_date, $created_by, $last_upd_date, $last_upd_by); $content_id = $content_item->save($dept_id, $type_id); } foreach ($_FILES as $file) #89 { $file_name = $file[“name”]; if ($file[“size”] <= 0) continue; $download = new ContentDownload($content_id, $file_name); $file_id = $download->save(); Continued 14_575872 ch07.qxd 5/27/05 6:27 PM Page 305 [...]... available in the PHP manual at www .php. net/manual/en/ref mysqli .php and www .php. net/manual/en/ref .mysql .php In this application, I have stored the information needed by the PHP mysql functions in a separate file called forumVars.inc This file is stored in a directory outside my Web space, for security reasons The file contains information similar to the following: < ?php $host = “localhost”; $user = “admin”;... pages 317 3 18 Part IV: Building Other Useful Applications Designing the Forums page The Forums page displays all the forums and topics available Figure 8- 1 shows the Forums page Figure 8- 1: The Forums page displayed by the forum application The Forums page displays the names of the forums In this case, two forums are displayed: General and Debugging The name and description of topics within the forums are... Hosting Discussions with a Web Forum 323 LISTING 8- 2: SUPPORTING FUNCTIONS FOR VIEWFORUMS.INC < ?php /* File: functions_viewforums.inc * Desc: Supporting functions for the viewForums.inc file */ function DisplayForumsHeader() { echo ‘ Forum Topic Description... forum tables To interact with the MySQL server, your PHP scripts use the mysql (or mysqli) API that comes with PHP By using the mysql functions, you can connect to a MySQL server, execute queries and other SQL statements, and retrieve results from the server When you fetch (or retrieve) a row of data from the MySQL server, you can ask PHP to deliver the row in many different forms If you call the mysql_ fetch_array... the use of features that were added in MySQL version 4.1 You can use the mysql functions with version 4.1, but you don’t have access to the newer features The mysql or mysqli extension is activated when PHP is installed You must use PHP 5 to use the mysqli functions Because MySQL 4.1 is now the recommended version on the MySQL Web site, I use the MySQL Improved (mysqli) functions in this chapter I use... align=\”center\”>”; echo “”; DisplayForumsHeader(); for( $i = 0; $i < mysqli_num_rows( $result ); $i++ ) #31 Continued 322 Part IV: Building Other Useful Applications LISTING 8- 1: (Continued) { $forum = mysqli_fetch_assoc( $result ); echo “”; echo ‘ ’.$forum[‘name’].””; echo “\n”; DisplayTopics($forum[‘id’],$cxn,”viewTopic .php ); # 38 } echo “”;... the forms that I describe later in this chapter To create a new forum, simply insert (by using an INSERT query) a new row into the Forum table, like this: INSERT INTO Forum (name, description) VALUES (‘Cats’, ‘All things kitty’); Chapter 8: Hosting Discussions with a Web Forum Notice that you can omit the id column and MySQL will assign a unique number for you If you let MySQL assign an id for your Forum,... appear in functions_viewforums.inc in Listing 8- 2: #6 The DisplayForumsHeader function creates column headers for this Web page #29 #36 324 Part IV: Building Other Useful Applications #16 DisplayTopics is called (by viewForums.inc) once for each forum This function displays all topics owned by a single forum — the $forumID argument contains the ID of the parent forum #21 The for loop beginning at line... using PHP 4 or for other reasons want to use the mysql functions — rather than the mysqli functions — you might need to make small changes to the syntax The mysqli functions are very similar to the mysql functions, but some differences exist I explain the PHP and MySQL versions in Chapter 1 The syntax differences are shown in Appendix C More information about the functions is available in the PHP manual... parent For example, a Post is owned by a Thread: If you look inside a Post, you see a column named parent_thread that contains the id of the parent Thread In a similar fashion, each Thread contains a parent_topic and each Topic contains a parent_forum Designing the Forum table The Forum table contains information about each forum Table 8- 1 shows the layout of the Forum table Table 8- 1 Database Table: Forum . data. */ include_once(“functions_main.inc”); ?> <html> <head><title>< ?php echo $page[‘title’]?></title></head> <body style=”margin: 0”> <h3 align=”center”>< ?php echo $page[‘top’] ?></h3> <div style=”font-size:. $link => $label) { echo “<tr><td >” . “<a href=”$link”>$label<p><p></td></tr> ”; } if (sizeof($page[“left_nav_links”]) == 0) echo “<i>no. items yet</i>”; ?> </table> </td> <! Column that separates the two forms > <td style=”background-color: gray”></td> < ?php Continued 14_57 587 2 ch07.qxd

Ngày đăng: 12/08/2014, 21:21

Tài liệu cùng người dùng

Tài liệu liên quan