2008-12-25

在Ubuntu下面,让symfony工作起来

类归于: Ubuntu, symfony — 标签:, zhuozi @ 11:10

1.安装好Ubuntu之后,我们需要安装一些必要的软件。

php5,mysql,apache2,svn

#sudo apt-get install ***

接下来需要注意的是symfony需要PDO(mysql)这个模块和apache(rewrite)模块。

PDO:大家可以参考这篇文章,我也是根据这个安装的pdo的安装)

Rewrite:启用重写模块sudo a2enmod rewrite

2.在安装完所有的软件之后,我们开始配置环境。

在网上可以很容易找到symfony下载的svn地址,下载下来之后,把symfony的路径写在php.ini中

include_path=”.:/home/your/symfony/1.2″

3.设置虚拟机,在/etc/apache2/sites-enabled 文件夹下面添加自己的虚拟机文件,并开启。

2008-12-24

在admin generator中加入复杂的自定义列

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

在admin generator的list动作中, 我们可能希望在列表上加入自定义的列, symfony 1.2直接或间接的为我们提供了一些方法.

  1. 插入一个字段(field)
  2. 插入一个”虚拟字段”
  3. 插入局部模板(partial)
  4. 插入组件(component)

在generator.yml中, 我们可以修改list动作中列表显示的数据.

// 请将"."替换成" "
list:
..sort: [id, asc]
..display: [id, =name, _partial, ~component]
..max_per_page: 10
..object_actions:
....first_action:
......label: "first action"
......action: first
......params: class=className
...._edit: -
...._delete: -

sort项是list的动作的默认排序方式, display是行表行中要显示的基本数据, object_actions定义可以对该对象执行的操作.

这里我们重点讲解display, display定义要在list行中显示的对象属性或者自定义内容, 其元素可以是以”_”开头的局部模板名, 也可以是以”~”开头的组件名, 或者是一个字段名, 字段名前面也可以以”=”开头, 表示该字段是一个指向编辑页面的链接.

我们所说的字段名, 其实并不是真正意义上的数据库字段, 而是对象中的getter方法, 也就是说, 我们要显示在list中的字段, 并不一定要在数据库中真是存在.

下面看一个例子:

__ schema.yml __

propel:
..shop:
....__attributes: { phpName: Shop }
....id:
....name:         { type: varchar(60), required:true }

__ generator.yml __

list:
..sort: [id, asc]
..display: [id, =name, description]
..max_per_page: 10
..object_actions:
...._edit: -
...._delete: -

在generator.yml的list动作的display项中, description字段是在数据库中并不存在的, 所以我们要在shop对象中添加如下方法:

__ /lib/model/Shop.php __

// 被注释掉的代码是标准的getter和setter应该有的部分, 但并不是我们例子中必须的.
public function getDescription()
{
//  return $this->description;
return "some description";
}

//public function setDescription($value)
//{
//  $this->description = $value;
//}

这样, 我们就在shop/list的每一行都加了一个内容为”some description”的列.

可能很多人象bobhero一样, 不想去创建一个模板, 其实我也不想, 但我更不想多写很多代码, 因为我比较懒, 所以我使用了下面的方法来实现和上面一样的功能.

__ generator.yml __

list:
..sort: [id, asc]
..display: [id, =name, ~description]
..max_per_page: 10
..object_actions:
...._edit: -
...._delete: -

~description, 前面说过以”~”开头的元素是一个组件, 那么我们建立下面的组件.

__ /apps/app/modules/shop/actions/components.class.php __

<?php
class shopComponents extends sfComponents
{
public function executeDescription(sfWebRequest $request)
{
echo "some description";
return sfView::NONE;// 这句为了使组件不调用模板, 因为组件和动作一样, 会自动调用相应的模板.
}
}

虽然上面的方法都达到了相同的效果, 但实际上还是有很大区别的, 组件更适合用于复杂的逻辑处理, 而getter却显得很吃力.

有了描述之后, 可能我们还想给商店加个图标, 我们可以使用局部模板来实现, 修改generator.yml如下.

__ generator.yml __

list:
..sort: [id, asc]
..display: [_logo, id, =name, description]
..max_per_page: 10
..object_actions:
...._edit: -
...._delete: -

之后我们创建模板/apps/app/modules/shop/templates/_logo.php

__ /apps/app/modules/shop/templates/_logo.php __

<?php echo img_tag($shop->getId().".gif");?>

这样我们在每列的id前面加入了一个以id命名的gif图片, 当然图片是要上传的, 至于如何上传图片不在本文的讨论范围之内, 可以搜索本站的其他文章.

2008-12-23

symfony目录结构及部署办法说明

类归于: symfony — 标签:, bobhero @ 13:31

Symfony   实现了  MVC 结构 ,其目录结构 对于 初学者  或是 不习惯 MVC 结构 的人来说可以称得上 诡异,在这里简单说一下主要的目录 结构的作用。

通常 symfony  在初始化的时候建立 的 目录 结构是不用修改的 ,因为必竟经过了3年的精练 ,应该 比较 能适应大多数网站用户的 需要 。

默认目录结构如下

project/                                                                                                                                   项目文件夹

–apps/                                                                                                                                    多个入口 ,一般分前后台,或是多个用户等,主要用来区别大方向上的功能群变化

—-app1/                                                                                                                                 功能1,名字随便,代表一个功能 的集合,SYMFONY官方通常用frontend 来表示 前台

——config/                                                                                                                            所有config 的目录 都是存放 与其最近的上级目录 代表的功能  的配置文件  如 app1/config 代表 是app1的配置文件

——i18n/                                                                                                                                 i18n代表当前app的 多语言文件 存放位置

——lib/                                                                                                                                    所有lib 目录 都是代表 库文件 目录  与config 一样 ,如果只作用于当前的最近的功能

——modules/                                                                                                                          当前application 的模块存放文件

——–module1/                                                                                                                        某一个功能模块 名字任意

———-actions/                                                                                                                       当前模块的动作一般只有一个文件 也就是最核心的部分,所有动作都最终会被 路由到这里的文件中

———-config/                                                                                                                         同上config

———-lib/                                                                                                                                同上lib

———-templates/                                                                                                                   所有叫templates的文件夹用来存放模板,工作机制同lib ,config

——–module2/

——templates/                                                                                                                         同上templates

—-app2/

–cache/                                                                                                                                     缓存文件夹 通常 用来被 清空  要注意保持此目录 可写

–config/                                                                                                                                    同上config

–data/                                                                                                                                        存放symfony项目的数据  ,如 sql 文件 ,测试数据等

–doc/                                                                                                                                         存放文档

–lib/                                                                                                                                            同上lib  ,这个是作用于全局的,一般不想被外面直接访问到的类库可以放到这里

—-filter/                                                                                                                                      过滤器类存放文件夹

—-form/                                                                                                                                      表单类存放文件夹

—-model/                                                                                                                                    数据模型存放文件夹

—-validator/                                                                                                                               验证器存放文件夹

—-vendor/

—-widget/                                                                                                                                   存放自定义表单元素类的文件夹

–log/                                                                                                                                             日志存放位置

–plugins/                                                                                                                                      插件存放位置

–test/                                                                                                                                             测试存放位置

–web/                                                                                                                                             网站的根目录  只允许外部访问 此目录  其它都没有办法 通过URL 直接访问 到 大大提高了网站代码的安全性

–symfony                                                                                                                                      symfony命令文件 ,方便快捷的操作SYMFONY项目的PHP 脚本。想使用时需要先加权限,并确保可以被php解析

程序开发好了 需要部署 ,部署方法如下:

  1. 首先冻结当前项目,即把当前项目做成沙盒  , 把symfony 的lib 放到当前的data下 和lib 下(个人感觉 这是一个BUG,不需要同时放在两个位置 )
    1. symfony freeze path/to/symfonylib
  2. 先将文件上传(解压)
  3. 设置APACHE 配置虚拟机
  4. 设置对应文件权限,清缓存(如果有上传文件夹 同时也要设置相应的权限)
    1. 将cache 下的所有文件 清除
    2. 将web/uploads cache  log 目录 设置成为777 (递归)
    3. 对于有shell的网站管理 员可以直接  用 symfony cc                    symfony proj:permissions来实现上面效果
  5. 调试
    1. 如果网页不能正常 访问   则 在脚本文件 后加上DEV ,如frontend_dev.php ,实际上是切换到了开发模式 ,开发模式会报告出各种错误 来帮助调式,如权限不中,找不到文件等等。

2008-12-22

使用helper加快视图开发

类归于: symfony — 标签:, maker @ 16:21

在视图中, 我们可以使用Helpers来加快开发进度。

我们看一个简单的例子:

<?php echo input_tag('title);?>

上面的代码会生成下面的html代码

<input id="title" name="title" type="text" />

在视图中,一些Helpers不会被自动载入, 需要使用use_helper()进行声明, 我们可以这样用:

use_helper('Text');
use_helper('JavaScript');

或者象下面这样可以达到和上面一样的效果:

use_helper('Text', 'JavaScript');

在symfony中,Helpers按照用途分组, 比如Text, Tag, Url等Helpers内都包含相关的辅助函数。Helpers被存放在源码的/lib/helper/目录下。

目前symfony1.2支持的Helper有:

在视图中Helper, Tag, Url, Asset是不用被声明的, 视图必须使用这些基本函数才能正常工作,在默认设置中Partial,Cache,Form也是不需要声明的,该设置取决于apps/app/config/settings.yml中的standard_helpers选项。默认的standard_helpers选项如下:

standard_helpers: [Partial, Cache, Form]

我们可以在该选项中加入更多的自动加载的Helper, 或者如果你觉得你不会用到模板缓存,你可以将Cache从该选项中去掉, 这有助于加快程序运行速度。

在模板之外使用Helper

有些时候,我们不只要在视图中使用Helpers,比如我们要在action中生成一个内部链接,我们可以用下面的方法:

//symfony 1.0 & symfony 1.1
sfLoader::loadHelpers('Url');
$url = url_for('shop/search');
//symfony1.2
$this->getContext()->getConfiguration()->loadHelpers('Url');
$url = url_for('shop/search');

form使用一例

类归于: symfony — 标签:, maker @ 14:51

symfony1.2中加入了一个很重要的特性, 就是form, 使用form可以快速的配置表单的相关操作, 增删改, 包括验证.

当然, 你也可以不对form进行设置, 因为form的生成是自动的, 当初始化model的时候是会在lib/form/下建立相应的的form, 和model一样, form也有一个用户可以自定义的类和一个base类.

下面是针对module shop的一个例子

__ lib/form/ShopForm.class.php __

class ShopForm extends BaseShopForm
{
// 用来生成选项的widget
var $last = array('Wang', 'Luo', 'Chen', 'Li');
public function configure()
{
$this->setWidgets(array(
// input text widget
'first' => new sfWidgetFormInput(array(), array('class' => 'class_name' , 'id' => 'id_name', 'value' => '屁股')),
// select widget
'last' => new sfWidgetFormSelect(array('choices' => $this->last)),
));
// set a label
$this->widgetSchema->setLabel('first', 'Your first name');
// set labels for widgets
$this->widgetSchema->setLabels(array( 'last' => 'Your last name',));
// 设置生成代码的方式, 可以是表格或者列表(li)
//$this->widgetSchema->setFormFormatterName('list');
// 设定生成的name的格式name="name[name]"
$this->widgetSchema->setNameFormat('name[%s]');
// 设定表单项的提示信息
$this->widgetSchema->setHelps(array('first' => 'first name', 'last' => 'last name'));
// 添加验证规则
$this->setValidators(array(
// 最小长度
'first' => new sfValidatorString(array('min_length' => 5), array('min_length' => '屁股的名字太短了')),
'last' => new sfValidatorString(array()),
));

// setPostValidator 是一个全局验证规则,错误信息会出现在表单上方
// validatorCallback 是一个自定义验证的方法
$this->validatorSchema->setPostValidator(new sfValidatorCallback(array('callback' => array($this, 'vcallback')), array('invalid' => '%value%错误了"')));
}

// 自定义验证方法
// $v应该是验证实例
// $s是form传进来的值
// $a应该是附加参数
function vcallback(&$v, $s, $a)
{
if (3>2)
// 如果验证失败返回一个validatorError实例
// validatorError的第三个参数用来替换上面callback时候的%value%
throw new sfValidatorError($v, 'invalid', array('value' => '屁股'));
}
}

__ apps/frontend/modules/shop/actions/actions.class.php __

public function executeIndex(sfWebRequest $request)
{
$this->form = new ShopForm();
if($request->isMethod('post'))
{
$this->form->bind($request->getParameter('name'));
if($this->form->isValid()){
// 如果通过验证则将参数传递到另外一个action中
$this->redirect('shop/submit?'.http_build_query($this->form->getValues()));
}
}
}

__ apps/frontend/modules/shop/templates/indexSuccess.php __

<form action='<?php echo url_for('shop/index');?>' method='post'>
<table border='1'>
<?php echo $form;?>
<tr>
<td colspan='2'>
<input type='submit' />
</td>
</tr>
</table>
</form>
« 较近文章早前文章 »

WordPress 所驱动