2009-03-17

跳并快乐着-symfony跳转指南

类归于: symfony — 标签:, , , maker @ 12:24

项目接近尾声,闲来无事写一点东西活跃活跃气氛。在日常的web开发中,跳转是一个很常见的操作,成功了要跳转,错误了要跳转,满足某某条件也要跳转,symfony作为一款成熟的开发框架对跳转的处理也是非常多样的。

一. 关于跳转

虽说多样,但万变不离其宗,一般的跳转分为两种,forward(转发)和redirect(重定向),两种方法虽然目的都是为了进行跳转但是本质上还是有很大差别的。

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

示例1

public function executeActionA($request)
{
// 一些处理
// to ActionB: 剩下的就交给你了
$this->forward('default', 'actionb');
}
public function executeActionB($request)
{
// to ActionA: 交给我你就放心吧
// 又一些处理
}

示例一中,ActionA将处理工作交给的ActionB,其实其效果是和下例一样的。

示例2

public function executeActionC($request)
{
// 一些处理
// 又一些处理
// ps : 我是全能,ActionA和ActionB能做的我自己就能做
}

上面这两个例子就如同我们雇佣一个程序员一个美工或者雇佣一个懂美工的程序员一样,我们将事件处理过程分开总是有各种各样的原因,比如为了逻辑清晰,代码重用等等等等,所以在很多情况下我们就需要使用forward。

说完forward我们再来说redirect,其实我觉得redirect才能够叫做真正的跳转,很多时候我觉得forward就象调用函数。一个真正的redirect涉及了两次http请求,浏览器发送了一个http请求之后,服务端根据业务需要进行跳转,这样服务端会向浏览器返回一个跳转信息,这个跳转信息可能是一个重定向的http header,也可能是一段带有跳转代码的html或者javascript,浏览器接到请求根据跳转信息进行第二次http 请求,这个第二次请求不同于forward的第二个Action,这个请求可以在程序内,也可以在程序外,比如说跳到google, 而用forward就象蹲监狱,再怎么跳也就是换换牢房,想出去是不可能了,除非你是Michael Scofield。

示例3

public function executeActionA($request)
{
// 我要换牢房
$this->redirect('fox/room');
}
public function executeActionB($request)
{
// 我要换去Sucre的牢房拆马桶
$this->redirect("fox/room?user='Fernando Sucre'");
}
public function executeActionC($request)
{
// 和哥哥越狱到谷歌去
$this->redirect('http://g.cn/?with_my_brother=true');
}

这里扯的有点远,其实我觉得在看我文章的朋友其实已经有一定的symfony基础的,所以不需要细细的去讲,只要给大家一些提示就可以。forward和redirect还有很关键的一点区别,就是forward进行转发之后原来的请求参数不会变,这里的请求参数指post, get, cookie什么什么什么的, 而redirect就需要你通过url将你需要的参数再传过去, symfony中貌似有http_build_query()这么一个函数.

示例4

public function executeActionA($request)
{
// 所有和我从Fox River跑出来的朋友一起去巴拿马
$this->redirect('panama.com?'.http_build_query($request->getPostParameters()));
}

二. symfony中的跳转

关于forward和redirect就介绍到这里,下面来介绍symfony中的跳转方法。

function forward($module, $action)

最基本的转发动作,参数是模块名和动作名。

示例5,新建立模块的Index方法都是这样的。

public function executeIndex(sfWebRequest $request)
{
// 将默认动作转发到默认模块
$this->forward('default', 'index');
}

function forward404($message = null)

forward404动作其实和throw new sfError404Exception的效果是一样的, 在symfony中可以通过设置404动作来控制404的输出,这样实际上就是一个转发到404错误处理动作的跳转, 返回404异常在程序中是很常见的,比如参数错误,数据错误等等等等等等,我们都可以直接抛出404异常。

示例6

public function executeActionA($request)
{
$id = (int) $request->getParameter('id');
if ($id < 1) {
$this->forward404();
}
$product = ProductPeer::retrieveByPk($id);
if (!is_object($product)) {
$this->forward404();
}
//我们将对象注册到模板中去,其实和$this->product=$product是一样的
$this->setVar('product', $product);
}

function forwardIf($condition, $module, $action)

当$condition为”真”的时候转发到$module/$action

示例7

public function executeCreate($request)
{
$product = new Product;
$product->setName('产品1');
// 创建产品,成功则跳转到列表,创建失败则抛出404
$this->forwardIf($product, 'product', 'list');
$this->forward404();
}

function forwardUnless($condition, $module, $action)

当$condition为”假”的时候转发到$module/$action

示例8

public function  executeAction($request)
{
$product = ProductPeer::retrieveByPk($this->getParameter('id'));
$this->forward($product, 'default', 'error404');
}

function forward404If($condition, $message = null)

当$condition为“真“的时候抛出404异常

示例9

public function executeShow($request)
{
$id = intval($request->getParameter('id'));
// 如果id小于0抛出异常
$this->forward404If($id<0, 'parameter error');
$product = ProductPeer::retrieveByPk($id);
// 如果产品不存在抛出异常
$this->forward404If(!$product, 'product not exists');
$this->object = $product;
}

function forward404Unless($condition, $message = null)

当$condition为“假“的时候抛出404异常, 实际应用中这个方法比forward404If更方便

示例10

public function executeShow($request)
{
$id = intval($request->getParameter('id'));
// 如果id小于0抛出异常
$this->forward404If($id<0, 'parameter error');
$product = ProductPeer::retrieveByPk($id);
// 如果产品不存在抛出异常
$this->forward404Unless($product, 'product not exists');
$this->object = $product;
}

function redirect($url, $statusCode = 302)

跳转到$url,返回http状态码,$url可以是内部url也可以是外部url.

示例11

public function executeActionA($request)
{
$this->redirect('g.cn');
}
public function executeActionB($request)
{
$this->redirect('default/index?action=b');
}

function redirect404()

跳转到404动作,404处理动作可以通过settings.yml进行设置, 这个动作是不用给参数的,symfony会自动调用系统设置。

function redirectIf($condition, $url, $statusCode = 302)

如果$condition为“真”则跳转到$url

示例12

public function executeCreate($request)
{
$product = new Product;
$product->setName('产品2');
//创建成功进入编辑页面
$this->redirectIf($product->save(), 'product/update?id='.$product->getId());
//创建失败加载Error模板
return sfView::ERROR;
}

function redirectUnless($condition, $url, $statusCode = 302)

如果$condition为“假”则跳转到$url, 参考forwardUnless

三. 结束语

本文旨在抛砖引玉,其实关于跳转还有很多的技巧,这个就要在实际应用中慢慢积累了。

2009-03-10

Awesome3.0默认快捷键

类归于: Linux — 标签:, maker @ 17:26

最近一直工作在Awesome(什么是Awesome?)下, 发现Awesome的确是个很高效率的桌面环境.

在Awesome中几乎所有的东西都是可配置的, 当然配置过程可能比较复杂, 要用到Lua语言, 使用Awesome最大的好处就是解放了鼠标, 所以这里简单介绍一下Awesome3.0缺省的快捷键位.

Mod4 + Left 切换到上一个Tag
Mod4 + Right 切换到下一个Tag
Mod4 + 1~9 切换到指定Tag
Mod4 + t 标记当前窗口
Mod4 + Ctrl + 1~9 把标记的窗口移动到指定桌面
Mod4 + Esc 切换到最后使用过的Tag
Mod4 + Ctrl + r 重启awesome
Mod4 + Ctrl + q 退出awesome
Mod4 + m 最大化/还原当前窗口
Mod4 + f 全屏/恢复当前窗口
Mod4 + Shift +c 关闭当前窗口
Mod4 + j 切换到下一个窗口
Mod4 + k 切换到上一个窗口
Mod4 + Shift + j 当前窗口和前一个窗口互换位置
Mod4 + Shift + k 当前窗口和后一个窗口互换位置
Mod4 + Ctrl + j 切换到下一个屏幕
Mod4 + Ctrl + k 切换到前一个屏幕
Mod4 + Ctrl + Space 切换当前窗口是否为浮动的
Mod4 + Ctrl + Return
Mod4 + Return
Mod4 + Tab 切换到最后使用过的窗口
Mod4 + o
Mod4 + u
Mod4 + Shift + r 重绘当前窗口
Mod4 + l 当前窗口的宽度减小5%
Mod4 + h 当前窗口的宽度增大5%
Mod4 + Shilt + h 增加主区域窗口的数量
Mod4 + Shift + l 减少主区域窗口的数量
Mod4 + Ctrl + h 增加非主区域窗口的数量
Mod4 + Ctrl + l 减少非主区域窗口的数量
Mod4 + Space 切换下一布局
Mod4 + Shift + Space 切换上一个布局
Mod4 + F1 运行程序
Mod4 + F4 运行Lua命令
Mod4 + Ctrl + i 显示当前窗口的class和instance
Ctrl + Alt + BackSpace 注销当前登录
Mod4 + Shift + F1~F9 把当前桌面和1~9桌面同时显示

参考: Ubuntu Wiki

2009-03-08

gcc 升级引起的错误

类归于: Arch, Linux — 标签:, , bobhero @ 09:10

今天重做了系统  想起有一个软件没有测试 叫 devtodo  结果出现了错误如下
todoterm.cc:18: error: ‘getenv’ was not declared in this scope
todoterm.cc:22: error: ‘setenv’ was not declared in this scope

查了一下,资料 还真的很少

不过还是可以解决的找个适当的位置 把下面一句话加上就OK 了

#include <cstdlib>

2009-03-04

FCK编辑器操作参数

类归于: PHP — 标签:zhuozi @ 15:25

本来是计划用tinyMCE的,可是tinyMCE不支持文件上传,只好换成了FCK,可是发觉FCK有一点不是很方便,也可能是自己一直没有找到,设置的办法。
官方js中的配置
this.InstanceName = instanceName ;
this.Width = width || ‘100%’ ;
this.Height = height || ‘200′ ;
this.ToolbarSet = toolbarSet || ‘Default’ ;
this.Value = value || ” ;
this.BasePath = FCKeditor.BasePath ;
this.CheckBrowser = true ;
this.DisplayErrors = true ;
通过上面的设置我们可以发现,没有多语言这个选项,没有办法,只有修改源码的配置文件了。把下面显示自动检测浏览器的设置改为false,默认语言设置成自己想用的就可以了。
FCKconfig 配置文件主要内容
Save : “保存”,
NewPage : “新建”,
Preview : “预览”,
Cut : “剪切”,
Copy : “复制”,
Paste : “粘贴”,
PasteText : “粘贴为无格式文本”,
PasteWord : “从 MS Word 粘贴”,
Print : “打印”,
SelectAll : “全选”,
RemoveFormat : “清除格式”,
InsertLinkLbl : “超链接”,
InsertLink : “插入/编辑超链接”,
RemoveLink : “取消超链接”,
VisitLink : “打开超链接”,
Anchor : “插入/编辑锚点链接”,
AnchorDelete : “清除锚点链接”,
InsertImageLbl : “图象”,
InsertImage : “插入/编辑图象”,
InsertFlashLbl : “Flash”,
InsertFlash : “插入/编辑 Flash”,
InsertTableLbl : “表格”,
InsertTable : “插入/编辑表格”,
InsertLineLbl : “水平线”,
InsertLine : “插入水平线”,
InsertSpecialCharLbl: “特殊符号”,
InsertSpecialChar : “插入特殊符号”,
InsertSmileyLbl : “表情符”,
InsertSmiley : “插入表情图标”,
About : “关于 FCKeditor”,
Bold : “加粗”,
Italic : “倾斜”,
Underline : “下划线”,
StrikeThrough : “删除线”,
Subscript : “下标”,
Superscript : “上标”,
LeftJustify : “左对齐”,
CenterJustify : “居中对齐”,
RightJustify : “右对齐”,
BlockJustify : “两端对齐”,
DecreaseIndent : “减少缩进量”,
IncreaseIndent : “增加缩进量”,
Blockquote : “块引用”,
CreateDiv : “新增 Div 标籤”,
EditDiv : “更改 Div 标籤”,
DeleteDiv : “删除 Div 标籤”,
Undo : “撤消”,
Redo : “重做”,
NumberedListLbl : “编号列表”,
NumberedList : “插入/删除编号列表”,
BulletedListLbl : “项目列表”,
BulletedList : “插入/删除项目列表”,
ShowTableBorders : “显示表格边框”,
ShowDetails : “显示详细资料”,
Style : “样式”,
FontFormat : “格式”,
Font : “字体”,
FontSize : “大小”,
TextColor : “文本颜色”,
BGColor : “背景颜色”,
Source : “源代码”,
Find : “查找”,
Replace : “替换”,
SpellCheck : “拼写检查”,
UniversalKeyboard : “软键盘”,
PageBreakLbl : “分页符”,
PageBreak : “插入分页符”,

Form : “表单”,
Checkbox : “复选框”,
RadioButton : “单选按钮”,
TextField : “单行文本”,
Textarea : “多行文本”,
HiddenField : “隐藏域”,
Button : “按钮”,
SelectionField : “列表/菜单”,
ImageButton : “图像域”,

FitWindow : “全屏编辑”,
ShowBlocks : “显示区块”,

FCKConfig.CustomConfigurationsPath = ” ; // 自定义配置文件路径和名称
FCKConfigFCKConfig.EditorAreaCSS = FCKConfig.BasePath + ‘css/fck_editorarea.css’; // 编辑区的样式表文件 FCKConfig.EditorAreaStyles = ” ; // 编辑区的样式表风格
FCKConfig.ToolbarComboPreviewCSS =”; //工具栏预览CSS
FCKConfig.DocType = ” ;//文档类型
FCKConfig.BaseHref = ”; // 相对链接的基地址
FCKConfig.FullPage = false ; //是否允许编辑整个HTML文件,还是仅允许编辑BODY间的内容 FCKConfig.StartupShowBlocks = false ;//决定是否启用”显示模块”
FCKConfig.Debug = false ;//是否开启调试功能
FCKConfigFCKConfig.SkinPath = FCKConfig.BasePath + ’skins/default/’ ; //皮肤路径
FCKConfig.PreloadImages=… //预装入的图片
FCKConfigFCKConfig.PluginsPath = FCKConfig.BasePath + ‘plugins/’ ; //插件路径

FCKConfig.AutoDetectLanguage = true ; //是否自动检测语言
FCKConfig.DefaultLanguage = 'zh-cn' ; //默认语言

FCKConfig.ContentLangDirection = ‘ltr’ ; //默认的文字方向,可选”ltr/rtl”,即从左到右或从右到左 FCKConfig.ProcessHTMLEntities = true ; //处理HTML实体
FCKConfig.IncludeLatinEntities = true ; //包括拉丁文
FCKConfig.IncludeGreekEntities = true ;//包括希腊文
FCKConfig.ProcessNumericEntities = false ;//处理数字实体
FCKConfig.AdditionalNumericEntities = ” ; //附加的数字实体
FCKConfig.FillEmptyBlocks = true ; //是否填充空块
FCKConfig.FormatSource = true ; //在切换到代码视图时是否自动格式化代码
FCKConfig.FormatOutput = true ; //当输出内容时是否自动格式化代码
FCKConfig.FormatIndentator = ‘ ‘ ; //当在源码格式下缩进代码使用的字符
FCKConfig.StartupFocus = false ; //开启时焦点是否到编辑器,即打开页面时光标是否停留在fckeditor上 FCKConfig.ForcePasteAsPlainText = false ; //是否强制粘贴为纯文件内容
FCKConfig.AutoDetectPasteFromWord = true ; //是否自动探测从word粘贴文件,仅支持IE
FCKConfig.ShowDropDialog = true ;//是否显示下拉菜单
FCKConfig.ForceSimpleAmpersand = false ;//是否不把&符号转换为XML实体
FCKConfig.TabSpaces = 0 ;//按下Tab键时光标跳格数,默认值为零为不跳格
FCKConfig.ShowBorders = true ;//合并边框
FCKConfig.SourcePopup = false ;//弹出
FCKConfig.ToolbarStartExpanded = true ;//启动fckeditor工具栏默认是否展开
FCKConfig.ToolbarCanCollapse = true ;//是否允许折叠或展开工具栏
FCKConfig.IgnoreEmptyParagraphValue = true ;//是否忽略空的段落值
FCKConfig.FloatingPanelsZIndex = 10000 ;//浮动面板索引
FCKConfig.HtmlEncodeOutput = false ;//是否将HTML编码输出
FCKConfig.TemplateReplaceAll = true ;//是否替换所有模板
FCKConfig.ToolbarLocation = ‘In’ ;//工具栏位置,

« 较近文章

WordPress 所驱动