網頁

4/27/2013

[CI]CodeIgniter & PHPMailer(使用Gmail的SMTP)寄信


想用PHP寄送Email,但使用內建的mail()函數需要有SMTP伺服器很麻煩,網路上有個好用的工具叫PHPMailer它可以使用Gmail的SMTP寄信,接著就介紹一下在CodeIgniter中如何使用。

Step 1:在application\libraries中建立Sendmail.php。
<?php
require_once ("class.phpmailer.php");//載入PHPMailer類別 

class Sendmail
{
 public function send($to, $subject, $body){
  $mail = new PHPMailer();
  $mail->IsSMTP();

  $mail->SMTPAuth = true;//使用Gmail的SMTP需要驗證,所以這裡要設true
  $mail->SMTPSecure = "ssl";

  //Gmail的SMTP是使用465port
  $mail->Host = "smtp.gmail.com";
  $mail->Port = 465;
  $mail->Username = 'xxx@gmail.com';//帳號
  $mail->Password ='xxxxxxxxxxxxxx';//密碼

  $mail->From = 'xxx@gmail.com';//寄件者
  $mail->FromName = 'xxx';//寄件者姓名

  $mail->AddAddress($to);//收件者
   

  $mail->CharSet = "utf-8";
  $mail->Encoding = "base64";
  $mail->IsHTML(true);
  $mail->WordWrap = 50;

  $mail->Subject = $subject;//主旨
  $mail->Body = $body;//內文
  $mail->AltBody = "Your browser does not support HTML";

  $mail->Send();
 }
}
Step 2:在要使用的地方載入此類別,之後就可以使用了。

//載入sendmail
$this->load->library('sendmail');
//寄信
$this->sendmail->send('收件者','主旨','內文');

4/21/2013

[CI]CodeIgniter Session類別

這篇我要介紹如何自己建立一個Session的類別,因為如果有看了CodeIgniter的使用手冊,應該知道CodeIgniter的Session類別是儲存於cookie中,我個人不喜歡使用cookie,因為如果User關閉cookie時,Session就會無法建立,那麼網站就會出問題,所以我在這不介紹官方的使用方式,如果有興趣的人可以直接看使用手冊

Step 1:在application\libraries中建立Originalsession.php。
<?php
class Originalsession
{
 public function __construct()
 {
  session_start();//載入時會執行
 }

        //設定Session值
 public function set( $key, $value )
 {
  $_SESSION[$key] = $value;
 }
      
        //取出Session值,如果沒有值回傳null
 public function get( $key )
 {
  return isset( $_SESSION[$key] ) ? $_SESSION[$key] : null;
 }

        //刪除Session
 public function delete( $key )
 {
  unset( $_SESSION[$key] );
 }
}
?>
Step 2:在要使用的地方載入此類別,之後就可以使用了。

  //載入
$this->load->library('originalsession');

 //設定Session值
$this->originalsession->set('username', $admin['user_id']);

 //取出Session值,如果沒有值回傳null
$this->originalsession->get('username');

  //刪除Session
$this->originalsession->delete('username');

4/20/2013

[CI]CodeIgniter 語言(Language)類別-多國語言網站製作

語言(Language)類別主要是用來製作多國語言的網站,要製作多語的網站要先找到system/language目錄或是application/language 目錄中建立各語系的資料夾及文字檔,之後只要載入Language的類別好了。( CodeIgniter 會先尋找 application/language 目錄,如果找不到符合的檔案,就會尋找 system/language 目錄。)

Step 1: 先建立各語系的資料夾,例如有中文跟英文,就要在system/language目錄或是application/language 目錄中建立chinese及english兩個資料夾。
application/language/chinese
application/language/english

Step 2:建立文字檔,文字檔的命名最後必須是 _lang.php。例如,想建立一個錯誤訊息的文字檔,命名為error_lang.php,但如果偷懶點的人或小型網站,可以建立一個all_lang.php,然後在裡面加點註解就行了。
application/language/chinese/all_lang.php
application/language/english/all_lang.php

Step 3:文字檔內容,language_key是取出資料時的索引值,所以在編輯時要注意不要重覆,建議可以在前面加上頁面名稱或著是文字檔的名稱。
$lang['language_key'] = "要顯示的資料";
Step 4:讀取單一語言的文字檔,在使用前要先將檔案載入,filename->文字檔的檔名(去掉 _lang.php),language->語系的資料夾名稱(如果沒有設定,會使用 application/config/config.php的預設的語言)。
$this->lang->load('filename','language');

Step 5:取出資料,language_key是要顯示的資料索引值。
$this->lang->line('language_key');


4/14/2013

[CI]CodeIgniter動態範例-新聞管理

通常我的習慣是會先規劃資料庫需要哪些欄位,之後把會用到的新增、修改、刪除、列表、取單一值的功能都先寫好,最後才會處理頁面,所以接下來我要寫一個簡單的範例會是用這樣的順序。

Step 1 : 先建立一個叫news的資料表,裡面有id、title、content三個欄位,id為主鍵。

CREATE TABLE `news` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(100) NOT NULL,
  `content` text NOT NULL,
  PRIMARY KEY (`id`)
)


Step 2 :新增模型(Model)檔案名稱為news_model.php存放在application/models資料夾中。
<?php
class News_model extends CI_Model {

 public function __construct()
 {
  $this->load->database();//每次都會先load資料庫
 }

 //新增
 public function create($title, $content)
 {
  //設值
  $this->db->set('title', $title);
  $this->db->set('content', $content);
  $this->db->set('create_time', date('Y-m-d H:i:s'));
  //存入資料庫
  $this->db->insert('news');
  // 產生: INSERT INTO news (title, content, create_time) VALUES ('$title', '$content', '2013-04-05 12:00:00')
 }

 //修改
 public function edit($id, $title, $content)
 {
  //設值
  $this->db->set('title', $title);
  $this->db->set('content', $content);
  //指定要更新的id
  $this->db->where('id', $id);
  //存入資料庫
  $this->db->update('news');
  //產生: UPDATE news SET title = '$title', content = '$content' WHERE id = $id
 }

 //刪除
 public function delete($id){
  $this->db->delete('news', array('id' => $id));
  //產生:  DELETE FROM news WHERE id = $id
 }

 //列表
 public function all(){
  //指定資料表
  $query = $this->db->get('news');
  return $query->result_array();//把找到的結果轉成array
  
 }

 //取單一值
 public function one($id){
  //指定條件,資料表
  $query = $this->db->get_where('news',array('id'=>$id));
  return $query->row_array();//把找到的結果轉成array
 }
}
?>


Step 3 : 新增檢視(View)檔案名稱為index.php及form.php 存放在application/views資料夾中。
index.php列表
<?php foreach($news as $row){?>
 <div class="news-cont-box">
 <h3><?= substr($row['create_time'],0,10)?></h3>
 <h2><?= $row['title']?></h2>
 <p><?= $row['content']?></p>
 </div>
<?php }?>

form.php主要用來做新增跟修改的
<script src="http://code.jquery.com/jquery-1.9.1.js"></script>
<script language="javascript">
$('document').ready(function(){
 $('#save').click(function(){
  if($("#title").val() == ""){
   msg = msg+"標題說明不能為空\n";
  }
  if($("#content").val() == ""){
   msg = msg+"內容不能為空\n";
  }

  if(msg == ""){
   $.post('<?= site_url('news/save')?>',$("#contentForm").serialize(), function(result){
    if (result == 'success'){
     window.location = "<?= site_url('news')?>";
    }else{
     alert(result);
    }
   },
   'text'
   );
  }else{
   alert(msg);
  }
 });
});
</script>


 <form id="contentForm">
  <table border="0" width="100%" cellspacing="0" cellpadding="5" >
   <tbody>
    <tr>
     <td>標題</td>
     <td><input type="text" name="title" id="title" value="<?= $news['title']?>"/></td>
    </tr>
    <tr>
     <td>內文</td>
     <td><textarea id="content" name="content" cols="60" rows="5"><?= $news['content']?></textarea></td>
    </tr>
   </tbody>
  </table>
  <input type="hidden" name="id" id="id" value="<?=  $news ['id']?>"/>
                <input type="button" id="save" name="save" value="儲存" class="button" />
 </form>
Step 4 : 控制器(Controller)檔案名稱為news.php 存放在application/controllers資料夾中。

<?php
class News extends CI_Controller {

 public function __construct()
 {
  parent::__construct();
  $this->load->helper('url');
  $this->load->model('news_model');
 }

 public function index()
 {
  $data['news'] = $this->news_model->all();
  $this->load->view('index',$data);
 }

 public function form($id=null)
 {
  $data['news'] = $this->news_model->one($id);
                $this->load->view('form',$data);
 }

 public function save(){
  try{
   $title = $this->input->post('title');
   $content = $this->input->post('content');
   $id = $this->input->post('id');

   if($id == ""){
    $this->news_model->create($title, $content);
   }else{
    $this->news_model->edit($id, $title, $content);
   }
   echo 'success';
  }catch(Exception $e){
   echo $e;
  }
 }

 public function delete(){
  try{
   $this->news_model->delete($this->input->post('id'));
  }catch(Exception $e){
   echo 'error';
  }
  echo 'success';
 }
}
?>



4/10/2013

[CI]認識CodeIgniter的基本架構

CodeIgniter 是眾多 PHP Framework 中的其中一個,他的架構跟多數的Framewrok一樣是使用M-V-C。
MVC 是把程式邏輯跟視覺的拆開來寫的一種開發方法。它讓你的網頁中只有少量的程式,主要是把PHP跟Html的程式分開來開發。


  • 模型(Model) 裡面可以放很多的function,主要是以資料庫的新增、修改、刪除為主。
  • 檢視(View) 是用來放網頁的內容(Html),在CodeIgniter是可以把多個View在一個頁面中呈現出來,所以像header或footer這些共用的部分可以分開來寫,顯示頁面時再把他們load進來就行了。
  • 控制器(Controller) 在Model跟View之間,處理 HTTP request 以及產生網頁。
CodeIgniter 雖然是採用 MVC 的方法,但它的規則較寬鬆,所以不一定要有Model。 如果你覺得用Model很複雜,你可以只使用Controller跟View來開發網站。CodeIgniter 也可以放入網路上找到的jQuery套件或著自己寫的libraries,讓你用你最習慣、最喜歡的開發網頁。

了解完架構後就來看一下,下載來的資料夾中有哪些檔案吧~~

解壓縮後就可以看到裡面有application、system、user_guide、index.php、license.txt



1. 介紹 index.php 裡有哪些設定是比較重要的:


  1. define('ENVIRONMENT', 'development');  第22行他預設 development 的環境下,Notice、Warning、Error都會顯示出來,因為他的error_reporting設定為 E_ALL ,所以在開發結束後要記得把他改成production不然有可能會造成使用者的困擾。
  2. $system_path = 'system';  第61行,$application_folder = 'application';  第77行
    為了安全性的問題,有些人會把  application跟system這兩個資料夾重新命名或是變動路徑,如果做了變動一定
    要記得改這兩個變數的值。

2. application的資料夾(程式及網頁主要存放的位置):
  1. config資料夾
    裡面常用到的有confg.php、database.php、routes.php
    confg.php 常會用到的是設定base_url及index_page(url中要把index.php拿掉需要在這設定)
    database.php 會用到資料庫的話要在這裡設定連線主機、使用者、密碼、資料庫名稱。
    routes.php 可以設定default的頁面還有404錯誤時的頁面,看檔案名稱就可以知道,它主要是用來設定轉址的例如:http://www.xxx.com/news/view/id,希望url可以短一點省略掉view,可以加一行 $route['news/(:any)'] = 'news/view/$1'; 到這隻檔案中這樣網址就只要輸入 http://www.xxx.com/news/id 就會導到正確的頁面。
  2. controllers、libraries、models、views這四個資料夾就是我們主要放程式的地方了,之後的文章再寫範例仔細的介紹。
3. system資料夾:系統的核心程式,內有許多好用的類別,想知道使用方法可以到http://www.codeigniter.org.tw/user_guide/去了解,之後我也會挑幾個我用過的來介紹。

4.user_guide資料夾:網頁放到伺服器上可以不用上傳這個資料夾,因為它只是使用手冊,所以不需要的人可以直接刪除。



3/31/2013

JQuery- 圖文編輯器[CKEditor整合KCFinder]

        CKEditor 是一套所見即所得(WYSIWYG)HTML 編輯器,多數用在網站或部落格上,支援多種常用瀏覽器,提供的功能相當多且完整,但他並不包含圖片的上傳管理,通常在發表文章時總希望會有美美的圖片做為點綴,這時就可以搭配免費的KCFinder來做使用,接下來就告訴大家如何將CKEditor整合KCFinder

Step1:先到CKEditorKCFinder下載程式

Step2:各自解壓縮後分別名命為ckeditor及kcfinder,然後把kcfinder的整個資料夾放入ckeditor中
Step3:打開ckeditor資料夾中的config.js,將下面的內容整個覆蓋上去
CKEDITOR.editorConfig = function( config )
{
 config.filebrowserBrowseUrl = '/ckeditor/kcfinder/browse.php?type=files';
 config.filebrowserImageBrowseUrl = '/ckeditor/kcfinder/browse.php?type=images';
 config.filebrowserFlashBrowseUrl = '/ckeditor/kcfinder/browse.php?type=flash';
 config.filebrowserUploadUrl = '/ckeditor/kcfinder/upload.php?type=files';
 config.filebrowserImageUploadUrl = '/ckeditor/kcfinder/upload.php?type=images';
 config.filebrowserFlashUploadUrl = '/ckeditor/kcfinder/upload.php?type=flash';
};

Step4:打開kcfinder資料夾中的config.php
  • 'disabled' => true,改為'disabled' => false,
  • '_check4htaccess' => true,改為'_check4htaccess' => false,

Step5:在ckeditor資料夾中建立index.php將下列的程式貼上
<!DOCTYPE html>
 <html>
 <head>
  <title>CKEditor Samples</title>
  <meta charset="utf-8">
  <script type="text/javascript" src="ckeditor.js"></script>
  <script language="javascript">
   CKEDITOR.replace('editor1');
  </script>
 </head>
 <body>
  <textarea id="editor1" name="editor1" class="ckeditor"></textarea>
 </body>
</html>
這樣就完成了喔~~


下面有些設定,如果需要也可以加上:

1.CKEditor 預設如果從 WORD (或來自剪貼簿) 複製文字 (段落) 後貼上 CKEditor 會造成字體格式跑掉,變成沒有顏色亦沒有字體大小,解決方法就是打開ckeditor資料夾中的config.js,在裡頭加入下面那兩行程式碼即可。
config.pasteFromWordRemoveFontStyles = false;
config.pasteFromWordRemoveStyles = false;

2.KCFinder上傳中文檔名的檔案,通常上傳中文檔名的檔案都會有問題,所以可以編輯ckeditor/kcfinder/core/uploader.php
先找到341行$filename = strtr($filename, $this->config['filenameChangeChars']);
然後在那行下面加入以下的程式即可

if(mb_strlen($filename,"Big5") != strlen($filename)){
  $file_end=end(explode('.', $filename));
  $filename =  time().".".$file_end;
}

3/28/2013

重設TCP/IP


Windows的網路產生問題時(例:辦公室的內網IP重複、電腦中毒),可以依照下面的方式重設TCP/IP去修復網路。

1.開啟命令提示字元,請按一下 [開始] 然後在 [搜尋程式及檔案] 中輸入 CMD

2.在 [程式集] 中的 [CMD.exe] 圖示上按右鍵,然後選擇 [以管理員身分執行]
  #如果是Window XP可以直接點擊圖示開啟

3.在命令提示字元中,複製並貼上 (或輸入) 下列命令,然後按下 ENTER:
netsh int ip reset c:\resetlog.txt
注意 如果您不要指定記錄檔的目錄路徑,請使用下列命令:
netsh int ip reset resetlog.txt
4.將電腦重新開機。