PHP CI MANIA 0.8.4.4 การนำโค้ดไปใช้กับ CodeIgniter 3 เวอร์ชั่นล่าสุด

โดย SONGCHAI SAETERN
ขั้นตอนการนำโค้ดจาก Project เดิมที่เป็น CodeIgniter 3 เวอร์ชั่นเก่า ไปใช้ในเวอร์ชั่น 3.1.11

1. ดาวน์โหลดที่ http://www.codeigniter.com


2. คลายซิปไปยังโฟลเดอร์ที่เก็บโปรเจ็กต์ของเรา


3. ซึ่งถ้าใช้ XAMPP แบบติดตั้งปกติจะอยู่ที่ C:\xampp\htdocs



4. จากนั้นก็เปลี่ยนชื่อเป็น Project ที่ต้องการ



5. คัดลอกไฟล์จาก Project ที่เป็น CodeIgniter 3 เวอร์ชั่นเก่าไปยัง CodeIgniter 3 เวอร์ชั่นใหม่ โดยเริ่มจาก application/config เลือกไฟล์ตามในภาพ


6. ต่อมาก็เลือกไฟล์ส่วนที่เราสร้างขึ้นมาเอง ซึ่งอยู่ใน application โดยมีด้วยกัน 8 โฟลเดอร์




7. ส่วนสุดท้ายก็คือโฟลเดอร์ assets ที่เราใช้เก็บไฟล์เทมเพลต และ JavaScript, CSS, รูปภาพ และอื่นๆที่ที่เกี่ยวกับส่วนของ Front-end เพิ่มเติม


8. หลังจากนำไฟล์ไปวางทับใน CodeIgniter 3 เวอร์ชั่นล่าสุดที่เราดาวน์โหลดมาเรียบร้อยแล้ว ให้ทำการลบโฟลเดอร์ที่เก็บคู่มือการใช้งาน CodeIgniter ออกจากโปรเจ็กต์ของเรา เพราะไม่จำเป็นต้องใช้ก็ได้




เพียงเท่านี้เราก็สามารถนำโค้ดจากเทมเพลตใน CodeIgniter 3 เวอร์ชั่นเดิม ไปใช้กับ CodeIgniter 3 เวอร์ชั่นล่าสุดได้แล้วครับ



สมาชิกสามารถดาวน์โหลด PHP CI MANIA : PATCH 0.8.4.04 เพื่ออัพเดตเทมเพลตที่ใช้กับ CodeIgniter 3.1.11 ได้ที่หน้า Downloads ได้เลยครับ






PHP CI MANIA - PHP Code Generator 

โปรแกรมช่วยสร้างโค้ด "ลดเวลาการเขียนโปรแกรม"
http://fastcoding.phpcodemania.com/index.php/#purchase-order
ราคาสุดคุ้ม  4,500  บาท
http://fastcoding.phpcodemania.com

PHP CI MANIA อัพเดตระบบสมาชิก พร้อมระบบล็อกอิบ แบบลืมรหัสผ่านทั้งอีเมล และตอบคำถาม

โดย SONGCHAI SAETERN
สิ่งที่เปลี่ยนแปลงในเทมเพลตเวอร์ชั่นนี้คือ การล็อกอินจะย้ายเข้าไปอยู่ใน Modules
ซึ่งถ้าจะเอาไปใช้กับเทมเพลตเดิม ก็จะต้องคัดลอกโฟลเดอร์ 2 โฟลเดอร์ คือ

1. application/modules/member
2. assets/js_modules/member

และนอกจากนี้ยังต้องเปลี่ยนลิงค์สำหรับ Login และ Logout อีก 2 จุดด้วยกัน คือ
1. application/views/template/sb-admin-bs4/top_navbar_view.php
2. application/views/template/sb-admin-bs4/homepage_view.php


หากต้องการใช้กับ example_project ที่เป็นเวอร์ชั่นก่อนหน้านี้ มีขั้นตอนดังต่อไปนี้

เริ่มจากการเปลี่ยนลิงค์สำหรับ Logint ไปที่ /member/login


โดยเข้าไปแก้ไขที่ไฟล์ application/views/template/sb-admin-bs4/top_navbar_view.php


ต่อมาส่วนของการ Logout ให้ไปที่ /member/logout
โดยเข้าไปแก้ไขที่ไฟล์ application/views/template/sb-admin-bs4/homepage_view.php



คัดลอกไฟล์ส่วนของ PHP ที่ตำแหน่ง application/modules/member  ชื่อโฟลเดอร์ member ไปวางในตำแหน่งเดียวกันของโปรเจ็กต์ที่ต้องการ


คัดลอกไฟล์ส่วนของ JavaScript ที่ตำแหน่ง assets/js_modules/member  ชื่อโฟลเดอร์ member ไปวางในตำแหน่งเดียวกันของโปรเจ็กต์ที่ต้องการ






สมาชิกดาวน์โหลดได้ที่ http://fastcoding.phpcodemania.com/index.php/downloads




การส่งอีเมล์ด้วย PHP โดยมีการเรียกใช้งาน Authen Account ของ Gmail
https://phpcodemania.blogspot.com/2015/11/php-authen-account-gmail.html


PHP กับการเขียนโปรแกรมส่ง Email ด้วย CodeIgniter - email library
https://phpcodemania.blogspot.com/2018/02/php-email-codeigniter-email-library.html


PHP CI MANIA - PHP Code Generator 

โปรแกรมช่วยสร้างโค้ด "ลดเวลาการเขียนโปรแกรม"
http://fastcoding.phpcodemania.com/index.php/#purchase-order
ราคาสุดคุ้ม  4,500  บาท
http://fastcoding.phpcodemania.com



วิดีโอตัวอย่างการทำงาน




PHP ประมวลผลไฟล์ zip จาก Google Form

โดย SONGCHAI SAETERN
ดาวน์โหลดข้อมูลจาก Google Form เอามาอัพโหลดประมวลผลใน PHP



ตัวอย่างโค้ด
<?php


if( isset($_FILES) && isset($_FILES["FileUpload1"]["name"]) && $_FILES["FileUpload1"]["name"] != '' ){
    $zip = zip_open($_FILES["FileUpload1"]["tmp_name"]);

    if ($zip)
      {
        while ($zip_entry = zip_read($zip))
        {
            echo "<p>";
            echo "<b>ชื่อไฟล์ : </b> <span class='text-primary'>" . zip_entry_name($zip_entry) . "</span><br />";

            if (zip_entry_open($zip, $zip_entry))
            {
                echo "File Contents:<br/>";
             
                $contents = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
                $data = array_map("str_getcsv", preg_split('/\r*\n+|\r+/', $contents));
                echo '<pre>';
                print_r($data);
                echo '</pre>';
                echo '<hr/>';
             
                zip_entry_close($zip_entry);
            }
           
            echo "</p>";
        }

    zip_close($zip);
    }
}

?>

<form enctype="multipart/form-data" action="index.php?page=gfmis&m=satisfaction_process" method="post">
    <div class="panel panel-primary">
        <div class="panel-heading">
            <h2 class="panel-title">
                <b>อัพโหลดข้อมูลแบบฟอร์มสำรวจความพึงพอใจ</b>
            </h2>
        </div>
        <div class="panel-body">
            <table cellspacing="0" cellpadding="0" border="0">
                <tbody>
                    <tr>
                        <td width="20">&nbsp;</td>
                        <td class="title" style="text-align:left">เลือกไฟล์ Excel</td>
                    </tr>
                    <tr>
                        <td></td>
                        <td class="title_content">
                            <input type="file" id="FileUpload1" name="FileUpload1">
                        </td>
                    </tr>
                    <tr>
                        <td colspan="2" class="title_content">
                            <br/>
                            <input type="submit" id="Button1" value="ตรวจสอบข้อมูล" name="Button1">
                        </td>
                    </tr>
                </tbody>
            </table>
        </div>
    </div>
</form>


แหล่งอ้างอิง

PHP zip_entry_read() Function
https://www.w3schools.com/php/func_zip_entry_read.asp

Import CSV zipped file date to mysql
https://www.webmasterworld.com/php/4078430.htm

Converting CSV to array
https://stackoverflow.com/questions/7502370/converting-csv-to-array

PHP CI MANIA สร้างฟังก์ชั่นค้นหาข้อมูลจากตารางอื่น และทำการตรวจสอบเพื่อแสดงสถานะในรูปแบบปุ่มสีต่างๆ

โดย SONGCHAI SAETERN
เขียนโปรแกรมเว็บแอพพลิเคชั่นด้วยภาษา PHP




ตรวจสอบชื่อตัวแปรที่ใช้ใน list_view.php ตัวอย่างนี้คือ {status}


สร้างตัวแปรอาร์เรย์รับค่าจากฟังก์ชั่น $this->getStatus() ที่ไปค้นหาข้อมูลจากตารางอื่น



        private function setDataListFormat($lists_data, $start_row=0)
{
$data = $lists_data;
$count = count($lists_data);
for($i=0;$i<$count;$i++){
$start_row++;
$data[$i]['record_number'] = $start_row;
$pk1 = $data[$i]['id'];
$data[$i]['url_encrypt_id'] = urlencode(encrypt($pk1));

if($pk1 != ''){
$pk1 = encrypt($pk1);
}
$data[$i]['encrypt_id'] = $pk1;
$data[$i]['preview_ref_province_id'] = $this->setRefProvinceIdSubject($data[$i]['ref_province_id']);
$data[$i]['preview_ref_amphur_id'] = $this->setRefAmphurIdSubject($data[$i]['ref_amphur_id']);
$data[$i]['preview_ref_district_id'] = $this->setRefDistrictIdSubject($data[$i]['ref_district_id']);
//เพิ่มตัวแปรใหม่
$data[$i]['status'] = $this->getStatus($data[$i]['ref_student_id']); //ส่งเงื่อนไขที่ใช้ค้นหา ตัวอย่างค้นด้วยไอดีนักเรียน
}
return $data;
}


สร้างฟังก์ชั่น เพื่อค้นหาข้อมูลจากตารางอื่น และตรวจสอบ แสดงสถานะในรูปแบบปุ่มสี

private function getStatus($value)
        {
$cause = $this->Address_list->getValueOf('tb_results', 'id', "ref_student_id = '$value'");
if($cause == ''){
$result = '<a class="btn btn-warning">อยู่ในระหว่างดำเนินการ</a>';
}else{
$result = '<a class="btn btn-success">ดำเนินการเรียบร้อย</a>';
}
return $result;
}


ก็จะได้สถานะจากตารางอื่นมาแสดงในตารางรายการ





กรณีที่ต้องการมากกว่า 1 ฟิลด์ ให้ใช้คำสั่ง  getRowOf() นะครับ

ตัวอย่าง

$titleRow = $this->Resume->getRowOf('tb_members', 'username, fullname, lastname, email', "userid =  $data[member_id]", $this->db)
if(!empty($titleRow)){ 
    $memberIdUsername = $titleRow['username'];     
    $memberIdFullname = $titleRow['fullname'];            
    $memberIdLastname = $titleRow['lastname'];     
    $memberIdEmail = $titleRow['email']; 
}else{             
    $memberIdUsername = ''; 
    $memberIdFullname = '';     
    $memberIdLastname = ''; 
    $memberIdEmail = ''; 
}





PHP CI MANIA - PHP Code Generator 

โปรแกรมช่วยสร้างโค้ด "ลดเวลาการเขียนโปรแกรม"
http://fastcoding.phpcodemania.com/index.php/#purchase-order
ราคาสุดคุ้ม  4,500  บาท
http://fastcoding.phpcodemania.com

CodeIgniter 3 เรียนรู้พื้นฐาน MVC กับการประยุกต์ใช้จริงด้วย Shopping Cart (Codeigniter for Beginners)

โดย SONGCHAI SAETERN


CodeIgniter 3 เรียนรู้พื้นฐานกับการประยุกต์ใช้จริง 

บทนำ
            สิ่งที่จะได้หลังจากเรียนรู้จากหนังสือเล่มนี้

บทที่ 1 ทำความรู้จักกับ CodeIgniter 3
            - การเขียน PHP แบบธรรมดา
            - การเขียน PHP แบบใช้ CodeIgniter Framework
            - สรุปความน่าสนใจของ CodeIgniter Framework

บทที่ 2 เริ่มต้นใช้งาน CodeIgniter 3
            - ดาวน์โหลดและติดตั้งใช้งาน
            - MVC คืออะไร (มาลองฝึกเขียนแบบแยกส่วนออกจากกัน)
            - Helper ที่ใช้ต้องรู้จัก ( Functions )
                - File
                - URL
                - การสร้าง Helper ไว้ใช้เอง
            - Library ที่ได้ใช้งานบ่อยๆ
                - Form Validation
                - Database
                - Session
                - Parser
                - File upload
                - E-Mail
                - การสร้าง Library ไว้ใช้เอง
            - การส่งค่าผ่าน Form และ URL
            - การเชื่อมต่อและจัดการฐานข้อมูล MySQL
                - การตั้งค่า Config เพื่อเชื่อมต่อฐานข้อมูล
                - การเพิ่ม/แสดง/แก้ไข/ลบ ข้อมูล ( CRUD )
                - การตรวจสอบค่าซ้ำ / นับจำนวน / หาผลรวม ( UNIQUE / COUNT / SUM)
                - การแสดงข้อมูลเชื่อมกันตั้งแต่ 2 ตารางขึ้นไป ( JOIN )
                - โปรแกรมจัดการฐาน HeidiSQL

บทที่ 3 ดาวน์โหลด Bootstrap Front-End Framework สำหรับสร้างเทมเพลตเว็บไซต์
            - ขั้นตอนการดาวน์โหลด
            - วิธีใช้งานใน CodeIgniter
            - การค้นหา Template มาใช้งาน

บทที่ 4 ออกแบบองค์ประกอบหน้าเว็บสำหรับขายสินค้าโดยใช้ Bootstrap template
            - ออกแบบแผนผังเว็บไซต์ขายของออนไลน์
            - สร้าง Views สำหรับหน้าเว็บส่วนต่างๆ
                - Home
                - Product List
                - Product Detail
                - Cart
                - Checkout
                - Order Tracking
                - Stock Management

บทที่ 5 การออกบบฐานข้อมูล
            - ออกแบบแผนผังข้อมูลอย่างย่อ (Data Flow Diagram)
            - ออกแบบความสัมพันธ์ของข้อมูลแต่ละตาราง (ER Diagram)
            - สร้างฐานข้อมูลตามแผนผังที่ได้ออกแบบไว้

บทที่ 6 เริ่มต้นเขียนโค้ดเชื่อมต่อฐานข้อมูล MySQL
            - ออกแบบฟังก์ชั่นใน Controller ที่จะใช้งานในแต่ละหน้า (ตามแผนผังเว็บไซต์)
            - ออกแบบฟังก์ชั่นใน Model ที่จะต้องใช้ในแต่ละส่วน (ตามฐานข้อมูลที่ออกแบบไว้)
            - นำส่วนต่างๆมารวมเข้าด้วยกันสำหรับเรียกใช้งานในแต่ละเมนู

บทที่ 7 ทดสอบการทำงานของระบบ
            - กำหนดเงื่อนไขที่ต้องการทดสอบ
            - ทดสอบทุกเมนูตามเงื่อนไขที่กำหนดไว้
            - แก้ไขข้อผิดพลาดและทดสอบจนครบทุกเงื่อนไขที่กำหนดเพิ่มเติม

ภาคผนวก ก ติดตั้ง XAMPP ใน Windows แบบ Portable
ภาคผนวก ข รวมข้อความ Error และวิธีการแก้ไข
ภาคผนวก ค รวมรายชื่อ Libraries
            




แก้ปัญหาการ submit ส่งค่าใน Form แต่ไม่มีค่าไปด้วย readonly & disabled

โดย SONGCHAI SAETERN
การใช้งาน Select box กับคำสั่งของ select2() จำเป็นจะต้องสั่ง readonly อีกครั้ง เพราะ select2 จะมีผลแค่กับคำสั่ง disabled แต่ถ้าหากเรา diabled ค่าในแบบฟอร์มก็จะไม่ส่งไปด้วย!!

เพิ่มฟังก์ชั่นใน JavaScript เพื่อทำการเซ็ต Readonly ให้กับ Select Box ที่กำหนดเป็น readonly เอาไว้

var Menulevel = {

current_page : 0,
current_path : '',

// load preview to modal
loadPreview: function(id){
$.ajax({
method: 'GET',
url: site_url('menulevel/menulevel/preview/'+ id),
success: function (results) {
$('#divPreview').html(results);
},
error : function(jqXHR, exception){
ajaxErrorMessage(jqXHR, exception);
}
});
$('#modalPreview').modal('show');
},

// 
//
//
//
//Add another function
setDropdownReadonly: function(){
$(document).ready(function() {
$("select[readonly]").select2("readonly", true);
});
}

}

แก้ไขส่วนของ Controller เพิ่มการเรียกใช้งานฟังก์ชั่นใน JavaScript

public function edit($encrypt_id = '')
{
//JavaScript
$this->another_js .= '<script>Menulevel.setDropdownReadonly();</script>';

                //
                //
                //
        }


ในส่วนของแบบฟอร์ม HTML

                <select id='menu_id'  name='menu_id' value="{record_menu_id}" diabled>
<option value="">- เลือก เมนู -</option>
{tb_menu_item_menu_id_option_list}
</select>

เปลี่ยนเป็น readonly

                <select id='menu_id'  name='menu_id' value="{record_menu_id}" readonly >
<option value="">- เลือก เมนู -</option>
{tb_menu_item_menu_id_option_list}
</select>


วิดีโอประกอบคำอธิบาย






PHP CI MANIA - PHP Code Generator 

โปรแกรมช่วยสร้างโค้ด "ลดเวลาการเขียนโปรแกรม"
http://fastcoding.phpcodemania.com/index.php/#purchase-order
ราคาสุดคุ้ม  4,500  บาท
http://fastcoding.phpcodemania.com

การค้นหาแบบระบุ ช่วงวันที่ - CodeIgniter ( PHP CI MANIA )

โดย SONGCHAI SAETERN


ส่วนของ Controller เมื่อเกิดการค้นหาจะตรวจสอบค่า POST
if (isset($_POST['submit'])) {
$search_field =  $this->input->post('search_field', TRUE);
$value = $this->input->post('txtSearch', TRUE);
$arr = array($this->Portfolio->session_name . '_search_field' => $search_field, $this->Portfolio->session_name . '_value' => $value );
$this->session->set_userdata($arr);
} else {
$search_field = $this->session->userdata($this->Portfolio->session_name . '_search_field');
$value = $this->session->userdata($this->Portfolio->session_name . '_value');
}


เพิ่มค่า POST อื่นๆเข้าไปใน Controller

if (isset($_POST['submit'])) {
$search_field =  $this->input->post('search_field', TRUE);
$value = $this->input->post('txtSearch', TRUE);
// เพิ่มตัวแปรอื่นๆ
$begin_date = $this->input->post('begin_date', TRUE);
$final_date = $this->input->post('final_date', TRUE);
$arr = array(
$this->Portfolio->session_name . '_search_field' => $search_field, 
$this->Portfolio->session_name . '_value' => $value,
$this->Portfolio->session_name . '_begin_date' => $begin_date, //<- วันที่เริ่มต้น
$this->Portfolio->session_name . '_final_date' => $final_date  //<- วันที่สิ้นสุด
);
$this->session->set_userdata($arr);
} else {
$search_field = $this->session->userdata($this->Portfolio->session_name . '_search_field');
$value = $this->session->userdata($this->Portfolio->session_name . '_value');
// เพิ่มตัวแปรอื่นๆ
$begin_date = $this->session->userdata($this->Portfolio->session_name . '_begin_date');
$final_date = $this->session->userdata($this->Portfolio->session_name . '_final_date');
}


ส่วนของ Model ที่ต้องแก้ไข
สังเกตที่ตัวแปร $where
ส่วนนี้จะเป็นค่าเริ่มต้นของระบบที่ตรวจสอบฟิลด์ที่ใช้ค้นหาแบบฟิลด์เดียว

if($search_field != '' && $value != ''){
$search_method_field = "$this->my_table.$search_field";
$search_method_value = '';
if($search_field == 'portfolio_id'){
if(!is_numeric($value)){
$value = 0;
}
$value = $value + 0;
$search_method_value = "= $value";
}
$where .= ($where != '' ? ' AND ' : '') . " $search_method_field $search_method_value "; 
if($order_by == ''){
$order_by = " $this->my_table.$search_field";
}
}
// เพิ่มเงื่อนไขอื่นๆที่นี่
// รับค่าจาก SESSION
$begin_date = $this->session->userdata($this->session_name . '_begin_date');
$final_date = $this->session->userdata($this->session_name . '_final_date');
$begin_date = setDateToStandard($begin_date);
$final_date = setDateToStandard($final_date);

if($begin_date  != '' && $final_date != ''){
$where .= ($where != '' ? ' AND ' : '') . " your_date_field BETWEEN $begin_date AND $final_date "; 
}


เราสามารถเพิ่มโค้ดต่อท้ายโดยเช็คจาก SESSION ที่เราเพิ่มเข้าไปใน Controller แล้วก็เพิ่มคำสั่งเงื่อนไขที่ต้องการในตัวแปร $where เพิ่มจากเดิมได้เลยครับ







PHP CI MANIA - PHP Code Generator 

โปรแกรมช่วยสร้างโค้ด "ลดเวลาการเขียนโปรแกรม"
http://fastcoding.phpcodemania.com/index.php/#purchase-order
ราคาสุดคุ้ม  4,500  บาท
http://fastcoding.phpcodemania.com