OneThink1.0開發手冊:
http://document.onethink.cn/manual_1_0.html
簡介
[ 主要特性 ]
- 基於ThinkPHP最新3.2版本。
- 模塊化:全新的架構和模塊化的開發機制,便於靈活擴展和二次開發。
- 文檔模型/分類體系:通過和文檔模型綁定,以及不同的文檔類型,不同分類可以實現差異化的功能,輕松實現諸如資訊、下載、討論和圖片等功能。
- 開源免費:OneThink遵循Apache2開源協議,免費提供使用。
- 用戶行為:支持自定義用戶行為,可以對單個用戶或者群體用戶的行為進行記錄及分享,為您的運營決策提供有效參考數據。
- 雲端部署:通過驅動的方式可以輕松支持平台的部署,讓您的網站無縫遷移,內置已經支持SAE和BAE3.0。
- 雲服務支持:即將啟動支持雲存儲、雲安全、雲過濾和雲統計等服務,更多貼心的服務讓您的網站更安心。
- 安全穩健:提供穩健的安全策略,包括備份恢復、容錯、防止惡意攻擊登錄,網頁防篡改等多項安全管理功能,保證系統安全,可靠、穩定的運行。
- 應用倉庫:官方應用倉庫擁有大量來自第三方插件和應用模塊、模板主題,有眾多來自開源社區的貢獻,讓您的網站“One”美無缺。
OneThink只是一個內容管理框架,並不是一個真正意義的CMS,所以你不會看到很多的功能,也不要因此而抱怨,因為一切功能都來自於您的創造或者大家的分享。這才是OneThink的理念和定位。OneThink集成了一個完善的后台管理體系和前台模板標簽系統,讓你輕松管理數據和進行前台網站的標簽式開發。
[ 主要功能 ]
- 用戶Passport系統
- 配置管理系統
- 權限控制系統
- 后台建模系統
- 多級分類系統
- 用戶行為系統
- 鈎子和插件系統
- 系統日志系統
- 數據備份和還原
利用OneThink現有的后台功能和標簽庫機制,你可以輕松的定制或者開發基於OneThink的網站和應用。
[ 最低系統需求 ]
•PHP 5.3.0 或更高版本。
•MySQL 5.0 或更高版本。
[ 系統安裝 ]
- 將OneThink壓縮包解壓至一個空文件夾,並上傳它。
- 首次在瀏覽器中訪問index.php,將會進入安裝向導。
- 按照安裝向導完成安裝。若在安裝過程中出現問題,請訪問官網討論區尋求幫助。
OneThink支持直接在SAE以及BAE3.0平台上直接安裝。
應用架構及目錄結構
應用目錄結構
wwwroot├─index.php OneThink入口文件├─Addons 插件目錄│├─Application 應用模塊目錄│ ├─Admin 后台模塊│ │ ├─Conf 后台配置文件目錄│ │ ├─Common 后台函數公共目錄│ │ ├─Controller 后台控制器目錄│ │ ├─Model 后台模型目錄│ │ ├─Logic 后台模型邏輯目錄│ │ └─View 后台視圖文件目錄│ ││ ├─Common 公共模塊目錄(不能直接訪問)│ │ ├─Conf 公共配置文件目錄│ │ ├─Common 公共函數文件目錄│ │ ├─Controller 模塊訪問控制器目錄│ │ └─Model 公共模型目錄│ ││ ├─Home Home 前台模塊│ │ ├─Conf 前台配置文件目錄│ │ ├─Common 前台函數公共目錄│ │ ├─Controller 前台控制器目錄│ │ ├─Model 前台模型目錄│ │ └─View 模塊視圖文件目錄│ ││ └─User 用戶模塊(不能直接訪問)│ ├─Api 用戶接口文件目錄│ ├─Conf 用戶配置目錄│ ├─Common 后台函數公共目錄│ ├─Model 用戶模型目錄│ └─Service 用戶Service文件目錄│├─Public 應用資源文件目錄├─Runtime 應用運行時目錄├─ThinkPHP 框架目錄└─Uploads 上傳根目錄├─Download 文件上傳目錄├─Picture 圖片上傳目錄└─Editor 編輯器圖片上傳目錄
靜態資源目錄結構
├─Public 應用資源文件目錄│ ├─Admin 后台資源文件目錄│ │ ├─css 樣式文件目錄│ │ ├─images 圖片文件目錄│ │ └─js 腳本文件目錄│ ││ ├─Home 前台資源文件目錄│ │ ├─css 樣式文件目錄│ │ ├─images 圖片文件目錄│ │ └─js 腳本文件目錄│ ││ └─static 公共資源文件目錄
==============================================================
模板開發指南
基礎知識
見 ThinkPHP3.2手冊 視圖部分
Onethink后台模板
后台使用了模板繼承,基礎模板位於 View/Public/base.html。其他模板都位於對應的控制器模板目錄。
后台公共js文件位於Public/Admin/Js/common.js,這個js文件是在頁面主體內容之后加載。
后台公共css文件位於Public/Admin/Css/base.css
在具體的控制器模板中,你可以通過繼承重置<block name="script"></block>來向當前模板加入新的js。這些代碼在common.js之后執行。
Onethink前台模板
前台模板比較少,通常二次開發時會刪除所有模板,根據設計重新組織和編寫前台模板,所以這里對模板文件和目錄不做介紹。
標簽庫
OneThink定義了兩個標簽庫Think和Article,類文件位於ThinkPHP/Library/OT/TagLib,文件名為Article.class.php和Think.class.php,如有需要,您可以在該目錄下創建自己的標簽庫。
Think標簽庫
Article標簽庫
'partlist' => array('attr' => 'id,field,page,name', 'close' => 1), //段落列表'partpage' => array('attr' => 'id,listrow', 'close' => 0), //段落分頁'prev' => array('attr' => 'name,info', 'close' => 1), //獲取上一篇文章信息'next' => array('attr' => 'name,info', 'close' => 1), //獲取下一篇文章信息'page' => array('attr' => 'cate,listrow', 'close' => 0), //列表分頁'position' => array('attr' => 'pos,cate,limit,filed,name', 'close' => 1), //獲取推薦位列表'list' => array('attr' => 'name,category,child,page,row,field', 'close' => 1), //獲取指定分類列表
Article:list 標簽補充說明
category 屬性 最好是帶單引號, 如 category="'0'" 因為標簽庫里判斷了empty, 可能導致0 相當於沒傳參數
Article:position 標簽補充說明:
pos 是數字,后台有 :1:列表推薦2:頻道推薦4:首頁推薦
所以一般前台讀取的時候,一般傳指定的數字如 pos="1" 這種
而cate 這邊比較坑, 默認你傳指定的45 單數字沒問題, 傳多個分類 45,46 這樣不行的,必須帶單引號 如 cate="'45,46'"
onethink常用標簽的使用示例
首頁文章模型列表輸出:
<article:list name="article" category="2" row="3" order="update_time desc" limit="0,1" child="true"> 閱讀:{$article.view} 發布時間:{$article.create_time|date='m-d',###} 作者:{$article.uid|get_username} 文章標題:{$article.title} 原文鏈接:{:U('Article/detail?id='.$article['id'])} 文章描述:{$article.description}
封面圖片:<img src="{$article.cover_id|get_cover=###,'path'}" /> 分類鏈接:{:U('Article/lists?category='.get_category_name($article['category_id']))} 分類標題{$article.category_id|get_category_title} </article:list>
首頁簡介(單個文章)輸出:
{$wdjj.content|strip_tags|mb_substr=0,150,"UTF8"}
文章詳情頁:
標題:{$info.title}
作者:{$info.uid|get_username}
時間:{$info.create_time|date='Y-m-d H:i',###}
內容:{$info.content}
下載尺寸:{$info.size}
下載次數:{$info.download}
描述:{$info.description|default='暫無描述'}
分頁:
<article:prev name="prev" info="info">
<a href="{:U('?id='.$prev['id'])}">上一篇</a> </article:prev> <article:next name="next" info="info"> <a href="{:U('?id='.$next['id'])}">下一篇</a> </article:next>
分類列表:
<volist name="category" id="cate">
<eq name="current" value="$cate['id']">
<li class="active"> <a href="{:U('Article/lists?category='.$cate['name'])}"> <i class="icon-chevron-right"></i>{$cate.title} </a> </li> <else/> <li> <a href="{:U('Article/lists?category='.$cate['name'])}"> <i class="icon-chevron-right"></i>{$cate.title} </a> </li> </eq> </volist>
oneThink后台添加插件步驟詳解
內容管理框架:oneThink
版本:V1.1.141212 (注:v1.1也有很多版本,一不小心就下到V1.1.140202 去了,還有其他版本,建議去代碼托管平台下載最新版本)
我也不偷懶,把每一步步驟都記錄下來。
一、進入后台,創建插件



這里的鈎子我新建了一個indexFooter,因為我只需在前台首頁底部顯示友情鏈接即可。我們把上面所有要勾的地方都勾上,至於有什么區別,大家可以自己建幾個例子區分一下,生成的文件是否一樣。OK!到這里 我們的友情鏈接插件就創建好了!點擊“確定”。(這里的自定義模板什么的,通通不填,我會在下篇文章演示添加自定義模板的效果)

二、點擊“安裝” 即可,找到我們剛安裝好的Links插件,點擊“設置”,你會看到它有個默認的“是否開啟隨機”的選項,這里我們不管它,因為我們用不上,等下要刪掉的。安裝后,我們可以在左側導航“已安裝插件后台”看到我們新建的“友情鏈接”

三、當我們點擊左側導航的“友情鏈接”,你會發現報錯,大概就是說的某個表不存在。是的,我們剛才只是建了插件,如果涉及到數據存儲到數據庫, 還需要建表。這里不直接去數據庫里建,因為這樣做,是很不人性化的。那我們就找到安裝插件的函數,在安裝插件的時候建立數據庫,這樣就好了。首先系統的插件全部存放在 根目錄/Addons/ 文件夾下面,打開此文件夾,我們看到有個Links文件夾,這就是我們剛創建的插件,一個插件對應一個文件夾。打開Links文件夾,里面有2個文件和2個文件夾。

四、其實現在oneThink做的越來越簡潔了,不懂PHP的人照樣創建插件,之后你就會發現。當然,如果你有自己的想法,不想局限於官方的限制,那還是要把php學好的。
五、打開插件入口文件:LinksAddon.class.php 里面有個類 LinksAddon,先來分析一下這個文件吧

我這里把 $admin_list 數組的model 值改成links了,為了與插件對應。接下來我們在install方法里添加新建數據庫的語句,這樣我們在安裝插件的時候,就會新建數據庫了,我的代碼如下:
1 public function install(){ //安裝插件的方法 2 //1、添加數據表 3 $model = D(); 4 $db_prefix = C('DB_PREFIX'); 5 $table_name = "{$db_prefix}links"; 6 7 $sql=<<<SQL 8 CREATE TABLE IF NOT EXISTS `$table_name` ( 9 `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵', 10 `title` varchar(80) NOT NULL DEFAULT '' COMMENT '站點名稱', 11 `link` varchar(140) NOT NULL DEFAULT '' COMMENT '鏈接地址', 12 `summary` varchar(255) NOT NULL DEFAULT '' COMMENT '站點描述', 13 `mailto` varchar(100) NOT NULL DEFAULT '' COMMENT '站長聯系方式', 14 `sort` int(3) unsigned NOT NULL DEFAULT 0 COMMENT '優先級', 15 `nofollow` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '是否追蹤', 16 `type` tinyint(3) unsigned NOT NULL DEFAULT 1 COMMENT '類型分組', 17 `cover_id` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '封面圖片', 18 `status` tinyint(2) NOT NULL DEFAULT 1 COMMENT '狀態(0:禁用,1:正常)', 19 `create_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '添加時間', 20 PRIMARY KEY (`id`) 21 ) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='友情連接表'; 22 SQL; 23 24 $model -> execute($sql);//執行sql語句 25 26 //2、返回true,表示插件安裝成功 27 return true; 28 }
我這里省略了很多細節判斷,大家自己完善。
六、既然在安裝插件的時候,新建了表,我們在卸載的插件的時候就要把表給刪除,不然下次安裝該插件的時候就會出問題。所以我們uninstall 方法代碼如下:
public function uninstall(){ //卸載插件的方法 $model = D(); $db_prefix = C('DB_PREFIX'); $table_name = "{$db_prefix}links"; $sql="DROP TABLE IF EXISTS `".$table_name."`;"; $model -> execute($sql);//執行sql語句 return true; }
好了,到這里就差不多了,保存一下LinksAddon.class.php 文件,應該可以正常顯示了,我們來看看。進入插件列表,先把Links插件卸載,然后重新安裝。點擊左側菜單“友情鏈接”,可以看到

之所以能正常顯示這個列表,是因為系統有默認的模板,在\Application\Admin\View\Addons 文件夾里,有興趣的同學可以研究一下這幾個模板文件,其中這個列表的模板就是adminlist.html,那么我們要把封面、書名、描述等等這些字眼改掉,要去模板里改嗎?細心的同學估計注意到了,在LinksAddon.class.php 文件 的$admin_list 數組里配置的,其他的看后面的注釋就明白,這里詳細說一下 list_grid 關聯的數組。我們剛才新建的links數據表有id、title、link等字段,你想在這個列表顯示什么字段,都可以添加。我這里代碼如下:
'list_grid'=>array( //這里定義的是除了id序號外的表格里字段顯示的表頭名和模型一樣支持函數和鏈接 'title:網站名稱', 'link:鏈接', 'summary:描述', 'create_time|time_format:添加時間', //time_format 是一個函數,把時間格式化,其他地方想使用什么函數也可以按照這種格式書寫 'id:操作:[EDIT]|編輯,[DELETE]|刪除' ),
保存,刷新后台友情鏈接列表

我們點擊“新增” 來增加一個友情鏈接吧,你會發現,只有一個書名字段。我們打開Model/LinksModel.class.php 文件,我這里分別解釋一下這兩個自帶的數組,具體看下面代碼里的注釋
class LinksModel extends Model{ public $model = array( 'title'=>'',//新增[title]、編輯[title]、刪除[title]的提示 'template_add'=>'',//自定義新增模板自定義html edit.html 會讀取插件根目錄的模板 'template_edit'=>'',//自定義編輯模板html 'search_key'=>'',// 搜索的字段名,默認是title 'extend'=>1, //在后台列表是否顯示 “增加”、“刪除” 按鈕,0-不顯示 1-顯示 ); public $_fields = array( 'id'=>array( 'name'=>'id',//字段名,與數據庫的字段對應 'title'=>'ID',//顯示標題 'type'=>'num',//字段類型:num、string、textarea、datetime、bool、select、radio、checkbox、editor、picture(封面)、file(附件)、 'remark'=>'',// 備注,相當於配置里的tip 'is_show'=>3,// 1-始終顯示 2-新增顯示 3-編輯顯示 0-不顯示 'value'=>0,//默認值 ),
//下面演示一下 select字段怎么顯示 radio、checkbox同理 'type'=>array( 'name'=>'type', 'title'=>'類型', 'type'=>'select', 'remark'=>'請選擇所屬類型', 'is_show'=>1,
'extra'=>'0:友情鏈接,1:合作站點', 'value'=>0, 'is_must'=>1, ), ); }
ok,我最后的效果是這樣的:

添加一條數據看看吧:

這里要顯示具體類型、顯示圖片等,需要自定義adminlist.html模板了。關於自定義模板,我們下一篇文章再說。關於鈎子,其實就是寫一個函數從數據庫讀取數據,然后在前台需要的地方調用鈎子就行。如果需要模板,則在鈎子函數里解析模板。鈎子調用格式一般:
{:hook("鈎子名稱"),"[參數]"} 沒參數就不寫。直接寫成這樣{:hook("鈎子名稱")}
到此為止就是用系統默認的模板,一步一步的建立自己的插件,是不是很簡單,就像填空題一樣,只要按照它的規則填空,就ok了。
==================================================

