onethink引用jquery库没

插件名称:& & & &在线留言插件插件说明:1、将Message文件放到 /Addons 目录下2、拓展-》插件管理-》安装插件3、在线留言视图页面需要加入勾子: `{:hook('Message')}`插件截图:yershop商城系统开发一——thinkphp和onethink简析-爱编程
yershop商城系统开发一——thinkphp和onethink简析
yershop商城系统是基于thinkphp和onethink开发而来,此系列将详细分析我在二次开发中所面临的种种问题。
本篇简要分析日常在二次开发中涉及到的thinkphp和onethink知识。
yershop目录结构了解
此为我的项目中在zendstudio中截图
Addons:扩展插件目录,里面包含了第三方登陆插件、编辑器插件等;
Application:项目目录,之后详细介绍
Data:数据库备份目录
Public:js、css、image网站图片资源保存
Uploads:上传图片、文件目录(SAE环境下存储于storage中)
Runtime:运行中动态生成的程序(在检查标签语法出错时很有用,文件可删除)
Thinkphp:Thinkphp包,yershop系统或onethink在开发中均对Thinkphp包有改动,勿直接换该文件
Application目录
Common:公共配置,进入应用程序后,首先加载此文件夹内容;
User:用户模块,提供用户注册之类的核心方法;
Install:安装模块,安装异常时可在此检查代码;
Home:PC网站模块;
Wap:手机网站模块;(个人开发,免费下载包无)
Wei:嫁接weiphp2.0到商城所用模块(个人自定义模块,免费下载包无)
Common目录
此处重点关注 Common文件夹/function.php 和 Conf文件夹/config.php 两个文件
function.php为全局方法,Home、Wap、自定义模块等其它模块 均可调用其内方法;
config.php 为全局配置文件,需要注意的是数据库连接以及User模块下同名文件的数据库连接。
问:PC站和手机站如何在输入主域名后直接访问对应模块(Home or Wap)?
答: 在config.php文件开头根据访问源指定要加载的模块,代码如下
if(!ismobile()){
$module = 'Home';
$module = 'Wap';
return array(
/* 模块相关配置 */
'AUTOLOAD_NAMESPACE' =& array('Addons' =& ONETHINK_ADDON_PATH), //扩展模块列表
'DEFAULT_MODULE' =& $module,
ismobile()方法可使用function.php里已有的判断说否为手机方法,此处贴代码:
function ismobile() {
if (isset ($_SERVER['HTTP_X_WAP_PROFILE']))
return true;
if(isset ($_SERVER['HTTP_CLIENT']) &&'PhoneClient'==$_SERVER['HTTP_CLIENT'])
return true;
if (isset ($_SERVER['HTTP_VIA']))
return stristr($_SERVER['HTTP_VIA'], 'wap') ? true : false;
if (isset ($_SERVER['HTTP_USER_AGENT'])) {
$clientkeywords = array(
'nokia','sony','ericsson','mot','samsung','htc','sgh','lg','sharp','sie-','philips','panasonic','alcatel','lenovo','iphone','ipod','blackberry','meizu','android','netfront','symbian','ucweb','windowsce','palm','operamini','operamobi','openwave','nexusone','cldc','midp','wap','mobile'
if (preg_match("/(" . implode('|', $clientkeywords) . ")/i", strtolower($_SERVER['HTTP_USER_AGENT']))) {
return true;
if (isset ($_SERVER['HTTP_ACCEPT'])) {
if ((strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') !== false) && (strpos($_SERVER['HTTP_ACCEPT'], 'text/html') === false || (strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') & strpos($_SERVER['HTTP_ACCEPT'], 'text/html')))) {
return true;
return false;
Home下也有 Common/function.php 和 Conf/config.php 两个文件,但作用域仅限Home模块
注意:该function.php里的方法不能有和Common模块下总function.php里 重名 的方法,否则报 无法重载的错误。
Home/Conf/config.php文件
此文件内可配置仅针对PC端网站使用的配置,例如支付宝配置信息
有学习价值的配置信息:
'DEFAULT_THEME' =&
'URL_MODEL'
'PICTURE_UPLOAD_DRIVER'=&defined('SAE_TMP_PATH') ? 'Sae' : 'local',
'UPLOAD_LOCAL_CONFIG'=&array(),
'UPLOAD_SAE_CONFIG'=&array(
'rootPath'=&'',
'domain'=&'upload',
'SAE_Domain'
=& 'http://' . $_SERVER['HTTP_APPNAME'] . '-upload.',
Controller控制器文件夹及文件
thinkphp设置默认加载Index控制器中index()方法,在这里所有文件都继承了HomeController,在HomeController.class.php文件里可定义多数页面都需要加载的方法,如
public function _empty(){
$this-&redirect('Index/index');
protected function _initialize(){
$config = api('Config/lists');
C($config);
if(!C('WEB_SITE_CLOSE')){
$this-&error('站点已经关闭,请稍后访问~');
View视图文件夹
因为在Home模块的config.php文件中设置了'DEFAULT_THEME' =& 'monkey',故会加载View/monkey文件夹
问:Controller与View的关联?
答:需要前台展现的页面,如用户登陆页面,只需在UserController.class.php文件login()方法最后使用
$this-&display();
如果需要指定加载模版,
$this-&display('User/index');
则会调用User控制器下login方法,展现User文件夹下index.html模版页面
一定要学会根据URL判断所加载文件的位置!
例如:/index.php/Home/User/login.html
文件后台代码位置:Home/Controller/UserController.class.php-&login()方法;
默认前台代码位置:Home/View/(default文件夹 or 自定义 or null)/User/login.html。
少数文件会加载指定模版,但后台代码位置一般不会有误。
问:我自己创建了一个控制器,但每次访问都直接跳转到了Index/index里?
答:排除代码错误问题
1.控制器命名:
(1)首字母大写;
(2)XxxController.class.php中,Xxx中有其它大写字母,例如WxPayController.class.php;
2.类名与文件名不统一
文件名为:UserController.class.php,则类名必须为UserController
namespace Home\C
* 用户控制器
* 包括用户中心,用户登录及注册
class UserController extends HomeController {...
3.在Thinkphp核心程序中设置了跳转(weiphp中),Thinkphp包是最先被加载的,在weiphp中Thinkphp/Library/Think/Controller.class.php中有一个初始化函数,设定了未登录跳转。作为参考
4.View文件夹中base母版文件被添加了跳转代码(同样存在与weiphp)
5.后台设置了限制访问的目录(weiphp含有)
6.在没有以上问题,请新建控制器文件,从已有能正常访问的控制器代码复制,修改class类名。
View视图中类似asp.net的母版实现及修改
打开Index/index.html文件,可以看到
&extend name="Base/common" /&
&block name="body"&
extend,母版位置为Base文件夹/common.html文件,找到打开
&!DOCTYPE HTML&
file="Public/head"/&
file="Public/toolbar"/&
class="yershop_wrapper"&
file="Public/header"/&
file="Public/menu"/&
file="Public/body"/&
file="Public/cart_js"/&
file="Public/footer"/&&
file="Public/kefu"/&
母版页使用 include 将其它页面包含进来,注意写法。
而在被包含的页面中打开Public文件夹/body.html文件,在其中我们会看到
name="body"&
这段代码,这就决定了index.html文件
&block name="body"&
&/block&中内容部分最终被加载到哪个位置。
block这段代码对于内容部分、额外加载的css、js代码部分常用,因为每个页面都要使用同样的母版,但内容以及内容的css、js可能不同,block就起到很好的自定义作用。
其它固定的内容,则不需要使用。
后台给前台传参
...某控制器下的方法内{
$this -& assign('xxx',$a);
$yidata = M('order')-&where(array('id'=&$a))-&find();
$this -& assign('yiwei',$yidata);
$erdata = M('order')-&where(array('status'=&1))-&select();
$this -& assign('erwei',$erdata);
$this -& display();
对应前台使用
后台传了参数:
后台传递了一维数组获取:
{$yiwei.id} or {$yiwei['id']}
后台传递了二维数组获取:
&volist name="erwei" id="vo"&
第{$key}个参数id是:{$vo.id} or {$vo['id']}
对于不确定的数组内容,使用var_dump()函数打印数据在前台输出查看
在前台页面调用方法,U函数带参链接书写方式
{:data("Y-m-d H:i:s",$vo['create_time'])}
{:U('Wap/Article/index',array('category'=&'jste'))}
{:U('Article/detail?id='.$vo['id'])}
绝对不要将上述形式的函数(冒号开头)的参数写成 $vo.create_time形式,否则无法解析,写成原生数组形式
{$vo.id|get_cover_id|get_cover='path'}
/* 先解析{$vo.id},之后其作为get_cover_id函数的参数,返回商品封面图片的cover_id,第三步通过第二步得到的cover_id,将其和path作为get_cover两个参数传递。
前台使用原生php程序
if($a & 0 ){
&a & 0显示&
if($a & 0 ){
echo '&h1&a & 0显示&/h1&';
此两种方法各有千秋,如果html代码较多,使用第一种;较少可用第二种。
===================
原版出处-csdn:blog.csdn.net/afanxingzhou。
学习交流Q,承接小项目开发。
版权所有 爱编程 (C) Copyright 2012. . All Rights Reserved.
闽ICP备号-3
微信扫一扫关注爱编程,每天为您推送一篇经典技术文章。thinkPHP/onethink(17)
在onethink中,Admin后台有个系统栏目,可以看到网站的配置信息:
这些配置信息,可以在Admin控制器方法里,使用C函数获取到,也可以在默认的Home模块的控制器方法里通过C函数访问,但是到了别的自定义的模块里就不行了,原因是没有加载站点配置。
解决的办法如下:
在自定义的模块控制器里先添加站点配置,再读取配置信息,或者直接从$config里读取:
/* 读取站点配置 */
$config = api('Config/lists');
C($config); //添加配置
echo C('WEB_SITE_TITLE');
你也可以根据需要把读取站点配置写到公共的控制器里,根据业务需求。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:26497次
积分:1136
积分:1136
排名:千里之外
原创:85篇
转载:12篇
(4)(5)(13)(14)(10)(5)(11)(10)(3)(7)(2)(5)(4)(5)(1)1041人阅读
Thinkphp(13)
今天在使用OneThink的时候,发现竟然还可以调用插件里面的控制器如index.php?s=/Addons/execute/_addons/EditorForAdmin/_controller/Upload/_action/ke_upimg.html,代表调用了addons/EditorForAdmin/Controller/UploadController.class.php中ke_upimg,感觉用了这么久的TP,一直没有这么做过,有必要去深究一下,其能这样做的原因。通过分析路由,发现其实调用的是/Home/AddonsController.class.php中的execute方法,然后在execute方法中,在实例化UploadController类,并调用ke_upimg方法。其实,就相当于让Home/AddonsController.class.php类做一个代理而已,_addons/EditorForAdmin/_controller/Upload/_action/ke_upimg.html作为参数。弄清楚这些之后,那么后期写自己的插件也就相当方便了。
AddonsController.class.php文件
class AddonsController extends Controller{
protected $addons = null;
public function execute($_addons = null, $_controller = null, $_action = null){
if(C('URL_CASE_INSENSITIVE')){
$_addons = ucfirst(parse_name($_addons, 1));
$_controller = parse_name($_controller,1);
if(!empty($_addons) && !empty($_controller) && !empty($_action)){
$Addons = A("Addons://{$_addons}/{$_controller}")-&$_action();
$this-&error('没有指定插件名称,控制器或操作!');
定义自己的插件
我在下oneThink/Addons/Calendar/Controller定义了控制器LogController.class.php,如下图,
namespace Addons\Calendar\Controller;
use Think\Controller;
class LogController extends Controller{
public function addLog(){
var_dump('addLog');
那么怎样才能访问该控制器呢?使用如下地址,因为我在入口文件中,绑定了模型Home,所以调用时候,不需要添加模型名称。
localhost/index.php?s=/Addons/execute/_addons/Calendar/_controller/log/_action/addLog.html
ThinkPHP执行过程
ThinkPHP执行过程简化后,可以归结如下
index.php—-&Think.class.php——-&app.class.php
1.初始化参数(定义一下常量、加载一些配置文件),定义异常、错误、文件自动加载,定义存储方式
2.路径解析以及相应的过滤
3.创建请求的控制器对象
4.通过反射获取请求的方法,判断其属性,并获取方法的所有参数。
5.通过反射获取请求的控制器类,判断其是否定义了'_before_'.$action方法,请判断该方法属性,如果是public属性,则调用该方法。
6.通过反射,调用请求的方法
7.判断其是否定义了'_after_'.$action方法,请判断该方法属性,如果是public属性,则调用该方法。
8.针对上述的行为,ThinkPHP中定义了相应的行为钩子,当行为执行之前或之后,就调用相应的行为钩子。
插件开发可以参考如下网址
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:220919次
积分:4865
积分:4865
排名:第4268名
原创:253篇
转载:52篇
评论:91条
文章:20篇
阅读:7654
文章:14篇
阅读:13054
文章:16篇
阅读:15409
阅读:1745
文章:21篇
阅读:32471
文章:30篇
阅读:83564
(8)(12)(17)(5)(18)(51)(77)(55)(8)(19)(19)(13)(5)(1)提供主流cms教程
提供数据库教程和设计
提供各种常见网页js代码
提供常用的JS特效代码及在线演示
提供jQuery插件教程及插件下载
提供服务器常见问题及教程
提供站长技术、站长资讯等内容
提供常用开发手册和开发工具
您现在的位置:& >
thinkphp3.2路由时出错提示:无法加载模块 解决方法
导读:利用onethink二次开发做了一个站,上线的时候发现url地址太长,所以考虑用路由来美化url,开始是这样写的:/* URL配置 */'URL_CASE_I...
利用onethink二次开发做了一个站,上线的时候发现url地址太长,所以考虑用路由来美化url,开始是这样写的:
/* URL配置 */
'URL_CASE_INSENSITIVE' =& true, //默认false 表示URL区分大小写 true则表示不区分大小写
'URL_MODEL' =& 2, //URL模式 0:普通模式 1:PATHINFO模式 2:REWRITE模式 3:兼容模式
'VAR_URL_PARAMS' =& '', // PATHINFO URL参数变量
'URL_PATHINFO_DEPR' =& '/', //PATHINFO URL分割符
'URL_HTML_SUFFIX' =& '.html',
'URL_ROUTER_ON' =& true,
'URL_ROUTE_RULES' =& array(
'news/:idd' =& array('Home/Article/detail'), //资讯详情
访问网站***.com/news/1.html的时候提示出现错误,错误提示如下:
无法加载模块:News
FILE: E:wwwrootdichanThinkPHPLibraryThinkDispatcher.class.php  LINE: 168
然后各种搜索,官网都搜遍了还是没找到问题,差点急死老子了,查看官网手册,其中有句话这样说:
3.2的路由功能是针对模块设置的,所以URL中的模块名不能被路由,路由定义也通常是放在模块配置文件中。
哈哈,以前的版本都是写在公共文件里的config.php,原来3.2做了改动,必须写在模块的config.php,心中暗喜,是不是这个问题导致的错误,果断试了试,shit!还是不行,然后看了一下配置文件的配置,感觉比较可疑:
'MODULE_DENY_LIST' =& array('Common','User','Admin','Install'),
//'MODULE_ALLOW_LIST' =& array('Home','Admin'),
吧下边的那个注释删掉:
'MODULE_DENY_LIST' =& array('Common','User','Admin','Install'),
'MODULE_ALLOW_LIST' =& array('Home','Admin'),
刷新,路由正常,原来是这里的问题,原来3.2对模块的访问是自动判断的,所以通常情况下无需配置模块列表即可访问,在部署模块的时候,默认情况下都是基于类似于子目录的URL方式来访问模块的,所以这里的模块没有允许被访问。soga,这个问题憋了三天!!!终于解决了!
转载请注明(B5教程网)原文链接:
网友评论:

我要回帖

更多关于 jquery引用js文件 的文章

 

随机推荐