<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ORM 對象映射法是在ZF2開發指南中引用的一種模型編寫方法,可以當作是ZF2的推薦寫法,此方法的實現主要通過TableGateway(作者稱為數據庫網關);此方法通過Di來實現,對其進行引用前需要對他做相關配置工作;總的來說引用簡單、模型與模塊關聯性較強。 在編寫模型代碼前先進行數據表的設計,數據表創建在Mysql數據庫的test默認數據庫里表名為news;以下里數據表的設計及多條測試數據。 ~~~ CREATE TABLE news (id int(10) NOT NULL AUTO_INCREMENT,title varchar(100) NOT NULL,content varchar(1000) NOT NULL,PRIMARY KEY(id)); INSERT INTO news(title,content) VALUES(‘First news’,’This is the first news’); INSERT INTO news(title,content) VALUES(‘Second news’,’This is the second news’); INSERT INTO news(title,content) VALUES(‘Third news’,’This is the third news’); INSERT INTO news(title,content) VALUES(‘fourth news’,’This is the fourth news’); INSERT INTO news(title,content) VALUES(‘Fifth news’,’This is the fifth news’); INSERT INTO news(title,content) VALUES(‘Sixth news’,’This is the sixth news’); ~~~ 已經有了數據庫、數據表、數據需要對數據庫的訪問屬性(數據庫適配器Adapter)進行設置后模型才能夠正常的連接到我們的數據庫,找到文件 `/config/autoload/global.php` 文件內容如下: ~~~ return array( 'db' => array( 'driver' => 'Pdo', 'dsn' => 'mysql:dbname=test;host=localhost', 'driver_options' => array( PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'' ), ), 'service_manager' => array( 'factories' => array( 'Zend\Db\Adapter\Adapter' => 'Zend\Db\Adapter\AdapterServiceFactory' ), ), ); ~~~ * db 表示數據庫配置信息節點 * driver 表示數據庫使用的驅動程序類型 * dsn 數據庫連接串,也稱為數據源 * driver_options 數據庫驅動選項 * service_manager 表示服務器管理器節點 * factories 表示服務器管理器需要加載的工廠類 為要安全起見,將數據庫的用戶名與密碼寫入到 /config/autoload/local.php 文件,你同樣也可以將他寫入到global文件的db 節點中。local.php文件內容如下: ~~~ return array( 'db' => array( 'username' => 'root', 'password' => '' ), ); ~~~ ### 6.1.1 創建 News 類 News 類主要包括數據表中個各字段的映射,以及實現數組與對象之間的數據轉換 路徑:`/module/Application/src/Application/Model/News.php` 在文件中添加收下代碼: ~~~ namespace Application\Model; class News { public $id; public $title; public $content; public function exchangeArray($data){ $this->id = (isset($data['id'])) ? $data['id'] : null; $this->artist = (isset($data['title'])) ? $data['title'] : null; $this->title = (isset($data['content'])) ? $data['content'] : null; } public function getArrayCopy(){ return get_object_vars($this); } } ~~~ 代碼講解: public $id,$title,$content 這些公共變量與數據表字段一一對應 public function exchangeArray($data) 對數組數據進行轉換或都說是提取數組數據 public function getArrayCopy() 將類屬性轉化為一個關聯數組,方便后續的使用 ### 6.1.2 創建 NewsTable 類 NewsTable 類的主要是通過TableGateway 數據網關來實現對數據庫操作。 路徑:`/module/Application/src/Application/Model/NewsTable.php` 在文件中添加以下代碼: ~~~ namespace Application\Model; use Zend\Db\TableGateway\TableGateway; use Zend\Db\ResultSet\ResultSet; use Zend\Db\Sql\Select; class NewsTable { protected $tableGateway; public function __construct(TableGateway $tg) { $this->tableGateway = $tg; } public function fetchAll() { $resultSet = $this->tableGateway->select(); return $resultSet; } } ~~~ public function __construct(TableGateway $tg) 構造函數 public funciton fetchAll() 獲取數據表的數據 ### 6.1.3 使用模型讀取數據庫數據 在使用模型的時候需要對其他進行模塊配置,以便ZF2能夠地運行的時候自動加載。 #### 6.1.3.1 模塊配置 找到文件 `/module/Application/Module.php` ,在添加函數的時候注意導入相關的命名空間,添加函數 `public function getServiceConfig(){}`,函數名稱是固定的,ZF2會在運行的時候自動調用Module 中的全部方法。添加內容后的文件如下: ~~~ namespace Application; use Zend\Mvc\ModuleRouteListener; use Zend\Mvc\MvcEvent; use Zend\Db\ResultSet\ResultSet; use Zend\Db\TableGateway\TableGateway; use Application\Model\News; use Application\Model\NewsTable; class Module { public function onBootstrap(MvcEvent $e){ $eventManager = $e->getApplication()->getEventManager(); $moduleRouteListener = new ModuleRouteListener(); $moduleRouteListener->attach($eventManager); } public function getConfig(){ return include __DIR__ . '/config/module.config.php'; } public function getAutoloaderConfig(){ return array( 'Zend\Loader\StandardAutoloader'=>array( 'namespaces'=>array( __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__ ) ) ); } public function getServiceConfig(){ return array( 'factories'=>array( 'Application\Model\NewsTable'=>function($sm){ $tg = $sm->get('NewsTableGateway'); $table = new NewsTable($tg); return $table; }, 'NewsTableGateway'=>function($sm){ $adapter = $sm->get('Zend\Db\Adapter\Adapter'); $rs = new ResultSet(); $rs->setArrayObjectPrototype(new News()); return new TableGateway('news',$adapter,null,$rs); } ), ); } } ~~~ 通過以上的函數就配置好了模塊對模型的引用,從函數getServiceConfig 的內容中可以看出函數本身只返回一個關聯數組,這個關聯數據的 鍵-值 都將在后續中被引用;同時也可以看出我們目錄的配置是針對news 表的操作,也是為什么我們在上面的模型中fetchAll()函數里沒有看到數據表的原因。 #### 6.1.3.2 控制器中使用模型 找到文件 `/module/Application/src/Application/Controller/NewsController.php`,添加函數 `public function getNewsTable(){}`,同時修改 `public function listAction(){}`函數內容,注意導入相關包;文件修改后如下: ~~~ namespace Application\Controller; use Zend\Mvc\Controller\AbstractActionController; use Zend\View\Model\ViewModel; use Application\Model\NewsTable; class NewsController extends AbstractActionController{ protected $newsTalbe; public function __construct(){ } public function indexAction(){ $view = new ViewModel(); return $view; } public function listAction(){ $paginator = $this->getNewsTalbe()->fetchAll(); var_dump($paginator); exit; } public function addAction(){ echo 'NewsController addAction'; exit; } public function editAction(){ echo 'NewsController editAction'; exit; } public function deleteAction(){ echo 'NewsController deleteAction'; exit; } public function getNewsTalbe(){ if(!$this->newsTalbe){ $sm = $this->getServiceLocator(); $this->newsTalbe = $sm->get('Application\Model\NewsTable'); } return $this->newsTalbe; } } ~~~ public function getNewsTalbe(){} 的主要工作就是完成對數據網關的實例化 $sm = $this->getServiceLocator() 獲取本地已經初化的服務管理器及服務 $this->newsTalbe = $sm->get('Application\Model\NewsTable') 獲取在模塊文件中的相關函數 $paginator = $this->getNewsTalbe()->fetchAll() 通過模型(數據網關)訪問數據庫 通過添加以上代碼就可以通過 http://localhost/news/list 來查看模型對數據庫的相關操作信息了。在此處只是通過 var_dump 函數對模型的操作結果進行打印輸出,而并沒有通過模板來呈現;要想通過模板來呈現模型對數據庫查詢的結果還需要進行一些小的修改。 #### 6.1.3.3 通過模板顯示數據庫查詢結果 模板是匯集網站應用所有操作的一個最終集合點,最終將所有匯集的數據集中展現給用戶。在使用模板前我們還得修改下控制器,以便控制器能將模型操作的結果傳遞到模板中去。修改 listAction 控制器內容為: ~~~ public function listAction(){ $paginator = $this->getNewsTalbe()->fetchAll(); $view = new ViewModel(); $view->setTemplate('application/news/list.phtml'); $view->setVariable('paginator', $paginator); return $view; } ~~~ $paginator = $this->getNewsTalbe()->fetchAll() 獲取模型查詢的數據 $view = new ViewModel() 實例化一個視圖模型 $view->setTemplate('application/news/list.phtml') 設置視圖模型所使用的模板 $view->setVariable('paginator', $paginator) 給視圖傳遞數據 return $view 將視圖模型返回給前端控制器 或者是使用以下代碼: ~~~ public function listAction(){ $paginator = $this->getNewsTalbe()->fetchAll(); return new ViewModel(array('paginator'=>$paginator)); } ~~~ 以后兩種方法的最終結果是一樣的。 接下來修改我們的模板文件 `/module/Application/view/application/news/list.phtml`,模板的內容如下: ~~~ <table> <tr> <th>Title</th> <th>Content</th> <th>Add news</a></th> </tr> <?php foreach ($paginator as $news) : ?> <tr> <td><?php echo $this->escapeHtml($news->title); ?></td> <td><?php echo $this->escapeHtml($news->content); ?></td> <td> <a href="<?php echo $this->url('news', array('action' => 'edit', 'id' => $news->id));?>"><?php echo $this->translate("Edit") ?></a> <a href="<?php echo $this->url('news', array('action' => 'delete', 'id' => $news->id));?>"><?php echo $this->translate("Delete") ?></a> </td> </tr> <?php endforeach; ?> </table> ~~~ foreach ($paginator as $news) 使用foreach 來循環模型查詢結果的數據行 echo $this->escapeHtml($news->title) 通過對象操作方式輸出新聞標題 echo $this->escapeHtml($news->content) 通過對象操作方式輸出新聞內容 echo $this->url('news', array('action' => 'edit', 'id' => $news->id)) 通過url 方法構造編輯新的鏈接 echo $this->url('news', array('action' => 'delete', 'id' => $news->id)) 通過url 方法構造刪除新的鏈接 現在通過 http://localhost/news/list 看看是不是已經把之前我們插入到數據的數據已經全部輸出了呢。結果如下所示: ~~~ header Title Content Add news First news This is the first news Edit Delete Second news This is the second news Edit Delete Third news This is the third news Edit Delete fourth news This is the fourth news Edit Delete Fifth news This is the fifth news Edit Delete Sixth news This is the sixth news Edit Delete footer ~~~ #### 6.1.3.4 插入數據 插入數據的功能通過添加新聞的方式來進行講解,在使用插入數據的功能時同時涉及到過濾器、表單生成的相關內容,本小節將這三個內容進行結合講解。 6.1.3.4.1 創建表單文件 添加表單文件,路徑:`/module/Application/src/Application/Form/NewsForm.php` 內容如下: ~~~ namespace Application\Form; use Zend\Form\Form; class NewsForm extends Form{ public function __construct($name='news') { parent::__construct($name); $this->setAttribute('method', 'post'); $this->add(array( 'name'=>'id', 'type'=>'Hidden' )); $this->add(array( 'name'=>'title', 'type'=>'Text', 'options'=>array( 'label'=>'Title' ), )); $this->add(array( 'name'=>'content', 'type'=>'Text', 'options'=>array( 'label'=>'Content' ), )); $this->add(array( 'name'=>'submit', 'type'=>'submit', 'attributes'=>array( 'value'=>'Go', 'id'=>'submit' ), )); } } ~~~ 代碼解析: public function __construct($name='news') 就是一個普通的構造函數,$name 為表單名稱 $this->setAttribute('method', 'post') 設置表單屬性 $this->add(array('name'=>'id','type'=>'Hidden')); 添加一個表單隱藏域,作為新聞ID $this->add(array('name'=>'title','type'=>'Text','options'=>array('label'=>'Title' ))); 添加一個input 標簽,作為新聞標題輸入 $this->add(array('name'=>'content','type'=>'Text','options'=>array('label'=>'Content'))); 添加一個input標簽,作為新聞內容輸入 $this->add(array('name'=>'submit','type'=>'submit','attributes'=>array('value'=>'Go','id'=>'submit'))); 添加一個提交按鈕 以上代碼就包含了一個新聞記錄所需的全部表單元素。 6.1.3.4.2 添加過濾器 文件:`/module/Application/src/Application/Model/News.php` 在此文件原來的基礎上添加了內容,文件內容: ~~~ namespace Application\Model; use Zend\InputFilter\Factory as InputFactory;// 新加導入包 use Zend\InputFilter\InputFilter;// 新加導入包 use Zend\InputFilter\InputFilterAwareInterface;// 新加導入包 use Zend\InputFilter\InputFilterInterface;// 新加導入包 class News implements InputFilterAwareInterface {// 添加了接口 public $id; public $content; public $title; protected $inputFilter; public function exchangeArray($data){ $this->id = (isset($data['id'])) ? $data['id'] : null; $this->content = (isset($data['content'])) ? $data['content'] : null; $this->title = (isset($data['title'])) ? $data['title'] : null; } public function getArrayCopy(){ return get_object_vars($this); } public function getInputFilter() {// 新添加,實現接口方法 if(!$this->inputFilter){ $this->inputFilter = new InputFilter(); $factory = new InputFactory(); $this->inputFilter->add($factory->createInput(array( 'name'=>'id', 'required'=>true, 'filters'=>array( array('name'=>'Int'), ), ))); $this->inputFilter->add($factory->createInput(array( 'name'=>'content', 'required'=>true, 'filters'=>array( array('name'=>'StripTags'), array('name'=>'StringTrim'), ), 'validators'=>array( array( 'name'=>'StringLength', 'options'=>array( 'encoding'=>'UTF-8', 'min'=>5, 'max'=>100, ), ), ), ))); $this->inputFilter->add($factory->createInput(array( 'name'=>'title', 'required'=>true, 'filters'=>array( array('name'=>'StripTags'), array('name'=>'StringTrim'), ), 'validators'=>array( array( 'name'=>'StringLength', 'options'=>array( 'encoding'=>'UTF-8', 'min'=>5, 'max'=>100, ), ), ), ))); } return $this->inputFilter; } public function setInputFilter(InputFilterInterface $inputFilter) {// 新添加,實現接口方法 throw new \Exception('Not used'); } ~~~ 代碼解析: public function getInputFilter() 獲取收入類型過濾器,對指定的表單元素進行過濾。 $this->inputFilter = new InputFilter(); 實例化一個InputFilter過濾器 $factory= new InputFactory(); 實例化一個InputFactory 輸入工廠 $this->inputFilter->add($factory->createInput(array('name'=>'id','required'=>true,'filters'=>array(array('name'=>'Int'))))); 創建過濾規則并將附加到InputFilter上,規則內容:name為id的標簽為必填項,并且限制為整形輸入 $this->inputFilter->add($factory->createInput(array('name'=>'content','required'=>true,'filters'=>array(array('name'=>'StripTags'),array('name'=>'StringTrim'))'validators'=>array(array('name'=>'StringLength','options'=>array('encoding'=>'UTF-8','min'=>5,'max'=>100))))));建過濾規則并將附加到InputFilter上,此處的過濾規則為一個過濾鏈,規則內容:name 為 content的標簽為必填項,并對其他輸入進行去HTML標簽(StripTags)和去空格(StringTrim)處理,同時對輸入內容進一步校驗,校驗規則為將輸入內容限制為utf-8,同時長度為5~100的個字符。 public function setInputFilter(InputFilterInterface $inputFilter) 設置過濾,實現接口的方法 6.1.3.4.3 創建表單 通過上面兩個小節的內容已經完成了創建表單的基本要素,下面將通過控制器中的方法來引用上面的內容來生成一個新聞表單。 打開文件:`/module/Application/src/Application/Controller/NewsController.php`,添加如下內容: 導入包 ~~~ use Application\Form\NewsForm; use Application\Model\News; ~~~ 修改public function addAction(){} 函數內容,具體內容如下: ~~~ public function addAction(){ $form = new NewsForm(); $form->get('submit')->setValue('Add'); $request = $this->getRequest(); if($request->isPost()){ $news= new News(); $form->setInputFilter($news->getInputFilter()); $form->setData($request->getPost()); if($form->isValid()){ $album->exchangeArray($form->getData()); $this->getNewsTalbe()->saveNews($news); return $this->redirect()->toRoute('news');// 或者使用URL$this->redirect()->toUrl('/news/list'); } } return array('form'=>$form); } ~~~ addAction 函數內容代碼解釋: $form = new NewsForm(); 實例化一個新聞表單 $form->get('submit')->setValue('Add');修改新聞表單的提交按鈕名稱 $request = $this->getRequest(); 獲取用戶請求 if($request->isPost()){} 判斷 是否為 POST請求 $form->setInputFilter($news->getInputFilter()); 為表單添加過濾器 $form->setData($request->getPost()); 設置表單數據 if($form->isValid()){} 判斷表單是否通過校驗 $news->exchangeArray($form->getData()); 能表單數據進行轉換 $this->getNewsTalbe()->saveNews($news); 通過模型將表單提交的數據保存到數據庫里 return $this->redirect()->toRoute('news'); 實現路由跳轉 return array('form'=>$form); 返回一個表單對象 6.1.3.4.4 模板輸出表單 收到從控制器中傳遞過來數據并將數據在模板中輸出,打開文件:/module/Application/view/application/news/add.phtml,文件具體內容如下: $form = $this->form; // 接收到控制器傳遞過來的表單對象 $form->setAttribute('action',$this->url('news',array('action'=>'add')));// 設置表單的action屬性 echo $this->form()->openTag($form);// 打開form表單 echo $this->formCollection($this->form);// 輸出表單里的元素集合 echo $this->form()->closeTag();// 閉合form表單 此處是使用簡潔法輸出表單,即通過打開表單,輸出表單、閉合表單這個動作一次性把表單里的所有元素輸出。這種方法的好處是只用3行代碼就能把表單里的全部元素輸出,缺點就是全部屬性都使用$form對象的默認設置屬性,靈活度沒那么好。另一種表單輸出的方法就是對$form表單對象里的元素一個一個輸出,并且可以對表單對象元素進行相關修改,靈活度較好,但代碼量較大。 通過前面四節的課內容現在可以通過 http://localhost/news/add 打開新聞表單了,并可以通過表單將將數據提交到數據庫進行保存。頁面結果如下: ~~~ header 窗體頂端 Title窗體底端 Content footer ~~~ 6.1.3.4.5 添加模型方法saveNews 要把新聞表單的數據能夠提交到數據庫中進行保存,還需要在模型中添加保存新聞的模型方法,打開模型文件 `/module/Application/src/Application/Model/NewsTables.php` 文件,添加如下方法: ~~~ public function saveNews(News $news) { $data = array( 'content' =>$news->content, 'title' =>$news->title ); $id = (int) $news->id; if($id == 0){ $this->tableGateway->insert($data); }else{ if($this->getNews($id)){ $this->tableGateway->update($data,array('id'=>$id)); }else{ throw new \Exception("Could not find row {$id}"); } } } ~~~ 代碼解釋: $data = array( 'content' =>$news->content,'title' =>$news->title); 將傳遞過來的數據保存到數組中,因為在ZF2中對數據的操作很多是通過數組來傳遞的 $this->tableGateway->insert($data); 如果id不存在的時候將數據里的數據插入到數據庫,此處實現插入功能 $this->tableGateway->update($data,array('id'=>$id)); 如果id存在的時候,對數據庫里指定id的數據行進行更新 throw new \Exception("Could not find row {$id}"); 如果更新出現錯誤則拋出一個異常 public function saveNews(News $news){} 方法說明 ,此方法不單用來保存添加新聞時的數據,也將用來保存更新新聞內容后的數據,即包含了插入和更新功能。 模型方法saveNews 建立好后就可以通過 http://loaclhost/news/add 來添加新聞并保存到數據庫了。 6.1.3.4.6 修改新聞內容 上面一節內容已經講解了怎么通過表單將一個新插入到數據庫里,接下來就是要實現如果使用表單來修改一條新聞記錄并將他保存到數據庫。在前一節講解內容的時候已經說過 saveNews 保存數據功能不僅用于添加新聞,也用于新聞的修改,表單也是重用之前內容的表單,所以這些部分的內容就不再重復進行講解。下面將重點放在控制器的 editAction方法和edit.phtml模板中。 6.1.3.4.6.1修改模塊路由 在繼續制作editAction 和 edit.phtml 前我需要對我們的module.config.php 的模塊文件做一個小的修改,在修改前可以看一下之前輸出的新聞列表的最后一個列中 Edit 種 Delete 的鏈接,看看鏈接地址的后面是不是沒有出現我們平時做網站時應該出現的id 值。這是由于我們之前對模塊路由的配置中并沒有包括對參數傳遞的功能,如果路由上沒有配置這些傳遞參數的功能,即使你強行在鏈接地址的后面加上去也會被路由匹配規則給過濾掉,最終可能導致一個404的錯誤出現。 打開文件:/module/Application/config/module.config.php 將路由 news 區段修改為如下內容: ~~~ 'news'=>array( 'type'=>'segment', 'options'=>array( 'route'=>'/news[/][:action][/:id]', 'constraints'=>array( 'action'=>'[a-zA-Z]*', 'id'=>'[0-9]+' ), 'defaults'=>array( 'controller'=>'Application\Controller\News', 'action'=>'index' ), ), ), ~~~ 路由做過調整的地方: 'route'=>'/news[/][:action]' 修改為 route'=>'/news[/][:action][/:id]', 'id'=>'[0-9]+' 添加了路由中id 的匹配規則,只匹配數字類型的id 添加模型方法 public function getNews($id){},此方法功能是根據$id查找數據庫中的新聞記錄并返回查詢結果行。打開文件:`/module/Application/src/Application/Model/NewsTable.php` 在文件原來的基礎上添加如下內容: ~~~ public function getNews($id){ $id = (int) $id; $rowset = $this->tableGateway->select(array('id'=>$id)); $row = $rowset->current(); if(!$row){ throw new \Exception("Could not find row {$id}"); } return $row; } ~~~ 模型方法內容解釋: $id = (int) $id; 將傳遞過來的id強制轉換為整形 $rowset = $this->tableGateway->select(array('id'=>$id)); 根據id查詢新聞結果集 $row = $rowset->current(); 取出結果集的第一行記錄 if(!$row){} 判斷是否存在指定id 的新聞記錄行,如果不存在則拋出一個異常 return $row 返回查詢結果的新聞記錄行 6.1.3.4.6.2修改editAction 方法 打開文件:`/module/Application/src/Application/Controller/NewsController.php`,找到editAction 方法并將內容修改為如下: ~~~ public function editAction(){ $id = (Int) $this->params()->fromRoute('id',0); if(!$id){ return $this->redirect()->toRoute('news',array('action'=>'add')); } try{ $news = $this->getNewsTalbe()->getNews($id); }catch(\Exception $e){ return $this->redirect()->toRoute('news',array('action'=>'list')); } $form = new NewsForm(); $form->bind($news); $form->get('submit')->setAttribute('value', 'Edit'); $request = $this->getRequest(); if($request->isPost()){ $form->setInputFilter($news->getInputFilter()); $form->setData($request->getPost()); if($form->isValid()){ $this->getNewsTalbe()->saveNews($news); $this->redirect()->toUrl('/news/list'); } } return array('id'=>$id,'form'=>$form); } ~~~ 代碼解釋: $id = (Int) $this->params()->fromRoute('id',0); 從路由中分離id,也就是獲取新聞id if(!$id){} 如果id 不存在則直接跳轉到添加新聞頁面 $news = $this->getNewsTalbe()->getNews($id); 通過數據網關獲取指定id的新聞記錄 return $this->redirect()->toRoute('news',array('action'=>'list')); 如果在獲取新聞記錄中出現異常則直接跳轉到列表頁 $form = new NewsForm(); 實例化一個新聞表單 $form->bind($news); 給表單綁定數據 $form->get('submit')->setAttribute('value', 'Edit');設置表單提交按鈕名稱 $request = $this->getRequest(); 獲取用戶請求 if($request->isPost()){} 判斷是否通過post提交的請求 $form->setInputFilter($news->getInputFilter()); 為表單添加過濾器 $form->setData($request->getPost());為表單附加數據 if($form->isValid()){} 判斷表單數據是否通過校驗 $this->getNewsTalbe()->saveNews($news);將編輯后的數據更新到數據庫 $this->redirect()->toUrl('/news/list'); 跳轉到新聞列表 return array('id'=>$id,'form'=>$form); 返回一個表單對象和新聞id到模板,此處的表單對象與前面章節中插入數據的表單有所區別,此表單里面的標簽都已經有數據的了,而之前插入新聞的表單只是一個空的表單。 6.1.3.4.6.3修改edit.phtml模板 打開文件:`/module/Applicaiton/view/application/news/edit.phtml`,將文件內容修改為如下: ~~~ $form = $this->form; $form->setAttribute('action',$this->url('news',array('action'=>'edit','id'=>$this->id))); // 設置表單的action 屬性 echo $this->form()->openTag($form);// 打開form 表單 echo $this->formCollection($this->form);// 生成表單元素 echo $this->form()->closeTag();// 關閉表單 ~~~ 到目前為止就已經完成了新聞修改功能的全部工作,現在可以通過新聞列表中的 Edit 鏈接來打開修改新聞的頁面了,修改新聞的頁面與添加新聞的頁面外觀上看上去是一樣的;只不過新聞修改頁面多了一重判斷,當指定id的新聞記錄存在時則可以進行修改,如果指定的id還在,則進行的是添加功能。 6.1.3.4.7 刪除新聞記錄 本節將講解關于數據庫CURD中的最后一個是重要環節--數據庫的刪除操作,本章節所講解的主要任務是實現對指定新聞id的刪除功能。 6.1.3.4.7.1修改deleteAction 方法 打開文件:`/module/Application/src/Application/Controller/NewsController.php`,找到deleteAction 方法并將內容修改為如下: ~~~ public function deleteAction(){ $id = (Int) $this->params()->fromRoute('id',0); if(!$id){ $this->redirect()->toUrl('/news/list'); } $request = $this->getRequest(); if($request->isPost()){ $del = $request->getPost('del','No'); if($del=='Yes'){ $id = (Int)$request->getPost('id'); $this->getNewsTalbe()->deleteNews($id); } $this->redirect()->toUrl('/news/list'); } return array('id'=>$id,'news'=>$this->getNewsTalbe()->getNews($id)); } ~~~ 代碼解釋: $id = (Int) $this->params()->fromRoute('id',0) 獲取新聞記錄id if(!$id){$this->redirect()->toUrl('/news/list');} 判斷是否有傳遞id 值,如果沒有則直接跳轉到新聞列表頁面 if($request->isPost()){} 判斷用戶請求類型是否為post 請求 $del = $request->getPost('del','No'); 獲取用戶處理動作{Yes或No} if($del=='Yes'){} 如果用戶操作就連Yes,則進行刪除操作 $id = (Int)$request->getPost('id'); 獲取新聞id $this->getNewsTalbe()->deleteNews($id); 刪除指定的新聞記錄 $this->redirect()->toUrl('/news/list'); // 完成刪除后跳轉到新聞列表 return array('id'=>$id,'news'=>$this->getNewsTalbe()->getNews($id)); 如果用戶請求為非post 請求,則返回數據給模板 6.1.3.4.7.2添加模型 deleteNews方法 打開模型文件 `/module/Application/src/Application/Model/NewsTables.php` 文件,添加如下方法: ~~~ public function deleteNews($id){ $this->tableGateway->delete(array('id'=>$id)); } ~~~ 代碼解釋: $this->tableGateway->delete(array('id'=>$id)); 根據傳遞過來的id刪除新聞記錄 6.1.3.4.7.2修改delete.phtml模板 打開文件:/module/Applicaiton/view/application/news/delete.phtml,將文件內容修改為如下: ~~~ $title = 'Delete news'; $this->headTitle($title); ?> <h1><?php echo $this->escapeHtml($title); ?></h1> <p>Are you sure that you want to delete '<?php echo $this->escapeHtml($news->title); ?>' by '<?php echo $this->escapeHtml($news->content); ?>'? </p> <?php $url = $this->url('news', array( 'action' => 'delete', 'id' => $this->id, )); ?> <form action="<?php echo $url; ?>" method="post"> <div> <input type="hidden" name="id" value="<?php echo (int) $news->id; ?>" /> <input type="submit" name="del" value="Yes" /> <input type="submit" name="del" value="No" /> </div> </form> ~~~ 代碼解釋: $this->headTitle($title); 設置文件標題 echo $this->escapeHtml($news->title); 輸出新聞標題 echo $this->escapeHtml($news->content); 輸出新聞內容 $url = $this->url('news', array('action' => 'delete','id' => $this->id)); 構造表單的action鏈接 以上為主要的php內容,致以表單中其他的html代碼就不再做解釋。下面轉到新聞列表頁面,http://localhost/news/list 在新聞列表中點擊Delete將跳轉到刪除的確認頁面,然后確認是否刪除。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看