Kirby Opener เป็นปุ่มฟิลด์แผง Kirby CMS ที่ช่วยให้คุณสามารถใช้ตัวยึดตำแหน่งเพื่อสร้าง URL แบบไดนามิกซึ่งจะถูกเรียกโดยมีและไม่มีการตอบสนอง ajax หรือเริ่มการดาวน์โหลด
หมายเหตุ: นี่ไม่ใช่ปลั๊กอินฟรี เพื่อใช้งานบนเซิร์ฟเวอร์ที่ใช้งานจริง คุณจะต้องซื้อใบอนุญาต สำหรับรายละเอียดเกี่ยวกับรูปแบบใบอนุญาตของ Kirby Opener ให้เลื่อนลงไปที่ส่วนใบอนุญาตของเอกสารนี้
เปิด URL ใด ๆ จากภายในแผง
เพิ่มข้อมูลที่กำหนดเองภายใน URL โดยใช้ ตัวยึดตำแหน่ง
เรียกใช้ฟังก์ชัน Routes หรือ Page Models ได้อย่างง่ายดาย
แสดงข้อความสถานะการตอบสนอง JSON ที่กำหนดเองที่ป้ายกำกับปุ่ม
ทริกเกอร์การดาวน์โหลดไฟล์
ทริกเกอร์สำเนาคลิปบอร์ดของ URL
ทริกเกอร์การรีเฟรชหน้าเมื่อสำเร็จ
ทริกเกอร์กล่องโต้ตอบการยืนยันเบราว์เซอร์
ตัวยึดตำแหน่ง ที่ขยายได้ง่าย
การแยกวิเคราะห์การกำหนดค่า การตอบสนอง json
เคอร์บี้ 2.3+
kirby plugin:install bnomei/kirby-opener
$ git submodule add https://github.com/bnomei/kirby-opener.git site/plugins/kirby-opener
ดาวน์โหลดเนื้อหาของที่เก็บนี้เป็นไฟล์ ZIP
เปลี่ยนชื่อโฟลเดอร์ที่แยกออกมาเป็น kirby-opener
และคัดลอกลงในไดเร็กทอรี site/plugins/
ในโครงการ Kirby ของคุณ
เริ่มแผง Kirby และสร้างหน้าใหม่ด้วย openerexample
เทมเพลตตัวอย่างที่ปลั๊กอินนี้มีให้ ปลั๊กอินยังมาพร้อมกับช่องตัวอย่างเพื่อให้คุณเริ่มต้นได้ คุณสามารถค้นหาคำจำกัดความของฟิลด์ส่วนกลางได้ในโฟลเดอร์ kirby-opener/blueprints/fields
หากต้องการใช้ปลั๊กอินอย่างเต็มที่ คุณจะต้องกำหนด URL ของคุณเองโดยใช้ ตัวยึดตำแหน่ง และอาจสร้างตัวควบคุมและ/หรือเทมเพลตเพื่อตอบสนองด้วย JSON อีกด้วย
example1: openeropenuser example2: openeropenexternal example3: openeropenpagefield example4: openerpopup example5: openerdownload example6: openersuccess example7: openererror example8: openercontroller
เพิ่มคำจำกัดความของฟิลด์นี้ให้กับพิมพ์เขียวใดๆ และเปิดเพจในแผง
example2explained:type: openercommand: 'https://www.google.com/?q={field.title}/open:yes'text: 'ค้นหาชื่อใน Google'
{field.title}
เรียกว่า ตัวยึดตำแหน่ง มันจะถูกแทนที่ด้วยบริบทที่เกี่ยวข้องในหน้าแผง ในกรณีนี้ด้วยฟิลด์ title
ของ $page
-object ปัจจุบัน
เพิ่มคำจำกัดความของฟิลด์นี้ให้กับพิมพ์เขียว มันจะสร้างปุ่ม opener
ใหม่ในแผงที่มีป้ายกำกับ Download fileXY
ขณะที่รอการตอบกลับ ...
จะปรากฏขึ้น เมื่อเพจที่ถูกเรียกตอบสนองด้วย JSON เพจนั้นจะถูกแยกวิเคราะห์ เว้นแต่จะมี message
อื่นใน JSON textsuccess
จากพิมพ์เขียวจะปรากฏขึ้น
example5explained:type: openercommand: '/{page.url}/fileparam:fileXY/download:yes'text: 'ดาวน์โหลดไฟล์'textprogress: '...'textsuccess: 'ดาวน์โหลด...'
{page.url}
ภายใน command
เป็น ตัวยึดตำแหน่ง และจะถูกแทนที่ด้วย URL ของหน้าปัจจุบัน มี ตัวยึดตำแหน่ง ที่กำหนดไว้ล่วงหน้าอยู่สองสามตัว แต่คุณอาจต้องการกำหนดตัวยึดของคุณเอง คุณสมบัติใดของออบเจ็กต์ JSON รูทที่ถูกแยกวิเคราะห์เพื่อกำหนดความสำเร็จ ข้อความและ URL ของไฟล์สามารถกำหนดค่าได้ หัวข้อเหล่านี้จะอธิบายในภายหลังใน readme นี้
download:yes
-parameter ยังสามารถกำหนดค่าได้ มันบอกให้โค้ดจาวาสคริปต์ของปลั๊กอินดาวน์โหลดไฟล์และไม่เปิดมันในหน้าต่างป๊อปอัป (เนื่องจากเบราว์เซอร์ส่วนใหญ่จะบล็อกสิ่งนั้นตามค่าเริ่มต้น)
สำหรับตัวอย่างนี้ เราจะตอบกลับด้วยการดาวน์โหลดไฟล์ลิขสิทธิ์เคอร์บี้ ในโค้ดเทมเพลตของคุณ คุณต้องสร้างและส่งกลับการตอบกลับ JSON
if(param('fileparam') == 'fileXY') { $code = f::exists(kirby()->roots()->index().DS.'license.md') ? 200 : 400; $json = ['code' => $code, 'fileurl' => kirby()->urls()->index().'/license.md', ];นอน(5); // รอสักครู่เพื่อเป็นตัวอย่าง วัตถุประสงค์die(response::json($json, $code)); -
โปรดทราบว่านี่เป็นการใช้งานขั้นพื้นฐานของการส่งคืน JSON Kirby Cookbook และ Kirby Forum เป็นแหล่งข้อมูลที่ดีในการปรับปรุงให้ดีขึ้น
ตอนนี้เปิดเพจของคุณในแผงควบคุมแล้วกดปุ่ม Download fileXY
กล่องโต้ตอบการดาวน์โหลดเบราว์เซอร์ของคุณสำหรับไฟล์ kirby License.md ควรปรากฏขึ้น เว้นแต่คุณจะถอดใบอนุญาตออก – ไอ้วายร้ายตัวน้อย
เพื่อให้แน่ใจว่าคำสั่งสามารถเรียกได้จากภายในแผงควบคุมเท่านั้น คุณต้องเพิ่มการป้องกันการเรียงลำดับ สมมติว่าคุณเตรียมตัวควบคุม api
(หรือเพียงแค่เทมเพลต) ไว้แล้ว เพิ่มคำจำกัดความของฟิลด์ต่อไปนี้ให้กับพิมพ์เขียวที่คุณต้องการทริกเกอร์ API
exampleController:type: openercommand: '/api/{field.autoid}/{page.diruri.encoded}/{page.secret}/mycmd:dowork'text: 'ทำงาน'textprogress: 'ทำงาน...'textsuccess: 'เสร็จสิ้น' ข้อผิดพลาดข้อความ: 'ล้มเหลว'
ดังนั้นในหน้าใดๆ ภายในแผงที่มีฟิลด์นี้ คุณจะมีปุ่ม Do Work
แล้ว การกดจะเป็นการเริ่มคำขอ ajax ไปยังหน้า api
พร้อมพารามิเตอร์เพิ่มเติม เนื่องจากพารามิเตอร์เหล่านี้มี ตัวยึดตำแหน่ง บางตัวด้วย เช่นกัน เหล่านี้จะถูกแทนที่ด้วยค่าเฉพาะบริบท
ตอนนี้คุณต้องมีตรรกะในการจัดการคำขอ ฉันชอบใช้คอนโทรลเลอร์ร่วมกับเทมเพลต ดังนั้นให้วางสิ่งนี้ลงในคอนโทรลเลอร์ api
ของคุณ ปลั๊กอินนี้มาพร้อมกับตัวควบคุมตัวอย่างเพื่อช่วยคุณในการเริ่มต้น แต่มาดูกันว่าคอนโทรลเลอร์ทำงานอย่างไร
<?phpreturn function($site, $pages, $page) { // เตรียม json response$json = ['code' => 400, 'message' => '', 'fileurl' => '']; // #1: ตัวเลือกการรักษาความปลอดภัย...// กำหนดให้ผู้ใช้ต้องเข้าสู่ระบบและ // คำขอจะต้องมาจากปลั๊กอินตัวเปิดแผงควบคุมและ// จะต้องเป็น ajax callif ที่เหมาะสม ( !$site->ผู้ใช้ () || !boolval(param('panel')) || // เพิ่มโดยปลั๊กอินโดยอัตโนมัติ !r::อาแจ็กซ์() ) { ตาย(ตอบกลับ::json($json, 400)); } // #2: ตอนนี้ตรวจสอบว่าจำเป็นต้องทำงานที่ allif(param('mycmd') == 'dowork') { // #3: ให้เพจทำงานที่$pageToWork = null; // #3.1: ลอง autoidif($autoid = param('autoid')) { // เหลือให้คุณ Implement$pageToWork = myGetPageByAutoIdFunction($autoid); - // #3.2: ลอง dirurielse if($diruri = param('diruri')) { // ปลั๊กอินจัดเตรียมวิธีการของเพจเพื่อรับเพจจากการเข้ารหัส uri// ทำไมต้องเข้ารหัส uri? เนื่องจากอาจมีหลาย '/' และจะทำให้พารามิเตอร์เสียหาย$pageToWork = $pages->openerDiruriEncodedGetPage($diruri); } // #4: พบเพจแล้วหรือยัง? จากนั้นตรวจสอบด้วยความลับแล้วเริ่มทำงาน// ทำไมต้องเป็นความลับ? เพื่อเพิ่มรูปแบบการรักษาความปลอดภัยเพิ่มเติม ดังนั้นการสร้างที่ถูกต้อง// คำขอเป็นสิ่งที่คุณสามารถทำได้เท่านั้นและไม่มีใครจากภายนอก if($pageToWork && $pageToWork->openerSecret() == param('secret')) { // นอนหลับ(5); // จากนั้นตอบกลับ...$json['code'] = 200; $json['message'] = 'ช่วงพักเที่ยง!'; - } // เพื่อความเรียบง่าย เพียงออกจาก nowdie(response::json($json, intval($json['code']))); // โดยปกติแล้วคอนโทรลเลอร์จะคืนค่าบางค่าไปที่เทมเพลต//return compact('json');};
ตัวยึดตำแหน่งช่วยให้คุณสร้างคำสั่งได้อย่างรวดเร็ว เหตุใดฉันจึงใช้ตัวยึดตำแหน่งแทนที่จะแยกวิเคราะห์คำสั่งโดยตรง สิ่งเหล่านี้ช่วยให้คุณหลีกเลี่ยงข้อผิดพลาดในการยึดมั่นในหลักการ DRY
แทนที่ไวด์การ์ดด้วยชื่อฟิลด์พิมพ์เขียวเพื่อรับค่าของฟิลด์ รองรับเฉพาะตัวเลขและสตริงเท่านั้น
จะได้รับฟิลด์และเรียก urlencode()
ตามค่าของมัน
$page->url()
ในเทมเพลต
$page->parent()->url()
ในเทมเพลต
โทเค็นคุณสามารถตรวจสอบในเทมเพลต/คอนโทรลเลอร์ได้หากคำขอถูกต้อง จำกัดอยู่ที่หน้า
โทเค็นคุณสามารถตรวจสอบในเทมเพลต/คอนโทรลเลอร์ได้หากคำขอถูกต้อง เวอร์ชันไวด์การ์ด
urlencoded($page->diruri())
เพื่อส่งต่อหน้านี้ไปยังผู้อื่น มีฟังก์ชันตัวช่วย – ดูตัวอย่างคอนโทรลเลอร์
การใช้ปลั๊กอิน autoid เป็นทางเลือกที่ดีสำหรับ diruri
หากคุณใช้วิธีการค้นหาแบบรวดเร็วโดยใช้แคช เนื่องจากเพียงแค่ใช้ $site->index()
หรือ $site->search()
อาจจะช้าถ้าคุณมีหลายหน้า
คุณยังสามารถกำหนดการตั้งค่าของคุณเองได้ด้วยการสร้างการตั้งค่า site/config/config.php
ปลั๊กอินนี้ให้สิทธิ์คุณในการเข้าถึง $site
และ $page
c::set('plugin.opener.placeholder', [ 'myfield' => '$page->myfield()->fieldmethod()', 'another' => '$page->parent()->diruri ()', 'ยังอีก' => '$site->otherfield()', -
คุณสามารถตั้งค่าเหล่านี้ได้ใน site/config/config.php
ของคุณ
ค่าเริ่มต้น: ''
เพิ่มใบอนุญาตของคุณที่นี่ และวิดเจ็ตเตือนให้คุณซื้อใบอนุญาตจะหายไปจากแผงควบคุม
ค่าเริ่มต้น: SALT เฉพาะสำหรับเว็บเซิร์ฟเวอร์ของคุณ
ค่านี้ใช้เพื่อสร้าง secret
และคุณควรตั้งค่าของคุณเองเพื่อปรับปรุงความปลอดภัย แต่ไม่จำเป็น
ค่าเริ่มต้น: จริง
หากปิดใช้งาน ปลั๊กอินจะไม่ติดตั้ง blueprints, templates, controllers, hooks and routes
ใดๆ ที่ใช้ในตัวอย่าง ใช้การตั้งค่านี้ในสภาพแวดล้อมการผลิต
ค่าเริ่มต้น: code
ใช้การตั้งค่านี้เพื่อกำหนดคุณสมบัติรูตออบเจ็กต์ json ซึ่งจะใช้ในการแยกวิเคราะห์รหัสสถานะ
ค่าเริ่มต้น: message
ใช้การตั้งค่านี้เพื่อกำหนดคุณสมบัติรูทของวัตถุ json ซึ่งจะใช้ในการแยกวิเคราะห์ข้อความตอบกลับ
ค่าเริ่มต้น: fileurl
ใช้การตั้งค่านี้เพื่อกำหนดคุณสมบัติรูทอ็อบเจ็กต์ json ซึ่งจะใช้ในการแยกวิเคราะห์ URL ของไฟล์ที่จะดาวน์โหลด
ค่าเริ่มต้น: 5000
ในหน่วย ms
หลังจากนั้นการหน่วงเวลาปุ่มจะถูกรีเซ็ตจากการแสดงข้อความเป็นสถานะเริ่มต้น
ค่าเริ่มต้น: เท็จ
การดาวน์โหลดจะถูกเปิดผ่านกล่องโต้ตอบ Bowser หากเป็นไปได้ และไม่ใช่เป็นหน้าต่างป๊อปอัปที่เบราว์เซอร์ส่วนใหญ่บล็อก
ค่าเริ่มต้น: 'ดาวน์โหลด: ใช่'
ส่วนคำสั่งเพื่อบอกสคริปต์ปลั๊กอิน js ให้ทริกเกอร์การดาวน์โหลดเนื้อหาของการตอบสนอง JSON (ดู json.fileurl
)
ค่าเริ่มต้น: 'เปิด: ใช่'
ส่วนคำสั่งเพื่อบอกสคริปต์ปลั๊กอิน js ให้ทริกเกอร์หน้าต่าง/แท็บใหม่พร้อมคำสั่งเป็น url จะไม่มีการโทรอาแจ็กซ์
ค่าเริ่มต้น: 'คัดลอก: ใช่'
ส่วนคำสั่งเพื่อบอกสคริปต์ปลั๊กอิน js ให้ทริกเกอร์สำเนาคลิปบอร์ดของ url จะไม่มีการโทรอาแจ็กซ์ หากเบราว์เซอร์บล็อกเบราว์เซอร์จะทำงานเหมือนกับ open:yes
ค่าเริ่มต้น: 'รีเฟรช: ใช่'
ส่วนคำสั่งเพื่อบอกสคริปต์ปลั๊กอิน js ให้ทริกเกอร์การรีเฟรชหน้าเมื่อสำเร็จ
ค่าเริ่มต้น: เท็จ
หากเปิดใช้งาน คุณจะสามารถใช้ $pageModel
ในตัวยึดตำแหน่งของคุณเพื่อเข้าถึงฟังก์ชันที่กำหนดไว้ใน Kirby Page Models ของคุณ
ค่าเริ่มต้น: เท็จ
คำสั่งอนุญาตให้คุณเชื่อมโยง $page
หรือ $site
และวิธีการของพวกเขา แต่ไม่มีพารามิเตอร์ หากคุณเปิดใช้งาน allow-eval
คุณจะคลั่งไคล้ตัวยึดตำแหน่งของคุณได้ถึง 100 ตัวอักษรและคำสั่งเดียว แต่เนื่องจาก eval()
เป็นอันตราย การตั้งค่านี้จึงถูกปิดใช้งานตามค่าเริ่มต้น โปรดตระหนักถึงความเสี่ยงที่คุณเปิดใช้งานการตั้งค่านี้
ตัวยึดตำแหน่งดังต่อไปนี้จะเป็นไปได้หากเปิดใช้งาน:
c::set('plugin.opener.placeholder', [ 'crazy' => 'panel()->page("some/wicked/uri")->mymethod($page->somefield()->value( ))', // น้อยกว่า 100 ตัวอักษร]);
ปลั๊กอินนี้มีให้ "ตามสภาพ" โดยไม่มีการรับประกัน คุณต้องยอมรับความเสี่ยงในการใช้งานและทดสอบด้วยตัวเองทุกครั้งก่อนที่จะใช้ในสภาพแวดล้อมการใช้งานจริง หากคุณพบปัญหาใด ๆ โปรดสร้างปัญหาใหม่
สามารถประเมิน Kirby Opener ได้ตราบเท่าที่คุณต้องการบนจำนวนเซิร์ฟเวอร์ส่วนตัวที่คุณต้องการ หากต้องการปรับใช้ Kirby Opener บนเซิร์ฟเวอร์สาธารณะ คุณต้องซื้อใบอนุญาต คุณต้องมีใบอนุญาตที่ไม่ซ้ำกันหนึ่งใบต่อเซิร์ฟเวอร์สาธารณะ (เช่นเดียวกับที่ Kirby ทำ) ดู license.md
สำหรับข้อกำหนดและเงื่อนไข
อย่างไรก็ตาม แม้ว่าจะมีรหัสใบอนุญาตที่ถูกต้อง เราก็ไม่แนะนำให้ใช้ในโครงการใดๆ ที่ส่งเสริมการเหยียดเชื้อชาติ การกีดกันทางเพศ การกลัวคนรักร่วมเพศ การทารุณกรรมสัตว์ หรือคำพูดแสดงความเกลียดชังในรูปแบบอื่นใด
การสนับสนุนด้านเทคนิคมีให้ใน GitHub เท่านั้น ไม่มีการรับรองหรือรับประกันเกี่ยวกับเวลาตอบกลับที่มีการตอบคำถามสนับสนุน แต่คุณยังสามารถเข้าร่วมการสนทนาในฟอรัม Kirby ได้อีกด้วย
Kirby Opener ได้รับการพัฒนาและดูแลโดย Bruno Meilick นักออกแบบเกมและนักพัฒนาเว็บไซต์จากประเทศเยอรมนี ฉันอยากจะขอบคุณ Fabian Michael ที่สร้างแรงบันดาลใจให้ฉันมากมาย และ Julian Kraan ที่เล่าเรื่อง Kirby ให้ฟังตั้งแต่แรก