yii的一些方法的解析和blog的详细解析(三)

转载自:http://www.yiichina.org/forum/thread-218-1-1.html

//这样写就可以传送参数用get方法接收
$this->redirect(array('category/show',array('id'=>1,'rule_id'=>'1'))); 2.  原始代码
<?php echo CHtml::linkButton('Logout',array(
       'submit'=>'',
       'params'=>array('command'=>'logout'),
   )); 
?><?php echo CHtml::Button('Delete', array (
       'submit' => $this->createUrl('post/delete',$this->getReturnParams()),
       'params' => array('id'=>123),
       'confirm'=>'Are you sure?'
     )) 
?>

------------------------------------------------------------------------------------------------------------------------------------------------
代码可以先取出用户已经选的选项,再赋值到前台页面中
------------------------------------------------------------------------------------------------------------------------------------------------
<?php foreach($options = $tempradio as $key => $value): ?>
<?php
if ($field->value == $key)
  echo "<span class='radio'>",CHtml::radioButton($field->id, true, array("class" => "noborder", "value" => $key)),$value,"</span>";
else
  echo "<span class='radio'>",CHtml::radioButton($field->id, false, array("class" => "noborder", "value" => $key)),$value,"</span>";
?>
<?php endforeach; ?>



--------------------------------------------------------------------------------------------------------------------------------
tpl调用jquery的AJAX
--------------------------------------------------------------------------------------------------------------------------------
1.tpl中 调用js中的函数startAlert()
     <?php echo CHtml::Button('Flag', array("id"  => "cb_btn_$field->id", "name"  => "cb_btn_$field->id", "onclick" => "startAlert('$field->id')"));?>
2.js中
   function startAlert(id){
    $.ajax({
      type: "POST",
      url: "http://www.cnblogs.com/Change",
      data: "id="+id+"&location=Boston",
      success: function(msg){
        //alert( "Data Saved: " + msg );
        document.getElementById('cb_'+id).innerHTML=msg;
      }
    });
   }
  注意:data传递参数是post且格式如下"id="+id+"&location=Boston" 可以传递N个变量 url :填写路径是有技巧的
             1. 当URL路径 trunk/bo/index.php/category/show/id/1  意义为 在categorycontroller下的 actionshow中 id是参数名 1 为参数值这样时候 AJAX需要写"http://www.cnblogs.com/Change" 网上递归两层
             2. 当URL路径 trunk/bo/index.php/category/fill       意义为 在categorycontroller下的 actionfill中这样时候 AJAX需要写"Change"   不需要递归


--------------------------------------------------------------------------------------------------------------------------------------------
main.php 里面的内容包括
--------------------------------------------------------------------------------------------------------------------------------------------
1》 params 文件的应用
  1.protected/config/main.php 中进入这个文件'params' => include(dirname(__FILE__) . '/params.php')
    相当于引入了一些全局静态变量到系统中
  2. 实际的操作方法为。在tpl文件中可以引用  Yii::app()->params['TEXT_TYPE']

2》 http://www.yiiframework.com/doc/guide/zh_cn/topics.url
    设置网页上的URL 把带问号的参数?r=site/login,变成/组成的URL
    opentax/trunk/bo/index.php?r=site/login  ====》 opentax/trunk/bo/site/login
    1. 'components' => array(这里增加一个数组
        'urlManager' => array(
         'urlFormat' => 'path',
         'showScriptName' => 'false',
         'urlSuffix' => '.html', //传递参数后会自动添加此后缀名,用于欺骗作用的下标。id/1  ===> id/1.html
        ),
       )
3》 http://www.yiiframework.com/doc/guide/zh_cn/topics.theming
    设置新主题 theme 相当于整个网站的新tpl风格
    'theme' => 'opentax', 与components数组平行
    Yii::app()->theme->baseUrl . '/images/FileName.gif'  需要调用theme中的图片时候,可以用此地址
   
4》 http://www.yiiframework.com/doc/guide/zh_cn/topics.logging
    在components中设置,可以用来输出特出的值
     'log' => array(
     'class' => 'CLogRouter',
     'routes' => array(
      array(
       'class' => 'CFileLogRoute',
       'levels' => 'error, warning',
       'class'=>'CWebLogRoute', //当加上这两句话时候,程序就显示一个关于执行过程的表格易于开发,但是发布时候需要去除,不然影响程序速度(http://www.yiiframework.com/forum/index.php/topic,2004.0.html)
              'levels'=>'trace', //当加上这两句话时候,程序就显示一个关于执行过程的表格易于开发,但是发布时候需要去除,不然影响程序速度
      ),
     ),
    ),
    
5》 增加数据库的连接文件
        'db'=>array(
            'class'=>'CDbConnection',
            'connectionString'=>'mysql:host=localhost;dbname=ox',
            'username'=>'root',
            'password'=>'',
        ),

6》  http://www.yiiframework.com/doc/guide/zh_cn/topics.prado
    模版引擎
    在components中添加
    'viewRenderer'=>array(
            'class'=>'CPradoViewRenderer',
     ),

7》 http://www.yiiframework.com/doc/guide/zh_cn/topics.security
    安全性
    1.CSRF 保护。在form中添加一个cookie,当提交时候服务器会认证这个值,若相同表示为可信任的表单及其传的值
       components中加入
        'request'=>array(
             'enableCsrfValidation'=>true,
         ),
     且建立表单时候一定用CHtml::form。这种格式,其他格式都不能被保护
    
   2.XSS 保护
      <?php $this->beginWidget('CHtmlPurifier'); ?>
    ...display user-entered content here...
    <?php $this->endWidget(); ?>
  3.Cookie 保护
      components中加入
      'request'=>array(
            'enableCookieValidation'=>true,
        ),
        用时候这样调用和赋值
        $cookie=Yii::app()->request->cookies[$name];
    $value=$cookie->value;

    // send a cookie
    $cookie=new CHttpCookie($name,$value);
    Yii::app()->request->cookies[$name]=$cookie;



8》http://www.yiiframework.com/doc/guide/zh_cn/topics.performance
   提高性能
    1.应用php的APC(Alternative PHP Cache)。参考http://www.php.net/manual/en/book.apc.php
    return array(
       'components'=>array(
          'cache'=>array('class'=>'CDbCache'),
          'cache2'=>array('class'=>'CMemCache'),
       ),
    );
   然后通过Yii::app()->cache和Yii::app()->cache2来访问。
    2.关闭YII_DEBUG 设置为false
    3. Active Record用这个调用库文件也可以应用到缓存技术
    4. 可以用$cs=Yii::app()->clientScript;来合并许多的js文件
    5. 可以引用google的jquery来代替自身的echo CGoogleApi::bootstrap(); CGoogleApi::load

--------------------------------------------------------------
当用yii自带的BUTTON调用自己的JQuery.yii.js时候会与Jquery.validate.js冲突
1.  这样调用Button 就yii自己生成了 JQuery.yii.js,会产生冲突。文本框验证不了
<?php echo CHtml::Button('cancel', array (
    'submit' => Yii::app()->request->baseUrl . '/category/DeleteUser',
    'params' => '',
    'confirm' => 'Are you sure?'
)) ?>

2.  解决:
   需要避开带参数的button
   <?php echo CHtml::Button('cancel',array("onclick"=>"deleteuser('".Yii::app()->request->baseUrl . '/category/DeleteUser'."')"));?>
   让它去调用js函数deleteuser()且把相对路径传给他。让js去提交表单和询问
  
   js如下:
   function deleteuser(url)
  {
    if(confirm('are you sure?'))
    {
     document.getElementById('fillForm').action=url;
     document.getElementById('fillForm').submit();
    }
  }
----------------------------------------------------------------------------------------------------------------------------
yii controller中需要load某些文件的操作方法
1. /protected/config/main.php 中 是纵览哪些文件是可以load进来的
    // autoloading model and component classes
  'import' => array(
   'application.models.*',
   'application.components.*',
     'application.classes.*',
  ),

2. controller之间的action不能相互调用且controller之间也不能相互引用
   需要公共的函数可以写到这些文件中只要建立一个class就可以 
   解决方法在公共函数中进行回传一个变量或者全局变量,用变量进行判断

----------------------------------------------------------------------------
YII 的 JQUERY 的json 运用方法
1. php中建立数组
  $chage['fieldid'] = $fieldid;
  $chage['butflag'] = 0;
  echo CJSON::encode($chage);

2.  JS文件中输出
     var Jsonstr = $.json.decode(msg);
     这样就可以取值Jsonstr['fieldid']

posted on 2011-04-28 19:00  DavidYanXW  阅读(3685)  评论(0)    收藏  举报