mvc、.css.js调用、路径、更改项目主页、user会话、设置全局layout、动作中url_for、图片路径、获取IP、当前页地址、setTemplate和redirect的区别、forward、动作里设置title、keyword

 

一个mvc相互协同的例子:

1.添加model层代码(lib/model/doctrine/JobeetJobTable.class.ph):

 

    
    
    
    
  1. class JobeetJobTable extends Doctrine_Table{ 
  2.  
  3.      public function test(){ 
  4.  
  5.           //return $this->createQuery('j')->where('j.expires_at > ?', date('Y-m-d H:i:s', time()))->execute(); 
  6.  
  7.           return 'test'; 
  8.  
  9.      } 
  10.  

2.添加控制层代码(apps\frontend\modules\job\actions):

 

    
    
    
    
  1. public function executeIndex(sfWebRequest $request) 
  2.  
  3.  
  4.      $this->test=Doctrine_Core::getTable('JobeetJob')->test(); 
  5.  

模型层(Model layer)定义业务逻辑(数据库属于这个层)。symfony将与模型层关联的所有类和文件都放在lib/model目录下。

视图层(View)是与用户交互的层(模板引擎是这个层的一部分)。在symfony中,视图层主要由PHP模板组成。这些文件存储在不同的templates/目录中。

控 制层(Controller)是一段代码,它从模型层读取数据传送给视图层,由视图层显示到客户端。所有的请求都由前端控制器(index.php and frontend_dev.php)管理。这些前端控制器(front controllers)将实际工作交由动作(actions)处理。这些动作被合理的组织到模块(modules)中。

 

模板中.css和.js文件调用

include_stylesheets() 和include_javascripts()函数是通过读取view.yml文件中stylesheets项来决定调用哪些文件的。个人感觉比较好用的 还是

 

路径

URL /job/show/id/1可以在模板中通过url_for()辅助函数生成:

    
    
    
    
  1. url_for('job/show?id='.$job->getId()) 

你也可以使用“@路由规则名”的方式:

    
    
    
    
  1. url_for('@default?module=job&action=show&id='.$job->getId()) 

这两中方式是一样的,不过使用“@路由规则名”方式速度更快一些,因为程序不需要匹配所有路由,而是直接匹配与名称相对的规则。并且它不包含模块名和动作名,更加灵活(修改的时候直接改相应的规则,而不用修改每一个url_for()中模块和动作名)。

 

更改项目主页

正常的当使用symfony命令行生成一个项目后,用浏览器打开该项目显示的总会是一个symfony的首页,在此可以用模块来更改首页:

 

    
    
    
    
  1. # apps/frontend/config/routing.yml 
  2.  
  3. homepage: 
  4.  
  5. url:   / 
  6.  
  7. param: { module: job, action: index }   #将default修改为job(模块名) 

当更改了routing.yml后还需要清空一下cache文件夹并关闭此页,然后再重新打开,方能有效。

在动作里return sfView::NONE;在这种情况下,视图层就不会被执行了。这就意味着你完全可以越过视图层直接从动作输出HTML代码。

 

将数据保存到用户会话

    
    
    
    
  1. $this->getUser()->setAttribute('nickname', $nickname); 

从用户会话中取得数据,如果取不到值则使用默认值

 

    
    
    
    
  1. $nickname = $this->getUser()->getAttribute('nickname', 'Anonymous Coward'); 
  2.  
  3. $this->getUser()->setFlash('nickname','Lee');//将数据保存到临时会话 

删除用户属性

 

    
    
    
    
  1. $this->getUser()->getAttributeHolder()->remove('nickname'); 
  2.  
  3. $this->getUser()->getAttributeHolder()->clear(); 

在模板里访问用户会话属性

 

    
    
    
    
  1. <p>Hello, php echo $sf_user->getAttribute('nickname') ?>p> 

如果你需要在执行每个动作前都要执行一段代码,你可以把这段代码放入动作类里的preExecute()方法里。你可能猜到如果你想在执行每个动作后执行一段代码,那你可以把这段代码放入postExecute()方法里(切记俩方法无参数!)。

 

选用全局layout

1.在/apps/frontend/templates/下添加layoutA.php

2.在action里调用$this->setLayout('layoutA')

action里添加.css和.js

 

    
    
    
    
  1. $this->getResponse()->addStylesheet('members.css'); 
  2.  
  3. $this->getResponse()->addJavascript('members.js'); 

在action里使用url_for

 

    
    
    
    
  1. $this->getController()->genUrl('model/action'); 

在模板里使用图片路径

源文件:

获取IP地址

动作:$this->getRequest()->getHttpHeader ('addr','remote');  或:$r->getHttpHeader('addr','remote');

模板:$sf_request->getHttpHeader ('addr','remote');

获取当前页完整地址

sfContext::getInstance()->getRequest()->getReferer();

字符串截取

 

getDescription(),50)?> //据说在最后会自动加上“...”

DateHelper::format_date()格式化日期

format_date($date,'yyyy-MM-dd HH:mm:ss');?>#output 2010-12-08 20:23:18

获得templates下的模板文件内容

$html = $this->getPartial('member/template',array('param'=>$param)); //将_template.php文件里的内容返回给$html

在动作里设置title、keyword和description

 

    
    
    
    
  1. $response = $this->getResponse(); 
  2.  
  3. $response->setTitle('vvv'); 
  4.  
  5. $response->addMeta('keywords', '1,2,3,4,5');$response->addMeta('description', '大连云飞电子'); 

获取当前model和action名称

sfContext::getInstance()->getModuleName();或$this->getModuleName();

sfContext::getInstance()->getActionName();或$this->getActionName();

在apps/frontend/templates/layout.php包含apps/frontend/model/templates/_layoutA.php

参数值)) ?>

删除不在schema.yml里的model

    
    
    
    
  1. symfony doctrine:clean-model-files 

设置获取cookie

    
    
    
    
  1. $this->getResponse()->setCookie('cookie_name','val'); 
  2. $this->getRequest()->getCookie('cookie_name'); 

 

forward

所谓forward,是一个action将当前的请求交给另外一个action处理,这个过程是在同一个http请求中完成的,整个过程不涉及客户端,url地址也不会发生改变。

 

    
    
    
    
  1. public function executeActionA($request) { 
  2.  
  3.            // 一些处理 
  4.  
  5.            // to ActionB: 剩下的就交给你了 
  6.  
  7.            $this->forward('default', 'actionb'); 
  8.  
  9.  
  10. public function executeActionB($request) { 
  11.  
  12.             // to ActionA: 交给我你就放心吧 
  13.  
  14.             // 又一些处理 
  15.  

 

sfWebRequest类包含了$_SERVER, $_COOKIE, $_GET, $_POST, $_FILES PHP全局数组:

 

    
    
    
    
  1. getMethod()$_SERVER['REQUEST_METHOD'] 
  2.  
  3. getUri()$_SERVER['REQUEST_URI'] 
  4.  
  5. getReferer()$_SERVER['HTTP_REFERER'] 
  6.  
  7. getHost()$_SERVER['HTTP_HOST'] 
  8.  
  9. getLanguages()$_SERVER['HTTP_ACCEPT_LANGUAGE'] 
  10.  
  11. getCharsets()$_SERVER['HTTP_ACCEPT_CHARSET'] 
  12.  
  13. isXmlHttpRequest()$_SERVER['X_REQUESTED_WITH'] == 'XMLHttpRequest' 
  14.  
  15. getHttpHeader()$_SERVER 
  16.  
  17. getCookie()$_COOKIE 
  18.  
  19. isSecure()$_SERVER['HTTPS'] 
  20.  
  21. getFiles()$_FILES 
  22.  
  23. getGetParameter()$_GET 
  24.  
  25. getPostParameter()$_POST 
  26.  
  27. getUrlParameter()$_SERVER['PATH_INFO'] 
  28.  
  29. getRemoteAddress()$_SERVER['REMOTE_ADDR'] 

我们已经用过getParameter()方法访问请求的参数,它返回$_GET或$_POST 全局变量的值或~PATH_INFO~变量。

如果你想确定请求参数究竟属于上面哪一类,你需要使用getGetParameter(), getPostParameter(), 和 getUrlParameter()。