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}               /版权信息 [上一页](# "上一页")[下一页](# "下一页")
';