构建新闻管理系统虽然预览版提供了许多组件(甚至许多已经被开发),我们已经讨论了构建一个简单程序所需要的全部组件。在这里,你会对ZF的基本结构和设计有更清楚的理解。 每个人开发的程序都会有所不同,而Zend Framework试图包容这些差异。同样,这个教程是根据我的喜好写的,请根据自己的偏好自行调整。 当我开发程序时,我会先做界面。这并不意味着我把时间都花在标签、样式表和图片上,而是我从一个用户的角度去考虑问题。因此我把程序看成是页面的集合,每一页都是一个独立的网址。这个新闻系统就是由以下网址组成的:
/ /add/news /add/comment /admin /admin/approve /view/{id}
你可以直接把这些网址和controller联系起来。IndexController列出新闻,AddController添加新闻和评论,AdminController处理一些如批准新闻之类的管理,ViewController特定新闻和对应评论的显示。 如果你的FooController.php还在,把它删除。修改IndexController.php,为业务逻辑以添加相应的action和一些注释:
- <?php
- Zend::loadClass(’Zend_Controller_Action’);
- class IndexController extends Zend_Controller_Action
- {
- public function indexAction()
- {
- /* List the news. */
- }
- public function noRouteAction()
- {
- $this->_redirect(’/');
- }
- }
- ?>
复制代码
接下来,创建AddController.php文件:
- <?php
- Zend::loadClass(’Zend_Controller_Action’);
- class AddController extends Zend_Controller_Action
- {
- function indexAction()
- {
- $this->_redirect(’/');
- }
- function commentAction()
- {
- /* Add a comment. */
- }
- function newsAction()
- {
- /* Add news. */
- }
- function __call($action, $arguments)
- {
- $this->_redirect(’/');
- }
- }
- ?>
复制代码
记住AddController的indexAction()方法不能调用。当访问/add时会执行这个类方法。因为用户可以手工访问这个网址,这是有可能的,所以你要把用户重定向到主页、显示错误或你认为合适的行为。 接下来,创建AdminController.php文件:
- <?php
- Zend::loadClass(’Zend_Controller_Action’);
- class AdminController extends Zend_Controller_Action
- {
- function indexAction()
- {
- /* Display admin interface. */
- }
- function approveAction()
- {
- /* Approve news. */
- }
- function __call($action, $arguments)
- {
- $this->_redirect(’/');
- }
- }
- ?>
复制代码
最后,创建ViewController.php文件:
- <?php
- Zend::loadClass(’Zend_Controller_Action’);
- class ViewController extends Zend_Controller_Action
- {
- function indexAction()
- {
- $this->_redirect(’/');
- }
- function __call($id, $arguments)
- {
- /* Display news and comments for $id. */
- }
- }
- ?>
复制代码
和AddController一样,index()方法不能调用,所以你可以使用你认为合适的action。ViewController和其它的有点不同,因为你不知道什么才是有效的action。为了支持像/view/23这样的网址,你要使用__call()来支持动态action。
数据库操作因为Zend Framework的数据库组件还不稳定,而我希望这个演示可以做得简单一点。我使用了一个简单的类,用SQLite进行新闻条目和评论的存储和查询。
- <?php
- class Database
- {
- private $_db;
- public function __construct($filename)
- {
- $this->_db = new SQLiteDatabase($filename);
- }
- public function addComment($name, $comment, $newsId)
- {
- $name = sqlite_escape_string($name);
- $comment = sqlite_escape_string($comment);
- $newsId = sqlite_escape_string($newsId);
- $sql = “INSERT
- INTO comments (name, comment, newsId)
- VALUES (’$name’, ‘$comment’, ‘$newsId’)”;
- return $this->_db->query($sql);
- }
- public function addNews($title, $content)
- {
- $title = sqlite_escape_string($title);
- $content = sqlite_escape_string($content);
- $sql = “INSERT
- INTO news (title, content)
- VALUES (’$title’, ‘$content’)”;
- return $this->_db->query($sql);
- }
- public function approveNews($ids)
- {
- foreach ($ids as $id) {
- $id = sqlite_escape_string($id);
- $sql = “UPDATE news
- SET approval = ‘T’
- WHERE id = ‘$id’”;
- if (!$this->_db->query($sql)) {
- return FALSE;
- }
- }
- return TRUE;
- }
- public function getComments($newsId)
- {
- $newsId = sqlite_escape_string($newsId);
- $sql = “SELECT name, comment
- FROM comments
- WHERE newsId = ‘$newsId’”;
- if ($result = $this->_db->query($sql)) {
- return $result->fetchAll();
- }
- return FALSE;
- }
- public function getNews($id = ‘ALL’)
- {
- $id = sqlite_escape_string($id);
- switch ($id) {
- case ‘ALL’:
- $sql = “SELECT id,
- title
- FROM news
- WHERE approval = ‘T’”;
- break;
- case ‘NEW’:
- $sql = “SELECT *
- FROM news
- WHERE approval != ‘T’”;
- break;
- default:
- $sql = “SELECT *
- FROM news
- WHERE id = ‘$id’”;
- break;
- }
- if ($result = $this->_db->query($sql)) {
- if ($result->numRows() != 1) {
- return $result->fetchAll();
- } else {
- return $result->fetch();
- }
- }
- return FALSE;
- }
- }
- ?>
复制代码
(你可以用自己的解决方案随意替换这个类。这里只是为你提供一个完整示例的介绍,并非建议要这么实现。) 这个类的构造器需要SQLite数据库的完整路径和文件名,你必须自己进行创建。
- <?php
- $db = new SQLiteDatabase(’/path/to/db.sqlite’);
- $db->query(”CREATE TABLE news (
- id INTEGER PRIMARY KEY,
- title VARCHAR(255),
- content TEXT,
- approval CHAR(1) DEFAULT ‘F’
- )”);
- $db->query(”CREATE TABLE comments (
- id INTEGER PRIMARY KEY,
- name VARCHAR(255),
- comment TEXT,
- newsId INTEGER
- )”);
- ?>
复制代码
你只需要做一次,以后直接给出Database类构造器的完整路径和文件名即可:
- <?php
- $db = new Database(’/path/to/db.sqlite’);
- ?>
复制代码
|
构建新闻管理系统虽然预览版提供了许多组件(甚至许多已经被开发),我们已经讨论了构建一个简单程序所需要的全部组件。在这里,你会对ZF的基本结构和设计有更清楚的理解。 每个人开发的程序都会有所不同,而Zend Framework试图包容这些差异。同样,这个教程是根据我的喜好写的,请根据自己的偏好自行调整。 当我开发程序时,我会先做界面。这并不意味着我把时间都花在标签、样式表和图片上,而是我从一个用户的角度去考虑问题。因此我把程序看成是页面的集合,每一页都是一个独立的网址。这个新闻系统就是由以下网址组成的:
/ /add/news /add/comment /admin /admin/approve /view/{id}
你可以直接把这些网址和controller联系起来。IndexController列出新闻,AddController添加新闻和评论,AdminController处理一些如批准新闻之类的管理,ViewController特定新闻和对应评论的显示。 如果你的FooController.php还在,把它删除。修改IndexController.php,为业务逻辑以添加相应的action和一些注释:
- <?php
- Zend::loadClass(’Zend_Controller_Action’);
- class IndexController extends Zend_Controller_Action
- {
- public function indexAction()
- {
- /* List the news. */
- }
- public function noRouteAction()
- {
- $this->_redirect(’/');
- }
- }
- ?>
复制代码
接下来,创建AddController.php文件:
- <?php
- Zend::loadClass(’Zend_Controller_Action’);
- class AddController extends Zend_Controller_Action
- {
- function indexAction()
- {
- $this->_redirect(’/');
- }
- function commentAction()
- {
- /* Add a comment. */
- }
- function newsAction()
- {
- /* Add news. */
- }
- function __call($action, $arguments)
- {
- $this->_redirect(’/');
- }
- }
- ?>
复制代码
记住AddController的indexAction()方法不能调用。当访问/add时会执行这个类方法。因为用户可以手工访问这个网址,这是有可能的,所以你要把用户重定向到主页、显示错误或你认为合适的行为。 接下来,创建AdminController.php文件:
- <?php
- Zend::loadClass(’Zend_Controller_Action’);
- class AdminController extends Zend_Controller_Action
- {
- function indexAction()
- {
- /* Display admin interface. */
- }
- function approveAction()
- {
- /* Approve news. */
- }
- function __call($action, $arguments)
- {
- $this->_redirect(’/');
- }
- }
- ?>
复制代码
最后,创建ViewController.php文件:
- <?php
- Zend::loadClass(’Zend_Controller_Action’);
- class ViewController extends Zend_Controller_Action
- {
- function indexAction()
- {
- $this->_redirect(’/');
- }
- function __call($id, $arguments)
- {
- /* Display news and comments for $id. */
- }
- }
- ?>
复制代码
和AddController一样,index()方法不能调用,所以你可以使用你认为合适的action。ViewController和其它的有点不同,因为你不知道什么才是有效的action。为了支持像/view/23这样的网址,你要使用__call()来支持动态action。
数据库操作因为Zend Framework的数据库组件还不稳定,而我希望这个演示可以做得简单一点。我使用了一个简单的类,用SQLite进行新闻条目和评论的存储和查询。
- <?php
- class Database
- {
- private $_db;
- public function __construct($filename)
- {
- $this->_db = new SQLiteDatabase($filename);
- }
- public function addComment($name, $comment, $newsId)
- {
- $name = sqlite_escape_string($name);
- $comment = sqlite_escape_string($comment);
- $newsId = sqlite_escape_string($newsId);
- $sql = “INSERT
- INTO comments (name, comment, newsId)
- VALUES (’$name’, ‘$comment’, ‘$newsId’)”;
- return $this->_db->query($sql);
- }
- public function addNews($title, $content)
- {
- $title = sqlite_escape_string($title);
- $content = sqlite_escape_string($content);
- $sql = “INSERT
- INTO news (title, content)
- VALUES (’$title’, ‘$content’)”;
- return $this->_db->query($sql);
- }
- public function approveNews($ids)
- {
- foreach ($ids as $id) {
- $id = sqlite_escape_string($id);
- $sql = “UPDATE news
- SET approval = ‘T’
- WHERE id = ‘$id’”;
- if (!$this->_db->query($sql)) {
- return FALSE;
- }
- }
- return TRUE;
- }
- public function getComments($newsId)
- {
- $newsId = sqlite_escape_string($newsId);
- $sql = “SELECT name, comment
- FROM comments
- WHERE newsId = ‘$newsId’”;
- if ($result = $this->_db->query($sql)) {
- return $result->fetchAll();
- }
- return FALSE;
- }
- public function getNews($id = ‘ALL’)
- {
- $id = sqlite_escape_string($id);
- switch ($id) {
- case ‘ALL’:
- $sql = “SELECT id,
- title
- FROM news
- WHERE approval = ‘T’”;
- break;
- case ‘NEW’:
- $sql = “SELECT *
- FROM news
- WHERE approval != ‘T’”;
- break;
- default:
- $sql = “SELECT *
- FROM news
- WHERE id = ‘$id’”;
- break;
- }
- if ($result = $this->_db->query($sql)) {
- if ($result->numRows() != 1) {
- return $result->fetchAll();
- } else {
- return $result->fetch();
- }
- }
- return FALSE;
- }
- }
- ?>
复制代码
(你可以用自己的解决方案随意替换这个类。这里只是为你提供一个完整示例的介绍,并非建议要这么实现。) 这个类的构造器需要SQLite数据库的完整路径和文件名,你必须自己进行创建。
- <?php
- $db = new SQLiteDatabase(’/path/to/db.sqlite’);
- $db->query(”CREATE TABLE news (
- id INTEGER PRIMARY KEY,
- title VARCHAR(255),
- content TEXT,
- approval CHAR(1) DEFAULT ‘F’
- )”);
- $db->query(”CREATE TABLE comments (
- id INTEGER PRIMARY KEY,
- name VARCHAR(255),
- comment TEXT,
- newsId INTEGER
- )”);
- ?>
复制代码
你只需要做一次,以后直接给出Database类构造器的完整路径和文件名即可:
- <?php
- $db = new Database(’/path/to/db.sqlite’);
- ?>
复制代码
|
构建新闻管理系统虽然预览版提供了许多组件(甚至许多已经被开发),我们已经讨论了构建一个简单程序所需要的全部组件。在这里,你会对ZF的基本结构和设计有更清楚的理解。 每个人开发的程序都会有所不同,而Zend Framework试图包容这些差异。同样,这个教程是根据我的喜好写的,请根据自己的偏好自行调整。 当我开发程序时,我会先做界面。这并不意味着我把时间都花在标签、样式表和图片上,而是我从一个用户的角度去考虑问题。因此我把程序看成是页面的集合,每一页都是一个独立的网址。这个新闻系统就是由以下网址组成的:
/ /add/news /add/comment /admin /admin/approve /view/{id}
你可以直接把这些网址和controller联系起来。IndexController列出新闻,AddController添加新闻和评论,AdminController处理一些如批准新闻之类的管理,ViewController特定新闻和对应评论的显示。 如果你的FooController.php还在,把它删除。修改IndexController.php,为业务逻辑以添加相应的action和一些注释:
- <?php
- Zend::loadClass(’Zend_Controller_Action’);
- class IndexController extends Zend_Controller_Action
- {
- public function indexAction()
- {
- /* List the news. */
- }
- public function noRouteAction()
- {
- $this->_redirect(’/');
- }
- }
- ?>
复制代码
接下来,创建AddController.php文件:
- <?php
- Zend::loadClass(’Zend_Controller_Action’);
- class AddController extends Zend_Controller_Action
- {
- function indexAction()
- {
- $this->_redirect(’/');
- }
- function commentAction()
- {
- /* Add a comment. */
- }
- function newsAction()
- {
- /* Add news. */
- }
- function __call($action, $arguments)
- {
- $this->_redirect(’/');
- }
- }
- ?>
复制代码
记住AddController的indexAction()方法不能调用。当访问/add时会执行这个类方法。因为用户可以手工访问这个网址,这是有可能的,所以你要把用户重定向到主页、显示错误或你认为合适的行为。 接下来,创建AdminController.php文件:
- <?php
- Zend::loadClass(’Zend_Controller_Action’);
- class AdminController extends Zend_Controller_Action
- {
- function indexAction()
- {
- /* Display admin interface. */
- }
- function approveAction()
- {
- /* Approve news. */
- }
- function __call($action, $arguments)
- {
- $this->_redirect(’/');
- }
- }
- ?>
复制代码
最后,创建ViewController.php文件:
- <?php
- Zend::loadClass(’Zend_Controller_Action’);
- class ViewController extends Zend_Controller_Action
- {
- function indexAction()
- {
- $this->_redirect(’/');
- }
- function __call($id, $arguments)
- {
- /* Display news and comments for $id. */
- }
- }
- ?>
复制代码
和AddController一样,index()方法不能调用,所以你可以使用你认为合适的action。ViewController和其它的有点不同,因为你不知道什么才是有效的action。为了支持像/view/23这样的网址,你要使用__call()来支持动态action。
数据库操作因为Zend Framework的数据库组件还不稳定,而我希望这个演示可以做得简单一点。我使用了一个简单的类,用SQLite进行新闻条目和评论的存储和查询。
- <?php
- class Database
- {
- private $_db;
- public function __construct($filename)
- {
- $this->_db = new SQLiteDatabase($filename);
- }
- public function addComment($name, $comment, $newsId)
- {
- $name = sqlite_escape_string($name);
- $comment = sqlite_escape_string($comment);
- $newsId = sqlite_escape_string($newsId);
- $sql = “INSERT
- INTO comments (name, comment, newsId)
- VALUES (’$name’, ‘$comment’, ‘$newsId’)”;
- return $this->_db->query($sql);
- }
- public function addNews($title, $content)
- {
- $title = sqlite_escape_string($title);
- $content = sqlite_escape_string($content);
- $sql = “INSERT
- INTO news (title, content)
- VALUES (’$title’, ‘$content’)”;
- return $this->_db->query($sql);
- }
- public function approveNews($ids)
- {
- foreach ($ids as $id) {
- $id = sqlite_escape_string($id);
- $sql = “UPDATE news
- SET approval = ‘T’
- WHERE id = ‘$id’”;
- if (!$this->_db->query($sql)) {
- return FALSE;
- }
- }
- return TRUE;
- }
- public function getComments($newsId)
- {
- $newsId = sqlite_escape_string($newsId);
- $sql = “SELECT name, comment
- FROM comments
- WHERE newsId = ‘$newsId’”;
- if ($result = $this->_db->query($sql)) {
- return $result->fetchAll();
- }
- return FALSE;
- }
- public function getNews($id = ‘ALL’)
- {
- $id = sqlite_escape_string($id);
- switch ($id) {
- case ‘ALL’:
- $sql = “SELECT id,
- title
- FROM news
- WHERE approval = ‘T’”;
- break;
- case ‘NEW’:
- $sql = “SELECT *
- FROM news
- WHERE approval != ‘T’”;
- break;
- default:
- $sql = “SELECT *
- FROM news
- WHERE id = ‘$id’”;
- break;
- }
- if ($result = $this->_db->query($sql)) {
- if ($result->numRows() != 1) {
- return $result->fetchAll();
- } else {
- return $result->fetch();
- }
- }
- return FALSE;
- }
- }
- ?>
复制代码
(你可以用自己的解决方案随意替换这个类。这里只是为你提供一个完整示例的介绍,并非建议要这么实现。) 这个类的构造器需要SQLite数据库的完整路径和文件名,你必须自己进行创建。
- <?php
- $db = new SQLiteDatabase(’/path/to/db.sqlite’);
- $db->query(”CREATE TABLE news (
- id INTEGER PRIMARY KEY,
- title VARCHAR(255),
- content TEXT,
- approval CHAR(1) DEFAULT ‘F’
- )”);
- $db->query(”CREATE TABLE comments (
- id INTEGER PRIMARY KEY,
- name VARCHAR(255),
- comment TEXT,
- newsId INTEGER
- )”);
- ?>
复制代码
你只需要做一次,以后直接给出Database类构造器的完整路径和文件名即可:
- <?php
- $db = new Database(’/path/to/db.sqlite’);
- ?>
复制代码
|
构建新闻管理系统虽然预览版提供了许多组件(甚至许多已经被开发),我们已经讨论了构建一个简单程序所需要的全部组件。在这里,你会对ZF的基本结构和设计有更清楚的理解。 每个人开发的程序都会有所不同,而Zend Framework试图包容这些差异。同样,这个教程是根据我的喜好写的,请根据自己的偏好自行调整。 当我开发程序时,我会先做界面。这并不意味着我把时间都花在标签、样式表和图片上,而是我从一个用户的角度去考虑问题。因此我把程序看成是页面的集合,每一页都是一个独立的网址。这个新闻系统就是由以下网址组成的:
/ /add/news /add/comment /admin /admin/approve /view/{id}
你可以直接把这些网址和controller联系起来。IndexController列出新闻,AddController添加新闻和评论,AdminController处理一些如批准新闻之类的管理,ViewController特定新闻和对应评论的显示。 如果你的FooController.php还在,把它删除。修改IndexController.php,为业务逻辑以添加相应的action和一些注释:
- <?php
- Zend::loadClass(’Zend_Controller_Action’);
- class IndexController extends Zend_Controller_Action
- {
- public function indexAction()
- {
- /* List the news. */
- }
- public function noRouteAction()
- {
- $this->_redirect(’/');
- }
- }
- ?>
复制代码
接下来,创建AddController.php文件:
- <?php
- Zend::loadClass(’Zend_Controller_Action’);
- class AddController extends Zend_Controller_Action
- {
- function indexAction()
- {
- $this->_redirect(’/');
- }
- function commentAction()
- {
- /* Add a comment. */
- }
- function newsAction()
- {
- /* Add news. */
- }
- function __call($action, $arguments)
- {
- $this->_redirect(’/');
- }
- }
- ?>
复制代码
记住AddController的indexAction()方法不能调用。当访问/add时会执行这个类方法。因为用户可以手工访问这个网址,这是有可能的,所以你要把用户重定向到主页、显示错误或你认为合适的行为。 接下来,创建AdminController.php文件:
- <?php
- Zend::loadClass(’Zend_Controller_Action’);
- class AdminController extends Zend_Controller_Action
- {
- function indexAction()
- {
- /* Display admin interface. */
- }
- function approveAction()
- {
- /* Approve news. */
- }
- function __call($action, $arguments)
- {
- $this->_redirect(’/');
- }
- }
- ?>
复制代码
最后,创建ViewController.php文件:
- <?php
- Zend::loadClass(’Zend_Controller_Action’);
- class ViewController extends Zend_Controller_Action
- {
- function indexAction()
- {
- $this->_redirect(’/');
- }
- function __call($id, $arguments)
- {
- /* Display news and comments for $id. */
- }
- }
- ?>
复制代码
和AddController一样,index()方法不能调用,所以你可以使用你认为合适的action。ViewController和其它的有点不同,因为你不知道什么才是有效的action。为了支持像/view/23这样的网址,你要使用__call()来支持动态action。
数据库操作因为Zend Framework的数据库组件还不稳定,而我希望这个演示可以做得简单一点。我使用了一个简单的类,用SQLite进行新闻条目和评论的存储和查询。
- <?php
- class Database
- {
- private $_db;
- public function __construct($filename)
- {
- $this->_db = new SQLiteDatabase($filename);
- }
- public function addComment($name, $comment, $newsId)
- {
- $name = sqlite_escape_string($name);
- $comment = sqlite_escape_string($comment);
- $newsId = sqlite_escape_string($newsId);
- $sql = “INSERT
- INTO comments (name, comment, newsId)
- VALUES (’$name’, ‘$comment’, ‘$newsId’)”;
- return $this->_db->query($sql);
- }
- public function addNews($title, $content)
- {
- $title = sqlite_escape_string($title);
- $content = sqlite_escape_string($content);
- $sql = “INSERT
- INTO news (title, content)
- VALUES (’$title’, ‘$content’)”;
- return $this->_db->query($sql);
- }
- public function approveNews($ids)
- {
- foreach ($ids as $id) {
- $id = sqlite_escape_string($id);
- $sql = “UPDATE news
- SET approval = ‘T’
- WHERE id = ‘$id’”;
- if (!$this->_db->query($sql)) {
- return FALSE;
- }
- }
- return TRUE;
- }
- public function getComments($newsId)
- {
- $newsId = sqlite_escape_string($newsId);
- $sql = “SELECT name, comment
- FROM comments
- WHERE newsId = ‘$newsId’”;
- if ($result = $this->_db->query($sql)) {
- return $result->fetchAll();
- }
- return FALSE;
- }
- public function getNews($id = ‘ALL’)
- {
- $id = sqlite_escape_string($id);
- switch ($id) {
- case ‘ALL’:
- $sql = “SELECT id,
- title
- FROM news
- WHERE approval = ‘T’”;
- break;
- case ‘NEW’:
- $sql = “SELECT *
- FROM news
- WHERE approval != ‘T’”;
- break;
- default:
- $sql = “SELECT *
- FROM news
- WHERE id = ‘$id’”;
- break;
- }
- if ($result = $this->_db->query($sql)) {
- if ($result->numRows() != 1) {
- return $result->fetchAll();
- } else {
- return $result->fetch();
- }
- }
- return FALSE;
- }
- }
- ?>
复制代码
(你可以用自己的解决方案随意替换这个类。这里只是为你提供一个完整示例的介绍,并非建议要这么实现。) 这个类的构造器需要SQLite数据库的完整路径和文件名,你必须自己进行创建。
- <?php
- $db = new SQLiteDatabase(’/path/to/db.sqlite’);
- $db->query(”CREATE TABLE news (
- id INTEGER PRIMARY KEY,
- title VARCHAR(255),
- content TEXT,
- approval CHAR(1) DEFAULT ‘F’
- )”);
- $db->query(”CREATE TABLE comments (
- id INTEGER PRIMARY KEY,
- name VARCHAR(255),
- comment TEXT,
- newsId INTEGER
- )”);
- ?>
复制代码
你只需要做一次,以后直接给出Database类构造器的完整路径和文件名即可:
- <?php
- $db = new Database(’/path/to/db.sqlite’);
- ?>
复制代码
|
构建新闻管理系统虽然预览版提供了许多组件(甚至许多已经被开发),我们已经讨论了构建一个简单程序所需要的全部组件。在这里,你会对ZF的基本结构和设计有更清楚的理解。 每个人开发的程序都会有所不同,而Zend Framework试图包容这些差异。同样,这个教程是根据我的喜好写的,请根据自己的偏好自行调整。 当我开发程序时,我会先做界面。这并不意味着我把时间都花在标签、样式表和图片上,而是我从一个用户的角度去考虑问题。因此我把程序看成是页面的集合,每一页都是一个独立的网址。这个新闻系统就是由以下网址组成的:
/
/add/news
/add/comment
/admin
/admin/approve
/view/{id}
你可以直接把这些网址和controller联系起来。
IndexController
列出新闻,
AddController
添加新闻和评论,
AdminController
处理一些如批准新闻之类的管理,
ViewController
特定新闻和对应评论的显示。 如果你的
FooController.php
还在,把它删除。修改
IndexController.php
,为业务逻辑以添加相应的action和一些注释:
- <?php
- Zend::loadClass(’Zend_Controller_Action’);
- class IndexController extends Zend_Controller_Action
- {
- public function indexAction()
- {
- /* List the news. */
- }
- public function noRouteAction()
- {
- $this->_redirect(’/');
- }
- }
- ?>
复制代码
接下来,创建
AddController.php
文件:
- <?php
- Zend::loadClass(’Zend_Controller_Action’);
- class AddController extends Zend_Controller_Action
- {
- function indexAction()
- {
- $this->_redirect(’/');
- }
- function commentAction()
- {
- /* Add a comment. */
- }
- function newsAction()
- {
- /* Add news. */
- }
- function __call($action, $arguments)
- {
- $this->_redirect(’/');
- }
- }
- ?>
复制代码
记住
AddController
的
indexAction()
方法不能调用。当访问
/add
时会执行这个类方法。因为用户可以手工访问这个网址,这是有可能的,所以你要把用户重定向到主页、显示错误或你认为合适的行为。 接下来,创建
AdminController.php
文件:
- <?php
- Zend::loadClass(’Zend_Controller_Action’);
- class AdminController extends Zend_Controller_Action
- {
- function indexAction()
- {
- /* Display admin interface. */
- }
- function approveAction()
- {
- /* Approve news. */
- }
- function __call($action, $arguments)
- {
- $this->_redirect(’/');
- }
- }
- ?>
复制代码
最后,创建
ViewController.php
文件:
- <?php
- Zend::loadClass(’Zend_Controller_Action’);
- class ViewController extends Zend_Controller_Action
- {
- function indexAction()
- {
- $this->_redirect(’/');
- }
- function __call($id, $arguments)
- {
- /* Display news and comments for $id. */
- }
- }
- ?>
复制代码
和
AddController
一样,
index()
方法不能调用,所以你可以使用你认为合适的action。
ViewController
和其它的有点不同,因为你不知道什么才是有效的action。为了支持像
/view/23
这样的网址,你要使用
__call()
来支持动态action。
数据库操作因为Zend Framework的数据库组件还不稳定,而我希望这个演示可以做得简单一点。我使用了一个简单的类,用SQLite进行新闻条目和评论的存储和查询。
- <?php
- class Database
- {
- private $_db;
- public function __construct($filename)
- {
- $this->_db = new SQLiteDatabase($filename);
- }
- public function addComment($name, $comment, $newsId)
- {
- $name = sqlite_escape_string($name);
- $comment = sqlite_escape_string($comment);
- $newsId = sqlite_escape_string($newsId);
- $sql = “INSERT
- INTO comments (name, comment, newsId)
- VALUES (’$name’, ‘$comment’, ‘$newsId’)”;
- return $this->_db->query($sql);
- }
- public function addNews($title, $content)
- {
- $title = sqlite_escape_string($title);
- $content = sqlite_escape_string($content);
- $sql = “INSERT
- INTO news (title, content)
- VALUES (’$title’, ‘$content’)”;
- return $this->_db->query($sql);
- }
- public function approveNews($ids)
- {
- foreach ($ids as $id) {
- $id = sqlite_escape_string($id);
- $sql = “UPDATE news
- SET approval = ‘T’
- WHERE id = ‘$id’”;
- if (!$this->_db->query($sql)) {
- return FALSE;
- }
- }
- return TRUE;
- }
- public function getComments($newsId)
- {
- $newsId = sqlite_escape_string($newsId);
- $sql = “SELECT name, comment
- FROM comments
- WHERE newsId = ‘$newsId’”;
- if ($result = $this->_db->query($sql)) {
- return $result->fetchAll();
- }
- return FALSE;
- }
- public function getNews($id = ‘ALL’)
- {
- $id = sqlite_escape_string($id);
- switch ($id) {
- case ‘ALL’:
- $sql = “SELECT id,
- title
- FROM news
- WHERE approval = ‘T’”;
- break;
- case ‘NEW’:
- $sql = “SELECT *
- FROM news
- WHERE approval != ‘T’”;
- break;
- default:
- $sql = “SELECT *
- FROM news
- WHERE id = ‘$id’”;
- break;
- }
- if ($result = $this->_db->query($sql)) {
- if ($result->numRows() != 1) {
- return $result->fetchAll();
- } else {
- return $result->fetch();
- }
- }
- return FALSE;
- }
- }
- ?>
复制代码
(你可以用自己的解决方案随意替换这个类。这里只是为你提供一个完整示例的介绍,并非建议要这么实现。) 这个类的构造器需要SQLite数据库的完整路径和文件名,你必须自己进行创建。
- <?php
- $db = new SQLiteDatabase(’/path/to/db.sqlite’);
- $db->query(”CREATE TABLE news (
- id INTEGER PRIMARY KEY,
- title VARCHAR(255),
- content TEXT,
- approval CHAR(1) DEFAULT ‘F’
- )”);
- $db->query(”CREATE TABLE comments (
- id INTEGER PRIMARY KEY,
- name VARCHAR(255),
- comment TEXT,
- newsId INTEGER
- )”);
- ?>
复制代码
你只需要做一次,以后直接给出
Database
类构造器的完整路径和文件名即可:
- <?php
- $db = new Database(’/path/to/db.sqlite’);
- ?>
复制代码
转载于:https://blog.51cto.com/chinawl/285486