Thursday, June 18, 2009

Day10 Form

1. 表单合并:
可以通过mergeForm()方法将一个表单与另一个表单合并,或用embedForm()方法进行表单嵌套:

$this->mergeForm(new AnotherForm());
$this->embedForm('name', new AnotherForm());

2. 取消表单显示字段:
默认情况下,Propel表单显示的字段对应全部数据表字段,我们要清除(unset)其中不可以由终端用户编辑的字段:ex
class JobeetJobForm extends BaseJobeetJobForm
{
public function configure()
{
unset( $this['created_at'], $this['updated_at'], $this['expires_at'], $this['is_activated']
); }
}

3. sfWidgetFormChoice控件

sfWidgetFormChoice表示一个选择控件,它可以根据配置选项(通过expanded 和 multiple参数不同搭配)的不同,被显示为不同的控件:


* 生成下拉列表<select> array(’multiple’ => false, ‘expanded’ => false)

* 生成下拉框<select multiple=”multiple”> array(’multiple’ => true, ‘expanded’ => false)

* 生成单选框<input type=radio> array(’multiple’ => false, ‘expanded’ => true)

* 生成复选框<input type=checkbox> array(’multiple’ => true, ‘expanded’ => true)


4. 自定义表单样式

<?php echo $form ?>默认会以表格形式显示表单。


多少情况下,你可能需要自己定制表单布局。表单对象为定制提供许多有用的方法:



































Method Description
render() 显示表单(相当于echo $form)
renderHiddenFields() 显示隐藏的字段
hasErrors() 如果表单有错误,返回true
hasGlobalErrors() 如果标有全局错误,返回true
getGlobalErrors() 返回全局错误数组
renderGlobalErrors() 显示全局错误

表单对象就像一个字段数组。你可以用$form['company']访问company字段,返回的对象提供显示这个字段每一个元素的方法:































Method Description
renderRow() 显示表单域行。(包括label,error,field tag等全部)
render() 显示字段控件
renderLabel() 显示字段标签
renderError() 如果有子段错误则显示
renderHelp() 显示字段帮助信息

echo $form语句相当于:


<?php foreach ($form as $widget): ?>    <?php echo $widget->renderRow() ?>  <?php endforeach(); ?>  

Tuesday, June 9, 2009

正则表达式2

元字符
正则表达式的威力在于其能够在模式中包含选择和循环。它们通过使用元字符来编码在模式中,元字符不代表其自身,它们用一些特殊的方式来解析。

有两组不同的元字符:一种是模式中除了方括号内都能被识别的,还有一种是在方括号内被识别的。方括号之外的元字符有这些:

\
有数种用途的通用转义符

^
断言目标的开头(或在多行模式下行的开头,即紧随一换行符之后)

$
断言目标的结尾(或在多行模式下行的结尾,即紧随一换行符之前)

.
匹配除了换行符外的任意一个字符(默认情况下)

[
字符类定义开始

]
字符类定义结束

|
开始一个多选一的分支

(
子模式开始

)
子模式结束

?
扩展 ( 的含义,也是 0 或 1 数量限定符,以及数量限定符最小值

*
匹配 0 个或多个的数量限定符

+
匹配 1 个或多个的数量限定符

{
最少/最多数量限定开始

}
最少/最多数量限定结束

模式中方括号内的部分称为“字符类”。字符类中可用的元字符为:

\
通用转义字符

^
排除字符类,但仅当其为第一个字符时有效

-
指出字符范围

]
结束字符类

以下说明了每一个元字符的用法。

反斜线(\)
反斜线字符有几种用途。首先,如果其后跟着一个非字母数字字符,则取消该字符可能具有的任何特殊含义。此种将反斜线用作转义字符的用法适用于无论是字符类之中还是之外。

例如,如果想匹配一个“*”字符,则在模式中用“\*”。这适用于无论下一个字符是否会被当作元字符来解释,因此在非字母数字字符之前加上一个“\”来指明该字符就代表其本身总是安全的。尤其是,如果要匹配一个反斜线,用“\\”。

注: 单引号或双引号括起来的 PHP 字符串中的反斜线有特殊含义。因此必须用正则表达式的 \\ 来匹配 \,而在 PHP 代码中要用 "\\\\" 或 '\\\\'。

如果模式编译时加上了 PCRE_EXTENDED 选项,模式中的空白字符(字符类中以外的)以及字符类之外的“#”到换行符之间的字符都被忽略。可以用转义的反斜线将空白字符或者“#”字符包括到模式中去。

反斜线的第二种用途提供了一种在模式中以可见方式去编码不可打印字符的方法。并没有不可打印字符出现的限制,除了代表模式结束的二进制零以外。但用文本编辑器来准备模式的时候,通常用以下的转义序列来表示那些二进制字符更容易一些:



\a
alarm,即 BEL 字符(0x07)

\cx
"control-x",其中 x 是任意字符

\e
escape(0x1B)

\f
换页符 formfeed(0x0C)

\n
换行符 newline(0x0A)

\r
回车符 carriage return(0x0D)

\t
制表符 tab(0x09)

\xhh
十六进制代码为 hh 的字符

\ddd
八进制代码为 ddd 的字符,或 backreference


“\cx”的精确效果如下:如果“x”是小写字母,则被转换为大写字母。接着字符中的第 6 位(0x40)被反转。从而“\cz”成为 0x1A,但“\c{”成为 0x3B,而“\c;”成为 0x7B。

在“\x”之后最多再读取两个十六进制数字(其中的字母可以是大写或小写)。在 UTF-8 模式下,允许用“\x{...}”,花括号中的内容是表示十六进制数字的字符串。原来的十六进制转义序列 \xhh 如果其值大于 127 的话则匹配了一个双字节 UTF-8 字符。

在“\0”之后最多再读取两个八进制数字。以上两种情况下,如果少于两个数字,则只使用已出现的。因此序列“\0\x\07”代表两个二进制的零加一个 BEL 字符。如果是八进制数字则确保在开始的零后面再提供两个数字。

处理反斜线后面跟着一个不是 0 的数字比较复杂。在字符类之外,PCRE 以十进制数字读取该数字及其后面的数字。如果数字小于 10,或者之前表达式中捕获到至少该数字的左圆括号,则这个序列将被作为逆向引用。有关此如何运作的说明在后面,以及括号内的子模式。

在字符类之中,或者如果十进制数字大于 9 并且之前没有那么多捕获的子模式,PCRE 重新从反斜线开始读取其后的最多三个八进制数字,并以最低位的 8 个比特产生出一个单一字节。任何其后的数字都代表自身。例如:



\040
另一种表示空格的方法

\40
同上,如果之前捕获的子模式少于 40 个的话

\7
总是一个逆向引用

\11
可能是个逆向引用,或者是制表符 tab

\011
总是表示制表符 tab

\0113
表示制表符 tab 后面跟着一个字符“3”

\113
表示八进制代码为 113 的字符(因为不能超过 99 个逆向引用)

\377
表示一个所有的比特都是 1 的字节

\81
要么是一个逆向引用,要么是一个二进制的零后面跟着两个字符“8”和“1”


注意八进制值 100 或更大的值之前不能以零打头,因为不会读取(反斜线后)超过三个八进制数字。

所有的定义了一个单一字节的序列可以用于字符类之中或之外。此外,在字符类之中,序列“\b”被解释为反斜线字符(0x08),而在字符类之外有不同含义(见下面)。

反斜线的第三个用法是指定通用字符类型:



\d
任一十进制数字

\D
任一非十进制数的字符

\s
任一空白字符

\S
任一非空白字符

\w
任一“字”的字符

\W
任一“非字”的字符


任何一个转义序列将完整的字符组合分割成两个分离的部分。任一给定的字符匹配一个且仅一个转义序列。

“字”的字符是指任何一个字母或数字或下划线,也就是说,任何可以是 Perl "word" 的字符。字母和数字的定义由 PCRE 字符表控制,可能会根据指定区域的匹配而改变(见上面的“区域支持”)。举例说,在 "fr" (French) 区域,某些编码大于 128 的字符用来表示重音字母,这些字符能够被 \w 所匹配。

这些字符类型序列可以出现在字符类之中和之外。每一个匹配相应类型中的一个字符。如果当前匹配点在目标字符串的结尾,以上所有匹配都失败,因为没有字符可供匹配。

反斜线的第四个用法是某些简单的断言。断言是指在一个匹配中的特定位置必须达到的条件,并不会消耗目标字符串中的任何字符。子模式中更复杂的断言的用法在下面描述。反斜线的断言有:



\b
字分界线

\B
非字分界线

\A
目标的开头(独立于多行模式)

\Z
目标的结尾或位于结尾的换行符前(独立于多行模式)

\z
目标的结尾(独立于多行模式)

\G
目标中的第一个匹配位置

正则表达式

表 1. 常见 regex 操作符
操作符 用途
.(句点) 匹配所有单个字符
^(脱字符号) 匹配出现在行或字符串开头的空字符串
$(美元符号) 匹配出现在行尾的空字符串
A 匹配大写字母 A
a 匹配小写字母 a
\d 匹配所有一位数字
\D 匹配所有单个非数字字符
\w 匹配所有单个字母或数字字符;同义词是 [:alnum:]
[A-E] 匹配所有大写的 A、B、C、D 或 E
[^A-E] 匹配除大写 A、B、C、D 或 E 之外的任何字符
X? 匹配出现零次或一次的大写字母 X
X* 匹配零个或多个大写字母 X
X+ 匹配一个或多个大写字母 X
X{n} 精确匹配 n 个大写字母 X
X{n,m} 至少匹配 n 个且不多于 m 个大写字母 X;如果忽略 m,则表达式将尝试匹配至少 n 个 X
(abc|def)+ 匹配一连串的(最少一个)abc 和 def;abc 和 def 将匹配


php下的:
正则表达式的特殊字符:
正则表达式中的特殊字符分为元字符、定位字符等等。
元字符是正则表达式中一类有特殊意义的字符,用来描述其前导字符(即元字符前面的字符)在被匹配的对象中出现的方式。元字符本身是一个个单一的字符,但是不同或者相同的元字符组合起来可以构成大的元字符。
元字符:
大括号:大括号用来精确指定匹配元字符出现的次数,例如”/pre{1,5}/”表示匹配的对象可以是”pre”、”pree”、”preeeee”这样在”pr”后面出现1个到5个”e”的字符串。或者”/pre{,5}/”代表pre出现0此到5次之间。
加号:”+”字符用来匹配元字符前的字符出现一次或者多次。例如”/ac+/”表示被匹配的对象可以是”act”、”account”、”acccc”等在”a”后面出现一个或者多个”c”的字符串。”+”相当于”{1,}”。
星号:”*”字符用来匹配元字符前的字符出现零次或者多次。例如”/ac*/”表示被匹配的对象可以是”app”、”acp”、”accp”等在”a”后面出现零个或者多个”c”的字符串。”*”相当于”{0,}”。
问号:”?”字符用来匹配元字符前的字符出现零次或者1次。例如”/ac?/”表示匹配的对象可以是”a”、”acp”、”acwp”这样在”a”后面出现零个或者1个”c”的字符串。”?”在正则表达式中还有一个非常重要的作用,即”贪婪模式”。
还有两个很重要的特殊字符就是”[ ]“。他们可以匹配”[]“之中出现过的字符,比如”/[az]/”可以匹配单个字符”a”或者”z”;如果把上面的表达式改成这样”/[a-z]/”,就可以匹配任何单个小写字母,比如”a”、”b”等等。
如果在”[]“中出现了”^”,代表本表达式不匹配”[]“内出现的字符,比如”/[^a-z]/”不匹配任何小写字母!并且正则表达式给出了几种”[]“的默认值:
[:alpha:]:匹配任何字母
[:alnum:]:匹配任何字母和数字
[:digit:]:匹配任何数字
[:space:]:匹配空格符
[:upper:]:匹配任何大写字母
[:lower:]:匹配任何小写字母
[:punct:]:匹配任何标点符号
[:xdigit:]:匹配任何16进制数字
另外下面这些特殊字符在转义符号”"转义后代表的含义如下:
s:匹配单个的空格符
S:用于匹配除单个空格符之外的所有字符。
d:用于匹配从0到9的数字,相当于”/[0-9]/”。
w:用于匹配字母,数字或下划线字符,相当于”/[a-zA-Z0-9_]/”。
W:用于匹配所有与w不匹配的字符,相当于”/[^a-zA-Z0-9_]/”。
D:用于匹配任何非10进制的数字字符。
.:用于匹配除换行符之外的所有字符,如果经过修饰符”s”的修饰,”.”可以代表任意字符。
利用上面的特殊字符可以很方便的表达一些比较繁琐的模式匹配。例如”/d0000/”利用上面的正则表达式可以匹配万以上,十万一下的整数字符串。
定位字符:
定位字符是正则表达式中又一类非常重要的字符,它的主要作用是用于对字符在匹配对象中的位置进行描述。
^:表示匹配的模式出现在匹配对象的开头(和在”[]“里面不同)
$:表示匹配的模式出现在匹配对象的末尾
空格:表示匹配的模式出现在开始和结尾的两个边界之一
“/^he/”:可以匹配以”he”字符开头的字符串,比如hello、height等等;
“/he$/”:可以匹配以”he”字符结尾的字符串即she等;
“/ he/”:空格开头,和^的作用一样,匹配以he开头的字符串;
“/he /”:空格结束,和$的作用一样,匹配以he结尾的字符串;
“/^he$/”:表示只和字符串”he”匹配。
括号:
正则表达式除了可以用户匹配,还可以用括号”()”来记录需要的信息,储存起来,给后面的表达式读取。比如:
/^([a-zA-Z0-9_-]+)@([a-zA-Z0-9_-]+)(.[a-zA-Z0-9_-])$/
就是记录邮件地址的用户名,和邮件地址的服务器地址(形式为username@server.com之类的),在后面如果想要读取记录下来的字符串,只是需要用”转义符+记录的次序”来读取。比如”1〃就相当于第一个”[a-zA-Z0-9_-]+”,”2〃相当于第二个([a-zA-Z0-9_-]+),”3〃就是第三个(.[a-zA-Z0-9_-])。但是在PHP中,”"是一个特殊的字符,需要转义,所以”"到了PHP的表达式中就应该写成”1〃。
其他特殊符号:
“|”:或符号”|”和PHP里面的或一样,不过是一个”|”,而不是PHP的两个”||”!意思就是可以是某个字符或者另一个字符串,比如”/abcd|dcba/”可能匹配”abcd”或者”dcba”。

Thursday, June 4, 2009

Symfony studying on day4

1. use stylesheet in the template.
<!-- apps/frontend/modules/job/templates/indexSuccess.php --> <?php use_stylesheet('jobs.css') ?> <!-- apps/frontend/modules/job/templates/showSuccess.php --> <?php use_stylesheet('job.css') ?>
2. display date.
$job->getCreatedAt('m/d/Y');

3. how to use slot:
1) // apps/frontend/modules/job/templates/showSuccess.php
<?php slot( 'title', sprintf('%s is looking for a %s', $job->getCompany(), $job->getPosition())) ?>

2) // apps/frontend/modules/job/templates/showSuccess.php <?php slot('title') ?> <?php echo sprintf('%s is looking for a %s', $job->getCompany(), $job->getPosition()) ?> <?php end_slot(); ?>

3) // apps/frontend/templates/layout.php
<title> <?php if (!include_slot('title')): ?> Jobeet - Your best job board <?php endif; ?> </title>

4) <?php include_slot('title') ?>
<?php echo get_slot('title') ?>

<?php include_stylesheets() ?>

<?php echo get_stylesheets() ?>

3. forward 404
1) class jobActions extends sfActions { public function executeShow(sfWebRequest $request) { $this->job = JobeetJobPeer::retrieveByPk($request->getParameter('id')); $this->forward404Unless($this->job); }

2) $this->forward404If(!$this->job);

3) which is also equivalent to:

if (!$this->job) { $this->forward404(); }

The forward404() method itself is just a shortcut for:

$this->forward('default', '404');

Symfony studying on day3

$ php symfony propel:generate-module --with-show --non-verbose-templates frontend job JobeetJob

propel:generate-module 命令为工作模型JobeetJob 在frontend应用程序中生成了名为 job的模块。和大多数symfony命令一样,它在apps/frontend/modules/job 下创建了一些文件和目录
generate a module including action and template.

Directory Description
actions/ The module actions
templates/ The module templates

The actions/actions.class.php file defines all the available action for the job module:

Action name Description
index Displays the records of the table
show Displays the fields and their values for a given record
new Displays a form to create a new record
create Creates a new record
edit Displays a form to edit an existing record
update Updates a record according to the user submitted values
delete Deletes a given record from the table