手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜Qcloud , 注册 | 登陆
浏览模式: 标准 | 列表2009年05月的文章

using zf and smarty

使用zend framework开发时,可以采用第三方模版,比如smarty,在网上找了很多资料,一般来说是两种

1、扩展view

2、使用Zend_Registry,在初始化的时候加载smarty,然后在输出的时候使用Zend_Registry::get('smarty')->display();

使用第二种方式的话,我当然是没有什么说的了。我这里说的是使用第一种方案。

在第一种方案中,官方有例子,页面地址为:http://framework.zend.com/manual/en/zend.view.scripts.html,写上一个类,调用Zend_View_Interface,写上相同的函数就可以了。。

官方有源码,我这里就不贴了。我把官方的例子写一下:

 

PHP代码
  1. //Example 1. In initView() of initializer.  
  2. $view = new Zend_View_Smarty('/path/to/templates');  
  3. $viewRenderer =  
  4.     new Zend_Controller_Action_HelperBroker::getStaticHelper('ViewRenderer');  //使用此例子时,请将new去掉,静态方法不需要new
  5. $viewRenderer->setView($view)  
  6.              ->setViewBasePathSpec($view->_smarty->template_dir)  
  7.              ->setViewScriptPathSpec(':controller/:action.:suffix')  
  8.              ->setViewScriptPathNoControllerSpec(':action.:suffix')  
  9.              ->setViewSuffix('tpl');  
  10.   
  11. //Example 2. Usage in action controller remains the same...  
  12. class FooController extends Zend_Controller_Action  
  13. {  
  14.     public function barAction()  
  15.     {  
  16.         $this->view->book   = 'Zend PHP 5 Certification Study Guide';  
  17.         $this->view->author = 'Davey Shafik and Ben Ramsey'  
  18.     }  
  19. }  
  20.   
  21. //Example 3. Initializing view in action controller  
  22. class FooController extends Zend_Controller_Action  
  23. {  
  24.     public function init()  
  25.     {  
  26.         $this->view   = new Zend_View_Smarty('/path/to/templates');  
  27.         $viewRenderer = $this->_helper->getHelper('viewRenderer');  
  28.         $viewRenderer->setView($this->view)  
  29.                      ->setViewBasePathSpec($view->_smarty->template_dir)  
  30.                      ->setViewScriptPathSpec(':controller/:action.:suffix')  
  31.                      ->setViewScriptPathNoControllerSpec(':action.:suffix')  
  32.                      ->setViewSuffix('tpl');  
  33.     }  

以上是官方的example。不过,如果按第一个例子测试,是会出错的。。。

 

请看第4行。。。静态方法居然用了new。(应该是粗心吧。不过我昨天是直接复制的,死活报错,也没有仔细看,丢人啊)写这篇 文章,主要也就是提醒一下,这个例子有点问题。

顺便说一下,由于官方的例子里,是把$_smarty写成了protected,那么,其实在外面是不能够被直接引用的。要么写一个__get方法,要么,把属性改为public吧

不过,在使用smarty后,你会发现,你原来的layout功能不能完全使用了,为什么呢?因为,在原来的layout里面,代码都是类似于这样:

 

PHP代码
  1. <?php  
  2. $this->layout()->title;  
  3. ?>  

大致是这样的代码,这个,可不能用在smarty中。虽然在smarty中也可以用标签来调用PHP代码,但这毕竟不是一个好办法。

 

不过还好,又有牛人写了一个很牛叉的例子。LOOK:http://anders.tyckr.com/2008/03/12/implementing-zend-layout-and-smarty-using-zend-framework-mvc/,不过这个例子我还没有全部看完,先贴上来。以后慢慢看,应该会用在项目中吧?

不然,我就用不了layout了,除非我放弃这个东西。。哈哈

Tags: zend, framework, smarty

昨天带小家伙去公园玩了一下

小家伙现在看到出去就很激动的。当前被谁抱着,其他人都不让抱的。
照片我还是会上传到picasaweb上面,正在研究zf和zgada,然后直接利用这个东东把图片当成相册使用。还不占用我的硬盘空间
oh yeah.

jQuery 1.3.3 新功能

jQuery是目前我用的最多的JS框架,毕竟他简化了我很多JS的操作,而且目前它的插件也非常多。所以看到有更新就放上来。(当然不是我翻译的,以我的水平,翻译出来的文章会比英文原文更难懂)

原文:http://www.5iya.com/blog/post/jquery-1-3-3-new.asp

全部翻译自 Brandon Aaron 的blog

增强的toggleClass()

1.toggleClass也可以和addClass一样,用空格分隔多个class名称了。

.toggleClass("a b") == .toggleClass("a").toggleClass("b")

2.无参数时,自动删除、恢复全部class,也可以传递一个布尔值,true为恢复class,false为删除class。

3.也可以第一个参数为class名,第二个参数为布尔值,具体用法如下。

// 原始代码
// <div class="a b c"></div>

// 删除、恢复全部class
$('div').toggleClass();        // <div class="" />
$('div').toggleClass();        // <div class="a b c" />
$('div').toggleClass( false ); // <div class="" />
$('div').toggleClass( true );  // <div class="a b c" />

// 删除、恢复多个 class
$('div').toggleClass( "a b" );          // <div class="c" />
$('div').toggleClass( "a c" );          // <div class="a" />
$('div').toggleClass( "a b c", false ); // <div class="" />
$('div').toggleClass( "a b c", true );  // <div class="a b c" />

简化的hover()

1.3.3中,hover绑定事件可仅传递一个函数,将默认用做mouseenter/mouseleave公用的函数。

旧代码:

$('li').hover(function() {
        $(this).addClass('test');
}, function() {
        $(this).removeClass('test');
});

新代码:

$('li').hover(function() {
        $(this).toggleClass('test');
});

live冒泡事件支持预设参数

// 预设参数
var eventConfig = {
    selectedClass: "selected"
};

$("li").live("click", eventConfig, function( event ) {
    // 绑定函数的参数event的data属性即为传递的预设参数
    var selectedClass = event.data.selectedClass;
});

更好的支持其它windows、document对象

通过.contents()获得其它框架的document对象。

var iframeDoc = $('iframe').contents().get(0);

这样就可以获取其height/width/CSS属性或绑定事件。

// 获得框架宽度
$(iframeDoc).width();

// 获得框架高度
$(iframeDoc).height();

// 绑定事件
$(iframeDoc).bind('click', function( event ) {
    // do something
});

// 获得CSS属性值
$('div', iframeDoc).css('backgroundColor');

注意,如果要处理框架内部网页元素,请使用此插件(配合jQuery 1.3.3/+),和以下语法:

$('iframe').win().bind('load', fn);
$('iframe').doc().find('a').click(fn);

增强的index()

两个变化,第一个,支持传递selector作为参数。

旧代码:

$("img").index( $("img.selected") );

新代码

$("img").index( ".selected" );

第二个,无参数传递,直接查找在同级元素中的位置。

旧代码:

var $this = $(".selected");

$this.parent().children().index( $this );

新代码:

$(".selected").parent().index();

自行指定this对象

在1.3.3中,可以在bind/live绑定事件时,自行指定this参数代表的对象。这个用法需求不多,而且可用event.target,event.currentTarget代替。

具体用法请参看原文

Tags: jquery

关于base64

以前也曾经转载过关于BASE64方面的文章,那时候仅仅介绍了原理啥的。这回我找来的内容是如何实现的。。。

通过google找来了javaeye上的文章,他写了转载自xxx,进入xxx的页面,他告诉我转载自yyy每个人在转载的时候都去掉了一些内容。基于这样的现状,我。。。

不想转载了,贴出几个地址,自己看吧。

javaeye:http://chmod777.javaeye.com/blog/320301

xxx:http://www.cnblogs.com/yiki/archive/2009/01/18/1377828.html

yyy:http://www.cnblogs.com/reonlyrun/archive/2006/12/29/640991.html

这些实现在PHPer看来都是学习的经验,但phper根本不需要进行这些,因为php自带了base64_encode,base64_decode函数。

我要说的是,如何将加密的后的字符串在URL里传递,众所周知,base64中有三个特殊字符:"/,+,=",其中,=是补位码,/和+的标准字符,但/和=在URL里有着特定的意义,如果放到URL里,可能会被当成其他功能进行处理 。

于是,写了一个小函数进行了转换:

PHP代码
  1. function exchange ( $string , $reverse = false )  
  2. {  
  3.     if ( $reverse === false ){  
  4.         return str_replacearray("/","+","="), array(":","|",";"), $string );  
  5.     }else{  
  6.         return str_replacearray(":","|",";"), array("/","+","="), $string );  
  7.     }  
  8. }  
其实功能很简单,无非就是把这三个有特殊意义的字符转换成在URL里不被解析的三个字符,只要不和base64所规定的字符相关,也不是URL处理中的特殊字符,这三个字符你可以替换成你平时喜欢用的字符。。。

使用Jsonp解决跨域数据访问问题

以前,对jsonp没有听说过,看到本文的时候觉得可以参考一下,所以,保存一下做个记录
原文:http://www.cnblogs.com/cocowool/archive/2009/05/21/1486307.html

简介
符合Web2.0特征的众多网站一个明显的特点就是采用Ajax。Ajax提供了在后台提交请求访问数据的功能。其实现主要使用的是XMLHttpRequest函数,这个函数允许客户端的Javascript发送到服务器端的HTTP请求并获得返回数据。Ajax同时也是目前众多的Mashup背后的驱动力量,他们都利用Ajax来聚合不同来源的信息。

理解同源策略的限制
同源策略是指阻止代码获得或者更改从另一个域名下获得的文件或者信息。也就是说我们的请求地址必须和当前网站的地指相同。同源策略通过隔离来实现对资源的保护。这个策略的历史非常悠久从Netscape Navigator 2.0时代就开始了。

解决这个限制的一个相对简单的办法就是在服务器端发送请求,服务器充当一个到达第三方资源的代理中继。虽然是用广泛但是这个方法却不够灵活。
另一个办法就是使用框架(frames),将第三方站点的资源包含进来,但是包含进来的资源同样要受到同源策略的限制。

有一个很巧妙的办法就是在页面中使用动态代码元素,代码的源指向服务地址并在自己的代码中加载数据。当这些代码加载执行的时候,同源策略就不会起到限制。但是如果代码试图下载文件的时候执行还是会失败,幸运的是,我们可以使用JSON(JavaScript Object Notation)来改进这个应用。

JSON和JSONP
与XML相比,JSON是一个轻量级的数据交换格式。JSON对于JavaScript开发人员充满魅力的原因在于JSON本身就是Javascript中的对象。
例如一个ticker对象
    var ticker = {symbol:'IBM',price:100}
而JSON串就是    {symbol:'IBM',price:100}
这样我们就可以在函数的参数中传递JSON数据。我们很容易掌握在函数中使用动态的JSON参数数据,但是我们的目的并不是这个。
通过使我们的函数能够加载动态的JSON数据,我们就能够处理动态的数据,这项技术叫做 Dynamic Javascript Insertion。
我们看下面的例子
index.html中
    <script type="text/javascript">
        function showPrice(data){
            alert("Symbol:" + data.symbol + ", Price:" + data.price);
        }
        
        var url = "ticker.js";        //Outer JS URL
        var script = document.createElement('script');
        script.setAttribute('src', url);
        
        //load javascript
        document.getElementsByTagName('head')[0].appendChild(script);
    </script>
ticker.js中
    var data = {symbol:'IBM', price:100};
    showPrice(data);

上面的代码通过动态加入Javascript代码,来执行函数加载数据。
正如之前提到过的,同源策略对于动态插入的代码不适用。也就是你可以从不同的域中加载代码,来执行在他们代码中的JSON数据。
这就是JSONP(JSON with Padding)。注意,使用这种方法时,你必须在页面中定义回调函数,就像上例中的showPrice一样。

我们通常所说的JSONP服务(远程JSON服务),实际上就是一种扩展的支持在用户定义函数中包含返回数据的能力。这种方法依赖于必须接受一个回调函数的名字作为参数。然后执行这个函数,处理JSON数据,并显示在客户页面上。

JQuery的JSONP支持

从JQery 1.2以后,就开始支持JSONP的调用。在另外的一个域名中指定好回调函数名称,你就可以用下面的形式来就加载JSON数据。
    url?callback=?

示例:
    jQuery.getJSON(url + "&callbak=?", function(data){
        alert("Symbol:" + data.symbol + ", Price:" + data.price);
    });
jquery会在window对象中加载一个全局的函数,当代码插入时函数执行,执行完毕后就会被移除。同时jquery还对非跨域的请求进行了优化,如果这个请求是在同一个域名下那么他就会像正常的Ajax请求一样工作。

上例中我们在动态插入到页面的代码中使用了静态的json数据,虽然完成了依次JSONP返回,但仍不是JSONP服务,因为不支持在URL中定义回调函数名称。下面是一个将其变成JSONP服务的一个方法服务器端使用PHP。

首先我们来定义接口的规范,就像这样:http://www.mydomain.com/jsonp/ticker?symbol=IBM&callback=showPrice
symbol是请求条件,callback是回调函数名称。

在页面文件中,我们使用JQuery的支持:
        //JQuery JSONP Support
        var url = "http://www.mydomain.com/api/suggest.php?symbol=IBM&callback=?";
        jQuery.getJSON(url, function(data){
            alert("Symbol:" + data.symbol + ", Price:" + data.price);
        });

在suggest.php中
     $jsondata = "{symbol:'IBM', price:120}";
     echo $_GET['callback'].'('.$jsondata.')';
    
现在,如果我们想制作一些mashup,或者将第三方的资源整合到一个页面中,我们就很容易想到JSONP的解决方法了。

现有的JSONP服务
    既然我们已经知道如何使用JSONP,那么我们也就可以使用一些现有的JSONP服务了,下面是一些例子:
    Digg API:http://services.digg.com/stories/top?appkey=http%3A%2F%2Fmashup.com&type=javascript&callback=?
    Geonames API:http://www.geonames.org/postalCodeLookupJSON?postalcode=10504&country=US&callback=?
    Flickr API:http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&tagmode=any&format=json&jsoncallback=?
                   
注意:
    JSONP是一个非常强大的构建mashp的方法,可是不是一个解决跨域访问问题的万能药。它也有一些缺点
    第一也是最重要的:JSONP不提供错误处理。如果动态插入的代码正常运行,你可以得到返回,但是如果失败了,那么什么都不会发生。你无法获得一个404的错误,也不能取消这个请求
    另外一个重要的缺点是如果使用了不信任的服务会造成很大的安全隐患。    
    

[参考资料]
1、Cross-domain communication with jsonp        http://www.ibm.com/developerworks/library/wa-aj-jsonp1/

Records:5912345678910»