new Image(宽度,高度) $(image).attr('src', ...).load(function(){....})
load表示浏览器从服务器下载(装载)对象完成, 这个load方法很重要, 可以由浏览器自动判断一个对象, 或者一个节点是否装载、下载完成了new Image的时候, 内存缓存中 的图像 如何装载进来, 要加入到文档的某个节点中来才能 生根,才能显示??
使用 ajax事件:浏览器系统会自动检查 ajax的(全局)开始和结束, 以及每一次ajax请求的开始和结束,要把这些ajax事件注册到你需要显示和隐藏的节点上,这个通常是div或者下面的 图片?
显示图片的jquery方法 通常是用show, 而隐藏的时候,需要选择恰当的方法了:
可以用hide
但是, 如果你觉得hide消失得太快的话, 就要用fadeout或者用 animate的方式。 animate更灵活,它支持两个参数,一个是效果的js对象, 另一个是过渡的时间,多少毫秒(在jquery的效果函数中, 0 表示马上显示或隐藏)
也可以用 一个非标准的css样式:opacity: 透明度,等于0表示隐藏, 1 表示显示, 这个非标准的css样式,可以由jquery来封装隐藏底层差异
jquery可以缓存从服务器交互取得的数据, 这样以后如果需要再次使用这些数据的时候,就直接用本地缓存,而不必再次从服务器上去取数据,这样反应会更快。 使用的函数是 data. data('缓存数据的名称',缓存数据内容data) 以及取数据的方法是:data(‘缓存名称');
要让图片和文字同一行显示(而且高度一致), 对图片使用css的float样式??
php缓存技术, (csdn thinkphp缓存技术 think2me)
tp以及 普通浏览器是如何判断 一个请求是否是 ajax请求的?
:是通过 服务器变量 $_SERVER 来判断的:
- tp是如何判断ajax提交的?
是在文件Library/Think/App.class.php中定义的,方法是通过
- 判断 $_SERVER变量中是否有 'HTTP_X_REQUESTED_WITH' 这个元素, 且这个元素值等于'xmlhttprequest'
- 或者第二种方法是, 判断 $_POST或 $_GET变量中, 是否有 'ajax'这个元素.其中的ajax索引名称,是由 convention.php中的var_ajax_submit来配置的.
即:
define('IS_AJAX',
(
(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest')|| !empty(($_POST[C('VAR_AJAX_SUBMIT')])) || !empty(($_GET[C('VAR_AJAX_SUBMIT')]))
)?true:false
);
- 关于tp的ajax请求处理函数?
首先, 要判断 当前请求是否是 ajax请求,即
if(!IS_AJAX) {$this->error('错误提示'); }
然后, 才是 对 ajax 提交的处理,通常步骤是: 第一, 逻辑执行, 准备好ajax 返回的数据data: 第二, data通常是自己 组装的数组, 这个数组 通常应该包含(当然具体是由你自己来决定的) 执行状态status (根据不同的情形返回ok 或false), 具体的处理值; 第三, 调用 控制器的 ajaxReturn方法:
$this -> ajaxReturn($data);
这里返回的是数组, 在前端的时候, 就已经被 jquery的 post或 get请求转换成json 格式的 js对象了, 就可以直接使用 js对象的点语法 或 中括号语法 了 ???
- 反射类的价值. tp框架执行过程和反射调用?
mysqli中的i是improvement改进的意思
mysqli是用面向对象的方法写的, 而mysql是用c面向过程写的. 所以, mysql中的函数都有前缀mysql_, 而mysqli中的对象中的成员方法则没有这个前缀.
mysqli使用的是 持久性性 连接
一个简单的例子:
$db = new mysqli('localhost', 'root', '123', 'testdb');
$res = $db -> query('select * from tablename');
$row = $res -> fetch_assoc();
echo $row['id'];
注意, mysqli中的 fetch_assoc 只是取得 结果集的 第一行数据 作为 一个 一维数组.
tp中的 ajaxReturn的用法, 要了解这个函数 只需要看一看它的写法就好了:
protected function ajaxReturn($data,$type='',$json_option=0) {
if(empty($type)) $type = C('DEFAULT_AJAX_RETURN');
switch (strtoupper($type)){
case 'JSON' :
// 返回JSON数据格式到客户端 包含状态信息
header('Content-Type:application/json; charset=utf-8');
exit(json_encode($data,$json_option));
首先, 它是一个 protected 方法, 只能在控制器的 内部被调用;
其次, 要注意 这个函数 没有 返回值! 它的目的, 只是对要 通过ajax返回 的数据 $data 进行 一次 "格式转换" 而已. 其实, 你要处理客户端的ajax请求, 完全 可以 不用到 这个 函数. 因为, 在 query的 $.get或 $.post的参数中, 你指定了 处理ajax请求的 服务器端方法了, 比如ajaxHandler, 那么 你直接在控制器的 ajaxHandler方法中 进行业务处理, 组装好 要返回的 数据(通常是数组$data), 然后你直接echo 这个数据就好了, 这个数据 就可以在 前端被 获取到. 或者: 在 echo之前, 你自己手动的 调用一次 json_encode, 将数组转换为 json形式/格式 的字符串string.
使用 jsonReturn只是 对 ajaxHandler中 要返回的数组 $data 进行了一次 "格式"包装而已 : 首先在头部进行了声明:header('content-type: application/json; charset=utf8'); 然后 exit(json_encode($data, $json_option); 如果是 其他非json格式, 则做相应的其他处理
json_encode($value, $option); 其中的option是常量, 主要是 指示 要转换的数据$value中 的 一些特殊符号 该如何处理. json_encode返回值是一个 string 或false.
注意 $.get或 $.post 接收到 json格式 返回的数据, 已经就是 一个 js对象了.
js对象 属性的 调用方法 !important
js的对象, 可以用 大括号 来表示, 因此, 这个大括号{ }可以看做是一个 集合! 可以将js对象, 可以看作是 很多个 属性的 集合; 也可以看做是 多个 key: value 键值对的 集合.
所以, js的对象 有多种 aliases 别名: 在用法和理解上, 就等同于 关联数组, 字典, 映射, 哈希表, 查询表等等, 都可以.
所以, js的对象 的属性, 在 引用方法上, 就有 两种方法,
一种是用 点号(点符号)来引用. 一种是用 中括号标记 来引用
但是要注意的是, 如果 使用 使用点号来引用的话, 后面的 属性名 必须是 一个 合法的 javascript标记: 如果不是合法的js标记,比如 是以"空格, 连字符- , 或数字 开头的"非标准的 javascript标记, 则只能使用 关联数组 的方式: 即用中括号的方式 来 引用.
所以 **有时候, 我们可能不知道, 不确定 属性名是否是 合法的js标记, 推荐 今后 不管在什么时候, 都使用 中括号标记 来 引用 js对象的属性. 因为在中括号中的 属性名, 不管原来是什么 数字/空格/还是对象等等, 都 会被 自动转换成 合法的js标记 字符串! 是字符串. **
js对象的属性和方法 其实 并没有 明显的区别, 方法在这里 只是 "可以调用"的属性 而已.
另外: js中的 eval虽然功能强大, 但是 还是建议 "在任何时候都应该 避免使用"这是 MDN上 权威 站点上的原话.
### 解答一个 长期的 很重大的 一个疑点: 在模板html文件中的任何地方, 包括head, title甚至是 script的脚本中, 都是 可以使用 控制器传递 过来的 模板变量 和 模板函数(比如 U函数)的!
- 但是, 要注意, 在模板中使用的 这些 变量 和函数 转换后的 内容, 如果原来的内容 是 "字符串", 则 在模板中 转化后, 是不会带 引号的! 这个在某些 场合 是会出错的. 特别是 在 script 脚本中, 使用 这些模板变量和模板函数的时候, 更容易 出错!
- 所以, 如果确信 你要 用的是一个 字符串, 则一定要在 这些模板变量 或 模板函数 两边 加上 引号:
<script>
alert({$ok}); //这里 不加引号的话, 不会弹出, 因为会报错: {$ok} 转换后的 变量... undefined.
alert({:U()}); // 这里必须加上 引号, 否则会 报错: 正则表达式...
</script>
php这种语言 本身提供了 json_encode 和 json_decode "全局函数", 将 一个 php对象 转换成 一个 json格式/形式 的 字符串, 或将 一个 json格式/形式 的 字符串 转化成一个 php的对象.
如果是输入 password 字段的 表单, 如果你的应用 非常重要,比如有资金 交易的话, 就必须部署 https协议, 否则 : password fields present on an insecure (http://) page. This is a security risk that allows user login credentials to be stolen.
如何部署 https?
前端框架和 jquery就使用 bootstrap. 因为bs提供了统一的界面和组件ui. 而且bs正好又是建立在 jquery上的. 所以, 就这么定了, js框架用jq, ui框架用bootstrap
实作: 用cookie 模拟网站登陆, 显式权限, 跳转, 退出, 时间设置为一周, 多个页面跟踪用户的cookie.
php中跳转, 除了用框架的 redirect, success, error等 "封装"方法, 还可以使用 header方法: 即 header('location: jumpto.php'); 要注意, 只要发生 跳转后, 执行header中的 跳转后, 其后面的代码就不会再继续执行了, 类似于 die, exit等.
在原生的 php连接/登陆数据库, 判断是否成功, 方法是 : 判断 sql 查询 语句执行结果 $result的 属性 num_rows 是否大于等于1.
其中 mysqli 的 fetch_assoc是获取结果集的第一行数据.
- 在cookie中, 判断是否是有效的 登录用户, 如果只是返回的id, 那么, 保持的cookie值 时, 就可以 直接 从post去获取. 而不是再去数据库查询得到.因为 post中就已经存储了用户信息了.
网站登录是 用 "登录" login, logout, 注册是: sign(sign up) 跟 "登陆"没有任何关系.
如果是自己写的 站点页面, 没有使用框架, 那么 公共的 通用的内容, 就放在 common.inc.php文件中, 使用include机制 来包含. 比如数据库连接的代码.
在自己写的页面, 判断 要登录的用户 在后台数据库中 是否存在, 就只是查询 用户的名称(where子句中) 所对应的id是否 存在就好了. 不必查询更多的额外字段, 比如: select id from user_table where name= name_in_post;
html的表格, 也有 caption 属性, 类似于 html的title 标签.
一定要写 img标签的 alt属性(这个是在图片 不能显示/被禁用, 未加载进来/网速慢时 显示的 关于图片本身的描述文字信息) , 而img的 title属性 则是 提供 关于这个图片的 其他的 辅助性的 /说明用途等 的文字信息, 即: alt和 title的 语义 是不同的.
在php代码中, 即使是 原生的 php代码中, 你可以将 变量 $var放在 大括号中, 即{$var}, 类似于 tp的写法. !注意不能是 将 大括号放在 $ 后, 比如: ${var}这样是不行的, 这个是 bash的写法. ! 但是 必须将{$var} 放在引号中, 否则会出错. 即必须是 "{$var}" 而且, 当 使用 大括号后, 里面的内容就根引号外面的内容 隔离了. 即这个时候, 你在 里面任意的使用 引号, 都是可以的, 都不会引起 引号的嵌套问题:
即 "{$post["name"]}"
的写法是没有问题的.
在设计mysql数据库表/中的 用户是否具有 某种 权限时, 可以使用 数字 0/1 来表示 "没有/有"对应的权限就好了. 这时候,这个数据类型可以设为 tinyint. 默认的 tinyint是 tinyint(4) 表示显示时, 最多显示4位数字.
mariadb的 整数类型, 有5种: tinyint, smallint , mediumint, int, bigint(在写法上 ,都是小写, 中间没有分隔, 是一个单词). 大小依次是 1个字节(0-255), 2个字节, 3个字节, 4个字节和 8个字节.
mariadb的zerofill?
zerofill是一种 字段的 属性描述specification, 如同 unsigned. 它 而不是系统的 全局变量, 所以 你用 `show variables like '%zerofill%' 会显示 empty.
比如 一个字段 用 zerofill描述:
pay_type tinyint(4) unsigned zerofill NOT NULL DEFAULT '0000' COMMENT '支付方式:1卷皮系统 2支付宝 3银联 4财付通 ……',
这是一个 较好的例子, 在实际生产系统中, 定义字段的时候, 要写完整, 比如: field_name tinyint(4) unsigned zerofill/字段数据类型属性 not null/是否为空 default '0000' comment '...',
数字类型括号中的数字, 根varchar(10)中的数字 其作用是不同的! 前者只是表示 显示 宽度. 跟数据的存储个数没关系. 后者就真的表示 允许存储的最大字符数. 注意 在mysql中 , 字符是不分("高低贵贱")的:即 一个中文字符, 英文字母, 数字, 都表示的是mysql中的 一个字符. 即varchar(10)既可以存放10个英文字母, 也可以存放10个中文汉字.
要注意, 如果你插入的数据中, varchar(10)字段的内容 超过了 10, 它会自动 给你 截断的 . 即最多给你保留 10 个 mysql字符.
mariadb 修改列, 有三种情况, 使用不同的谓词: 1. alter column column_name ... 这个是用来设置或删除默认值的; 2. change column old_name new_col_name column_definition 这个change是用来修改 列的名称的; 3. modify column col_name col_definition...
关于session和cookie?
服务器向客户端发送信息,依次是 状态信息,头信息,实际内容,因此,在setcookie ,header等函数之前, 不能有实际的内容输出(因为这时候的输出内容是不能被识别的,并且会引起头部信息的错误。
你可以查看cookie文本文件, 当然就可以修改这个文件的内容. 每个cookie 是$_COOKIE的一个元素.
同一个网站的所有cookie都是放在同一个文本文件中的. 同时,你也可以设置单独的 一个cookie为一个数组.
当全部cookie过期后(删除), 该cookie文件就 不存在了.cookie更持久, 但容易被修改, 可以通过加密的方式增强cookie的安全性
cookie可以看做是商家给顾客发放的 会员卡, 自己保持, 然后购物时自己主动出示会员卡.session更安全保存在服务器端. 但有效时间短, 一次访问网站页面关闭后,就失效. 但是session的id是保存在客户端的cookie中的.
会话控制,是在多个页面中跟踪标记同一个用户, 其中的session和cookie是网站开发中不可或缺的。
网站请求的http机制, 是无状态的, 就是指 即使 是 同一个用户 访问同一个网站的 两个 页面(即使是被看做超链接跳转)(甚至是同一个页面的刷新), 会被看做是 两个独立的请求,第一个页面的信息, 请求变量, 设置等不会被带到 第二个页面(或者刷新后的页面), 因此就需要一种信息保持机制, 就像粘贴板, 记事本一样, 当用户第一次登录时,把这些登录信息 记下来, 然后 当这个用户 在这个网站中 的任意一个页面时, 这些用户信息都可以被公共的使用.保持信息, 除了用cookie和session外, 还能用其他手段吗? 不能! 因为: 1. get和post只能在两个页面之间 传递数据, 而 2. 文件或数据库的保持或持久化则是所有 用户都可以被使用. 显然不行. 登录等信息 只能被 同一个用户使用.
session要手动的启动, 但是 tp已经在框架启动时, 帮你启动了.
要注意的是, cookie不是实时生效的, 第一次写入后, 要等到第二次访问时才能生效. 因此,要想实时生效, 可以在 form表单 提交的处理php文件中, 输出一段script, 在提交时就自动提前刷新一次:
echo '<script> window.location.href = "..." </script>'
(即刷新不只是refresh, 有很多方法都可以实现).
什么事get方式访问, 什么是post?
凡是通过 地址栏输入url访问, 或者是 通过 超链接a的 get传参跳转的, 都是get访问/get请求; 只有通过表单 post提交的,才是post请求.(当然form也可以通过get请求传递数据, 但是一般不会).
关于php的鼠标/按钮操作, 不要只固定一种思路,以为只有 button, 只有onclick, 还有新的思维方式, 就是使用 超链接! 通过超链接a的操作, 有一个好处是, 可以 在php文件中, 通过 $_GET来获取数据并进行逻辑处理.
也就是说,如果你想 在 前端, 通过js 来处理动作,就可以使用 button, 使用onclick
但是, 如果你想在 后台的 php文件中, 获取数据并处理的话, 就使用 a超链接...
当表单所在页面 被刷新的时候, 表单就会被重新载入(即重新从服务器上下载该页面/或者从缓存加载). 这时候, 原来填写的内容就会消失了, 回到空的初始页面状态.
页面的刷新(重新载入), 除了按f5外, 还有表单的再次提交, js脚本的/ php的header函数: location.href
如果表单为空提交, post对应元素 是空 还是 isset???
form表单的action是什么意思?
是动作, 是操作的意思. 即: 当表单提交时, 将执行什么操作, 这个操作, 正好是 mvc框架中 action操作的意思,
注意, 如果action="" 就表示提交到当前页面进行处理. 在很多demo中就这样
tp框架自动 已经对session进行了启动, 在convention.php中, 有 SESSION_AUTO_START => true
, 所以可以在 文件中直接使用session的函数了.
session 有缓存的, 设置, 获取等函数,
要删除某一个session, 即session数组中的某一个元素, 使用 session('name', null);
如果要删除所有的session 元素, 直接用 session(null)
要删除session文件本身, 销毁session这个数据, 用session(destroy);
tp模板中的 表单action, 图片src, 链接href等的地址, 既可以用 U函数来写, 也可以直接用 "/模块/控制器/操作" 的方式来写? 要注意的是, 地址必须从 模块开始写起, 模块/控制器是不能省略 的, 模块前面的 斜杠/ 是可以省略的. 因为默认的使用pathinfo地址模式, 用斜杠的方式 就能自动解析到跳转地址的.
isset是判断变量是否设置过, 在所有声明或定义变量的语句中, 只有 明确的说 $var=null时 isset返回false, 其他都会返回true.
但是isset只能接收 原始的 简单类型的变量, 不能接收 一个函数的返回值来 判断.
use ... on 把...用在 什么上面. 比如: cannot use isset() on the result of a function call.
因此, 要判断一个函数的返回值 是否是 isset, 是不能用 isset(func())的, 要用 null !== func() instead. 比如:
echo (isset(I('post.name')))?'设置了name':'没有设置';
这样是错误的, 应该:echo (null!== I('post.name'):'设置':'没有设置'
或者直接用 简单变量,不要用 I函数.echo isset($_POST['name'])? '设置': '没有设置';
**特别注意, 判断一个变量是否设置, 最好不要用I函数, 因为 I函数有 副作用, 它会设置 一个默认值, 所以即使在 原来的 $_Post变量中没有判断的索引变量, 也总是返回true. 所以 要用 $_POST['flag'] 本身原生的 数组来判断. **
在前台页面布局的时候, 使用 frameset和 include的区别是: 前者的各个页面之间是 分离的,分隔的, 独立的; 所以frameset的各个页面中, 可以对应的 具有/ 可以执行/ 各自的控制器和操作, 在自己的操作方法中传递参数, 是可以收到的, 而include被包含时, 被包含的文件虽然是作为一个独立的文件存在, 但是并不 强制 要求 被包含的文件 具有 对应的 控制器和操作, 因此, 在被included的文件中,要使用 后台变量/模板变量如{$include} 的话, 必须由主文件中(即当前控制器的当前操作中) 给模板变量 赋值.
关于tp框架中, include标签的使用
include的属性file, 可以有两种指定方法,一是使用 模板表达式 Home@Public(公共控制器)/header(操作), 但是这个模板表达式中的控制器和操作也只是一种形式(相当于目录结构)并不强制要求真的有 那样的控制器和操作; 另一种方式是使用 模板文件 (要从./Application...开始指定绝对路径)
再就是 被包含的模板文件不管用 模板表达式还是 模板文件的方式, 都必须是 *.html结尾的文件, 可能是在 "模板引擎设置" 中进行了限定
TMPL_template_suffix => '.html' // 默认的模板文件后缀
也就是说, 只有 .html 才被认为是模板文件, 才能被 include所用.还可以由 include标签中, 给被包含文件传参, 要注意这个传参,不是 控制器/操作的传递变量, 在被包含文件中, 使用 中括号 方式 引用include的传参: [这里是include的传参]
get_defined_constants是php语言本身提供的一个全局函数, 是: 将分组显示 系统中定义的所有常量 : 包括php核心定义的常量, php扩展定义的常量 和 用户自己的常量, 比如tp框架定义的常量就放在 'user'分类中. 这个函数有一个 可选参数: categorize? 表示是否对所有的常量进行分类, 默认是false, 所以, 要分类的话, 必须显式的传递 true参数: get_defined_constants(true);
tp模板中 如果要将 模板常量和字符串 相连接/ 拼接, 怎么写??
div和table从语义上来讲: div是内容分块; table是表格, 在语义上就是用来 表达 二维数据的
在显示方法上的区别: div是即载即显示, 而table是加载完全后 才显示.
在布局上, 先期使用table, 后来使用 table+div(所以 会看到很多 在 表格的列 td中使用 div的), 后来完全使用div.
div+css虽然灵活, 但是也会在一些结构上引起 困惑和带来复杂度... 而css的兼容性并不太好. 而且外部引用css文件, 对后台web服务器的压力很大??
所以: 如果是一个中小型的 web应用, (或是主要给一个公司使用的)网站, 使用table来布局是合适的, 而且开发效率要快得多. 或者是 使用 table+div(表格+div结合css)是合适的.
使用frameset时的几个注意点:
- frame本身是关闭标签, 所以 不要用
<frame...> </frame>
的方式 - 嵌套frameset时, 不要将frameset放在frame中
- 注意frame, 和 frameset标签 各自的 属性有哪些, 不要 搞混淆了. 总之, frameset是定义 框架和框架之间的属性. 而frame 是定义 本框架内的属性 比如: marginwidth, marginheight, src, name等是 用来定义frame帧本身的属性
- 其中,frame的属性 src和name是 必须的属性, name是用来 链接的, 即使不用也要写.
- **最容易出错的地方, (对我来说)就是 rows, cols中的分隔 要用逗号隔开, 即: row="300, * "不能省略逗号, 否则框架分割会无效 **
- frameborder=0/1 只能设置为0或1, 表示是否显示或不显示边框. bordercolor设置边框颜色, 但是一般都不会去设置这些属性.
<frameset rows="100, *" frameborder="1" framespacing="0" >
<frame src="header.php" />
<frameset cols="140, *" >
<frame src="navi.php" name="navi" scrolling="no" noresize="noresize" >
<frame src="content.php" name="content" marginwidth="50" marginheight="10" scrolling="yes" noresize="noresize" />
</frameset>
</frameset>
在导航页面中
<body>
<div>导航</div>
<ul>
<li><a href="Home/Index/dz" target="content">dz</a></li> // 这里每个链接项, 链接的是各自对应的文件内容.
<li><a href="Home/Index/jz" target="content">jz</a></li> // 最重要的是, 这里的target正是右边主div内容框架的name.
<li><a href="Home/Index/xq" target="content">xq</a></li>
<li><a href="Home/Index/xx" target="content">xx</a></li>
</ul>
</body>
模板中tmpl的常量, 已经被behavior行为替换了, 替换对应 的控制器等常量了, 所以在模板中使用这些常量时, (而且模板中, 只能使用 模板常量, 而不能使用 只在php页面中使用的常量), 不能再用 $Think.const....常量名 来输出了. 这样就多了, 重复了....
控制浏览器可以缩放的最小宽度和高度的js代码:
window.onresize=function(){
if(document.body.clientHeight<700){
alert('禁止缩放');
window.resizeTo(document.body.clientHeight, 300);
}
} 宽度的设置同理.
??jquery实现, 根据浏览器窗口大小, 自动缩放图片的方法?
浏览器本身就有一个 最大/最小的缩放值 (吗?)
php的魔术方法, 可以实现在类的外部 访问它的私有属性, 是 走 __get($name); 如果在 类实例化的时候, 设置了私有属性的值, 是走的 __set魔术方法.
分页类, 不同的分页类, 在基本原理, 使用方法上都是 大同小异的, 在 最下面的 分页字符串 完全可以 自定义 符合自己需要的 更复杂的html代码..
为什么要使用框架, 框架的 开发速度更快, 你只需要专注于 业务/逻辑的实现, 其他基础结构已经帮你写好了(即使你自己从0开始写, 也差不多就是框架的这些内容, 但是还不一定写得这么好). 而且框架 更稳定/更可靠(就像给你做的厂房 电路不会扯拐, 管道不会堵塞, 不会时不时的停水停电), 更安全(病毒是由程序自动扫描你的代码) 通常不会引起厂房崩塌, 漏水漏电.
现在开发网站的分辨率一般设置为多少?
现在大多数人的电脑分辨率都不会小于1024768, (实际上更多的宽屏设置为 1600900) 所以网页的宽度设置为 1000, 1100 都是可以的, 然后两端由margin自动留白.
- 网页设计的宽度最好是固定值,比如1100px、1000px, 而高度自适应(不规定高度就好)。 这样能保证页面在不同设备分辨率下都能正常
表现。 最好是加上 min-width的css属性, 能保证页面正常。
注意div的width设为 50%, 不是指显示屏幕的50%, 而是指当前浏览器 窗口的 宽度的50%。
对于一般的前台页面, 通常的设计是: 头部或底部的宽度是100%满屏的, 中间内容是固定宽度、居中 的。
- Think\Upload 类 upload方法,返回值是一个 二维数组, 类似于 mysql查询返回的结果集。 这个二维数组的每一个 元素, 包含的是关
于 一个 上传文件的相关信息,又是一个数组。 而 uploadOne 是只上传一个文件, 因此返回的结果 就只是 关于这一个 上传文件的相关信
息 它就是一个一维数组。
事实上, 返回的信息, $file确实就是 对 原生的 超全局变量 $_FILES数组 的一个封装。
- tp允许在输出变量的时候, 对变量进行处理,比如我要输出 {$create_time} 的值, 但是我并不想直接输出, 我还想做一下 “输出时间
的格式换”处理, 因此 如果要在后台做这些 “样式”的处理并不科学, 后台只是输出原始数据, 至于具体的 表现形式,比如ymd, Y_M/d
等等, 这个还是交给前端 模板去处理。 所以 tp为了满足这样的目的, 提供了模板变量的函数处理,默认值处理等等,比如:
{$create_time|date='Y-m-d', ###}
- tp中的NOW_TIME常量, 是在 Library\Think\App.class.php 中定义的, 是通过 $_SERVER['REQUEST_TIME'] 来定义的, 即当前脚本的请
求时刻, 差不多就是当前脚本的执行时刻。
所谓tp的命名规范, 只是说满足两点: 一是类的存放位置 要跟 命名空间namespace的声明一致, 二是, 类的结束名字(扩展名)必
须是 .class.php 其他不要求, 比如 类是否要继承自 Controller等都不是命名规范中所要求的。
配置中的filter全都是 针对 I 方法进行的设置, 过滤函数有 null, default_filter, var_filter.
U 方法和I方法是tp中的核心方法。 U方法的定义规则是:
U('地址表达式', [传递的参数'], [伪静态后缀'], ['是否显示域名']
伪静态的后缀, 可以自己输入设置,比如是html, tpl等, 也可以是 false/true. 表示是否使用伪静态后缀
参数的传递, 有三种方式, 一是在地址表达式中一并写, 二是单独用字符串传递, 三是用数组进行传递. 通常推荐使用的是第三种方式, 将参
数放在 单独的数组中.
**另外, 使用U方法 生成的地址是根据 当前的url模式 自适应生成的, 即在不同的url模式下, U方法地址都可以生成, 但是生成的地址字符串
却不一样.**
I函数是为了获取 传递过来的参数, 所以会有一个默认值, 即当传递过来的参数为空的时候的默认值, 再就是一个过滤函数.