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

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

-----------------------------------------------------------------------------------------------
YII  不用自带的php validate验证功能,自己可以模仿输出
1.  在php中
    先用数据库查询用户是否存在
    if($this->checkEmail($_POST['email']))
   {
    $error[0] = 'email already exists';
                $er = true;
   }
    if($er) // 如果存在返回到首页
      {
          $questions = $this->loadQuest();
          $this->render('index', array(
                              'post' => $questions,
                              'error_msg_email' => $error[0],
                              'error_msg_zip' => $error[1],
                              'firstname' => $_POST['firstname'],
                              'email' => $_POST['email'],
                              'zipcode' => $_POST['zipcode'],
                              'perstatus' => $_POST['perstatus'],
                              ));
      }
     
2. tpl中 index.tpl
    if($textname == "email")
     {
      echo CHtml::textField($textname, $value = $$textname, array("class" => "required email", "minlength" => "3"));
      //用css的控制,决定错误提示是否输出及输出的位置
        echo '<label class="errorjs" for="email" generated="true" style="',($error_msg_email == '')?'display:none':'','">',$error_msg_email,'</label>';
      echo CHtml::hiddenField($textname . "hiden", $model->id);
     }

----------------------------------------------------------------------------------------------------------------------------------
类的不同调用
1. 当定义类中函数有静态属性时候。加static 的是静态成员,不能用实例化。
   在你运行的时候他自己在内存中开辟了块空间,不用再一次new, 有点像全局变量
class Uti
{
  public static function teOptions($text){}
}
2. 外面函数调用时候,用 Uti::teOptions() 这样就可以。但引用变量时候需self:shy.gifa,这样的方式
3. 若类中定义为 先实例化(new)一下才能用
  class Uti
{
  public function texOptions($text){}
}
4. 外部调用如下:  类中变量可以$this->a方式使用
    $component = new Uti;
   $tmpflag = $component -> texOptions();
--------------------------------------------------------------------------------------------------------------------------------------------------------
解释models文件夹中读取数据库中表的文件。relationship的应用
http://www.yiiframework.com/doc/guide/zh_cn/database.arr
1.  表结构如下
    category       (pk) id , name
    postcategory   (pk,fk1) postID,(pk,fk2)categoryID
    post           (pk) id ,  title,content,createTime,(fk1)authorID
    user           (pk) id , username,password email
    profile        (pk,fk1) ownerID,photo,website

2.  relation结构如下
    'VarName'=>array('RelationType', 'ClassName', 'ForeignKey', ...additional options)
     // author 为自己命名的标志,在查询时候应用
     // user和post的关系是一对多,post belongs to user
     // 外键是 authorID
     // categories 为自己命名的标志,在查询时候应用
     // category和post的关系是多对多,只不过用了一个中间表让之形成一对多,多对一这样的关系。post many_many category
     // 外键是 postcategory 这个表,它里面有两个字段
    class Post extends CActiveRecord { public function relations() { return array( 'author'=>array(self::BELONGS_TO, 'User', 'authorID'), 'categories'=>array(self::MANY_MANY, 'Category', 'PostCategory(postID, categoryID)'), ); } }
     // posts 为自己命名的标志,在查询时候应用
     // post和user的关系是多对一,user has many post
     // 外键是 authorID
     // profile 为自己命名的标志,在查询时候应用
     // user和Profile的关系是多对一,user has one Profile 是 has many的变种
     // 外键是 ownerID
    class User extends CActiveRecord { public function relations() { return array( 'posts'=>array(self::HAS_MANY, 'Post', 'authorID'), 'profile'=>array(self::HAS_ONE, 'Profile', 'ownerID'), ); } }

3.  sql程序调用时候
    //因为没有调用之前定义的author,categories,查询结果不启用关联查询,不会消耗性能
    $post=Post::model()->findByPk(10);
    //当用到with()这个函数时候,它关联了author 所以查询结果中增加user表中的结果
    $posts=Post::model()->with('author')->findAll();
    //用到了三个命名标志,所以它关联三个表 user ,Category, PostCategory
    $posts=Post::model()->with('author','categories')->findAll();
    //因为有关联到user中的profile 所以目前关联的是 post ,user, category, postcategory,profile
    $posts=Post::model()->with(array( 'author'=>array( 'profile', 'posts'), 'categories'))->findAll();
   
    注意:当不设置relation的时候但仍然要操作left join 之类的操作。方法如下
      $sql = "select * from date left join post on post.id = date.id";
    $temp=Date::model()->dbConnection->createCommand($sql)->queryAll();
    用 Yii的AR时候不设置relation时候不能操作
    这样是错误的。他调用了Yii的 CActiveRecord类中的populateRecords方法,它会根据relation中的表字段重新排列一下,所以左连接的内容不会被显示
    Date::model()->findBySql("select * from date left join post on post.id = date.id");
----------------------------------------------------------------------------------------------------------------------------------------------------------
View 的应用
http://www.yiiframework.com/doc/guide/basics.view
1. 可以用render用来传值到view层
   $this->render('edit', array(
       'var1'=>$value1,
       'var2'=>$value2,
   ));
     当用这种形式时候
     通过调用 renderPartial() 可以不依赖布局而渲染视图.

2.  主文件的tpl在这里protected/views/layouts/main.php
    可以用这样的形式来定义头和尾文件
    ......header here......
  <?php echo $content; ?>
  ......footer here......

3. 应用组件CWidget
   <?php $this->beginWidget('path.to.WidgetClass'); ?>
  ...body content that may be captured by the widget...
  <?php $this->endWidget(); ?>
  
  或者不需要body的组件
  <?php $this->widget('path.to.WidgetClass'); ?>
  
  也可以通过传递值到组件中
  <?php
  $this->widget('CMaskedTextField',array(
      'mask'=>'99/99/9999'
  ));
  ?>
  
4.  系统视图
    当出现404这样的错误时候 protected/views/system 在这里的模版可以列出显示错误页面

--------------------------------------------------------------------------------
Path Alias and Namespace   路径假名
1.  应用YiiBase::getPathOfAlias() 会把system.web.CController 变成真正的物理路径 yii/framework/web/CController
   
    导入文件的方法,这样比include和require高效
    Yii::import('system.web.CController');
    这样可以导入一个目录的文件
    Yii::import('system.web.*');
2. import基于spl_autoload_extensions创建新对象,且比较快http://cn.php.net/spl_autoload
  ClassA.php
  <?php class ClassA { var $val = 'Hello from class "ClassA"'; } ?>
  ClassB.php
  <?php class ClassB { var $val = 'Hello from class "ClassB"'; } ?>
  ClassC.php
  <?php class ClassC { var $val = 'Hello from class "ClassC"'; } ?>
  ClassD.php
  <?php class ClassD { var $val = 'Hello from class "ClassD"'; } ?>
  ClassE.php
  <?php class ClassE { var $val = 'Hello from class "ClassE"'; } ?>
  
   1》spl_autoload_extensions('.php,.inc');
   // new priority: .php .inc
   for($n=65; $n<70; $n++) {
       $className = 'Class'.chr($n);
       spl_autoload($className);
       $ins = new $className;
       echo $ins->val.'<br>';
      //1.4 miliseconds
   }

  2》 Simple:
   <?php
   // default priority: .inc .php
   for($n=65; $n<70; $n++) {
       $className = 'Class'.chr($n);
       spl_autoload($className);
       $ins = new $className;
       echo $ins->val.'<br>';
   }
   // 4.2 miliseconds
   ?>

3. http://www.yiiframework.com/doc/guide/zh_cn/extension.integration
   用Yii::import 方法还可以嵌入第三方程序
   1》我们嵌入zend的Zend_Search_Lucene模块方法如下
       首先,假设protected是网站的主目录,我们提取Zend Framework的发布文件到protected/vendors目录。确认protected/vendors/Zend/Search/Lucene.php文件存在
      
   2》在一个controller类文件的开始写入如下语句
       Yii::import('application.vendors.*');
       require_once('Zend/Search/Lucene.php');
       在任何action中可以这样引用了
       $lucene=new Zend_Search_Lucene($pathOfIndex);
       $hits=$lucene->find(strtolower($keyword));
      
------------------------------------------------------------------------  
Conventions 相关协定
1.  URL 
    传统GET传输参数http://hostname/index.php?r=ControllerID/ActionID
    当用到CUrlManager这个组件时候(相关参考protected/config/main.php),url变成http://hostname/ControllerID/ActionID.html

--------------------------------------------------------------------
在controller文件中 设定默认显示的action
1.  public $defaultAction='login';  这样就可以显示默认的第一个action了

2.  action 也可以自由定义 跟controller一样
    http://www.yiiframework.com/doc/guide/zh_cn/basics.controller
    定义如下:
  class UpdateAction extends CAction
  {
      public function run()
      {
          // place the action logic here
      }
  }
  当在controller中调用此action时候。action类文件为protected/controllers/post/UpdateAction.php
  class PostController extends CController
  {
      public function actions()
      {
          return array(
              'edit'=>'application.controllers.post.UpdateAction',
          );
      }
  }
  
3.  public function actions() 单独的这个函数表名执行controller时候需要前期执行某些函数
    Filters preprocess/postprocess  都有可能被用到
  ---------------------------------------------

可以用YII的errorhandler

   if($this->_category === null)
   throw new CHttpException(500, 'The requested category does not exist.');

唉,帖子太长,只能这么发了
里面的一些例题可以在blog当中找到,里面也解释了blog的流程,个人认为比官方的流程详细而且好理解

转载于:https://www.cnblogs.com/DavidYan/articles/2032102.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值