thinkphp-许愿墙-3

用jquery写异步传递的时候,

首先要判断表单中的输入是否为空:
如果有多个输入项, 应该, 分别的, 一步一步的来判断是否为空, 而不是用 and / or来复合判断!
同时如果为空, 应该将它设为焦点. $('input[name= username]').focus();
而且, 每个if后如果 出错, 就要 return, 不要再往下判断执行了!

在think的模板html文件中, 的 "任意地方" --- head中, css中, script>中, body>中 都可以解析think的模板, 如{$assing_var} {U('handle')}等等.

在js 链接文件中, 如何获得 U()方法地址?

  • 首先不能直接在js外部链接文件中获得U() 方法地址,
  • 其次, 应该通过在模板文件中的 script脚本段落, 中获得 U方法 这个 "全局的" 链接 地址, 然后在js文件中使用.

在head头部的css文件,和 外部链接的js文件, 就像 " c/c++ 中 的 包含文件 # include 一样", 当它们解析 "展开"来后, 就好象他们是在同一目录位置的地方, 于是, 它们之间的内容 就在同一个文件, 同一个作用域 内, 相互之间 完全 相互可见"!!

注意, 对于分组项目, U(方法)不支持当前子项目的方法, 要写全: 把子分组项目也要写上:
var handleUrl = {:U('Index/Index/handle')}.

ajax和post异步请求的区别?

  1. 如果用ajax, 则所有内容都放在 {..., key: value}中,
  2. 如果用$.post, 则不用key:value形式, 而是 直接写 $.post(url, [data], [callback],[type]);
  3. post不支持 异步失败时的回调函数, 要支持失败时的回调函数, 请用 ajax
  4. 发送的数据中的 key 不要加引号, 对于value: 要根据具体的 "数据类型" 来决定是否加引号, 只有当值为字符串类型时, 才加上引号, 如果为数字, bool, 也可以是"javascript 变量和js函数"(js等变量可以出现在 任何地方)则不能加引号!!

判断页面是否是 经过ajax提交的? 使用 $this->isAjax(); 或者: if(!IS_AJAX) halt('页面不存在');

firebug, swarm 英[swɔːm] 美[swɔrm] n. 蜂群, 一大群, vt. 云集, 挤满.

定制thinkphp的错误页面?

  1. 错误页面, 可以直接写 if(!IS_AJAX) halt('页面不存在');

  2. 也可以写成 模板错误页面:
    配置项: 'TMPL_EXCEPTION_FILE' => './Public/Tpl/error.html' 注意配置文件中的./ 相对路径 是项目的入口文件index.php

  3. 要在 "模板错误页面中使用 halt('错误信息') 提交过来的错误信息, 要在error.html中使用:

  4. 特别注意的是 在定制的 模板错误页面, 都 完全 不能使用 模板标签, {$e['message']} 不会被解析! 只能使用原生的php语法.

  5. 要跳转回 首页页面, 可以使用 thinkphp的常量: _ _ APP_ _.

  6. js中, 一个浏览器 window对象( 不要大写W), 是指浏览器的整个 窗口, 包括浏览器的标题, "地址栏(这个最重要, js主要是针对这个js对象操作的"), 显示的"客户区"

  7. 要写浏览器地址自动跳转:

       <script type="text/javascript">
            window.onload = function () {
                setTimeout(function(){
                    window.location.href = '<?php echo __APP__;  ?>';
                }, 5000);
            }
       </script> 
    

===================================================

thinkphp的结构 要常常去 通过查看 阅读 Think的源码, 会了解很多很多重要的东西!

think的大小是4~5MB

其ThinkPHP.php是框架的入口文件, 主要是定义一些 think 的 系统常量, 如: THINK_PATH等等.

然后, 是common文件夹, 其下有: common.php是基础函数库, functions.php是标准模式的公共函数库, runtime.php是运行时库.
//其中这些里面的函数, 是全局函数,像所有的 "单字母" 函数都是, 所以它们是不需要通过类对象来调用的!!

然后, 是Conf文件夹, 是系统配置文件, 是alias.php, convention.php等

然后, 是Extend文件夹, 是一些扩展.
然后, 是Lang文件夹, 包括en_us.php 和 zh_cn.php, 是返回 return array(.... )数组供其他文件调用! 主要是 一些键的中文/英文名称.

然后是, Lib文件夹, 这个是整个thinkphp的核心. 包括 Behavior文件夹 Lib文件夹 Driver文件夹 Template文件夹

  • Behavior文件夹(定义各种行为类),

  • Core件夹(核心类和基类, Behavior目录中的类都是从这个目录中的abstract class Behavior抽象基类派生的),

  • Driver文件夹(定义驱动器类,包括Cache驱动器,Db驱动器, TagLib驱动器),

  • Template文件夹(包括TagLib标签库解析类和ThinkTemplate模板引擎类).

其中, Core文件夹包括: 整个框架的核心类:
+ Action.class.php 是控制器的抽象基类: abstract class Action{..}, 里面有很多public (注意访问权限)protected成员函数.

        + App.class.php 是应用程序类. 由它将整个程序实例化. 成员函数全部都是静态公共函数: static public init,  exec, run,...在这个里面实现程序实例化!
        + abstract class Behavior是行为类的 抽象基类.

        +View.class.php视图类的基类
            view中的display()是调用自身的 fetch()函数,和 render()函数来的...
                里面有默认的$templateFile....
    /**
     * 运行应用实例 入口文件使用的快捷方法
     * @access public
     * @return void
     */
    static public function run() {
        // 项目初始化标签
        tag('app_init');
        App::init();
        // 项目开始标签
        tag('app_begin');
        // Session初始化
        session(C('SESSION_OPTIONS'));
        // 记录应用初始化时间
        G('initTime');
        App::exec();
        // 项目结束标签
        tag('app_end');
        return ;
    }

最后, 是Tpl文件夹, 包括一些系统定义的模板文件, 如 显示的首页 thinkphp欢迎页面: default_index.tpl dispatch_jump.tpl路由分发跳转, page_trace.tpl页面追踪

===================================================

一个称为一个php块, 一个类的定义, 必须在一个php块内完成, 下面的定义是无效的:

<?php
class foo{
}
?>
<?php
public function foo(){
....
}
?>

在php中, 一个变量只能有一个美元符合$: 所以, \(a->b是正确的, 表示a这个对象中的b成员变量, 这个\)符合作用于整个a->b, 相当于:\((a->b) , 如果写成\)a->\(b就是两个变量\)a, 和$b, 它们中间用->连接, 就在语法上是错误的: 两个变量之间是不能用 - 来连接的. 除非 \(b='???', 而???刚好是\)a对象的成员变量, 这个相当于变量替换.

$this 被叫做 伪变量...

===================================================

如何替换网页中的表情? replace_phiz()函数的写法?

表情, phiz [fiz] 不是[fizi], 表示网页中的表情 "笑脸, 抓狂..."等等. $phiz = array(....);

// 在common.php通用文件中, 不能使用 相对根路径, 而是要使用 __ROOT__等全局路径
function replace_phiz($content){
    //正则匹配出phiz放到$matches
    preg_match_all('/\[.*?\]/is', $content, $arr);
    if($arr[0]){
        $phiz = F('phiz','','./Data/');
        foreach($arr[0] as $v){
            foreach($phiz as $k=>$val){
                if($v == '['.$val.']') {   /* $v是[抱抱], 而$val是 "抱抱",所以要加上两边的 中括号.

                   $content = str_replace($v, '<img src="'.__ROOT__.'/Public/Images/Phiz/'.$k.'.gif" />', $content);
                   
                     break;  // 视频教程上是在 if 语句的下面一句写 continue, 但是我认为这里应该是break!

                     }
                
             }
        }

    }
}

==================================================


Model类的public function data等方法, 返回的是$this, 所以可以应用链式调用...

\(GLOBALS跟\)_POST, $_GET一样, 是所谓的"超全局变量", 也只是在 同一个 文件 域内有效, 不能跨文件生效, 只是说, 在同一文件的函数内部, 不用声明global就可以使用的变量.


var_dump和var_export的区别?

var_dump默认就会输出, 而且,如果带多个参数, 就是输出这多个参数的 "类型(值)"格式.
var_export默认不会输出, 而且 当第2 个参数为true时, var_export返回的 是 合法的php 代码, 这时, 这个代码string字符串, 就可以直接写到文件中去.

写文件的两种方式?

  • 一是, 用传统的 : fopen(), 然后写fwrite(), 最后关闭fclose().

  • 二是, 用快捷的函数: file_put_contents(string $filename, string $data); //这个函数就等于执行了上面的三个函数! 这个data可以是字符串, 也可以是数组...

  • 最重要的是, 要记住: 当要往文件中写入 php代码时, 一定要记得写上: ?php .... ?> , 因为你的php代码不可能直接就放在 甩在文件里, 而且变量的输出, 不能直接变量,(因为该变量会被作为代码 被执行...而出错), 而是要把变量通过 var_export($变量)来转换成字符串相连接, 如:

      ```
          $data = '<?php return '. var_export($phiz, true). ';?>';
          file_put_contents('./Data/phiz.php', $data);
    
      ```
    

从文件中读取内容, 如果 该文件是php文件, 那么就不能用 file_get_contents($filename) 这个函数, 因为这个函数在读取php文件的时候, 遇到{?php...?>的时候 会出错, 要用 $phiz = include './Data/phiz.php'; 这样的方式!!

这也就明白了之前说的: include是包含文件, 同时它还会执行 文件, 当这个文件是php文件的时候, 它会解析其中的内容: 比如这个文件是

<?php return array(....);
?>

那么include后, 它就真的会得到一个数组.

=====================================================
主要靠细心体会, 键位的移动是很细微, 很细微,很微妙的, 6789食指和中指稍向左移, 无名指则竖直向上, 小指则平行斜向上移动(分别管两个).[p略微向左移动一点, [, 略微靠右一点, ]又略微靠右一点,\最大. 要坚决杜绝用无名指去操作退格键.

echo只能打印简单变量, 不能打印输出 "数组" 当echo $array时, 只会{输出 Array}. 要用dump()等函数来打印数组!

===================================================

thinkphp 的F()函数: 快速的 "写入数组" 或者 "读取文件".

默认的是一个缓存, 实际上可以用来 读 和 写 数组.

/**
 * 快速文件数据   "读取"  和 "保存(写入)  针对简单类型 数据  字符串、"数组" 
 * @param string $name 缓存名称
 * @param mixed $value 缓存值
 * @param string $path 缓存路径
 * @return mixed
 */

// $name是缓存文件名, 不包括扩展名;
// $value: 在写入数组的时候, 是数组$array的值, 在要读文件的时候, 这个$value=''为空;
// $path 是缓存文件保存的路径, 当不存在时, 函数会去自动创建

function F($name, $value='', $path=DATA_PATH) {
    static $_cache  = array();
    !!!!    $filename       = $path . $name . '.php'; // 默认的文件是php, $path要带上 "/".
    // .....

    return $value;  // return 会返回缓存的文件内容, 也就是说, 可以获得, 读取文件内容.
}

比如, 要 写入 并读出 表情数组: 
    F('phiz', $phiz, './Data/')'              // 写入$phiz;
    $phiz2 = F('phiz', '', './Data/');        // 读出文件内容.

===================================

php中, 字符串和变量相连, 或者说字符串中包含变量的情况下, "高手"的用法: 一律是 用单引号, 然后用点号 与变量 相连. 而基本上没有用双引号包含替换的.

为什么php中的 字符串要用单引号? 本来双引号和单引号是 基本相同的(除开变量替换外). 但是, 字符串用单引号, 这样就便于写html/css中的属性的时候, 用双引号括起来: var str='<html attr="some_attr"'; var str2 = 'css: body{color: "red"; } ';

think或原生的php的ajaxReturn返回, 都一定要 指明 返回数据的 $data 的['status'] =0,或=1, 这样便于 js客户端来判断 ajax是否成功, 以及js中的 回调函数的处理...

要在字符串中间, "嵌入"变量的方法是: 在嵌入的地方, 先写上: '+ +' , 然后再在两个加号之间放入变量: 'abcd' ==> 'ab'+ $var +'cd'

在ajax中, 当客户端 需要 某个服务器端变量的时候, 就在服务器端把这个变量 封装在要返回的数据data中!!!

posted @ 2016-03-22 16:08  noitanym  阅读(375)  评论(0编辑  收藏  举报