Kirby Opener هو زر حقل لوحة Kirby CMS الذي يسمح لك باستخدام العناصر النائبة لإنشاء عناوين URL ديناميكية يتم استدعاؤها مع أو بدون استجابة ajax أو بدء التنزيلات.
ملحوظة: هذا ليس مكونًا إضافيًا مجانيًا. لاستخدامه على خادم الإنتاج، تحتاج إلى شراء ترخيص. للحصول على تفاصيل حول نموذج ترخيص Kirby Opener، قم بالتمرير لأسفل إلى قسم الترخيص في هذا المستند.
افتح أي عنوان URL من داخل اللوحة
إضافة بيانات مخصصة داخل عنوان URL باستخدام العناصر النائبة
يمكنك بسهولة الاتصال بوظائف الطرق أو نماذج الصفحة
عرض رسائل حالة استجابة 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
الحالي.
أضف تعريف الحقل هذا إلى مخطط. سيتم إنشاء زر 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 للملف. سيتم وصف هذه المواضيع لاحقًا في هذا الملف التمهيدي.
يمكن أيضًا تكوين معلمة download:yes
. فهو يخبر كود جافا سكريبت الإضافي بتنزيل الملف وعدم فتحه في نافذة منبثقة (نظرًا لأن معظم المتصفحات ستحظر ذلك افتراضيًا).
في هذا المثال، دعنا نرد بتنزيل ملف ترخيص كيربي. في كود القالب الخاص بك، تحتاج إلى إنشاء استجابة 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
(أو مجرد قالب) جاهزة. أضف تعريف الحقل التالي إلى أي مخطط تريد تشغيل واجهة برمجة التطبيقات فيه.
exampleController:type: openercommand: '/api/{field.autoid}/{page.diruri.encoded}/{page.secret}/mycmd:dowork'text: 'Do Work'textprogress: 'جاري العمل...'textsuccess: "تم." خطأ نصي: "فشل."
لذلك، في أي صفحة داخل اللوحة التي تحتوي على هذا الحقل، لديك الآن زر Do Work
. سيؤدي الضغط عليه إلى بدء طلب ajax إلى صفحة api
مع معلمات إضافية. نظرًا لأن هذه المعلمات تحتوي أيضًا على بعض العناصر النائبة ، فسيتم استبدالها بقيم محددة للسياق.
أنت الآن بحاجة إلى بعض المنطق للتعامل مع الطلب. أفضل استخدام وحدة التحكم مع القوالب، لذا الصق هذا في وحدة تحكم api
الخاصة بك. يأتي هذا البرنامج المساعد مع وحدة تحكم نموذجية لمساعدتك على البدء. ولكن دعونا نلقي نظرة على كيفية عمل وحدة التحكم.
<?phpreturn function($site, $pages, $page) { // تحضير json Response$json = ['code' => 400, 'message' => '', 'fileurl' => '']; // #1: أمان اختياري...// يتطلب تسجيل دخول المستخدم و// يجب أن يأتي الطلب من المكون الإضافي لفتح اللوحة و// يجب أن يكون callif ( !$site->user مناسبًا () || !boolval(param('panel')) || // تمت إضافته بواسطة البرنامج المساعد تلقائيًا !r::اجاكس() ) { يموت(الاستجابة::json($json, 400)); } // #2: تحقق الآن مما إذا كان العمل بحاجة إلى إنجازه على allif(param('mycmd') == 'dowork') { // #3: جعل الصفحة تعمل عند$pageToWork = null; // #3.1: حاول autoidif($autoid = param('autoid')) { // بقي لك تنفيذ$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');};
تساعدك العناصر النائبة على إنشاء الأوامر بسرعة. لماذا قمت بتطبيق العناصر النائبة بدلاً من تحليل الأمر مباشرة؟ إنها تساعدك على تجنب الأخطاء في الالتزام بمبدأ الجفاف.
استبدل حرف البدل بأي اسم حقل مخطط للحصول على قيمة الحقل. يتم دعم الأرقام والسلاسل فقط.
سيحصل على الحقول ويتصل 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
مللي ثانية
وبعد هذا التأخير تتم إعادة ضبط الزر من عرض الرسالة إلى حالتها الأولية.
الافتراضي: خطأ
يتم فتح التنزيلات عبر مربع حوار Bowser إن أمكن وليس كنوافذ منبثقة تحظرها معظم المتصفحات
الافتراضي: "تنزيل: نعم"
جزء الأمر لإخبار البرنامج النصي js لبدء التنزيل لمحتوى استجابة JSON (راجع json.fileurl
).
الافتراضي: "فتح: نعم"
جزء الأمر لإخبار البرنامج النصي js بتشغيل نافذة/علامة تبويب جديدة باستخدام الأمر كعنوان url. لن تكون هناك مكالمة اياكس.
الافتراضي: "نسخ: نعم"
جزء الأمر لإخبار البرنامج النصي js بتشغيل نسخة الحافظة من عنوان url. لن تكون هناك مكالمة اياكس. إذا قام المتصفح بحظره، فإنه يتصرف كما هو الحال مع open:yes
.
الافتراضي: "التحديث: نعم"
جزء الأمر لإخبار البرنامج النصي js بتشغيل تحديث الصفحة عند النجاح.
الافتراضي: خطأ
إذا تم تمكينه، فيمكنك استخدام $pageModel
في العناصر النائبة الخاصة بك للوصول إلى الوظائف المحددة في نماذج صفحة Kirby الخاصة بك.
الافتراضي: خطأ
تسمح لك الأوامر فقط بربط $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 Opener وصيانته بواسطة Bruno Meilick، وهو مصمم ألعاب ومطور ويب من ألمانيا. أريد أن أشكر فابيان مايكل لأنه ألهمني كثيرًا، وجوليان كران لأنه أخبرني عن كيربي في المقام الأول.