2009-05-23

怎么在app中构造其它app的链接(一)

类归于: CentOS/Redhat, symfony — 标签:zhuozi @ 16:44

最近开发的一个项目要求我们要在一个app中构造另一个app中的链接并使用。

我们现在有一个管理平台,app名字   admin, 我们还有一个PC展示平台 app名字 pc

我们知道使用symfony中链接辅助函数  url_for()  可以生成我们想要的URL,可是,默认的情况下,这种生成出来的URL是显示前端控制器名字的(控制器名字根据所在开发模式的不同,显示的也不一样)。

比如: 我们在admin这个平台使用  url_for(’member/create’)    生成的url是   admin_dev.php/member/create, 很显然这种URL不是我们所期望的,我们不希望还要去解析判断。

在apps/myapps/settings.yml 中有一项设置  no_script_name: off  这项是控制时候在URL中显示前端控制器的名字。

当我们把它开启的时候,再使用url_for(’member/create’)的时候,就会生成  member/create, 这样就会得到没有前端控制器名字的URL。

其实,最理想的状态是,我在使用某一个链接辅助函数的时候,直接就可以获得某一个平台的URL,比如在admin的平台返回给我一个  http://www.foolbirds.com/pc_dev.php/article/show  这样的链接。 可是找了一下下午也没有找到一个,或许需要自己写一个构造这样的URL来满足项目的需求了。

2009-01-16

symfony插件编写一例:QRcodePlugin

类归于: CentOS/Redhat, symfony — 标签:, maker @ 16:41

创建symfony插件》一文中对如何编写插件进行了简单的介绍, 下面用一个例子来详细讲解一些如何创建一个生成QRcode的插件.

什么是QR code(QR码)?

简单来说, QR code是用来存储数据的矩形黑白点阵, 可以在很小的图片中存储大量的数据, 在移动领域应用广泛. 详细的说明请参考维基百科(http://zh.wikipedia.org/wiki/QR%E7%A2%BC)

应项目需求, 我们要编写一个用来生成QR code的Helper, 为了更好的重用性, 我们要将这个Helper写成一个插件.

首先, 创建目录结构
$cd plugins$mkdir QRcodePlugin$cd QRcodePlugin$mkdir lib web$mkdir lib/helper

生成QR code的过程中我们使用到了一个第三方类库 qr_img0.50g, 在readme中我们找到了使用方法如下:

php/qr_img.php?d=data[&e=(L,M,Q,H)][&s=int size][&v=(1-40)][&t=J]
[&m=(1-16)&n=(2-16)[&o=original data][&p=(0-255)]]

访问该文件会根据url中的参数生成一个QR code 图片, 我们只要将这个库放到web目录下就可以了.

$mv qr_img0.50g pathtoproject/plugins/QRcodePlugin/web/qr_img

然后我们来编写Helper, 根据symfony中helper的命名规则创建文件如下

$cd pathtoproject/plugins/QRcodePlugin/lib/helper

$vi QRcodeHelper.php

<?php
# [useage]
# qr_img.php?d=[data]&e=[(L,M,Q,H)]&s=[int]&v=[(1-40)]
# (&m=[(1-16)]&n=[(2-16)](&p=[(0-255)],&o=[data]))
#
# d= data URL encoded data.
# e= ECC level L or M or Q or H (default M)
# s= module size (dafault PNG:4 JPEG:8)
# v= version 1-40 or Auto select if you do not set.
# t= image type J:jpeg image , other: PNG image
#
# structured append m of n (experimental)
# n= structure append n (2-16)
# m= structure append m (1-16)
# p= parity
# o= original data (URL encoded data) for calculating parity
#
function QRcode($d, $e = 'M', $s = null, $v = null, $t = 'P', $m = null, $n = null, $o = null, $p = null)
{
$path = '/QRcodePlugin/qr_img/php/qr_img.php';
$url = $path . '?d=' . $d;
if ($e && in_array(strtoupper($e), array('L', 'M', 'Q', 'H'))) {
$url .= '&e=' . strtoupper($e);
} else {
$url .= '&e=M';
}
if ($s) {
$url .= '&s=' . $s;
}
if ($v) {
$url .= '&v=' . $v;
}
if ($t) {
$url .= '&t=' . $t;
}
if ($m) {
$url .= '&m=' . $m;
}
if ($n) {
$url .= '&n=' . $n;
}
if ($o) {
$url .= '&o=' . $o;
}
if ($p) {
$url .= '&p=' . $p;
}
$output = image_tag($url, array('alt' => $d));
return $output;
}

这样, 我们就写好了一个只有一个Helper的Plugin, 我们来看一下插件结构如下.
|--.lib
|...`--.helper
|.......`--.QRcodeHelper.php
`--.web
....`--.qr_img
........|--.data
........|--.image
........`--.php
............`--.qr_img.php
创建symfony插件》一文中我们说过项目中是无法直接访问plugin中的web目录的, 所以我们还要copy一份web目录到项目的web目录下
$cp -rf pathtoproject/plugins/QRcodePlugin/web pathtoproject/web/QRcodePlugin接下来我们来测试一下Plugin是否有效.
$cd pathtoproject/$./symfony init-app test$./symfony init-module test test$vi apps/test/modules/test/actions/actions.class.php<?php
class testActions extends sfActions
{
public function executeIndex(sfWebRequest $request) { }
}

$vi apps/test/modules/test/templates/indexSuccess.php<?php use_helper('QRcode');?>
<?php echo QRcode('fuck');?>

访问http://project/test.php/test/index效果如下:

screenshot4

源代码如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<link rel="shortcut icon" href="/favicon.ico" />
<link rel="stylesheet" type="text/css" media="screen" href="/css/main.css" />
</head>
<body>
<img alt="fuck" src="/QRcodePlugin/qr_img/php/qr_img.php?d=fuck&t=P" /> 
</body>
</html>

测试通过, 本文完.

2009-01-04

查看各种服务的版本

类归于: CentOS/Redhat — 标签:, maker @ 12:16

前几天刚刚给公司配了新的内网服务器, 今天bobhero要看结果, 那就简单看一下吧.

查看linux内核版本
$uname -r
>2.6.27-7-generic
查看redhat/centos版本
$cat /etc/redhat -release
>CentOS release 5.2 (Final)
查看php版本
$php -v
>PHP 5.2.6 (cli) (built : May 5 2008 10:32:59)
>Copyright (c) 1997-2008 The PHP Group
>Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies
查看mysql版本
$mysql -v
>Server version: 5.0.45 Source distribution
查看apache版本
$rpm -qa httpd
>httpd-2.2.3-11.el5_2.centos.4
$apache2 -v
>Server version: Apache/2.2.8 (Ubuntu)
>Server build: Feb 2 2008 04:03:01

查看sendmail版本
$sendmail -d -i
Version 8.13.8
查看symfony的版本
$symfony -V
symfony version 1.2.4-DEV (/home/maker/www/symfony/lib)

2008-12-22

开启symfony的CSRF保护

类归于: CentOS/Redhat, symfony — 标签:maker @ 14:48

什么是CSRF?

CSRF是伪造客户端请求的一种攻击,CSRF的英文全称是Cross Site Request Forgery,字面上的意思是跨站点伪造请求。

symfony 1.2中内置了CSRF验证功能, 用来防止CSRF攻击, 在建立项目的时候我们可以使用如下命令开启CSRF保护.

> symfony generate:app --csrf-secret=UniqueSecret frontend

或者修改app的settings.yml

all:
  csrf-secret=UniqueSecret

开启CSRF保护之后app中的所有form都会增加一个隐藏项, 其值为随机生成的一个字符串, 表单提交之后会对该字符串进行验证, 工作原理类似验证码, 但免去了输入验证码的麻烦.

为了更好的兼容性(这里指开启和不开启CSRF的时候都可以正常运行), 我们需要修改form取得值的方法, 使用

$form->bind($request->getPostParameters());

可能是CSRF相关的功能还没有足够的完善, 在之前的测试中, 当form的submit按钮有name的时候会产生表单错误, 造成表单无法提交, 如果非必要情况, 最好将submit的name设置为空或者不设置.

但有时候我们的确需要给submit一个name, 比如但表单多submit的情况. 这时我们就需要用另外一种方法了, 在form中加入下面代码.

$this->validatorSchema -> setOption('allow_extra_fileds', true);

这样表单验证会允许存在不属于form的field.

WordPress 所驱动