Master & Detail วิธีคัดลอกโค้ดที่ Generate ออกมาแล้วต้องการตัดเอาเฉพาะส่วนของ Detail เพื่อเอาไปรวมกัน

โดย SONGCHAI SAETERN
กรณีที่มีการใช้ตารางย่อย หลายตาราง แต่ระบบ PHP CI MANIA สามารถ Generate การบันทึกแบบ Master & Detail ได้เพียงแค่ชุดเดียวต่อครั้ง เราก็จำเป็นจะต้องใช้ชุดแรกเป็นไฟล์หลัก

และ Generate ชุดตารางย่อย Detail อื่นๆ แล้วเอาโค้ดไปรวมกันกับชุดหลักเพื่อใช้งานด้วยกัน

ส่วนของ Model ที่เกี่ยวกับตารางย่อย Detail

  1. loadDetailList()
  2. load_detail_record()
  3. save_detail_list()
  4. delete_list()
    สำหรับส่วนของ Model เราไม่ต้องคัดลอกไปรวมกัน เพียงแค่ตั้งชื่อไฟล์ Model ใหม่ให้สื่อความหมายว่าใช้สำหรับทำอะไร แล้ว Load เข้าไปใน Controller ชุดหลักเพิ่มด้วยเท่านั้น

    เช่น 
        models/Education_model.php สำหรับประวัติการศึกษา
        models/Work_model.php สำหรับประวัติการทำงาน

    แล้วก็โหลดเข้าไปใช้กับ Controller หลัก
        $this->load->model('module_name/Master_model', 'MasterXXX');
        $this->load->model('module_name/Education_model', 'EducationYYY');
        $this->load->model('module_name/Work_model', 'WorkZZZ');

ส่วนของ Controller ที่เกี่ยวกับตารางย่อย Detail

  1. save_detail_list()
  2. edit_list()
  3. update_list()
  4. del_list()
  5. load_detail()
  6. formValidateDetail()
  7. formValidateDetailUpdate()
  8. formValidateDetailWithFile()   <-- กรณีมีการอัพโหลดไฟล์ด้วย
  9. setDetailDataListFormat()
  10. setPreviewFormatDetail()
    ในส่วนของ Controller จะต้องคัดลอกฟังก์ชั่นที่ Generate ชุดใหม่มาวางเพิ่ม และปัญหาก็คือ ชื่อฟังก์ชั่นซ้ำกัน ดังนั้น เพื่อไม่เห็นสับสน ก็เอาชื่อตารางไปต่อท้ายฟังก์ชั่น เช่น save_detail_list_education()

ส่วนของ JavaScript ที่เกี่ยวกับตารางย่อย Detail

  1. openAddListDialog()
  2. resetAddFormList()
  3. saveDetailList()
  4. confirmDeleteList()
  5. deleteRecordList()
  6. previewDetailRecord()
  7. editDetailRecord()
  8. loadDetailList()
    ส่วนของ JavaScript จะคล้ายกับ Model ครับ คือไม่ต้องเอาไปรวมไฟล์เดียวกัน ให้แยกคนละไฟล์ แล้ว Load เข้าไปในหน้า Controller เดียวกันและเวลาเรียกใช้ก็ผ่านชื่อคลาสของใครของมัน ^^
    
    ซึ่งส่วนของการโหลด JS แอดมินจะวางไว้ที่ __construct()

    // ไฟล์ที่ 1
    $js_url = 'assets/js_modules/module_name/master.js?ft='. filemtime('assets/js_modules/module_name/master.js'); 
    $this->another_js .= '<script src="'. base_url($js_url) .'"></script>';

    // ไฟล์ที่ 2
    $js_url = 'assets/js_modules/module_name/education.js?ft='. filemtime('assets/js_modules/module_name/education.js'); 
    $this->another_js .= '<script src="'. base_url($js_url) .'"></script>';

    // ไฟล์ที่ 3
    $js_url = 'assets/js_modules/module_name/work.js?ft='. filemtime('assets/js_modules/module_name/work.js'); 
    $this->another_js .= '<script src="'. base_url($js_url) .'"></script>';


แต่ก็มีส่วนที่ต้องแก้ไขเพิ่มคือ กรณีชื่อฟิลด์เหมือนกัน ก็จะมีการอ้างอิง INPUT ด้วย ไอดี เดียวกันก็อาจจะเกิดข้อผิดพลาดได้ ก็จำเป็นจะต้องเพิ่มการอ้างถึงอีเลเมนต์ form ของ js ชุดนั้นๆด้วย เช่น
   
    $('#detail_quantity').val('').attr('value','');
   
    ก็อาจจะต้องเปลี่ยนเป็น

    $('form#education #detail_quantity').val('').attr('value','');
    

สรุปส่วนที่จัดการยุ่งยากหน่อยก็คือ 

    1. Controller จะต้องเอาฟังก์ชั่นมารวมกัน และแก้ไขชื่อฟังก์ชั่นให้ไม่ชนกัน
    2. JavaScript จะต้องแก้ไขการอ้างถึงอีเลเมนต์ต่างๆด้วยไอดีที่ซ้ำกัน เพื่อให้ข้อมูลไม่ผิดพลาด

ส่วน Model โหลดเข้ามาก็เรียกใช้ด้วย Class ของใครของมันไม่ต้องแก้ไขอะไรใดๆครับ



PHP CI MANIA - PHP Code Generator 

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