הרחבת Kirby CMS: Hooks, Routes ופאנל Vue 3 מותאמים אישית
לקוח השיק חנות מקוונת על Kirby CMS ונתקל במגבלות: שדות מובנים לא תמכו בחיבור מוצר ל-CRM, ותמונות נדרשו להמרה ל-WebP. הכלים הסטנדרטיים חסרו גמישות — נאלצנו לכתוב תוסף. מצבים כאלה מתעוררים באופן קבוע כאשר הלוגיקה העסקית חורגת מהפונקציונליות המובנית.
התוספים שלנו יכולים להשתלב עם שירותים חיצוניים, להוסיף שדות מותאמים אישית לפאנל הניהול ב-Vue 3, לעקוף routes ל-API, או להריץ משימות רקע באמצעות hooks. לדוגמה, בעת פרסום מאמר, ליצור אוטומטית תמונות WebP ולשלוח הודעת Telegram. וכל זה מבלי לשנות את קוד המקור של Kirby, מה שמפשט עדכונים ומפחית את הסיכון לתקלות. אנו מפתחים תוספים מותאמים אישית — חבילות PHP שמרחיבות את ליבת ה-CMS מבלי לשנות את הקוד שלה. צרו קשר להערכה ראשונית של הפרויקט שלכם.
עם ניסיון של למעלה מ-5 שנים ויותר מ-50 פרויקטי Kirby מוצלחים, אנו מספקים תוספים חזקים. אנו מבטיחים תאימות ל-Kirby 4+ ומספקים תקופת תמיכה של 30 יום. פיתוח תוסף מותאם אישית מתחיל מ-$500 עבור hooks פשוטים ונע עד $5000 עבור אינטגרציות פאנל מורכבות.
איך לפתח תוסף מותאם אישית ל-Kirby?
טכנולוגיות: PHP 8.3, Kirby 4, Vue 3 (לפאנל), Composer, Docker. אנו משתמשים ב-Kirby::plugin() כדי לרשום הרחבות. מבנה התיקיות האופייני כולל index.php, lib/, templates/, assets/.
<?php // site/plugins/my-plugin/index.php
use Kirby\Cms\App;
use Kirby\Cms\Page;
App::plugin('vendor/my-plugin', [
'options' => [
'cache' => true,
'apiKey' => null,
],
'fields' => require __DIR__ . '/lib/fields.php',
'methods' => require __DIR__ . '/lib/methods.php',
'routes' => require __DIR__ . '/lib/routes.php',
'hooks' => require __DIR__ . '/lib/hooks.php',
'blueprints' => require __DIR__ . '/lib/blueprints.php',
'translations' => [
'ru' => require __DIR__ . '/lib/translations/ru.php',
'en' => require __DIR__ . '/lib/translations/en.php',
],
]);
איך להימנע משאילתות N+1 ועומס על השרת?
ללא hooks מתאימים, כל בקשת עמוד מייצרת עשרות שאילתות SQL מיותרות. הגישה שלנו מיישמת caching ברמת התוסף: אנו מנקים את המטמון רק כאשר עמוד ספציפי משתנה, לא את כל האתר. זה מפחית את עומס השרת פי 3–5 — עד 80% במקרים מסוימים. בפרויקט אחד, אינטגרציה עם Meilisearch קיצרה את זמן החיפוש מ-2 שניות ל-50 אלפיות השנייה. קבלו ייעוץ לפרויקט שלכם.
<?php // lib/hooks.php
return [
'page.create:after' => function (Page $page) {
if ($page->intendedTemplate()->name() !== 'article') {
return;
}
$url = urlencode(kirby()->site()->url() . '/sitemap.xml');
@file_get_contents("https://www.google.com/ping?sitemap={$url}");
},
'page.update:after' => function (Page $newPage, Page $oldPage) {
if (kirby()->cache('pages')->exists($newPage->id())) {
kirby()->cache('pages')->remove($newPage->id());
}
},
'file.create:after' => function (\Kirby\Cms\File $file) {
if (!$file->isImage()) {
return;
}
$file->thumb(['width' => 800, 'format' => 'webp']);
$file->thumb(['width' => 400, 'format' => 'webp']);
},
];
איך לשלב APIs חיצוניים באמצעות Routes מותאמים אישית?
לעתים קרובות אנו צריכים לשלוף נתונים ממערכות CRM או חיוב. באמצעות routes מותאמים אישית, אנו יוצרים נקודות קצה מאובטחות שמחזירות JSON או XML. בפרויקט אחד, בנינו חיפוש מוצרים באמצעות Meilisearch — תוצאות נמסרו ב-50 אלפיות השנייה במקום 2 שניות. זה פי 40 מהר יותר מחיפוש סטנדרטי.
אילו שדות מותאמים אישית ניתן להוסיף לפאנל הניהול?
מערכת השדות הסטנדרטית לא תמיד מתאימה. אנו מפתחים רכיבי Vue: בורר צבעים, קלט תגיות, בורר מפה. אלה מזרזים את עבודת העורכים ומבטלים שגיאות קלט.
<?php // lib/fields.php return [ 'colorpicker' => [ 'props' => [ 'value' => function ($value = '#000000') { return $value; }, 'presets' => function (array $presets = []) { return $presets; }, ], 'save' => function ($value): string { if (!preg_match('/^#[0-9A-Fa-f]{6}$/', $value)) { throw new \Exception('Invalid color format'); } return $value; }, ], ]; // assets/js/fields.js
panel.plugin('vendor/my-plugin', {
fields: {
colorpicker: {
template: `
<k-field v-bind="$props">
<input type="color" :value="value" @input="$emit('input', $event.target.value)">
<div class="presets">
<button v-for="color in presets" :key="color" :style="{ background: color }" @click="$emit('input', color)" />
</div>
</k-field>
`,
props: {
value: String,
presets: Array,
},
},
},
});
רשמו את הנכס ב-<?php // site/plugins/my-plugin/index.php use Kirby\Cms\App; use Kirby\Cms\Page; App::plugin('vendor/my-plugin', [ 'options' => [ 'cache' => true, 'apiKey' => null, ], 'fields' => require __DIR__ . '/lib/fields.php', 'methods' => require __DIR__ . '/lib/methods.php', 'routes' => require __DIR__ . '/lib/routes.php', 'hooks' => require __DIR__ . '/lib/hooks.php', 'blueprints' => require __DIR__ . '/lib/blueprints.php', 'translations' => [ 'ru' => require __DIR__ . '/lib/translations/ru.php', 'en' => require __DIR__ . '/lib/translations/en.php', ], ]); : <?php // lib/hooks.php return [ 'page.create:after' => function (Page $page) { if ($page->intendedTemplate()->name() !== 'article') return; $url = urlencode(kirby()->site()->url() . '/sitemap.xml'); @file_get_contents("https://www.google.com/ping?sitemap={$url}"); }, 'page.update:after' => function (Page $newPage, Page $oldPage) { if (kirby()->cache('pages')->exists($newPage->id())) { kirby()->cache('pages')->remove($newPage->id()); } }, 'file.create:after' => function (\Kirby\Cms\File $file) { if (!$file->isImage()) return; $file->thumb(['width' => 800, 'format' => 'webp']); $file->thumb(['width' => 400, 'format' => 'webp']); }, ]; .
ב-Kirby, hooks זמינים לכל האירועים המרכזיים: יצירה, עדכון, מחיקת עמודים וקבצים, עיבוד תבניות, שליחת אימיילים ועוד. Hooks מאפשרים להזריק לוגיקה עסקית מבלי לשנות את קוד האתר. לפי התיעוד הרשמי של Kirby, תוספים הם השיטה המועדפת להרחבת פונקציונליות.
למה תוספים מותאמים אישית עדיפים על שינויי ליבה?
שינויים ישירים בליבת Kirby מובילים לבעיות שדרוג: כל גרסה חדשה יכולה לדרוס את העריכות שלכם. תוספים חיים בתיקייה מבודדת משלהם ומשתמשים רק ב-API הציבורי. עם versioning סמנטי נכון, התוסף שלכם נשאר תואם לגרסאות חדשות ללא עבודה נוספת. זה חוסך זמן וכסף על תחזוקה.
השוואת גישות Caching
טבלה: גישות caching
| גישה | תוצאה | זמן תגובה |
|---|---|---|
| ללא תוסף, מטמון גלובלי | מנקה הכל על כל שינוי | 2 שניות |
| עם תוסף, מטמון לפי עמוד | מנקה רק את העמוד ששונה | 0.4 שניות |
מה כלול בפיתוח תוסף במפתחות מלאות
- קוד מקור של התוסף עם תיעוד
- הגדרת חבילת Composer (אופציונלי)
- דוגמאות שימוש בשיטות ו-hooks מותאמים אישית
- Migrations (במידת הצורך)
- הוראות התקנה ותצורה
- חודש תמיכה לאחר הפריסה
טעויות נפוצות בפיתוח תוספים
- טיפול לא נכון במטמון — נקו רק את הרשומות ששונו.
- התעלמות מ-versioning סמנטי — שובר תאימות בעדכונים.
- קידוד קשיח של אפשרויות במקום שימוש ב-
<?php // lib/fields.php return [ 'colorpicker' => [ 'props' => [ 'value' => function ($value = '#000000') { return $value; }, 'presets' => function (array $presets = []) { return $presets; }, ], 'save' => function ($value): string { if (!preg_match('/^#[0-9A-Fa-f]{6}$/', $value)) { throw new \Exception('Invalid color format'); } return $value; }, ], ];— מסבך את התצורה.
תהליך העבודה
- ניתוח — אנו לומדים את הארכיטקטורה והדרישות הנוכחיות.
- עיצוב — מגדירים hooks, שיטות, שדות, routes. מסכמים איתכם.
- יישום — כותבים קוד ב-PHP 8.3 ו-Vue 3.
- בדיקות — בדיקות יחידה לתרחישים מרכזיים, בדיקה על staging.
- פריסה — הגדרה על השרת, אימות תאימות מטמון.
לוחות זמנים משוערים
| סוג תוסף | לוחות זמנים |
|---|---|
| פשוט (שיטות + hooks) | 1–3 ימים |
| עם שדה פאנל מותאם אישית (Vue) | 3–6 ימים |
| מורכב (סעיף פאנל + API + מטמון) | 1–2 שבועות |
אנו ניתן הערכה מדויקת לאחר ניתוח הדרישות. הזמינו פיתוח תוסף — נכין מפרט טכני ונציע פתרון אופטימלי.







