มีคนให้ภาพรวมสถาปัตยกรรมของโฟลว์การควบคุม Drupal 7 ได้ไหม บางทีในแง่ของผังงานเกี่ยวกับวิธีการสร้างหน้า แหล่งข้อมูลเพิ่มเติมใดที่คุณจะแนะนำให้คำปรึกษาเกี่ยวกับการทำงานของ Drupal
มีคนให้ภาพรวมสถาปัตยกรรมของโฟลว์การควบคุม Drupal 7 ได้ไหม บางทีในแง่ของผังงานเกี่ยวกับวิธีการสร้างหน้า แหล่งข้อมูลเพิ่มเติมใดที่คุณจะแนะนำให้คำปรึกษาเกี่ยวกับการทำงานของ Drupal
คำตอบ:
Drupal อาจสร้างความสับสนให้กับหน้านี้บางส่วนเพราะมันมีฟังก์ชั่นที่ค่อนข้างสแต็ค ถึงแม้ว่ามันจะเป็น PHP แบบโพรซีเดอร์ แต่มันเป็นอีเว้นท์ / ผู้ฟังที่ขับเคลื่อนด้วยสถาปัตยกรรมและไม่มี "การไหล" อย่างง่ายในสคริปต์ PHP หลักเพื่อให้คุณดู ฉันเพิ่งทำการนำเสนอในเรื่องนี้มากและสไลด์จะโพสต์บนสไลด์โชว์ แต่การสรุประดับสูงอย่างรวดเร็วอาจมีประโยชน์
ในระหว่างกระบวนการทั้งหมดนั้นโมดูลปลั๊กอินของ Drupal และบุคคลที่สามกำลังไล่เหตุการณ์ออกไปและคอยฟังพวกเขาเพื่อตอบสนอง Drupal เรียกสิ่งนี้ว่าระบบ 'hook' และมันถูกนำไปใช้โดยใช้หลักการตั้งชื่อฟังก์ชั่น ตัวอย่างเช่นโมดูล 'บล็อก' สามารถดักจับ 'ผู้ใช้' ที่เกี่ยวข้องโดยใช้ฟังก์ชั่นชื่อ blog_user () ใน Drupal การพูดจาที่เรียกว่าhook_user ()
เป็นเรื่องเล็กน้อย แต่เนื่องจากการเล่นโวหารของ PHP (มันเก็บ hashtable ภายในของฟังก์ชั่นที่โหลดไว้ทั้งหมด) ทำให้ Drupal สามารถตรวจสอบผู้ฟังได้อย่างรวดเร็วเพียงแค่วนซ้ำรายการปลั๊กอินที่ติดตั้งไว้ สำหรับแต่ละปลั๊กอินมันสามารถเรียก function_exists () ในรูปแบบที่มีชื่อเหมาะสมและเรียกใช้ฟังก์ชันถ้ามันมีอยู่ ("ฉันกำลังใช้ไฟ 'เข้าสู่ระบบ' มีฟังก์ชั่น 'mymodule_login' อยู่ไหมฉันจะเรียกมันว่า 'yourmodule_login' มีอยู่หรือไม่ไม่ได้อย่างไร 'nextmodule_login' หรือไม่" ฯลฯ ) อีกครั้งเป็น clunky แบบสัมผัส ทำงานได้ค่อนข้างดี
ทุกสิ่งที่เกิดขึ้นใน Drupal เกิดขึ้นเพราะหนึ่งในเหตุการณ์เหล่านั้นถูกไล่ออก MenuAPI รู้เพียงว่า URL / เส้นทางใดที่จัดการโดยโมดูลปลั๊กอินที่แตกต่างกันเพราะมันจะทำให้เกิดเหตุการณ์ 'เมนู' (hook_menu) และรวบรวมโมดูลปลั๊กอินเมตาดาต้าทั้งหมดที่ตอบสนองด้วย ("ฉันจะดูแล url 'news / ล่าสุด' และนี่คือฟังก์ชั่นการโทรเมื่อหน้านั้นจำเป็นต้องสร้างขึ้น ... ") เนื้อหาได้รับการบันทึกเพียงเพราะ FormAPI ของ Drupal รับผิดชอบในการสร้างหน้าและไฟ เหตุการณ์ 'ส่งฟอร์ม' เพื่อให้โมดูลตอบกลับ การบำรุงรักษารายชั่วโมงเกิดขึ้นเพราะ hook_cron () ถูกเรียกใช้และโมดูลใด ๆ ที่มี mymodulename_cron () เป็นชื่อฟังก์ชั่นจะมีฟังก์ชั่นที่เรียกว่า
ทุกสิ่งทุกอย่างเป็นเพียงแค่รายละเอียดเท่านั้น - รายละเอียดที่สำคัญ แต่ความหลากหลายของธีมนั้น index.php เป็นตัวควบคุมระบบเมนูจะกำหนดว่า "หน้าปัจจุบัน" คืออะไรและมีเหตุการณ์มากมายเกิดขึ้นในกระบวนการสร้างเพจนั้น โมดูลปลั๊กอินสามารถเชื่อมโยงกับเหตุการณ์เหล่านั้นและเปลี่ยนเวิร์กโฟลว์ / จัดหาข้อมูลเพิ่มเติม / ฯลฯ นั่นเป็นส่วนหนึ่งของเหตุผลที่ทรัพยากร Drupal มุ่งเน้นไปที่การสร้างโมดูล หากไม่มีโมดูล Drupal จะไม่ทำอะไรนอกจากพูดว่า 'มีคนขอหน้า! มันมีอยู่หรือไม่ ไม่มี? ตกลงฉันจะให้บริการ 404 '
เพื่อให้เข้าใจถึงวิธีการทำงานของ Drupal คุณต้องเข้าใจกลไกการแสดงผลหน้าของ Drupal
กล่าวโดยย่อการเรียก / urls / ร้องขอทั้งหมดจะถูกให้บริการโดย index.php ซึ่งโหลด Drupal โดยรวมไฟล์ / โมดูลต่าง ๆ แล้วเรียกใช้ฟังก์ชันที่เหมาะสมซึ่งกำหนดไว้ในโมดูลเพื่อให้บริการคำขอ / url
นี่คือสารสกัดจากหนังสือ Pro Drupal Development ซึ่งอธิบายกระบวนการบูตของ Drupal
กระบวนการ Bootstrap
Drupal bootstraps ในทุก ๆ การร้องขอโดยทำตามขั้นตอนต่างๆของ bootstrap เฟสเหล่านี้ถูกกำหนดใน bootstrap.inc และดำเนินการตามที่อธิบายไว้ในส่วนต่อไปนี้
เริ่มต้นการกำหนดค่า
เฟสนี้ป็อปปูเลตการกำหนดค่าภายในของ Drupal และสร้าง URL พื้นฐาน ($ base_url) ของเว็บไซต์ ไฟล์ settings.php มีการแยกวิเคราะห์ผ่าน include_once () และการแทนที่ตัวแปรหรือสตริงใด ๆ ที่สร้างขึ้นมีการนำไปใช้ ดูส่วน "การแทนที่ตัวแปร" และ "การแทนที่สตริง" ของไฟล์ไซต์ / all / default / default.settings.php สำหรับรายละเอียด
แคชหน้าแรก
ในสถานการณ์ที่ต้องการความยืดหยุ่นในระดับสูงระบบแคชอาจต้องเรียกใช้ก่อนที่จะพยายามเชื่อมต่อฐานข้อมูล ขั้นตอนการแคชหน้าแรกช่วยให้คุณรวม (พร้อมรวม ()) ไฟล์ PHP ที่มีฟังก์ชั่นที่เรียกว่า page_cache_ fastpath () ซึ่งใช้แทนและส่งคืนเนื้อหาไปยังเบราว์เซอร์ แคชหน้าแรกเปิดใช้งานโดยการตั้งค่าตัวแปร page_cache_fastpath เป็น TRUE และไฟล์ที่จะรวมถูกกำหนดโดยการตั้งค่าตัวแปร cache_inc เป็นพา ธ ของไฟล์ ดูบทเกี่ยวกับการแคชสำหรับตัวอย่าง
เริ่มต้นฐานข้อมูล
ระหว่างเฟสฐานข้อมูลจะมีการกำหนดชนิดของฐานข้อมูลและทำการเชื่อมต่อเริ่มต้นที่จะใช้สำหรับการสืบค้นฐานข้อมูล
Hostname / IP-Based Access Control
Drupal อนุญาตให้มีการห้ามโฮสต์บนพื้นฐานชื่อโฮสต์ / ที่อยู่ IP ในเฟสการควบคุมการเข้าถึงจะทำการตรวจสอบอย่างรวดเร็วเพื่อดูว่าคำขอมาจากโฮสต์ที่ถูกแบนหรือไม่ ถ้าเป็นเช่นนั้นการเข้าถึงถูกปฏิเสธ
เริ่มต้นการจัดการเซสชั่น
Drupal ใช้ประโยชน์จากการจัดการเซสชันในตัวของ PHP แต่แทนที่ตัวจัดการบางตัวด้วยตัวเองเพื่อใช้การจัดการเซสชันที่มีฐานข้อมูลสำรอง เซสชั่นจะเริ่มต้นหรือสร้างใหม่ในเฟสเซสชั่ ออบเจ็กต์ผู้ใช้ทั่วโลกที่เป็นตัวแทนของผู้ใช้ปัจจุบันนั้นได้รับการเริ่มต้นที่นี่ด้วยเช่นกันแม้ว่าจะมีประสิทธิภาพไม่ใช่คุณสมบัติทั้งหมดที่มีอยู่ (จะถูกเพิ่มโดยการเรียกไปยังฟังก์ชัน
แคชของหน้าล่าช้า
ในช่วงแคชหน้าสุดท้าย Drupal โหลดรหัสสนับสนุนเพียงพอเพื่อกำหนดว่าจะให้บริการหน้าเว็บจากแคชหน้าหรือไม่ ซึ่งรวมถึงการรวมการตั้งค่าจากฐานข้อมูลลงในอาร์เรย์ที่สร้างขึ้นระหว่างขั้นตอนการกำหนดค่าเริ่มต้นและการโหลดหรือแยกรหัสโมดูล หากเซสชันระบุว่ามีการเปิดใช้งานการร้องขอโดยผู้ใช้ที่ไม่ระบุชื่อและการแคชเพจจะถูกเปิดใช้งานเพจนั้นจะถูกส่งคืนจากแคชและการดำเนินการหยุดทำงาน
การกำหนดภาษา
ในขั้นตอนการกำหนดภาษาการสนับสนุนหลายภาษาของ Drupal จะเริ่มต้นได้และการตัดสินใจจะใช้ภาษาใดในการให้บริการหน้าปัจจุบันตามการตั้งค่าไซต์และผู้ใช้ Drupal รองรับหลายทางเลือกในการพิจารณาการสนับสนุนภาษาเช่นคำนำหน้าเส้นทางและการเจรจาต่อรองภาษาระดับโดเมน
เส้นทาง
ที่เฟสพา ธ โค้ดที่จัดการพา ธ และสมนามพา ธ ถูกโหลด ขั้นตอนนี้ช่วยให้ URL ที่มนุษย์สามารถอ่านได้ได้รับการแก้ไขและจัดการการแคชพา ธ และการค้นหา Drupal ภายใน
เต็ม
ขั้นตอนนี้เสร็จสิ้นกระบวนการบูทสแตรปโดยโหลดไลบรารีของฟังก์ชันทั่วไปการสนับสนุนชุดรูปแบบและการสนับสนุนสำหรับการแม็พการโทรกลับการจัดการไฟล์ Unicode ชุดเครื่องมืออิมเมจ PHP การสร้างและประมวลผลแบบฟอร์มการจัดการเมลตารางที่เรียงลำดับได้โดยอัตโนมัติ ตัวจัดการข้อผิดพลาดที่กำหนดเองของ Drupal ถูกตั้งค่าและโมดูลที่เปิดใช้งานทั้งหมดจะถูกโหลด ในที่สุด Drupal ยิงเบ็ด init เพื่อให้โมดูลมีโอกาสได้รับการแจ้งเตือนก่อนเริ่มดำเนินการตามคำขออย่างเป็นทางการ
เมื่อ Drupal ทำการ bootstrapping เสร็จสิ้นแล้วส่วนประกอบทั้งหมดของเฟรมเวิร์กจะพร้อมใช้งาน ถึงเวลาที่จะรับคำขอของเบราว์เซอร์และส่งมอบให้กับฟังก์ชั่น PHP ที่จะจัดการกับมัน การแม็พระหว่าง URL และฟังก์ชั่นที่จัดการพวกมันทำได้โดยใช้การเรียกรีจิสตรีกลับที่ดูแลทั้งการแม็พ URL และการควบคุมการเข้าถึง โมดูลลงทะเบียนการเรียกกลับโดยใช้ hook เมนู (สำหรับรายละเอียดเพิ่มเติมดูบทที่ 4)
เมื่อ Drupal ได้พิจารณาแล้วว่ามีการเรียกกลับที่ URL ของคำขอเบราว์เซอร์แมปสำเร็จและผู้ใช้มีสิทธิ์เข้าถึงการเรียกกลับนั้นการควบคุมจะถูกส่งไปยังฟังก์ชันการเรียกกลับ
กำลังดำเนินการตามคำขอ
ฟังก์ชั่นการโทรกลับทำงานในสิ่งที่จำเป็นในการประมวลผลและรวบรวมข้อมูลที่จำเป็นในการดำเนินการตามคำขอ ตัวอย่างเช่นหากได้รับคำขอเนื้อหาเช่นhttp://example.com/ q = node / 3 URL จะถูกแม็พกับฟังก์ชัน node_page_view () ใน node.module การประมวลผลเพิ่มเติมจะดึงข้อมูลสำหรับโหนดนั้นจากฐานข้อมูลและนำไปไว้ในโครงสร้างข้อมูล จากนั้นก็ถึงเวลาสำหรับชุดรูปแบบ
พวกเขาข้อมูล
ชุดรูปแบบเกี่ยวข้องกับการแปลงข้อมูลที่ได้รับการจัดการหรือสร้างเป็น HTML (หรือ XML หรือรูปแบบผลลัพธ์อื่น ๆ ) Drupal จะใช้ธีมที่ผู้ดูแลระบบได้เลือกเพื่อให้หน้าเว็บมีรูปลักษณ์ที่ถูกต้อง ผลลัพธ์ที่ได้จะถูกส่งไปยังเว็บเบราว์เซอร์ (หรือไคลเอนต์ HTTP อื่น ๆ )
คำตอบของ Eaton ให้ภาพรวมที่ดี (ฉันใหม่ที่นี่ดังนั้นฉันไม่สามารถแก้ไขเขาได้ดังนั้นความคิดเห็น)
ช่วงเวลาที่โหดร้าย "aha" สำหรับฉันคือการตระหนักถึงทุกสิ่งที่เกิดขึ้นผ่านทาง index.php และจากนั้นก็ผ่านฟอเรสต์ของโมดูล หากต้องการขยายฟังก์ชันการทำงานหลักอย่าเขียนซ้ำ แทนที่จะคัดลอกโมดูลลงใน / sites / all / modules / หรือ / sites / [yoursite] / โมดูลและขยายนั้นหรือสร้างโมดูลใหม่ในสถานที่เหล่านั้น เหมือนกันสำหรับธีม ไดเรกทอรีโมดูลสามารถมีรหัสที่แสดงเช่นกันในรูปแบบของ tpl, css เป็นต้น
หากคุณคุ้นเคยกับกรอบประเภท MVC ที่เข้มงวดขึ้นเช่น Rails, Django เป็นต้นสิ่งนี้จะทำให้เกิดความสับสนเล็กน้อย โมดูลสามารถผสมในรหัสแสดงผลจำนวนมากและหากคุณกำลังดูโมดูลหรือเทมเพลตของบุคคลอื่นในที่สุดคุณก็จะสามารถเดินย้อนกลับไปในกองซ้อนได้ นั่นคือความงาม / ความเจ็บปวดจากการทำงานใน PHP
แดกดัน "เพียงแค่สร้างแอป" อาจเป็นวิธีที่เลวร้ายที่สุดในการเรียนรู้สิ่งนี้ Drupal ทำสิ่งต่าง ๆ ออกมาจากกล่องที่คลุมเครือจนคุณเข้าใจการควบคุม ไม่มีอะไรในไฟล์ tpl ที่บอกคุณว่าฟังก์ชั่นที่มีชื่อสนุกอย่าง l () มาจากไหน
ขึ้นอยู่กับความเข้าใจที่ลึกซึ้งที่คุณต้องการ หากคุณมีความรู้ php เป็นอย่างดีฉันขอแนะนำให้อ่านรหัสด้วยตนเองโดยเริ่มจาก index.php จากนั้นไปที่ include / bootstrap.inc จากนั้นสคริปต์อื่น ๆ ในไดเรกทอรีนั้น
กุญแจรวมถึงไฟล์:
นอกจากนี้ยังมีฟังก์ชั่นหลักบางอย่างในโมดูล / ไดเรกทอรี โดยเฉพาะอย่างยิ่ง modules / node / node.module เป็นพื้นฐานของระบบโหนดซึ่งโดยทั่วไปแล้วสิ่งที่ใช้ในการห่อหุ้มเนื้อหาของไซต์
รหัสโดยทั่วไปแล้วมีความคิดเห็นดีและชัดเจน การใช้มาร์กอัป Doxygen ในการแสดงความคิดเห็นหมายความว่ารหัสมีประสิทธิภาพเป็นเอกสารมาตรฐาน
นอกจากนี้ยังช่วยในการดำเนินการนี้โดยใช้โปรแกรมแก้ไขที่สามารถข้ามไปยังคำจำกัดความของฟังก์ชันได้อย่างรวดเร็ว การใช้เสียงเรียกเข้าร่วมกับ ctags นั้นเหมาะกับฉัน คุณต้องบอก ctags ให้ทำดัชนี. inc, .module เป็นต้นไฟล์เป็นไฟล์ php
ฉันเรียนรู้การโหลดโดยการนำเข้ารหัส drupal .php ไปยังโครงการ NetBeans คุณสามารถเรียกใช้ดีบักเกอร์ netbeans และดูเฟสต่าง ๆ ของหน้ารวมกัน
หนังสือที่ดีที่สุดในหัวข้อคือ "การพัฒนา Drupal" และ "การใช้ Drupal"
"การพัฒนา Drupal Pro" รวมถึงผังงานที่ดีหลายรายการและบทสรุปอย่างละเอียดของ APIs ของ Drupal (รูปแบบการจัดวางและอื่น ๆ ) มันมีจุดประสงค์ที่จะให้คำแนะนำแก่ผู้คนในการสร้างโมดูลและธีมของตัวเอง แต่มีคุณค่ามากมายสำหรับนักพัฒนา PHP ที่มีความชำนาญโดยเฉลี่ยที่ต้องการเข้าใจ Drupal นอกจากนี้ฉันได้สร้างโมดูลที่กำหนดเองสำหรับทุกไซต์ที่ฉันสร้างขึ้นเพื่อให้สามารถควบคุมสิ่งต่าง ๆ เช่นการซ่อนฟิลด์ที่เลือกในรูปแบบต่าง ๆ (ซึ่งโดยทั่วไปคุณต้องการทำเพื่อทำให้ฟอร์มโหนดง่ายขึ้นเพื่อสิ้นสุด ผู้ใช้) ดังนั้นจึงเป็นการดีที่จะมีความรู้นี้ภายใต้หมวกของคุณ
"การใช้ Drupal" มีวัตถุประสงค์เพื่อผู้พัฒนาเว็บไซต์ที่ต้องการทราบวิธีการสร้างสิ่งที่ดีเช่นแกลเลอรี่บล็อกและไซต์เครือข่ายสังคมออนไลน์ มันผ่านหลายกรณีการใช้งานและแสดงวิธีการกำหนดค่าโมดูลที่มีอยู่ให้ทำงานแต่ละงาน ในกระบวนการนี้จะทำให้คุณคุ้นเคยกับโมดูลเสริมที่สำคัญ "Content Construction Kit" (CCK) และ "Views" วิธีสร้างบล็อกและเทมเพลตที่กำหนดเองและการบำรุงรักษาไซต์ Drupal ฉันแนะนำหนังสือเล่มนี้โดยเฉพาะสำหรับผู้ที่ต้องการเพิ่มความเร็วและใช้งานจริง Drupal ทันที ในกระบวนการคุณจะเข้าใจองค์กรภายในของ Drupal
ผู้มีส่วนร่วมใหม่ที่นี่ 2 ปีในการสนทนา ;-)
กำลังตอบกลับไปที่https://stackoverflow.com/a/1070325/1154755
หากต้องการขยายฟังก์ชันการทำงานหลักไม่ต้องเขียนซ้ำ แทนที่จะคัดลอกโมดูลลงใน / sites / all / modules / หรือ / sites / [yoursite] / โมดูลและขยายนั้นหรือสร้างโมดูลใหม่ในสถานที่เหล่านั้น เหมือนกันสำหรับธีม
จริงๆแล้วฉันไม่ต้องคัดลอกโมดูลหลักเพื่ออัปเดต Drupal Hooks ควรเป็นทุกสิ่งที่คุณต้องการ
สำหรับธีมใช่บางครั้งเป็นหนทางเดียวที่จะไปได้ แต่บ่อยครั้งคุณสามารถสร้างหัวข้อย่อยเพื่อรับผลลัพธ์ที่คุณต้องการ