Ένα plugin είναι ένας φάκελος στο public/plugins/<όνομα>/ με ένα αρχείο <όνομα>.plugin.php. Ενεργοποιείται από το Plugins Manager και ενημερώνεται μαζί με τον πυρήνα.
Κεφαλίδα
<?php
/*
Plugin Name: Κρατήσεις
Description: Κρατήσεις τραπεζιών [booking]
Version: 1.0.0
Author: …
*/
cms39_i18n_domain('booking', __DIR__ . '/languages');
add_shortcode('booking', 'booking_render');Κάθε αλλαγή ανεβάζει το Version και γράφεται στο CHANGELOG.md του plugin, ώστε τα sites να ξέρουν τι πήραν με το update.
Σελίδα admin και ajax
// cp_loader?page=mod_admin_booking — μόνο συναρτήσεις με πρόθεμα mod_admin_
function mod_admin_booking()
{
check_authorise();
check_level(8);
return '<h1>Κρατήσεις</h1>…';
}
// cp_ajax?f=mod_ajax_booking_save — το cp_ajax δεν απαιτεί login: ελέγχει η ίδια η συνάρτηση
function mod_ajax_booking_save()
{
cms39_ajax_admin_only(8);
cms39_csrf_check();
// …
}
HookManager::addHook('cms39_admin_sidebar_menu', function (array $groups) {
$groups['data']['items'][] = ['label' => 'Κρατήσεις', 'icon' => 'bi bi-calendar', 'url' => cp_URL . 'cp_loader?page=mod_admin_booking'];
return $groups;
});Ρυθμίσεις
Οι ρυθμίσεις ενός plugin εμφανίζονται στο Settings. Η προεπιλογή μπαίνει στο cms39_conf_defaults(), και οι ετικέτες και η βοήθεια με το filter cms39_settings_ui. Ο κώδικας τις διαβάζει με cms39_conf('booking.slots', 20).
Πίνακες βάσης
$p = ['v' => '1.1.0', 'slug' => 'booking', 'schema' => __DIR__ . '/schema.php'];
cms39_plugin_installation_check($p);
// schema.php
$plugin_schema = [
'tables' => ['cms39_booking' => 'CREATE TABLE IF NOT EXISTS `cms39_booking` (…) ENGINE=InnoDB'],
'migrations' => [
'1.1.0' => ['ALTER TABLE `cms39_booking` ADD COLUMN IF NOT EXISTS `notes` TEXT NULL'],
],
];Οι πίνακες δημιουργούνται στο πρώτο request μετά την εγκατάσταση. Κάθε νέα έκδοση τρέχει μόνο τα migrations που λείπουν. Γράφετε πάντα IF NOT EXISTS, ώστε ένα βήμα να μπορεί να ξανατρέξει χωρίς σφάλμα.
ΗΛΕΚΤΡΟΝΙΚΑ ή τηλεφωνικά στο +30.2152151245-8