构建新闻管理系统虽然预览版提供了许多组件(甚至许多已经被开发),我们已经讨论了构建一个简单程序所需要的全部组件。在这里,你会对ZF的基本结构和设计有更清楚的理解。  每个人开发的程序都会有所不同,而Zend Framework试图包容这些差异。同样,这个教程是根据我的喜好写的,请根据自己的偏好自行调整。  当我开发程序时,我会先做界面。这并不意味着我把时间都花在标签、样式表和图片上,而是我从一个用户的角度去考虑问题。因此我把程序看成是页面的集合,每一页都是一个独立的网址。这个新闻系统就是由以下网址组成的:
/
/add/news
/add/comment
/admin
/admin/approve
/view/{id}
你可以直接把这些网址和controller联系起来。IndexController列出新闻,AddController添加新闻和评论,AdminController处理一些如批准新闻之类的管理,ViewController特定新闻和对应评论的显示。  如果你的FooController.php还在,把它删除。修改IndexController.php,为业务逻辑以添加相应的action和一些注释:
  1. <?php
  2. Zend::loadClass(’Zend_Controller_Action’);
  3. class IndexController extends Zend_Controller_Action
  4. {
  5.      public function indexAction()
  6.      {
  7. /* List the news. */
  8. }
  9.      public function noRouteAction()
  10.      {
  11. $this->_redirect(’/');
  12.      }
  13. }
  14. ?>
复制代码
接下来,创建AddController.php文件:
  1. <?php
  2. Zend::loadClass(’Zend_Controller_Action’);
  3. class AddController extends Zend_Controller_Action
  4. {
  5.      function indexAction()
  6.      {
  7. $this->_redirect(’/');
  8.      }
  9.      function commentAction()
  10.      {
  11. /* Add a comment. */
  12. }
  13.      function newsAction()
  14.      {
  15. /* Add news. */
  16. }
  17.      function __call($action, $arguments)
  18.      {
  19. $this->_redirect(’/');
  20.      }
  21. }
  22. ?>
复制代码
记住AddControllerindexAction()方法不能调用。当访问/add时会执行这个类方法。因为用户可以手工访问这个网址,这是有可能的,所以你要把用户重定向到主页、显示错误或你认为合适的行为。  接下来,创建AdminController.php文件:
  1. <?php
  2. Zend::loadClass(’Zend_Controller_Action’);
  3. class AdminController extends Zend_Controller_Action
  4. {
  5.      function indexAction()
  6.      {
  7. /* Display admin interface. */
  8. }
  9.      function approveAction()
  10.      {
  11. /* Approve news. */
  12. }
  13.      function __call($action, $arguments)
  14.      {
  15. $this->_redirect(’/');
  16.      }
  17. }
  18. ?>
复制代码
最后,创建ViewController.php文件:
  1. <?php
  2. Zend::loadClass(’Zend_Controller_Action’);
  3. class ViewController extends Zend_Controller_Action
  4. {
  5.      function indexAction()
  6.      {
  7. $this->_redirect(’/');
  8.      }
  9.      function __call($id, $arguments)
  10.      {
  11. /* Display news and comments for $id. */
  12. }
  13. }
  14. ?>
复制代码
AddController一样,index()方法不能调用,所以你可以使用你认为合适的action。ViewController和其它的有点不同,因为你不知道什么才是有效的action。为了支持像/view/23这样的网址,你要使用__call()来支持动态action。

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

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

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

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