mvc、.css.js调用、路径、更改项目主页、user会话、设置全局layout、动作中url_for、图片路径、获取IP、当前页地址、setTemplate和redirect的区别、forward、动作里设置title、keyword
一个mvc相互协同的例子:
1.添加model层代码(lib/model/doctrine/JobeetJobTable.class.ph):
- class JobeetJobTable extends Doctrine_Table{
- public function test(){
- //return $this->createQuery('j')->where('j.expires_at > ?', date('Y-m-d H:i:s', time()))->execute();
- return 'test';
- }
- }
2.添加控制层代码(apps\frontend\modules\job\actions):
- public function executeIndex(sfWebRequest $request)
- {
- $this->test=Doctrine_Core::getTable('JobeetJob')->test();
- }
模型层(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项来决定调用哪些文件的。个人感觉比较好用的 还是<?php echo stylesheet_tag('main') ?>、<?php use_stylesheet('test.css') ?>和<?php echo javascript_include_tag('jquery-1.4.2.min.js') ?>、<?php use_javascript('jquery-1.4.2.min.js') ?>
路径
URL /job/show/id/1可以在模板中通过url_for()辅助函数生成:
- url_for('job/show?id='.$job->getId())
你也可以使用“@路由规则名”的方式:
- url_for('@default?module=job&action=show&id='.$job->getId())
这两中方式是一样的,不过使用“@路由规则名”方式速度更快一些,因为程序不需要匹配所有路由,而是直接匹配与名称相对的规则。并且它不包含模块名和动作名,更加灵活(修改的时候直接改相应的规则,而不用修改每一个url_for()中模块和动作名)。
更改项目主页
正常的当使用symfony命令行生成一个项目后,用浏览器打开该项目显示的总会是一个symfony的首页,在此可以用模块来更改首页:
- # apps/frontend/config/routing.yml
- homepage:
- url: /
- param: { module: job, action: index } #将default修改为job(模块名)
当更改了routing.yml后还需要清空一下cache文件夹并关闭此页,然后再重新打开,方能有效。
在动作里return sfView::NONE;在这种情况下,视图层就不会被执行了。这就意味着你完全可以越过视图层直接从动作输出HTML代码。
将数据保存到用户会话
- $this->getUser()->setAttribute('nickname', $nickname);
从用户会话中取得数据,如果取不到值则使用默认值
- $nickname = $this->getUser()->getAttribute('nickname', 'Anonymous Coward');
- $this->getUser()->setFlash('nickname','Lee');//将数据保存到临时会话
删除用户属性
- $this->getUser()->getAttributeHolder()->remove('nickname');
- $this->getUser()->getAttributeHolder()->clear();
在模板里访问用户会话属性
- <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
- $this->getResponse()->addStylesheet('members.css');
- $this->getResponse()->addJavascript('members.js');
在action里使用url_for
- $this->getController()->genUrl('model/action');
在模板里使用图片路径
<img src=\'#\'" echo public_path('/uploads/image/aa.jpg') ?>" />
源文件:<img src=\'#\'" /yunfei/web/uploads/image/aa.jpg" />
获取IP地址
动作:$this->getRequest()->getHttpHeader ('addr','remote'); 或:$r->getHttpHeader('addr','remote');
模板:$sf_request->getHttpHeader ('addr','remote');
获取当前页完整地址
sfContext::getInstance()->getRequest()->getReferer();
字符串截取
<?php use_helper('Text')?>
<?php echo truncate_text($gallery->getDescription(),50)?> //据说在最后会自动加上“...”
DateHelper::format_date()格式化日期
<?php use_helper('Date');?>
<?php echo 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
- $response = $this->getResponse();
- $response->setTitle('vvv');
- $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
<?php include_partial('model/layoutA',array('参数名'=>参数值)) ?>
删除不在schema.yml里的model
- symfony doctrine:clean-model-files
设置获取cookie
- $this->getResponse()->setCookie('cookie_name','val');
- $this->getRequest()->getCookie('cookie_name');
forward
所谓forward,是一个action将当前的请求交给另外一个action处理,这个过程是在同一个http请求中完成的,整个过程不涉及客户端,url地址也不会发生改变。
- public function executeActionA($request) {
- // 一些处理
- // to ActionB: 剩下的就交给你了
- $this->forward('default', 'actionb');
- }
- public function executeActionB($request) {
- // to ActionA: 交给我你就放心吧
- // 又一些处理
- }
sfWebRequest类包含了$_SERVER, $_COOKIE, $_GET, $_POST, $_FILES PHP全局数组:
- getMethod()$_SERVER['REQUEST_METHOD']
- getUri()$_SERVER['REQUEST_URI']
- getReferer()$_SERVER['HTTP_REFERER']
- getHost()$_SERVER['HTTP_HOST']
- getLanguages()$_SERVER['HTTP_ACCEPT_LANGUAGE']
- getCharsets()$_SERVER['HTTP_ACCEPT_CHARSET']
- isXmlHttpRequest()$_SERVER['X_REQUESTED_WITH'] == 'XMLHttpRequest'
- getHttpHeader()$_SERVER
- getCookie()$_COOKIE
- isSecure()$_SERVER['HTTPS']
- getFiles()$_FILES
- getGetParameter()$_GET
- getPostParameter()$_POST
- getUrlParameter()$_SERVER['PATH_INFO']
- getRemoteAddress()$_SERVER['REMOTE_ADDR']
我们已经用过getParameter()方法访问请求的参数,它返回$_GET或$_POST 全局变量的值或~PATH_INFO~变量。
如果你想确定请求参数究竟属于上面哪一类,你需要使用getGetParameter(), getPostParameter(), 和 getUrlParameter()。