Drupal ทำงานอย่างไร [ปิด]


151

มีคนให้ภาพรวมสถาปัตยกรรมของโฟลว์การควบคุม Drupal 7 ได้ไหม บางทีในแง่ของผังงานเกี่ยวกับวิธีการสร้างหน้า แหล่งข้อมูลเพิ่มเติมใดที่คุณจะแนะนำให้คำปรึกษาเกี่ยวกับการทำงานของ Drupal


1
คำถาม? แล้วทำไมคุณไม่ถามว่าทำไมมันเอง :-)
liori

ฉันไม่คิดว่าจะมีทางล้นสแต็คกลับมาแล้ว :)
Jeremy French

2
ชุมชน Drupal มักมองหาคนที่จะช่วยเหลือเกี่ยวกับเอกสาร ทำไมไม่ช่วยถ้าเอกสารเงอะงะหรือแบบฝึกหัดอ่อนแอ? :)
Rimian

4
การจัดทำเอกสารจำเป็นต้องมีความเข้าใจ .. ซึ่งต้องใช้เอกสารประกอบหรือมีประสบการณ์มากมาย
Damon

คำตอบ:


160

Drupal อาจสร้างความสับสนให้กับหน้านี้บางส่วนเพราะมันมีฟังก์ชั่นที่ค่อนข้างสแต็ค ถึงแม้ว่ามันจะเป็น PHP แบบโพรซีเดอร์ แต่มันเป็นอีเว้นท์ / ผู้ฟังที่ขับเคลื่อนด้วยสถาปัตยกรรมและไม่มี "การไหล" อย่างง่ายในสคริปต์ PHP หลักเพื่อให้คุณดู ฉันเพิ่งทำการนำเสนอในเรื่องนี้มากและสไลด์จะโพสต์บนสไลด์โชว์ แต่การสรุประดับสูงอย่างรวดเร็วอาจมีประโยชน์

  • ไฟล์ index.php ของ Drupal ทำหน้าที่เป็นตัวควบคุม frontside หน้าทั้งหมดจะถูกส่งผ่านมันและ URL "จริง" ที่ผู้ใช้ร้องขอจะถูกส่งไปยัง index.php เป็นพารามิเตอร์
  • ระบบเราเตอร์พา ธ ของ Drupal (MenuAPI) ใช้เพื่อจับคู่พา ธ ที่ร้องขอกับโมดูลปลั๊กอินที่กำหนด โมดูลปลั๊กอินนั้นมีหน้าที่สร้าง "เนื้อหาหลัก" ของหน้า
  • เมื่อเนื้อหาของหน้าหลักถูกสร้างขึ้น index.php จะเรียกใช้ธีม ('หน้า', $ เนื้อหา) ซึ่งส่งมอบเนื้อหาให้กับระบบการจัดรูปแบบ / การสร้างสกินของ Drupal ที่นั่นมันห่อในแถบด้านข้าง / ส่วนหัว / วิดเจ็ต / ฯลฯ
  • เพจที่แสดงผลจะถูกส่งกลับไปที่ apache และจะถูกส่งกลับไปยังเบราว์เซอร์ของผู้ใช้

ในระหว่างกระบวนการทั้งหมดนั้นโมดูลปลั๊กอินของ 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 '


1
FWIW มันแตกต่างกันเล็กน้อยใน D7 (ชุดรูปแบบ ('หน้า') และสัญลักษณ์ถูกแคชในรีจิสตรีโค้ด) แต่กระบวนการโดยรวมยังคงเหมือนเดิม
FGM

2
คำอธิบายที่ยอดเยี่ยม Eaton ขอขอบคุณที่ได้ออกไปเที่ยวที่นี่ คำถามของฉันสำหรับคุณคือคุณจะแก้ไขข้อบกพร่องทั้งหมดนี้ได้อย่างไรนอกเหนือจากการวาง var_dump ในแต่ละโมดูลเพื่อค้นหาว่าเกิดอะไรขึ้น
Brian G

3
คำถามที่ดี. ขึ้นอยู่กับสิ่งที่คุณกำลังดีบัก การติดตั้งโมดูล devel สามารถช่วยได้โดยมอบเครื่องมือที่มีประโยชน์ให้กับคุณ ขั้นตอน (ในกรณีส่วนใหญ่) คือการระบุโมดูลที่รับผิดชอบในการสร้างหน้าให้ hook_menu () แมป URL / เส้นทางไปยังโมดูลเพื่อให้สามารถช่วยได้ จากนั้นระบุสิ่งที่เมนูการเรียกกลับกำลังทำอยู่ - การเรียก drupal_get_form () เพื่อสร้างฟอร์มหรือธีม ('some_custom_thing') เพื่อสร้าง HTML ฯลฯ ดูการใช้งานฟังก์ชั่นเช่น drupal_alter () หรือ module_invoke_all () ที่เรียกกิจกรรมสำหรับคนอื่น ๆ โมดูลเกินไป ...
อีตัน

ฉันพบว่ามันมีประโยชน์สุด ๆ คุณรู้หรือไม่ว่า Drupal 7 แตกต่างกันอย่างไร
Hortitude

อัปเดต D7: (ดูเพิ่มเติม) drupal.org/node/350780
dreftymac

63

กลไกการแสดงหน้า Drupal

เพื่อให้เข้าใจถึงวิธีการทำงานของ 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 อื่น ๆ )


20

คำตอบของ Eaton ให้ภาพรวมที่ดี (ฉันใหม่ที่นี่ดังนั้นฉันไม่สามารถแก้ไขเขาได้ดังนั้นความคิดเห็น)

ช่วงเวลาที่โหดร้าย "aha" สำหรับฉันคือการตระหนักถึงทุกสิ่งที่เกิดขึ้นผ่านทาง index.php และจากนั้นก็ผ่านฟอเรสต์ของโมดูล หากต้องการขยายฟังก์ชันการทำงานหลักอย่าเขียนซ้ำ แทนที่จะคัดลอกโมดูลลงใน / sites / all / modules / หรือ / sites / [yoursite] / โมดูลและขยายนั้นหรือสร้างโมดูลใหม่ในสถานที่เหล่านั้น เหมือนกันสำหรับธีม ไดเรกทอรีโมดูลสามารถมีรหัสที่แสดงเช่นกันในรูปแบบของ tpl, css เป็นต้น

หากคุณคุ้นเคยกับกรอบประเภท MVC ที่เข้มงวดขึ้นเช่น Rails, Django เป็นต้นสิ่งนี้จะทำให้เกิดความสับสนเล็กน้อย โมดูลสามารถผสมในรหัสแสดงผลจำนวนมากและหากคุณกำลังดูโมดูลหรือเทมเพลตของบุคคลอื่นในที่สุดคุณก็จะสามารถเดินย้อนกลับไปในกองซ้อนได้ นั่นคือความงาม / ความเจ็บปวดจากการทำงานใน PHP

แดกดัน "เพียงแค่สร้างแอป" อาจเป็นวิธีที่เลวร้ายที่สุดในการเรียนรู้สิ่งนี้ Drupal ทำสิ่งต่าง ๆ ออกมาจากกล่องที่คลุมเครือจนคุณเข้าใจการควบคุม ไม่มีอะไรในไฟล์ tpl ที่บอกคุณว่าฟังก์ชั่นที่มีชื่อสนุกอย่าง l () มาจากไหน


7

ขึ้นอยู่กับความเข้าใจที่ลึกซึ้งที่คุณต้องการ หากคุณมีความรู้ php เป็นอย่างดีฉันขอแนะนำให้อ่านรหัสด้วยตนเองโดยเริ่มจาก index.php จากนั้นไปที่ include / bootstrap.inc จากนั้นสคริปต์อื่น ๆ ในไดเรกทอรีนั้น

กุญแจรวมถึงไฟล์:

  • menu.inc มีความสำคัญอย่างยิ่งต่อการทำความเข้าใจว่าระบบโดยรวมทำงานอย่างไรเพราะจัดการการแมป URL กับเนื้อหาโดยปริยายจำนวนมาก
  • common.inc มีฟังก์ชั่นลึกลับเป็นอย่างมากส่วนใหญ่ซึ่งเป็นพื้นฐานของ API
  • module.inc จัดการการร้องขอเบ็ดที่ Eaton กล่าวถึง
  • ข้อเสนอ form.inc กับการแสดงแบบฟอร์มการส่งและการประมวลผล
  • theme.inc จัดการการนำเสนอ

นอกจากนี้ยังมีฟังก์ชั่นหลักบางอย่างในโมดูล / ไดเรกทอรี โดยเฉพาะอย่างยิ่ง modules / node / node.module เป็นพื้นฐานของระบบโหนดซึ่งโดยทั่วไปแล้วสิ่งที่ใช้ในการห่อหุ้มเนื้อหาของไซต์

รหัสโดยทั่วไปแล้วมีความคิดเห็นดีและชัดเจน การใช้มาร์กอัป Doxygen ในการแสดงความคิดเห็นหมายความว่ารหัสมีประสิทธิภาพเป็นเอกสารมาตรฐาน

นอกจากนี้ยังช่วยในการดำเนินการนี้โดยใช้โปรแกรมแก้ไขที่สามารถข้ามไปยังคำจำกัดความของฟังก์ชันได้อย่างรวดเร็ว การใช้เสียงเรียกเข้าร่วมกับ ctags นั้นเหมาะกับฉัน คุณต้องบอก ctags ให้ทำดัชนี. inc, .module เป็นต้นไฟล์เป็นไฟล์ php


5

ฉันเรียนรู้การโหลดโดยการนำเข้ารหัส drupal .php ไปยังโครงการ NetBeans คุณสามารถเรียกใช้ดีบักเกอร์ netbeans และดูเฟสต่าง ๆ ของหน้ารวมกัน


5

หนังสือที่ดีที่สุดในหัวข้อคือ "การพัฒนา Drupal" และ "การใช้ Drupal"

"การพัฒนา Drupal Pro" รวมถึงผังงานที่ดีหลายรายการและบทสรุปอย่างละเอียดของ APIs ของ Drupal (รูปแบบการจัดวางและอื่น ๆ ) มันมีจุดประสงค์ที่จะให้คำแนะนำแก่ผู้คนในการสร้างโมดูลและธีมของตัวเอง แต่มีคุณค่ามากมายสำหรับนักพัฒนา PHP ที่มีความชำนาญโดยเฉลี่ยที่ต้องการเข้าใจ Drupal นอกจากนี้ฉันได้สร้างโมดูลที่กำหนดเองสำหรับทุกไซต์ที่ฉันสร้างขึ้นเพื่อให้สามารถควบคุมสิ่งต่าง ๆ เช่นการซ่อนฟิลด์ที่เลือกในรูปแบบต่าง ๆ (ซึ่งโดยทั่วไปคุณต้องการทำเพื่อทำให้ฟอร์มโหนดง่ายขึ้นเพื่อสิ้นสุด ผู้ใช้) ดังนั้นจึงเป็นการดีที่จะมีความรู้นี้ภายใต้หมวกของคุณ

"การใช้ Drupal" มีวัตถุประสงค์เพื่อผู้พัฒนาเว็บไซต์ที่ต้องการทราบวิธีการสร้างสิ่งที่ดีเช่นแกลเลอรี่บล็อกและไซต์เครือข่ายสังคมออนไลน์ มันผ่านหลายกรณีการใช้งานและแสดงวิธีการกำหนดค่าโมดูลที่มีอยู่ให้ทำงานแต่ละงาน ในกระบวนการนี้จะทำให้คุณคุ้นเคยกับโมดูลเสริมที่สำคัญ "Content Construction Kit" (CCK) และ "Views" วิธีสร้างบล็อกและเทมเพลตที่กำหนดเองและการบำรุงรักษาไซต์ Drupal ฉันแนะนำหนังสือเล่มนี้โดยเฉพาะสำหรับผู้ที่ต้องการเพิ่มความเร็วและใช้งานจริง Drupal ทันที ในกระบวนการคุณจะเข้าใจองค์กรภายในของ Drupal


5

นี่ (สำหรับ Drupal 6) & นี่ (สำหรับ Drupal 7) เป็นภาพรวมสถาปัตยกรรมที่ดีงามของ drupal หากคุณต้องการรายละเอียดเพิ่มเติมฉันจะเริ่มเขียนเอกสารส่วนใหญ่ว่าดี การพยายามที่จะเรียนรู้ในระดับสูงโดยไม่มีสิ่งที่เป็นรูปธรรมที่จะบรรลุจะยากกว่าการลองทำอะไรสักอย่าง


4

ผู้มีส่วนร่วมใหม่ที่นี่ 2 ปีในการสนทนา ;-)

กำลังตอบกลับไปที่https://stackoverflow.com/a/1070325/1154755

หากต้องการขยายฟังก์ชันการทำงานหลักไม่ต้องเขียนซ้ำ แทนที่จะคัดลอกโมดูลลงใน / sites / all / modules / หรือ / sites / [yoursite] / โมดูลและขยายนั้นหรือสร้างโมดูลใหม่ในสถานที่เหล่านั้น เหมือนกันสำหรับธีม

จริงๆแล้วฉันไม่ต้องคัดลอกโมดูลหลักเพื่ออัปเดต Drupal Hooks ควรเป็นทุกสิ่งที่คุณต้องการ

สำหรับธีมใช่บางครั้งเป็นหนทางเดียวที่จะไปได้ แต่บ่อยครั้งคุณสามารถสร้างหัวข้อย่อยเพื่อรับผลลัพธ์ที่คุณต้องการ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.