บทความนี้อธิบายวิธีการแก้ปัญหาเทมเพลต ThinkPHP โดยไม่แยกวิเคราะห์เอาต์พุตโดยตรงตามที่เป็นอยู่ แบ่งปันสำหรับการอ้างอิงของคุณ รายละเอียดมีดังนี้:
1. คำถาม:
ฉันได้เรียนรู้เทมเพลต ThinkPHP เมื่อเร็ว ๆ นี้ แต่ฉันพบว่าหน้าเทมเพลตเป็นเหมือนเดิม หลังจากการค้นหาอย่างหนักในที่สุดฉันก็พบวิธีแก้ปัญหา
2. โซลูชัน:
หลายคนพบปัญหาเดียวกัน ตัวละครของ __Root__, __public__ และ __App__ ที่มีอยู่ในสตริงที่กำหนดในตัวแปรจะถูกแทนที่ด้วยเส้นทางจริงเมื่อแสดงในเทมเพลต นั่นคือปัญหานี้ถูกค้นพบเมื่อเขียนระบบการจัดการไฟล์ TIMI
อ่านซอร์สโค้ดจากไฟล์และส่งออกไปยังหน้าและพบว่าตราบใดที่อักขระพา ธ คือ TP มันจะถูกแทนที่ด้วยเส้นทางจริง
ตัวอย่างเช่น:
การคัดลอกรหัสมีดังนี้: $ this-> กำหนด ('fileContent', $ fileContent); // $ fileContent มีอักขระ __public__ "ค่าคงที่พา ธ "
หน้าจะส่งออกเป็นเส้นทางจริง /สาธารณะ /
ในช่วงเวลานี้ฉันได้ลองหลายสิ่งหลายอย่างเช่นการเข้ารหัส Base64 เมื่อกำหนดและถอดรหัสเมื่อส่งออกเทมเพลต แต่พบว่ามันไม่ทำงาน ในที่สุดฉันก็อดไม่ได้ที่จะดูซอร์สโค้ดของ TP และพบว่าในขั้นตอนสุดท้ายของวิธีการแสดงผลฉันแทนที่ "ค่าคงที่เส้นทาง TP" ด้วยเส้นทางจริงโดยเรียกวิธีแท็ก เป็นเรื่องปกติก่อนที่วิธีการเรนเดอร์
เดิมทีฉันวางแผนที่จะเปลี่ยนซอร์สโค้ดเพื่อให้ตระหนักถึงข้อกำหนดของรองเท้าเด็กต่อไปนี้:
บอสนี่เป็นวิธีแก้ปัญหาชั่วคราวหรือทางออกสุดท้ายหรือไม่?
แต่ฉันคิดว่าเป็นการดีที่จะเพิ่มการตัดสินลงในวิธีการกำหนด ()
หากเป็น $ this-> esign (',' ', false) เนื้อหาจะไม่ถูกแทนที่และผลลัพธ์จะเป็นเช่นเดียวกับ
เป็นผลให้หลังจากอ่านซอร์สโค้ดนี้ฉันพบว่ามันไม่ง่ายเลยและการเปลี่ยนแปลงนั้นใหญ่เกินไป
คำตอบสุดท้ายจากรองเท้าเด็กคนอื่นชี้ให้เห็นทางออกสุดท้าย:
"คุณสามารถอ้างถึงเนื้อหาได้ที่นี่: //www.vevb.com/article/54217.htm (การเปลี่ยนแม่แบบ)
ด้วยกฎการเปลี่ยนเทมเพลตสตริง __public__ ทั้งหมดในหน้าจะถูกแทนที่ หากคุณต้องการส่งออก __public__ strings ไปยังเทมเพลตเราสามารถเพิ่มกฎการเปลี่ยนได้เช่น:
คัดลอกรหัสดังนี้: 'tmpl_parse_string' => array (
'-public--' => '__public__', // ใช้กฎใหม่เพื่อส่งออก/สตริงสาธารณะ
-
หลังจากเพิ่มกฎการเปลี่ยนด้วยวิธีนี้หากเราต้องการส่งออกสตริง __public__ เราจะต้องเพิ่ม-สาธารณะ-ลงในเทมเพลตและวิธีการส่งออกของสตริงการเปลี่ยนอื่น ๆ จะคล้ายกัน
หลังจากเพิ่มกฎการเปลี่ยนด้วยวิธีนี้หากเราต้องการส่งออกสตริง __public__ เราจะต้องเพิ่ม-สาธารณะ-ลงในเทมเพลตและวิธีการส่งออกของสตริงการเปลี่ยนอื่น ๆ จะคล้ายกัน
ดังนั้นแผนการถูกปล่อยออกมา:
กำหนดค่าในไฟล์กำหนดค่าของ TP config.php
คัดลอกรหัสดังนี้: 'tmpl_parse_string' => array (// การกำหนดค่าพา ธ
// กู้คืนเส้นทางไฟล์ timi
'-public--' => '__public__'
'--App--' => '__App__'
'-url--' => '__url__'
'-การกระทำ-' => '__action__',
'-ตัวเอง-' => '__self__'
'--info--' => '__info__'
'-ext--' => '__ext__'
-
เมื่ออ่านซอร์สโค้ดให้แทนที่ "อักขระคงที่พา ธ " __ROOT__ เป็น-รูท-:
การคัดลอกรหัสมีดังนี้: $ fileContent = file_get_contents ($ filePath);
$ fileContent = htmlspecialchars (preg_replace ('/__(.*?)__/ คือ', '-$ 1-', $ fileContent));
จากนั้นการกำหนดค่า TMPL_PARSE_STRING จะถูกแทนที่เมื่อเทมเพลตถูกแยกวิเคราะห์ดังแสดงในรูปด้านล่าง:
ดังนั้นปัญหานี้ได้รับการแก้ไข "ชั่วคราว" และ "สมบูรณ์แบบ"
ฉันหวังว่าบทความนี้จะเป็นประโยชน์กับการเขียนโปรแกรม Framework ThinkPHP ของทุกคน