SMTP配置
最后更新于:2022-04-01 03:37:11
### SMTP配置
[上一页](# "上一页")[下一页](# "下一页")
**发件人: **
显示的发件人名字
**邮箱地址:**
表示显示发件人的邮箱地址,和下面的邮箱登录帐号最好一样;
**SMTP服务器:**
表示你的邮件服务器地址,不带http;如163,126邮箱分别是smtp.163.com,smtp.126.com
**邮箱登录帐号:**
就是你的邮箱号
**邮箱登录密码: **你的邮箱密码;
[上一页](# "上一页")[下一页](# "下一页")
后台管理
最后更新于:2022-04-01 03:37:08
插件后台管理控制器
最后更新于:2022-04-01 03:37:06
### 插件后台管理控制器
[上一页](# "上一页")[下一页](# "下一页")
1.
在插件类主文件里加has_admin为1的属性;
1.
默认后台管理控制器AdminIndex,默认方法index,不可更改
1.
sp_get_current_admin_id();可获取后台管理员id,可用于判断是否登录
~~~
<?php
namespace plugins\Demo\Controller; //Demo插件英文名,改成你的插件英文就行了
use Api\Controller\PluginController;//插件控制器基类
class AdminIndexController extends PluginController{
function _initialize(){
$adminid=sp_get_current_admin_id();//获取后台管理员id,可判断是否登录
if(!empty($adminid)){
$this->assign("adminid",$adminid);
}else{
//TODO no login
}
}
function index(){
//$plugin_demo_model=D("plugins://Demo/PluginDemo");//实例化自定义模型PluginDemo ,需要创建plugin_demo表
//$plugin_demo_model->test();//调用自定义模型PluginDemo里的test方法
$users_model=D("Users");//实例化Common模块下的Users模型
//$users_model=D("Common/Users");//也可以这样实例化Common模块下的Users模型
$users=$users_model->limit(0,5)->select();
$this->assign("users",$users);
$this->display(":admin_index");
}
}
~~~
[上一页](# "上一页")[下一页](# "下一页")
插件数据库模型
最后更新于:2022-04-01 03:37:04
### 插件数据库模型
[上一页](# "上一页")[下一页](# "下一页")
创建插件自定义模型
~~~
<?php
namespace plugins\Demo\Model;//Demo插件英文名,改成你的插件英文就行了
use Common\Model\CommonModel;//继承CommonModel
class PluginDemoModel extends CommonModel{ //Demo插件英文名,改成你的插件英文就行了,插件数据表最好加个plugin前缀再加表名,这个类就是对应“表前缀+plugin_demo”表
//自动验证
protected $_validate = array(
//array(验证字段,验证规则,错误提示,验证条件,附加规则,验证时间)
//array('ad_name', 'require', '广告名称不能为空!', 1, 'regex', 3),
);
protected function _before_write(&$data) {
parent::_before_write($data);
}
//自定义方法
function test(){
echo "hello";
}
}
~~~
实例化模型:
~~~
$plugin_demo_model=D("plugins://Demo/PluginDemo");//实例化自定义模型PluginDemo
$plugin_demo_model->test();//调用自定义模型PluginDemo里的test方法
$users_model=D("Users");//实例化Common模块下的Users模型
//$users_model=D("Common/Users");//也可以这样实例化Common模块下的Users模型
$users=$users_model->limit(0,5)->select();
print_r($users);
~~~
[上一页](# "上一页")[下一页](# "下一页")
插件控制器
最后更新于:2022-04-01 03:37:01
### 插件控制器
[上一页](# "上一页")[下一页](# "下一页")
插件写法:
~~~
<?php
namespace plugins\Demo\Controller; //Demo插件英文名,改成你的插件英文就行了
use Api\Controller\PluginController;//插件控制器基类,所有插件都要继承它
class IndexController extends PluginController{
function index(){
$this->display(":index");
}
}
~~~
插件url生成方法,sp_plugin_url();
X1.4.0新增
~~~
sp_plugin_url($url,$param,$domain)
~~~
**功能:**
生成访问插件的url
**参数:**
$url: url 格式:插件名://控制器名/方法
$param:额外参数,默认为空数组
$domain:是否添加域名,默认false
**返回:**
类型url
**模板使用:**
~~~
{:sp_plugin_url('Demo://Index/index',array('id'=>2),true)}
{:sp_plugin_url('Demo://List/index',array('id'=>2))}
~~~
[上一页](# "上一页")[下一页](# "下一页")
插件开发流程
最后更新于:2022-04-01 03:36:59
### 插件开发流程
[上一页](# "上一页")[下一页](# "下一页")
1.
确定功能,先给插件启名,英文名和中文名 如:Demo,插件演示,然后在plugins目录里添加这个插件目录
1.
确定是否要后台配置文件,如果需要在插件根目录加上config.php,格式可看文档“插件配置文件”
1.
创建插件主类文件,查看“插件类主文件”
1.
确定是否要模板,如需要请根目录添加View目录
1.
确定是否可以外部访问,如需要请加Controller目录,再添加Controller文件
1.
给自己的模板(tpl/simplebootx)添加钩子,把{:hook('钩子名')}放到模板相应位置,再在模板根目录添加hooks.html文件,让系统可以获取你模板里的钩子,如tpl/simplebootx/hooks.html文件,文件中以英文逗号分隔钩子,不能有空格;
hooks.html文件可以这样:
footer_end,footer
1.
到后台扩展工具-》插件管理刷新界面就会看到你新添加的插件
[上一页](# "上一页")[下一页](# "下一页")
插件类主文件
最后更新于:2022-04-01 03:36:57
### 插件类主文件
[上一页](# "上一页")[下一页](# "下一页")
插件类主文件
文件位于插件根目录
命名格式:插件名+Plugin.class.php
~~~
<?php
// +----------------------------------------------------------------------
// | ThinkCMF [ WE CAN DO IT MORE SIMPLE ]
// +----------------------------------------------------------------------
// | Copyright (c) 2013-2014 http://www.thinkcmf.com All rights reserved.
// +----------------------------------------------------------------------
// | Author: Dean <zxxjjforever@163.com>
// +----------------------------------------------------------------------
namespace plugins\Demo;//Demo插件英文名,改成你的插件英文就行了
use Common\Lib\Plugin;
/**
* Demo
*/
class DemoPlugin extends Plugin{//Demo插件英文名,改成你的插件英文就行了
public $info = array(
'name'=>'Demo',//Demo插件英文名,改成你的插件英文就行了
'title'=>'插件演示',
'description'=>'插件演示',
'status'=>1,
'author'=>'ThinkCMF',
'version'=>'1.0'
);
public $has_admin=1;//插件是否有后台管理界面
public function install(){//安装方法必须实现
return true;//安装成功返回true,失败false
}
public function uninstall(){//卸载方法必须实现
return true;//卸载成功返回true,失败false
}
//实现的footer钩子方法
public function footer($param){
$config=$this->getConfig();
$this->assign($config);
$this->display('widget');
}
}
~~~
[上一页](# "上一页")[下一页](# "下一页")
插件配置文件
最后更新于:2022-04-01 03:36:55
### 插件配置文件
[上一页](# "上一页")[下一页](# "下一页")
插件配置文件是插件目录下的config.php,不需要配置的插件可以不添加此文件;
文件结构:
~~~
<?php
return array (
'text' => array (// 在后台插件配置表单中的键名 ,会是config[text]
'title' => '文本:', // 表单的label标题
'type' => 'text',// 表单的类型:text,password,textarea,checkbox,radio,select等
'value' => 'hello,ThinkCMF!',// 表单的默认值
'tip' => '这是文本组件的演示' //表单的帮助提示
),
'password' => array (// 在后台插件配置表单中的键名 ,会是config[password]
'title' => '密码:',
'type' => 'password',
'value' => '',
'tip' => '这是密码组件'
),
'select' => array (// 在后台插件配置表单中的键名 ,会是config[select]
'title' => '下拉列表:',
'type' => 'select',
'options' => array (//select 和radio,checkbox的子选项
'1' => 'ThinkCMFX',// 值=>显示
'2' => 'ThinkCMF',
'3' => '跟猫玩糗事',
'4' => '门户应用'
),
'value' => '1',
'tip' => '这是下拉列表组件'
),
'checkbox' => array (
'title' => '多选框',
'type' => 'checkbox',
'options' => array (
'1' => 'genmaowan.com',
'2' => 'www.thinkcmf.com'
),
'value' => 1,
'tip' => '这是多选框组件'
),
'radio' => array (
'title' => '单选框',
'type' => 'radio',
'options' => array (
'1' => 'ThinkCMFX',
'2' => 'ThinkCMF'
),
'value' => '1',
'tip' => '这是单选框组件'
),
'textarea' => array (
'title' => '多行文本',
'type' => 'textarea',
'value' => '这里是你要填写的内容',
'tip' => '这是多行文本组件'
)
);
~~~
[上一页](# "上一页")[下一页](# "下一页")
插件钩子
最后更新于:2022-04-01 03:36:52
### 插件钩子
[上一页](# "上一页")[下一页](# "下一页")
钩子是插件执行的触发器;插件就像挂在钩子上的东西;
插件只有实现相应钩子方法,并安装启用成功后才能执行;
ThinkCMF系统内置了很多钩子;[http://www.thinkcmf.com/document/hooks.html](http://www.thinkcmf.com/document/hooks.html)
开发者也可以用hook('test')方法在控制器只加入钩子,让你的应用具有更好的扩展性;
同时也可以模板里加入钩子{:hook('footer')};
钩子也支持传入参数hook('footer',array('test'=>1));
**向系统暴露你的钩子**
**暴露应用控制器钩子:**
在你的应用根目录加上hooks.php文件
文件中返回此应用所有钩子数组就可以了;
如portal应用:
![untitled1.png](http://www.thinkcmf.com/data/upload/ueditor/54aa91de3ca54.png "untitled1.png")
hooks.php文件内容
~~~
<?php
return array(
//'test',
);
~~~
**暴露你的模板钩子:**
在你的模板根目录加上hooks.html文件;
在此文件中用英文逗号分开此模板所有的钩子就可以了;
如simplebootx模板:
![untitled1.png](http://www.thinkcmf.com/data/upload/ueditor/54aa9283b5d3a.png "untitled1.png")
hooks.html文件内容:
~~~
footer,footer_end
~~~
[上一页](# "上一页")[下一页](# "下一页")
插件
最后更新于:2022-04-01 03:36:50
### 插件
[上一页](# "上一页")[下一页](# "下一页")
插件是用于实现简单的显示及数据处理的功能扩展。插件是可以开启关闭的,但不会影响原有系统的代码;
插件结构:
![插件结构图](http://www.thinkcmf.com/data/upload/ueditor/54aa90907a9f6.png "插件结构图")
以Demo插件为例:
Controller //控制器目录
Model //插件自定义模型目录
View //模板目录,可以配置多个主题
config.php //模板配置文件
DemoPlugin.class.php 插件主文件,格式为:插件名+Plugin.class.php
README.txt 说明文件
lisense.txt 授权协议文件
[上一页](# "上一页")[下一页](# "下一页")
插件开发
最后更新于:2022-04-01 03:36:48
案例
最后更新于:2022-04-01 03:36:45
### 案例
[上一页](# "上一页")[下一页](# "下一页")
以ThinkCMF自带应用Portal的文章展示页为例:
~~~
<!DOCTYPE html>
<!--[if IE 8]> <html class="ie ie8"> <![endif]-->
<!--[if IE 9]> <html class="ie ie9"> <![endif]-->
<!--[if gt IE 9]><!--> <html> <!--<![endif]-->
<!-- head -->
<tc_include file="Public:head"/>
<!-- head -->
<body class="page-services">
<div class="wrap">
<!-- Head start -->
<tc_include file="Public:header" />
<!-- Head End -->
<!-- Content Start -->
<div id="main">
<!-- Title, Breadcrumb Start-->
<div class="breadcrumb-wrapper">
<div class="container">
<div class="row">
<div class="col-lg-6 col-md-6 col-xs-12 col-sm-6">
<h2 class="title">{$article.post_title}</h2>
</div>
<div class="col-lg-6 col-md-6 col-xs-12 col-sm-6">
<div class="breadcrumbs pull-right">
<ul>
<li>你的位置:</li>
<li><a href="#">{$term.name}</a></li>
<li>{$article.post_title}</li>
</ul>
</div>
</div>
</div>
</div>
</div>
<!-- Title, Breadcrumb End-->
<!-- Main Content start-->
<div class="content">
<div class="container">
<div class="row">
<div class="posts-block col-lg-9 col-md-8 col-sm-8 col-xs-12">
<article>
<!-- <h3 class="title">{$article.post_title}</h3> -->
<php>
if(!empty($smeta['thumb'])){
echo '
<div class="img-content">
<img src="'.$smeta['thumb'].'" tppabs="" alt="" style="width:300px">
</div>';
}
</php>
<div class="post-content">
<p>
{$article.post_content}
</p>
</div>
</article>
</div>
<!-- Left Section End -->
<!-- Skill Section Start-->
<div class="choice col-lg-3 col-md-4 col-sm-4 col-xs-12">
<h3 class="title">技能</h3>
<ul class="check-list why">
<li>LAMP构架</li>
<li>Bootstrap</li>
<li>SimpleCMF</li>
<li>Web Disgin</li>
</ul>
</div>
<!-- Skill Section end -->
</div>
</div>
</div>
<div class="divider"></div>
<!-- Main Content start-->
<div class="main-content">
<div class="container">
<div class="row">
<div class="col-lg-4 col-md-4 col-sm-4">
<div class="content-box big ch-item bottom-pad-small">
<div class="ch-info-wrap">
<div class="ch-info">
<div class="ch-info-front ch-img-1"><i class="icon-code"></i></div>
<div class="ch-info-back">
<i class="icon-code"></i>
</div>
</div>
</div>
<div class="content-box-info">
<php>
$p=sp_sql_post(36,'field:post_title,post_content');
</php>
<h3>{$p.post_title}</h3>
<p>
{$p.post_content}
</p>
<a href="#">Read More <i class="icon-angle-right"></i><i class="icon-angle-right"></i></a>
</div>
</div>
</div>
<div class="col-lg-4 col-md-4 col-sm-4">
<div class="content-box big ch-item bottom-pad-small">
<div class="ch-info-wrap">
<div class="ch-info">
<div class="ch-info-front ch-img-1"><i class="icon-eye-open"></i></div>
<div class="ch-info-back">
<i class="icon-eye-open"></i>
</div>
</div>
</div>
<div class="content-box-info">
<php>
$p=sp_sql_post(37,'field:post_title,post_content');
</php>
<h3>{$p.post_title}</h3>
<p>
{$p.post_content}
</p>
<a href="#">Read More <i class="icon-angle-right"></i><i class="icon-angle-right"></i></a>
</div>
</div>
</div>
<div class="col-lg-4 col-md-4 col-sm-4">
<div class="content-box big ch-item">
<div class="ch-info-wrap">
<div class="ch-info">
<div class="ch-info-front ch-img-1"><i class="icon-edit"></i></div>
<div class="ch-info-back">
<i class="icon-edit"></i>
</div>
</div>
</div>
<div class="content-box-info">
<php>
$p=sp_sql_post(38,'field:post_title,post_content');
</php>
<h3>{$p.post_title}</h3>
<p>
{$p.post_content}
</p>
<a href="#">Read More <i class="icon-angle-right"></i><i class="icon-angle-right"></i></a>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Main Content end-->
<!-- Main Content end-->
</div>
<!-- Content End -->
<!-- Footer Start -->
<tc_include file="Public:footer"/>
<!-- Footer End -->
<!-- Scroll To Top -->
<a href="#" class="scrollup"><i class="icon-angle-up"></i></a>
</div>
<!-- Wrap End -->
<!-- switcher start -->
<tc_include file="Public:switcher"/>
<!-- switcher start -->
<!-- The Scripts -->
<tc_include file="Public:scripts"/>
<!-- The Scripts -->
</body>
</html>
~~~
[上一页](# "上一页")[下一页](# "下一页")
模板自定义函数库
最后更新于:2022-04-01 03:36:43
### 模板自定义函数库
[上一页](# "上一页")[下一页](# "下一页")
在模板开发时,其实可以给此模板增加自己的函数
以simplebootx为例:
![ueditor/20150422/55372ef7e2507.png](http://www.thinkcmf.com/data/upload/ueditor/20150422/55372f75c485c.png "ueditor/20150422/55372ef7e2507.png")
这是simplebootx现在的结构;
下面我们来增加给simplebootx增加一个函数库文件;
**a)**.在simplebootx目录下增加文件function.html;
![ueditor/20150422/55372f75c507b.png](http://www.thinkcmf.com/data/upload/ueditor/20150422/553730119ce25.png "ueditor/20150422/55372f75c507b.png")
**b)**.在function.html加入自己的php函数_sp_helloworld()
~~~
<php>
function _sp_helloworld(){
echo "hello ThinkCMF!";
}
</php>
~~~
这样就增加了一个自定义方法,注意函数的命名格式:下划线+自己的函数前缀+方法名;
这样命名的好处,在于不会和官方的方法冲突,同时官方也方便采纳你的方法,前面的下划线去掉就可以了;
**c)**.引入自定义函数库
只要在需要用自定义方法的模板头部用tc_include标签引入就可以了
如在Portal/index.html文件第一行引入函数库:
~~~
<tc_include file=":function"/>
~~~
你也可以增加多个函数库文件,比如在Portal下,你也可以加个function.html;按自己的需要增加,再引入就行了;
[上一页](# "上一页")[下一页](# "下一页")
添加留言控件
最后更新于:2022-04-01 03:36:41
### 添加留言控件
[上一页](# "上一页")[下一页](# "下一页")
在模板中加入以下代码:
~~~
<form class="J_ajaxForm" role="form" method="post" action="{:u('api/guestbook/addmsg')}">
<label>姓名</label>
<input type="text" class="span3" placeholder="Your name" name="full_name">
<label>邮箱</label>
<input type="email" class="span3" placeholder="Email address" name="email">
<label>内容</label>
<textarea class="span6" id="message" placeholder="Write you message here..." name="msg"></textarea>
<label>验证码</label>
<input type="text" class="span3" placeholder="please enter the code" name="verify" autocomplete="off">
{:sp_verifycode_img('length=4&font_size=20&width=238&height=34&font_color=&background=','style="cursor: pointer;vertical-align: top;" title="点击获取"')}
<button type="submit" class="btn btn-primary J_ajax_submit_btn">发送留言</button>
</form>
~~~
[上一页](# "上一页")[下一页](# "下一页")
友情链接制作
最后更新于:2022-04-01 03:36:39
### 友情链接制作
[上一页](# "上一页")[下一页](# "下一页")
~~~
<php>$links=sp_getlinks();</php>
<foreach name="links" item="vo">
<a href="{$vo.link_url}" target="{$vo.link_target}">{$vo.link_name}</a>
</foreach>
~~~
[上一页](# "上一页")[下一页](# "下一页")
广告位制作
最后更新于:2022-04-01 03:36:36
### 广告位制作
[上一页](# "上一页")[下一页](# "下一页")
在文章底部加一个广告:
到后台扩展工具》网站广告 添加广告名称 为'portal_article_bottom'的广告,同时加上广告代码;
模板里代码如下:
~~~
<div>{:sp_getad("portal_article_bottom")}</div>
~~~
[上一页](# "上一页")[下一页](# "下一页")
幻灯片制作
最后更新于:2022-04-01 03:36:34
### 幻灯片制作
[上一页](# "上一页")[下一页](# "下一页")
在后台扩展工具》幻灯片分类 添加分类标识为"portal_index"的分类,然后在此分类添加幻灯片;
~~~
<php>
$home_slides=sp_getslide("portal_index");
</php>
<foreach name="home_slides" item="vo">
{$vo.slide_name}
<a href="{$vo.slide_url}">
<img src="{:sp_get_asset_upload_path($vo['slide_pic'])}" alt="">
</a>
</foreach>
~~~
[上一页](# "上一页")[下一页](# "下一页")
菜单导航制作
最后更新于:2022-04-01 03:36:32
### 菜单导航制作
[上一页](# "上一页")[下一页](# "下一页")
bootstrap导航:
~~~
<?php
$effected_id="";
$filetpl="<a href='\$href' target='\$target'>\$label</a>";
$foldertpl="<a href='\$href' target='\$target' class='dropdown-toggle' data-toggle='dropdown'>\$label <b class='caret'></b></a>";
$ul_class="dropdown-menu" ;
$li_class="" ;
$style="nav";
$showlevel=6;
$dropdown='dropdown';
echo sp_get_menu("main",$effected_id,$filetpl,$foldertpl,$ul_class,$li_class,$style,$showlevel,$dropdown);
?>
~~~
[上一页](# "上一页")[下一页](# "下一页")
模板注释
最后更新于:2022-04-01 03:36:30
### 模板注释
[上一页](# "上一页")[下一页](# "下一页")
js注释:
~~~
<script>
/* js注释*/
</script>
~~~
css注释
~~~
<style>
/*css注释*/
</style>
~~~
html注释
~~~
<div>
<!--html注释-->
</div>
~~~
php标签里的注释
~~~
<php>
/*一定要用这个方法,用//会在debug关时出问题*/
</php>
~~~
[上一页](# "上一页")[下一页](# "下一页")
全局变量
最后更新于:2022-04-01 03:36:27
### 全局变量
[上一页](# "上一页")[下一页](# "下一页")
ThinkCMF封装了前台模板开发时常用的一些变量,这些变量时全局的,你在任何时候都能直接调用:
{$site_name} /站点名称
{$site_host} /站点域名
{$site_root} /安装目录
{$site_icp} /备案信息
{$site_admin_email} /管理员邮箱
{$site_tongji} /页面统计代码
{$site_seo_title} /SEO标题
{$site_seo_keywords} /SEO关键字
{$site_seo_description} /SEO描述
{$site_copyright} /版权信息
[上一页](# "上一页")[下一页](# "下一页")