2008-12-26

Symfony中自定义form中offsetUnset的应用

类归于: symfony — 标签:, zhuozi @ 17:42

使用symfony,我们通常会重新定义我们需要的form,由于symfony机制的问题,它会根据你数据库的设置/config/databases.yml,自动判断form表单提交的数据是否符合标准。

我们常常遇到数据标准的问题就是,不可为空的字段,你没有给其赋值。

解决这个问题的办法,是在自定义的from里面

$this->offsetUnset(’字段名’); //重新定义一下,就不会出现这个错误了。

有的人可能会问,你直接修改数据的结构不是也可以解决嘛,对,修改数据库结构可以很容易的解决,可是如果你要是好几个模块都共用同一个表的时候怎么办呢?

比如说我有个表city有以下字段id,name,parent_id,info,pic

一级城市必须填写所有信息,二级城市只需填写name,parent_id字段

symfony1.2中的文件上传和验证

类归于: symfony — 标签:maker @ 16:02

symfony 1.2中将文件上传操作从webRequest对象转到了sfFormProple对象上, 使用save方法会调用proccessUploadFile, 然后调用saveFile

需要在form中声明上传的路径, 这个很重要.
比如我们给file字段增加上传功能, 则应该加上这样一行.

$this->validatorSchema['file']->setOption('path', sfConfig::get('sf_upload_dir'));

或者

$this->validatorSchema['file'] = new sfValidatorFile(array('path' => sfConfig::get('sf_uploads_dir')));

上面的代码可以完成symfony中文件的自动上传功能,symfony1.2的form中还有另外一个很强大的功能, 那就是表单验证, 同样的, 上传文件也是可以使用validator进行验证的, 下面是一个例子.

$this->setValidator('filename' , new sfValidatorFile(array('path' => sfConfig::get('sf_upload_dir'), 'required' => false, 'mime_types' => 'web_images', 'max_size' => SettingPeer::getSetting('shopPicMaxSize'))));

Ubuntu apt-get方法安装phpmyadmin

类归于: Ubuntu — 标签:zhuozi @ 13:46

在windows页面,不管是app-server还是LAMP等等的环境集合压缩包,安装完成之后都会自动包含phpmyadmin,可是在Ubuntu下面,我们需要一个一个安装,如何能让phpmyadmin正常的工作起来,让我在网上找了很长时间。

1. #sudo apt-get install phpmyadmin

PS:你会发现直接访问http://localhost/phpmyadmin,不好用

2.#sudo ln -s /usr/share/phpmyadmin/ /var/www/

安装上面的方法,我们建立一个软连接,或者你把phpmyadmin直接复制到 /var/www/的文件夹下面也可以。

在Ubuntu下面就可以正常使用phpmyadmin了。

symfony缓存(cache)机制简介

类归于: symfony — 标签:, , kthiz2006 @ 10:32

关于缓存

symfony可以处理三种不同类型的html缓存:

  1. 动作的缓存(包含或不包含布局)
  2. 局部模板,组件或组件槽的缓存
  3. 模板片段的缓存

全局缓存设置
在项目的配置目录下:
例:

dev:
.settings:
cache: on

首先缓存一个动作:
例如在fontend/modules/shop/config/cache.yml(如果该文件不存在,就创建它)里写如下

list:
enabled: on        #开启缓存
with_layout: false #设置是否布局一起被缓存
lifetime: 86400    #设置缓存时间

这时就可以在dev下测试缓存的设置。

如果动作里的参数不一样,则在缓存中会根据参数的不同存入相应的记录。

缓存局部模板,组件或组件槽
例如在fontend/modules/shop/config/cache.yml里下如下

_my_partial:
contextual: true #如果把每个调用它的模板都保存一个版本,则设为true
enable: on

模板缓存片段
例如:
<!– Code executed each time –>

<?php echo link_to('last accessed user', 'user/show?id='.$last_accessed_user_id) ?>

<!– Cached code –>

<?php if (!cache('users')):
foreach ($users as $user):
echo $user->getName() ;
endforeach;
cache_save() ;
 endif; ?>

动态配置缓存

$context->getViewCacheManager()->addCache('article', 'show', array(
'withLayout' => true,
'lifeTime'   => 3600,
));

删除缓存的命令:
1.删除整个缓存
symfony clear:cache (简写 php symfony cc)
2.仅删除前台应用的缓存
php symfony cache:clear –app=frontend
3.仅删除前台应用的HTML缓存
php symfony cache:clear –app=frontend –type=template
4.仅删除前台应用的配置缓存
php symfony cache:clear –app=frontend –type=config
5.仅删除前台应用的发布模式下的配置缓存
php symfony cache:clear –app=frontend –type=config –env=prod

用$this->getContext()->getViewCacheManager()->remove()删除指定缓存.
用sfToolkit::clearGlob()方法删除指定缓存所在的目录。
例如:

<?php
$sf_root_cache_dir = sfConfig::get('sf_cache_dir');
$cache_dir = $sf_root_cache_dir.'/frontend/cache/*';#清楚前台缓存目录
sfToolkit::clearGlob($cache_dir);
?>

下面举例个例子:

首先拷贝一个frontend_dev.php改名为frontend_cache.php,里面内容改为如下:

<?php
require_once(dirname(__FILE__).'/../config/ProjectConfiguration.class.php');

$configuration = ProjectConfiguration::getApplicationConfiguration('frontend', 'cache', true);
sfContext::createInstance($configuration)->dispatch();
?>

然后在apps/frontend/config/settings.yml里设置

cache:
.settings:
error_reporting: <?php echo (E_ALL | E_STRICT)."n" ?>
web_debug:       on
cache:           on
etag:            off

接着在config/databases.yml里写

cache:
propel:
class: sfPropelDatabase
param:
classname: DebugPDO

然后清楚缓存。

接着在apps/frontend/config/cache.yml下写

default:
enabled:     off
with_layout: false
lifetime:    86400

然后在apps/frontend/modules/shop/config/cache.yml(注:config目录如果不存在则创建它)下写

index:
enabled:     on
with_layout: true

清除缓存

这样刷新页面,就可以在shop的index页面看到红色边框,和蓝色的小框,刷新页面,蓝色变成黄色。可以看时间感受一下缓存后的速度。

这时如果想删除前台的整个缓存可以使用如下方法

<?php
$sf_root_cache_dir = sfConfig::get('sf_cache_dir');
$cache_dir = $sf_root_cache_dir.'/frontend/cache/*';#清楚前台缓存目录
sfToolkit::clearGlob($cache_dir);
?>

也可以用

<?php
$sf_root_cache_dir = sfConfig::get('sf_cache_dir');
$cache_dir = $sf_root_cache_dir.'/frontend'; #清楚前台缓存目录
sfToolkit::clearDirectory($cache_dir);
?>

这样缓存就被清除了。

HTTP1.1与客户端缓存
目前浏览器都支持http1.1(即使不支持也没关系)
增加ETag头信息来避免发送重复的内容(作用是当开启该功能后,服务器会增加一个含有响应本身签名的专门的头部。用户的浏览器会把它保存下来,代下次请求
的时候把这个签名一起发出去。如果与新签名一致,则服务器不会发出响应,而是发出一个没有修改的头信息。这样就节省了服务器的CPU时间和带宽,还有客户端的时间)
例如:在settings.yml里设置开启ETag功能.

all:
.settings:
etag: on
(注:默认是开启的)

增加Last-Modified头信息避免发送仍然有效的内容
服务器向浏览器发送响应的时候,会增加一个头部说明页面的数据的最后修改时间。
浏览器理解这个信息,当再次请求这个页面的时候,会对应的加上If-Modified
这样服务器可以比较客户端和应用程序返回的这个值,如果相同,则返回没有修改的头信息。这样可以节约带宽和CPU时间。
当然在symfony可以手动设置时间
例如:

<?php $this->getResponse()->setHttpHeader('Last-Modified', $this->getResponse()->getDate($timestamp));?>

通过增加Vary头信息保存一个页面的多个缓存版本,但这会增加缓存的大小,不过,服务器收到匹配的头信息的时候,就可以直接从缓存里取出响应而无须处理。
例如:

<?php
$this->getResponse()->addVaryHttpHeader('Cookie');
$this->getResponse()->addVaryHttpHeader('User-Agent');
$this->getResponse()->addVaryHttpHeader('Accept-Language');
?>

通过增加Cache-Control头信息来允许客户端缓存
例如:
可以定义缓存的时间

<?php $this->getResponse()->addCacheControlHttpHeader('max_age=60');?>

指定页面的缓存的条件

<?php $this->getResponse()->addCacheControlHttpHeader('private=True');?>

设置过期时间

<?php $this->getResponse()->setHttpHeader('Expires', $this->getResponse()->getDate($timestamp));?>

使用数据库存储系统进行缓存(好处是当应用程序的缓存压力非常大时,模板的缓存文件最终会分散在很深的文件结构中,在这种情况下用sqlite存储会更快。清除缓存过程将只是一个简单的文件删除)
首先查看php的扩展是否支持sqlite,如果不支持,请安装它.
安装好后,在应用程序的config里的factories.yml的all下面添加如下:

<?php
all:
  view_cache:
    class: sfSQLiteCache
    param:
      database: %SF_TEMPLATE_CACHE_DIR%/cache.db
?>

最后清缓存.
这样,就在你为应用程序的开启缓存的模式下启用了。

2008-12-25

Symfony框架中的“.htaccess”文件和“根”目录

类归于: symfony — 标签:zhuozi @ 14:08

大家使用php的框架来进行开发,有的时候可能会直接调用跟目录的文件而不是触发某个动作,可是由于MVC思想的缘故,会把url中的filename看作成某个action.当然,你肯定不愿意为了实现这个而特意去写一个action.

如果你做过website的sitemap,应该会了解,google建议的格式是xml,而yahoo建议的格式是txt,如何能让搜索引擎或者用户直接可以访问跟目录的文件呢?这个时候我们就需要用到.htaccess文件,把我们想直接访问的文件类型,写在.htaccess文件中。

而在symfony你基本上不用去特意修改.htaccess文件,只要把你想要直接访问的文件放在web文件夹下面就可以了,在symfony里web相当于“根”目录。

早前文章 »

WordPress 所驱动