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异步请求的区别?
- 如果用ajax, 则所有内容都放在 {..., key: value}中,
- 如果用$.post, 则不用key:value形式, 而是 直接写 $.post(url, [data], [callback],[type]);
- post不支持 异步失败时的回调函数, 要支持失败时的回调函数, 请用 ajax
-
发送的数据中的 key 不要加引号, 对于value: 要根据具体的 "数据类型" 来决定是否加引号, 只有当值为字符串类型时, 才加上引号, 如果为数字, bool, 也可以是"javascript 变量和js函数"(js等变量可以出现在 任何地方)则不能加引号!!
判断页面是否是 经过ajax提交的? 使用 $this->isAjax(); 或者: if(!IS_AJAX) halt('页面不存在');
firebug, swarm 英[swɔːm] 美[swɔrm] n. 蜂群, 一大群, vt. 云集, 挤满.
定制thinkphp的错误页面?
-
错误页面, 可以直接写 if(!IS_AJAX) halt('页面不存在');
-
也可以写成 模板错误页面:
配置项: 'TMPL_EXCEPTION_FILE' => './Public/Tpl/error.html' 注意配置文件中的./ 相对路径 是项目的入口文件index.php -
要在 "模板错误页面中使用 halt('错误信息') 提交过来的错误信息, 要在error.html中使用:
-
特别注意的是 在定制的 模板错误页面, 都 完全 不能使用 模板标签, {$e['message']} 不会被解析! 只能使用原生的php语法.
-
要跳转回 首页页面, 可以使用 thinkphp的常量: _ _ APP_ _.
-
js中, 一个浏览器 window对象( 不要大写W), 是指浏览器的整个 窗口, 包括浏览器的标题, "地址栏(这个最重要, js主要是针对这个js对象操作的"), 显示的"客户区"
-
要写浏览器地址自动跳转:
<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/'); // 读出文件内容.
===================================