1. CakePHP的应用程序脚手架
到CakePHP的app目录下
eg:
cd ../CakePHP/app
php ..\cake\console\cake.php bake
按提示步骤操作
Model
Controler
View
...
参考资料:
http://book.cakephp.org/cn/view/1522/Code-Generation-with-Bake
2. ACL 访问控制
参考《cakephp acl 使用说明》
参考资料:
http://book.cakephp.org/cn/view/1543/Simple-Acl-controlled-Application ACL应用的简单示例
3. CAS的集成
* 资源准备
# CAS的php客户端
下载地址: http://downloads.jasig.org/cas-clients/php/current/CAS-1.2.0.tgz
当前版本: 1.2.0
# CakePHP引入CAS客户端
把CAS客户端复制到CakePHP的./app/venders下
# 在项目中应用CAS客户端
在./app/app_controller.php里面引入CAS.php
eg: App::import('Vendor', 'phpCAS', array('file' => 'CAS.php'));
代码
eg:// 初始化 phpCAS hostname 域名 port 端口 appname 应用名称
phpCAS::client(CAS_VERSION_2_0, $hostname, $port, $appname);
// no SSL validation for the CAS server
phpCAS::setNoCasServerValidation();
// force CAS authentication
phpCAS::forceAuthentication();
// at this step, the user has been authenticated by the CAS server
// and the user's login name can be read with phpCAS::getUser().
// logout if desired
if (isset($_REQUEST['logout'])) {
phpCAS::logout();
}
//获得登录的用户名
$this->loggedUser = phpCAS::getUser();
* 参考资料
https://wiki.jasig.org/display/CASC/phpCAS
4. JIRA接口的使用
* jira配置要求
参照Url: http://confluence.atlassian.com/display/JIRA/Creating+a+SOAP+Client
* 权限Check
a. does the intended developer have the permission to be assigned issues?
b. does the Jira Administrator has the permission to assign issues? (remember, a Jira Admin can administrate the system, it does not necessarily grant any rights in projects...)
c.I'm not so sure about this one, but I think for SOAP to set a field, you might have to have the field on the "Create" screen.
Simple way to test this - log in as the Jira Admin user and click "create" and check what appears in the "assignee" field...
* create issue
在创建页面需显示创建issue时必要的field。
备注:如果不显示assignee的选项,在soap中不能修改assignee,显示为默认项目负责人。同时创建用户需要assgin权限。
代码:
<?php
// Jira WSDL
$wsdl = “http://localhost:8080/rpc/soap/jirasoapservice-v2?wsdl”;
// Login info
$login = “admin”;
$password = “111111”;
// Create the soap Client
$client = new soapclient($wsdl);
// Login to Jira
$login = $client->login( $login,$password);
$project = "CHECKING";
$type = 6;
$date = date('Ymd');
$detailUrl = JIRA_DETAIL_URL;
$userName = “test”;
$remoteIssue = array(array ("customfieldId"=>"customfield_10050", "values"=>array (“test0”)),
array ("customfieldId"=>"customfield_10123", "values"=>array (“test1”)),
array ("customfieldId"=>"customfield_10167", "values"=>array (“test2”)));
$issue = array(
"project" => $project,
"type" =>3,
"summary" => “TESTDEMO”,
"assignee"=>$userName,
"reporter"=>$login,
"customFieldValues" => $remoteIssue
);
// Create the Issue
$remoteIssue = $client->createIssue( $login,$issue);
// Add attachment
$attachment_file =”d:\\1.txt”;
$content = base64_encode(file_get_contents($attachment_file));
$attachmentName = basename($attachment_file);
$result = $client->addBase64EncodedAttachmentsToIssue($login, $remoteIssue->key, array($attachmentName), array($content) );
?>
5. 自定义Component(组件)
a. 日志组件LogHelper
参考《CakePHP 日志组件LogHelper》
b. 防止重复提交组件TokenHelper
为了防止form重复提交,而选择的token控件!
使用说明:
# 定义token控件 token_helper.php
<?php
class TokenHelperComponent extends Object {
var $components = array('Session');
var $token = null;
//called before Controller::beforeFilter()
function initialize(&$controller, $settings = array()) {
// saving the controller reference for later use
$this->controller =& $controller;
}
function token(){
$this->token = mt_rand(0,100000000);
$this->Session->write('token',$this->token);
}
function getToken(){
return $this->token;
}
function isFirstSubmit( $token = null ){
if($this->Session->read('token') == $token){
return true;
}
return false;
}
function del(){
$this->Session->write('token','');
$this->token = null;
return;
}
//called after Controller::render()
function shutdown(&$controller) {
}
}
?>
# controller中的使用
* 引入控件
var $components = array('TokenHelper');
* form入口method中使用
$this->TokenHelper->token();
......
$this->set('token', $this->TokenHelper->getToken());
* form提交method中使用
if($this->TokenHelper->isFirstSubmit($this->data['token'])){
$this->TokenHelper->del();
......
}else{
//重复提交的结果
......
}
# form页面
* 引入token
<?php echo $this->Form->input('token',array('label'=>false,'div'=>false,'class'=>'from_input','type'=>'hidden','value'=>$token)); ?>
备注:
参考php重复提交处理方案
c. 文件操作组件FileHelper
文件操作控件集合创建目录、文件,读取文件、文件内容、文件扩展名,删除文件等操作!
# cakephp扩展组件
php代码[app/controllers/components目录下]
file_helper.php
代码:
<?php
class FileHelperComponent extends Object {
var $components = array('LogHelper');
//called before Controller::beforeFilter()
function initialize(&$controller, $settings = array()) {
// saving the controller reference for later use
$this->controller =& $controller;
}
/**
* create dir
*/
function mkFiledir($path){
if(!file_exists($path)){
mkdir($path);
}
}
/**
* create file
*/
function createFile($filename,$content = null){
$ourFileName = $filename;
$ourFileHandle = fopen($ourFileName, 'w') or die("can't open file");
fwrite($ourFileHandle, $content);
fclose($ourFileHandle);
}
/**
* append content
*/
function appendFile($filename,$appendFile = null){
$ourFileName = $filename;
$content = '';
if (file_exists($appendFile) && is_file($appendFile)) {
$file = fopen($appendFile, "r") or exit("Unable to open file!");
//Output a line of the file until the end is reached
while(!feof($file)){
$line = fgets($file);
$content .= $line.PHP_EOL;
}
}else{
$this->LogHelper->setAddLog(array("SMessage"=>$rCurShaFileName."文件找不到","Result"=>false));
return;
}
if(!empty($content)){
$content = PHP_EOL.$content;
}
$ourFileHandle = fopen($ourFileName, 'a+') or die("can't open file");
fwrite($ourFileHandle, $content);
fclose($ourFileHandle);
}
/**
* exist file
*/
function isFileExist($filename){
if (file_exists($filename) && is_file($filename)) {
return true;
}
return false;
}
/**
* delete file
*/
function delFile($filename){
if (file_exists($filename) && is_file($filename)) {
unlink($filename);
}
}
/**
* file extension
*/
function extend($file_name){
$extend = pathinfo($file_name);
$extend = strtolower($extend["extension"]);
return $extend;
}
/**
* file content
*/
function getContent($filename){
$content = file_get_contents($filename);
return $content;
}
/**
* base name
*/
function getBaseName($filename){
$name = basename($filename);
return $name;
}
function download($fileName, $downloadFile) {
$speed = 100; // 8,5 kb/s download rate limit
if (file_exists($downloadFile) && is_file($downloadFile)) {
header('Cache-control: private');
header('Content-Type: application/octet-stream');
header('Content-Length: ' . filesize($downloadFile));
header('Content-Disposition: filename=' . $fileName);
flush();
$fd = fopen($downloadFile, 'r');
while (!feof($fd)) {
echo fread($fd, round($speed * 1024));
flush();
sleep(1);
}
fclose($fd);
$this->LogHelper->setLog('download',array("File"=>$downloadFile,"Result"=>true));
} else {
$this->LogHelper->setLog('download',array("File"=>$downloadFile,"Message"=>"文件不存在!","Result"=>false));
return;
}
}
//called after Controller::render()
function shutdown(&$controller) {
}
}
?>
# controller中的使用
* 引入控件
var $components = array('FileHelper');
* method中使用
eg:
//创建目录
$this->FileHelper->mkFiledir($path);
//创建文件
$this->FileHelper->createFile($filename, $content);
//在file1上追加file2文件内容
$this->FileHelper->appendFile($file1, $file2);
//判断文件是否存在
$this->FileHelper->isFileExist($filename);
//删除文件
$this->FileHelper->delFile($filename);
//获得文件扩展名
$this->FileHelper->extend($filename);
//获得文件内容
$this->FileHelper->getContent($filename);
//获得文件名
$this->FileHelper->getBaseName($filename);
d. 时间操作组件DateHelper
日期时间的操作方法
# cakephp扩展组件
php代码[app/controllers/components目录下]
date_helper.php
代码:
<?php
class DateHelperComponent extends Object {
//called before Controller::beforeFilter()
function initialize(&$controller, $settings = array()) {
// saving the controller reference for later use
$this->controller =& $controller;
}
/**
* java时间毫秒数转php时间
* format "Y-m-d H:i:s"
*/
function javaTimeMilToPhpDate($format, $time){
return date($format,$time/1000);;
}
/**
* format Y-m-d
*/
function dates_inbetween($date1, $date2, $format){
$day = 60*60*24;
$date1 = strtotime($date1);
$date2 = strtotime($date2);
$days_diff = round(($date2 - $date1)/$day); // Unix time difference devided by 1 day to get total days in between
$dates_array = array();
$dates_array[] = date($format,$date1);
for($x = 1; $x < $days_diff; $x++){
$dates_array[] = date($format,($date1+($day*$x)));
}
$dates_array[] = date($format,$date2);
return array_unique($dates_array);
}
/**
* date compare
*/
function greaterDate($start_date,$end_date){
$start = strtotime($start_date);
$end = strtotime($end_date);
if ($start-$end > 0)
return 1;
else
return 0;
}
//called after Controller::render()
function shutdown(&$controller) {
}
}
?>
# controller中的使用
* 引入控件
var $components = array('DateHelper');
* method中使用
eg:
//java时间毫秒数转成php的Date数据
$this->DateHelper->javaTimeMilToPhpDate($format, $time);
//两个日期间的日期列表
$this->DateHelper->dates_inbetween($date1, $date2, $format);
//两个日期间的比较
$this->DateHelper->greaterDate($date1, $date2);
e. Redis的客户端Predis应用组件RedisClient
redis的操作方法
# cakephp扩展组件
php代码[app/controllers/components目录下]
redis_client.php
代码:
<?php
App::import('Vendor', 'Predis_Client', array('file' =>'Predis'.DS.'SharedConfigurations.php'));
class RedisClientComponent extends Object {
// Predis info
var $redis = null;
var $redis_publish = null;
var $pubsub = null;
//called before Controller::beforeFilter()
function initialize(&$controller, $settings = array()) {
// saving the controller reference for later use
$this->controller =& $controller;
//redis
$this->_initCommonClient();
}
function _initCommonClient(){
$this->redis = new Predis_Client(array(
'host' => REDIS_HOST,
'port' => REDIS_PORT,
));
}
/**
* client add value
*/
function setValue( $key, $val ){
//不存在就添加
if(!$this->redis->exists($key)){
$this->redis->set($key, $val);
}else{
$this->redis->del($key);
$this->redis->set($key, $val);
}
}
/**
* client get value
*/
function getValue($key){
return $this->redis->get($key);
}
/**
* client delete value
*/
function del($key){
if($this->redis->exists($key)){
$this->redis->del($key);
}
}
//called after Controller::render()
function shutdown(&$controller) {
}
}
?>
# controller中的使用
* 引入控件
var $components = array('RedisClient');
* method中使用
eg:
//添加值
$this->RedisClient->setValue( $key, $val );
//获得值
$this->RedisClient->getValue($key);
//删除值
$this->RedisClient->del(key);