Stack Overflow : ตอน จัดเรียง Value ของ Select แบบ Multiple ตามลำดับการเลือกกันเถอะ (Select2)

โดย SONGCHAI SAETERN •
"Prevent multiple select element from automatically sorting the value assigned to it basis the order of the indexes in the options"

เรื่องของเรื่องมีอยู่ว่า...เมื่อเราใช้ Select2 ในการสร้าง Drop-down List และเวลาเลือก option แต่ละตัวเรียบร้อย พอส่งค่าไปใช้งาน มันก็จะเรียงจากบนลงล่าง option ไหนมาก่อน value ก็ไปก่อน แต่ทีนี้เราอยากให้มันเรียงตามลำดับการคลิก จะทำยังไง

ก็เลยค้นด้วยคำง่ายๆไปเลย "select2 multiple value not sort" แล้วก็เล็งกระทู้ของ StackOverflow.Com

แล้วก็ได้กระทู้นี้
https://stackoverflow.com/questions/21875658/prevent-multiple-select-element-from-automatically-sorting-the-value-assigned-to


พอลองทดสอบดู ก็ได้ผลลัพธ์เหมือนดั่งที่ใจเราต้องการจริงๆ



ก็เลยจัดการดัดแปลงนิดๆหน่อยๆ ได้ดังนี้
function getSelect2MultipleSortValue(elem_id){
    // 'data' brings the unordered list, while 'val' does not
    var data = $('#' + elem_id).select2('data');

    // Push each item into an array
    var finalResult = [];
    var finalResultTitle = [];
    for( item in $('#' + elem_id).select2('data') ) {
        finalResult.push(data[item].id);
        finalResultTitle.push(data[item].text.split('-').pop().trim());
    };
   
    var data = new Object();
    data['value'] = finalResult.join(',');
    data['text'] = finalResultTitle.join(',');
    // Display the result with a comma
    return data;
}
เมื่อเราเรียกฟังก์ชั่น getSelect2MultipleSortValue() พร้อมกับส่ง id ของ Drop-down List ที่ต้องการไปด้วยก็จะได้ข้อมูลออกมาเป็นอาร์เรย์ คือ value และ text ก็สามารถนำไปใช้งานต่อได้เลย

var field_title = getSelect2MultipleSortValue('table_join_detail_field_title');
 $('#detail_join_field_title').val(field_title.value;);
 $('#detail_join_field_comment').val(field_title.text);


แถมท้ายกันอีกนิดนึง กรณีต้องการนำค่ากลับคือไปใส่ใน select และให้ select2 แสดงขึ้นมาเรียงลำดับตามที่เราเลือกไว้นั้น ก็ใช้ฟังก์ชั่นนี้ หลังจากที่สั่งเซ็ต select2() เรียบร้อยแล้ว

function setDisplaySelect2(elem, title_val){
    var choices = [];
    for (i = 0; i < title_val.length; i++) {
        var option = $('#table_join_detail_field_title option[value="' +title_val[i]+ '"]');
        if(option[0]){
            choices[i] = {id:title_val[i], text:option[0].label, element: option};
        }
    }
    $(elem).select2('data', choices);
}
ที่มา : https://stackoverflow.com/questions/19930835/how-to-save-sorting-order-in-select2-field

การเซ็ตค่าให้ select เพื่อใช้งาน Select2
    var attributes_val = "3,1,5".split(',');
    elem = '#table_join_detail_field_attribute'
    $(elem).val(attributes_val).select2();
    setDisplaySelect2(elem, attributes_val);



----------------------------------------------------------------------------------------

สนับสนุนค่ากาแฟผู้เขียนได้ที่

PHP CI MANIA - PHP Code Generator 

โปรแกรมช่วยสร้างโค้ด ลดเวลาการเขียนโปรแกรม
http://fastcoding.phpcodemania.com/
สนใจสั่งซื้อราคาสุดคุ้ม
http://fastcoding.phpcodemania.com/

PayPal

jQuery ความแตกต่างระหว่า .data() กับ .attr('data-xxx')

โดย SONGCHAI SAETERN •
"Adding data attribute to DOM"

สำหรับการสร้างแอตทริวต์ในอีเลเมนต์ต่างๆ เพื่อพักข้อมูลไว้นั้น เรานิยมใช้ชื่อ data-xxxxx เช่น ต้องการเก็บ id ไว้ก็สร้างแอตทริบิวต์ data-id="1234"

ซึ่งสามารถใช้คำสั่งได้ 2 แบบ

$('div').data('id', '1234');

และ

$('div').attr('data-id', '1234');


 .data('xxxx') กับ .attr('data-xxx') ก็คือ .attr() จะแสดงแอตทริบิวต์ที่เพิ่มเข้าไป หรือเปลี่ยนแปลงไป ในโครงสร้าง HTML ให้เห็นด้วย



สังเกตว่าในรูปแท็ก <p> จะปรากฏแอตทริบิวต์ data-info แสดงออกมาด้วย

ที่มา : https://stackoverflow.com/questions/14935191/adding-data-attribute-to-dom






สนับสนุนค่ากาแฟผู้เขียนได้ที่

PHP CI MANIA - PHP Code Generator 

โปรแกรมช่วยสร้างโค้ด ลดเวลาการเขียนโปรแกรม
http://fastcoding.phpcodemania.com/
สนใจสั่งซื้อราคาสุดคุ้ม
http://fastcoding.phpcodemania.com/

PayPal

PHP CI MANIA : ตอนที่ 11 วิธีสร้างแบบฟอร์มบันทึกข้อมูลแบบ Master - Detail เพิ่ม/ลบ/แก้ไข รายการย่อยได้

โดย SONGCHAI SAETERN •
การสร้างแบบฟอร์มแบบ Master & Detail ก็คือการทำงานกับตาราง 2 ตาราง โดยที่จะมีการบันทึกข้อมูลหลักส่วนที่ 1 และมีแบบฟอร์มสำหรับบันทึกข้อมูลรายการ ในส่วนที่ 2 ดังภาพ


ส่วนของการตั้งค่าจะอยู่ในแท็ป "ตั้งค่า" ส่วนที่ 4 ด้านล่างสุด "ข้อมูลตารางรายการ (Detail)"




1. เลือกตารางที่จะใช้บันทึกรายการ เช่นหน้าเว็บนี้คือการบันทึกประวัติ Resume ดังนั้นก็จะมีตารางเก็บผลงานต่างๆ นั่นก็คือตาราง tb_portfolio ที่เลือกในภาพ


2. จะปรากฏข้อมูลฟิลด์ของตารางที่เลือกเพิ่มมาด้านล่าง

3. ดูในส่วนของตารางหลัก (Master) ใน tb_resume จะมีฟิลด์ที่เป็น Primary Key ชื่อว่า resume_id ดังที่เลือกไว้ในภาพ

4. จากนั้นก็ย้ายมาด้านตารางรายการ (Detail) เราจะต้องเลือก Foreign Key หรือง่ายๆก็คือ เลือกฟิลด์ที่เราจะเอาไอดีของตารางหลัก มาใส่อ้างอิงในแต่ละรายการนั่นเอง

5. หลังจากนั้นก็กำหนดรูปแบบช่อง INPUT เหมือนกับที่กำหนดให้ตารางหลัก ในบทที่ผ่านๆมา คือ ช่องวันที่ ช่องอัพโหลดไฟล์ ช่องตัวเลข หรือการ JOIN ต่างๆ

6. หลังจากนั้นให้คลิกสร้างไฟล์ Models, Views, JS และ Controller ให้เรียบร้อย แล้วคลิกลิงค์เพื่อดูตัวอย่าง จะพบกับหน้าเว็บ Resume ที่เราสร้างเอาไว้


7. คลิกเข้าไปที่ "เพิ่มรายการใหม่" จะเข้าสู่แบบฟอร์มเพิ่มข้อมูล เมื่อกรอกข้อมูลจนครบถ้วน และกดบันทึกเรียบร้อย จะปรากฏปุ่มเพิ่มรายการที่ด้านข้าง จะสามารถกดเพิ่มรายการผลงานต่างๆได้เรื่อยๆ


8. หลังจากที่เพิ่มข้อมูลเสร็จเรียบร้อย เมื่อกดย้อนกลับไปในข้อที่ 6 จะปรากฏรายการต่างๆที่ได้เพิ่มไว้ และเมื่อคลิกที่ปุ่ม "รายละเอียด" จะปรากฏตารางรายละเอียดที่ประกอบด้วย 2 ส่วนคือ
     1) Resume ข้อมูลประวัติ   <=  Master
     2) Portfolio รายการผลงานต่างๆ   <=  Detail


9. เมื่อกดย้อนกลับไปหน้าหลักข้อที่ 6 แล้วลองกดปุ่ม "แก้ไข" จะปรากฏแบบฟอร์มดังภาพ

ดูคลิปวิดีโอแนะนำได้ที่นี่



 

PHP CI MANIA : ตอนที่ 10 วิธีกำหนดค่าเริ่มต้น (Default Value) ให้กับช่องป้อนข้อมูลจาก SESSION/POST/GET

โดย SONGCHAI SAETERN •
ไปที่แท็ป "ตั้งค่า" และเลื่อนลงมาในส่วนที่ 3 ตั้งค่าที่คอลัม "SOURCE (Add Form)"

จะประกอบด้วยตัวเลือกดังนี้
  • Form Input จะเป็นการกำหนดตาม "ประเภทช่องป้อนข้อมูล" ในตอนที่ 7
  • URI Segment จะเป็นการดึงค่าใน URL หลัง /index.php ตามด้วยตัวเลขระบุลำดับที่ต้องการ 
  • SESSION จะเป็นการดึงค่า SESSION ที่ล็อกอินมาใช้งาน 
  • GET จะเป็นการดึงค่าใน URL (สำหรับ CodeIgniter จะไม่นิยมส่ง GET จะใช้ URI Segment )
  • POST จะเป็นการรับค่าจากการกด SUBMIT มายังหน้าแบบฟอร์มปัจจุบัน



มาลองดูผลลัพธ์ทีละส่วนกันครับ

1. Form Input
     จะกำหนดตาม "ประเภทช่องป้อนข้อมูล" ในตอนที่ 7 ในตัวอย่างนี้จะเลือก "ประเภทช่องป้อนข้อมูล" เป็นแบบบรรทัดเดียว

 เมื่อสร้างไฟล์ Views และ Controller เรียบร้อยแล้ว ให้คลิกเข้าไปที่หน้า "เพิ่มข้อมูลใหม่" จะได้ผลลัพธ์ดังนี้


2. URI Segment
     จะต้องกำหนดตำแหน่งของ URL ที่ต้องการดึงมาใช้งานด้วย ในตัวอย่างนี้คือเลข 4

   เมื่อสร้างไฟล์ Views และ Controller เรียบร้อยแล้ว ให้คลิกเข้าไปที่หน้า "เพิ่มข้อมูลใหม่" จะได้ผลลัพธ์เป็นช่อง INPUT ที่ไม่สามารถกรอกข้อมูลได้ จะรับค่าจาก URL

    ทดสอบโดยการป้อนข้อมูลลงในตำแหน่งที่ 4 แล้ว Enter เพื่อดูผลลัพธ์ในช่อง INPUT


3. SESSION
     จะต้องกำหนดชื่อ SESSION ลงไปด้วย ซึ่งใน example_project ที่ออกแบบสำหรับรันโค้ดที่ได้จาก PHP CI MANIA นี้จะกำหนดไว้ตอน Login ในไฟล์ application/models/Member_login_model.php

เทมเพลต example_expert จะอยู่ที่ตำแหน่ง
application\modules\member\models\Login_model.php
ฟังก์ชั่น validate() สามารถเพิ่มจากตรงนี้ได้


     
   ในตัวอย่างนี้เราจะกำหนดให้รับค่าจาก user_id ให้พิมพ์ลงแทนที่ member_id 

    และการจะใช้ SESSION ได้นั้น ก็ต้องผ่านระบบล็อกอินด้วย ดังนั้นก็ต้องคลิกเลือก "Login Require" ทุกครั้งเพื่อเช็คสิทธิ์การเข้าใช้งาน


    เมื่อสร้างไฟล์ Views และ Controller เรียบร้อยแล้ว ให้คลิกลิงค์เพื่อดูตัวอย่าง ก็จะพบกับหน้าตรวจสอบสิทธิ์ก่อนเข้าใช้งาน ให้ใช้รหัสทดสอบ user1 รหัสผ่าน 123456
    เมื่อล็อกอินเรียบร้อย จะเข้าไปที่หน้ารายการ ให้คลิกที่ปุ่ม "เพิ่มข้อมูลใหม่" จะเห็นว่าในช่อง INPUT ได้แสดงไอดีสมาชิกที่เป็น SESSION ชื่อว่า user_id ลงในแบบฟอร์มให้อัตโนมัติ


4. GET    
    จะเป็นการดึงค่าใน URL ซึ่ง CodeIgniter จะไม่นิยมรับ-ส่ง ค่าแบบ GET แต่จะใช้ URI Segment ในแบบข้อที่ 2 แทน สำหรับการใช้งาน ให้กำหนดชื่อพารามิเตอร์ที่จะใช้ รับ-ส่งค่า ตัวอย่างคือ member_id
      เมื่อสร้างไฟล์ Views และ Controller เรียบร้อยแล้ว ให้คลิกลิงค์เพื่อดูตัวอย่าง เข้าไปที่ "เพิ่มข้อมูลใหม่" จะได้ผลลัพธ์เป็นช่อง INPUT ที่ไม่สามารถกรอกข้อมูลได้ แต่จะรับค่าพารามิเตอร์ที่ชื่อ member_id จาก URL เท่านั้น


    ทดสอบโดยการป้อนข้อมูลลง URL โดยต่อท้ายเครื่องหมาย ? ตามด้วยพารามิเตอร์ member_id={ค่าที่ต้องการ} ในตัวอย่างคือ 1234 แล้ว Enter เพื่อดูผลลัพธ์ในช่อง INPUT

    จะเห็นว่าค่าที่ส่งผ่าน URL มานั้นจะแสดงใน INPUT ให้อัตโนมัติ



4. POST 
    สำหรับการรับส่งค่าแบบ POST นั้น ก็ตั้งค่าเช่นเดียวกับ GET คือ กำหนดชื่อพารามิเตอร์ที่จะใช้ รับ-ส่งค่า ตัวอย่างคือ member_id แต่จะแตกต่างกันที่การทดสอบ จะต้องสร้างฟอร์มขึ้นมาเพื่อกด SUBMIT ส่งค่าแบบ POST มายังแบบฟอร์มที่เราสร้างไว้

    เมื่อสร้างไฟล์ Views และ Controller เรียบร้อยแล้ว ให้คลิกลิงค์เพื่อดูตัวอย่าง คลิกเข้าไปที่ "เพิ่มข้อมูลใหม่" จะได้ผลลัพธ์เป็นช่อง INPUT ที่ไม่สามารถกรอกข้อมูลได้ แต่จะรับค่าพารามิเตอร์ที่ชื่อ member_id จากการ SUBMIT ผ่านแบบฟอร์มมาเท่านั้น


ตัวอย่างแบบฟอร์มส่งค่า action="{URL ของแบบฟอร์มเพิ่มข้อมูลที่ได้สร้างไว้}" ในที่นี้คือ index.php/test/resume/add และส่งข้อมูล Input ที่มีแอตทริบิวต์ name="member_id" เหมือนที่เราได้รับค่าไว้

     เมื่อกด บันทึก แบบฟอร์มนี้ก็จะส่งข้อมูล member_id ที่ไปยังหน้า "เพิ่มข้อมูลใหม่" ที่เราได้สร้างเตรียมไว้รับค่า POST ก็จะแสดงตัวเลข 1234 อัตโนมัติ


วิดีโอสาธิตการทำงาน
[ PHP CI MANIA #7 ระบบบริหารจัดการข้อมูลโรงเรียน ส่งข้อมูลผ่าน URL เพื่อบันทึก Resume [CodeIgniter] ] https://www.youtube.com/watch?v=OArRxYz6T2A


 


PHP Array การสลับตำแหน่ง Array ระหว่าง key => value แบบไม่ต้องพิมพ์ใหม่ ด้วย array_flip(), var_export()

โดย SONGCHAI SAETERN •
จากรูปด้านล่างนี้ จะเห็นว่ามี key ที่ชื่อว่า image/jpeg สองบรรทัด ทำให้ value ด้านหลังทับกันเหลือเพียงแค่ jpg ตัวสุดท้าย แต่ jpeg บรรทัดก่อนหน้านั้นหายไป


เนื่องจากการกำหนดชื่อ key ของอาร์เรย์ ต้องไม่เป็นชื่อซ้ำกัน ดังนั้น จึงจำเป็นที่จะต้องสลับตำแหน่งระหว่าง key และ value กลับด้านกัน ซึ่งฟังก์ชั่นที่ใช้ก็คือ array_flip()



ผลลัพธ์เมื่อใช้ array_flip() จะเห็นว่าสามารถกลับด้านข้อมูลได้ แต่ทีนี้จะทำยังไงเพื่อเอามาแทนที่โค้ดเดิมได้ เพราะการ print_r() เป็นเพียงแค่การแสดงผลลัพธ์ออกมาให้เห็น แต่ไม่ได้อยู่ในรูปแบบของซอร์สโค้ด PHP


 และพระเอกของงานนี้ก็คือ var_export() ซึ่งทุกท่านอาจจะเคยเห็นผ่านตากับฟังก์ชั่น var_dump() มาบ้าง ซึ่งเป็นการแสดงข้อมูลออกมาเหมือนกับ print_r() แต่มีรายละเอียดที่มากกว่า

แต่ var_export() จะแตกต่างออกไป เพราะสามารถแสดงข้อมูลอาร์เรย์ออกมาในรูปแบบของซอร์สโค้ด PHP เพื่อคัดลอกนำไปใช้งานต่อได้เลย


ทีนี้ก็ถึงเวลาที่เราต้องเขียนโค้ดเพื่อดูผลลัพธ์กันแล้ว

1. สลับค่าในตัวแปร $this->file_allow ด้วย array_flip()
        $new_array = array_flip($this->file_allow);


2. แสดงข้อมูลในรูปแบบใหม่หลังจากที่สลับด้านเรียบร้อย ด้วยฟังก์ชั่น var_export()
        var_export($new_array);

3. เปิดหน้าเว็บที่แสดงผลลัพธ์ สังเกตว่าโค้ดจะออกมากองรวมกันไม่สวยงาม


4. เขียนโค้ดแทรกแท็ก HTML เพื่อจัดระเบียบให้สวยงามด้วย <pre></pre>
        echo '<pre>';
        var_export($new_array);
        echo '</pre>';

5. เปิดหน้าเว็บดูผลลัพธ์อีกครั้ง

6. ทำการคัดลอกซอร์สโค้ดที่ได้ไปใช้งานได้ทันที

PHP CI MANIA [FQA] : Use of undefined constant กรณีสร้าง INPUT แบบหลายตัวเลือก

โดย SONGCHAI SAETERN •
กรณีนี้จะเกิดขึ้นกับประเภทฟิลด์ ไม่ต้องกับ คีย์ หรือ value ที่เรากำหนดในการสร้างตัวเลือก




เช่น ฟิลด์ เก็บค่าตัวเลข แต่สร้างคีย์/value เป็นตัวอักษร

วิธีแก้ไขก็คือ กำหนด Data Type ของฟิลด์ให้ตรงกับที่ต้องการ
หรือกำหนดคีย์/value ให้ตรงกับ Data Type ของฟิลด์นั้นๆ




PHP CI MANIA : ตอนที่ 9 วิธีกำหนดเงื่อนไขค้นหา การแบ่งหน้า และการจัดเรียงลำดับในตารางข้อมูล

โดย SONGCHAI SAETERN •
ไปที่แท็ป "ตั้งค่า" เลื่อนลงไปในส่วนที่ 4 "กำหนดการค้นหา / ประเภทช่องป้อนข้อมูล"


กำหนดการค้นหาที่คอลัมน์ "กำหนดตัวเลือก สำหรับค้นหา"

    จะปรากฏตัวเลือก 4 รายการ 
    1.   = 'คำค้นหา'  จะค้นหาแบบต้องตรงทุกตัวอักษร เช่นการค้น ไอดี รหัสเอกสาร จำนวนเงิน
    2.   LIKE '%คำค้นหา%'  จะค้นหารายการที่มีคำที่ต้องการ อยู่ในส่วนใดส่วนหนึ่งของฟิลด์นั้น
    3.   LIKE 'คำค้นหา%'  จะค้นหารายการที่ขึ้นต้นด้วยคำที่ค้นหา
    4.   LIKE '%คำค้นหา'  จะค้นหารายการที่ลงท้ายด้วยคำที่ค้นหา


หลังจากกำหนดฟิลด์ที่ต้องการเรียบร้อย ให้คลิกไปที่แท็ป "Views"


ที่แท็ปย่อย "แสดงตารางรายการ" จะมีส่วนที่ให้ตั้งค่า 2 ส่วน คือ
1. ช่องให้กรอกจำนวนที่ต้องการแสดงต่อหน้า
2. ตัวเลือกสำหรับจัดเรียง ซึ่งจะ Default ตามชื่อฟิลด์ที่ใช้ค้นหา สามารถเพิ่มลดได้ตามต้องการ

เมื่อกดปุ่มแสดงตัวอย่าง จะได้ผลลัพธ์ดังนี้


หลังจากที่กดสร้างไฟล์จนครบทุกไฟล์ สามารถตรวจสอบการทำงานจากลิงค์ที่แท็ป "Controller" จะเปิดหน้าตารางรายการขึ้นมา


ทดลองค้นหาด้วย "ชื่อเล่น" จะได้ผลลัพธ์ดังนี้

จากนั้นคลิกที่ปุ่ม "ทั้งหมด" เพื่อแสดงทุกรายการ แล้วลองเลือกตัวเลือกการจัดเรียงด้านขวา โดยเลือกให้จัดเรียงตามไอดี มาก - น้อย

ทดสอบจัดเรียงด้วยฟิลด์ "ชื่อเล่น" แบบเรียง ก-ฮ ( ORDER BY ........ ASC )

และลองเลือกจัดเรียงด้วยฟิลด์ "ชื่อเล่น" แบบเรียง ฮ - ก ( ORDER BY ........ DESC )

จากตัวอย่างที่ผ่านมา จะเห็นว่า การสร้างหน้าเว็บสำหรับค้นหา แบ่งหน้า และจัดเรียง เป็นเรื่องง่ายๆแทบจะไม่ต้องเขียนโค้ดเองเลย หากต้องการปรับแต่งเพิ่มเติมเรื่องหน้าตาก็สามารถเปิดไปในโฟลเดอร์ views ของ module นั้นๆแก้ไขได้ทันที