Archive for the '网络技术' Category

26

有几个月没有摸FB了,换笔记本后,也没有安装。根据又中国特色的社会主义特点,自然要安装最新版本Flash Builder 4.6。Adobe下载界面提示此试用版本需要先安装Eclipse,无所谓了,反正机器上有。压缩包大概有800多兆,安装时提示错误。后来一查,很多电脑需要删除“C:\Program Files\Common Files\Adobe”文件夹方可安装,这下可麻烦了。

不是我舍不得删除,而是根本删不干净。我先删除了CS5.5里的其他软件,但“C:\Program Files\Common Files\Adobe”里面有两个文件夹怎么都删不掉,提示说需要system账户权限,即使用管理员角色也不行!即使按F8进安全模式也不行。网上有一些教程说用命令行打开超级终端或者提高Administrator的权限,但非常复杂。

最简单的方法是:在删除不了的文件上右键/属性,修改文件的所有人为Administrator,然后就可以删除了!

经过漫长的等待,终于安装好Flash Builder 4.6了。至于被删掉的CS5.5 软件能不能再次安装,只有下次试试才知道了。

26

YII的CListView使用起来很方便,并且它的dataprovider也是可以自定义的。比如想要获取其它表里的内容,可以在controller中这样写:

$dataProvider=new CActiveDataProvider('tableA', array(
			    'criteria'=>array(
					'select'=>'ta.*',
			        'condition'=>'tb.status=1',
					'alias'=>'ta',
			        'order'=>'id DESC',
					'join'=>'JOIN '.tableB::model()->tableName().' ta ON ta.pid=tb.id',
					'with'=>'p',
			    ),
			    'pagination'=>array(
			        'pageSize'=>20,
			    ),
			));

在CListView的view中使用的时候:

echo CHtml::encode($data->id);
echo CHtml::encode($data->p['title']);

注意,“p”是在前面’with’=>’p'中定义的。用以上方法可以大大扩充dataprovier的使用范围。
如果需要更复杂的数据整理,建议自行提取数据放入array,然后再用CArrayDataProvider将Array转化为dataprovider。

16

线条的绘制有点特别,线条本身是继承的Line3D,但必须要放入Lines3D之后才能使用。

lines = new Lines3D;
line = new Line3D(lines, new LineMaterial(0xFF0000), 2, new Vertex3D(450, 0, 0), new Vertex3D(500, 0, 0));
lines.addLine(line);
default_scene.addChild(lines);

注意:lines可以包含多条line

21

随着开发的不断深入,这两天在Yii框架下利用jQuery实现了AJAX。关键点有如下:

//listen to main element with ajaxlink style class name
    $(document).ready(function(){
        //after clicking a prediction intro
       $('.ajaxlink').click(function(){
           //ajax scan all dom element at the begining
           //and will not scan again even if class name is changed
           //so need to check the class name for sure
           if($(this).attr('class')=="ajaxlink"){
            targetID=$(this).attr('pid');
            $.ajax({
                type:"POST",
                url:'index.php?r=prediction/load',
                data:"id="+targetID,
                success:function(data){
                    $('#detail_'+targetID).html(data);
                }
            })
           }
        });
    });

核心是初始化文档时侦听带有特定样式名的元素,如果它(们)被点击,则激发js函数进行处理。这里是把id以post的形式发送到index.php?r=prediction/load,并将返回值放到id为#detail_x的元素中。实际开发过程中发现jQuery建立侦听后不能再添加侦听或者消除已建立的侦听,即使改变了样式名也不行。所以上面代码中加了一个对样式名的判断,虽然改变样式名不能消除侦听,但可以通过判断不执行相应操作。

16

在YII简单角色设定一文中介绍了如何设定user的角色。实际应用中往往还需要为user添加更多的变量。在userIdentity文件中可以这样写

if ($role >= 1) {
                $auth = Yii::app()->authManager;
                $auth->createRole('admin');
                $auth->assign('admin', $this);
                $this->setState('level', "admin");
            } else {
                $this->setState('level', "user");
            }

之后就可以这样应用level变量了

if(!Yii::app()->user->isGuest) echo(Yii::app()->user->level);
28

懒惰式加载(lazy loading):是指在定义好两个modle之间relations之后,只要在一个modle中没有利用relations去调用另一个modle的信息,则不会执行相应的查询。比如在author和post之间建立的一对多的关系,只要不引用post->author,YII就不会去查询post作者的详细信息。

// 获取 ID 为 10 的帖子
$post=Post::model()->findByPk(10);
// 获取帖子的作者(author): 此处将执行一个关联查询。
$author=$post->author;

渴求式加载(eager loading)
渴求式加载方式会在获取主 AR 实例的同时获取关联的 AR 实例。 这是通过在使用 AR 中的 find 或 findAll 方法时配合使用 with 方法完成的。例如:

$posts=Post::model()->with('author')->findAll();

上述代码将返回一个 Post 实例的数组。与懒惰式加载方式不同,在我们访问每个 Post 实例中的 author 属性之前,它就已经被关联的 User 实例填充了。 渴求式加载通过 一个 关联查询返回所有帖子及其作者,而不是对每个帖子执行一次关联查询。

我们可以在 with() 方法中指定多个关系名字,渴求式加载将一次性全部取回他们。例如,如下代码会将帖子连同其作者和分类一并取回。

$posts=Post::model()->with('author','categories')->findAll();
20

本地调好的webservice,传到服务器上后。直接用浏览器访问wsdl地址,提示“cannot modify header information”。这句话的意思是在用header方法定义网页header之前,已经有字符输出了。

刚开始按照网络上的解决方法,去修改php.ini来允许先输出别的字符后增加header(会影响性能),但并未解决我的问题。后来看到错误提示里提到”字符输出始于config/main.php:1″。难道main.php出问题了?

打开main.php,删除文档注释前的空行,问题解决了!看来先认真分析错误代码是非常重要的。

19

今天将开发中的YII项目文件上传到服务器测试,结果登录后一片空白。查看一个index页提示PDO错误。解决办法是在php.ini里打开:
extension=php_pdo_mysql.dll
extension=php_pdo_odbc.dll
extension=php_pdo_sqlite.dll

12

看文档比较糊涂,其实挺简单的:

$predictions=Prediction::model()->findAll("uid=:uid",array(":uid"=>10));

第一个参数是选择条件:”uid=10″。其中:uid是一个占位符,在后面的array(“:uid”=>10)对齐进行了赋值;

更完善的查询需要用到ctiteria:

$criteria=new CDbCriteria;
$criteria->select='title'; // only select the 'title' column
$criteria->condition='postID=:postID';
$criteria->params=array(':postID'=>10);
$criteria->order='id DESC';
$post=Post::model()->find($criteria); // $params is not needed
09

YII很强大,很高效,可以直接生成webservice。但是文档根本没说清楚该怎么用。只有Phone book demo给了我坚持到底的信心(因为Phone book demo里的webservice在flex里可以正常访问)。

按照yiiframework.com上的文档其实可以访问,但只能返回数字。。。。是的,返回字符串都不行。于是开始郁闷的调试。最终通过吧Phone book demo的数据库和所有功能移植到我项目上,进行逐个function的比对才找到问题所在。

好吧,总结几点经验,以免大家重蹈覆辙,先贴代码:

SiteController.php

    /**
     * Declares class-based actions.
     */
    public function actions() {
        return array(
            //web service action define
            'myService' => array(
                'class' => 'CWebServiceAction',
                'classMap' => array(
                    'Members',
                ),
            ),
        );
 
      /**
     * Returns all predictions.
     * @return Members[] the members records
     * @soap
     */
    public function getPredictions() {
        return Members::model()->findAll();
    }
    }

注意:
1 服务器要打开soap功能,在phpinfo里搜soap,如果已经打开了的话有个大标题就是SOAP
2 classMap其实只要是对应的Model就行,比如这里的Members。
3 代码注释里* @return Members[] the members records Members[]也必须和Model名称一致
4 代码注释里* @soap 这个也不能少,不然无法通过soap方式访问,想不到注释里还有这么多文章
5 如果controller里有accessRules的话,得设定访客就可以访问getPredictions()
6 Model里要公开的变量,需要用下面的形式标明:

/**
     * @var integer UID of this record
     * @soap
     */
    public $uid;