Source of file CustomMenuHolder.php
Size: 5,823 Bytes - Last Modified: 2021-12-24T05:16:41+00:00
/var/www/docs.ssmods.com/process/src/src/model/CustomMenuHolder.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218 | <?php namespace ilateral\SilverStripe\CustomMenus\Model; use SilverStripe\ORM\DataObject; use SilverStripe\Security\PermissionProvider; use SilverStripe\Security\Permission; use SilverStripe\SiteConfig\SiteConfig; use SilverStripe\CMS\Model\SiteTree; use SilverStripe\ORM\Connect\Database; use SilverStripe\ORM\DB; use SilverStripe\Core\Convert; use Symbiote\GridFieldExtensions\GridFieldOrderableRows; use ilateral\SilverStripe\CustomMenus\Tasks\CustomMenusMigrationTask; /** * A container of menu links that can then be rendered into a template * * @author Mo <morven@ilateral.co.uk> * @package CustomMenus */ class CustomMenuHolder extends DataObject implements PermissionProvider { private static $table_name = 'CustomMenuHolder'; private static $db = [ 'Title' => 'Varchar', 'Slug' => 'Varchar', 'Order' => 'Text', ]; private static $has_one = [ 'Site' => SiteConfig::class ]; private static $has_many = [ "Links" => CustomMenuLink::class ]; private static $many_many = [ 'Pages' => SiteTree::class ]; private static $summary_fields = [ 'Title' => 'Title', 'Slug' => 'Slug', "Links.Count" => "# Links" ]; private static $searchable_fields = [ 'Title' ]; public function getCMSFields() { $this->beforeUpdateCMSFields(function ($fields) { if (!$this->canEdit()) { return; } $fields->removeByName('Pages'); $fields->removeByName('Order'); $slug_field = $fields->dataFieldByName("Slug"); $slug_field->setDescription(_t( "CustomMenus.SlugDescription", "Call this in your templates" )); $links_field = $fields->dataFieldByName("Links"); if ($links_field) { $links_field ->getConfig() ->addComponent(new GridFieldOrderableRows('SortOrder')); } }); return parent::getCMSFields(); } /** * Create default menu items if no items exist * * @see sapphire/core/model/DataObject#requireDefaultRecords() */ function requireDefaultRecords() { parent::requireDefaultRecords(); // Main Menu if (!DataObject::get_one(self::class)) { $menu = new CustomMenuHolder(); $menu->Title = 'Main Menu'; $menu->Slug = "main-menu"; $menu->write(); $menu->flushCache(); DB::alteration_message("Main menu created", "created"); $menu = new CustomMenuHolder(); $menu->Title = 'Header Menu'; $menu->Slug = "header-menu"; $menu->write(); $menu->flushCache(); DB::alteration_message("Header menu created", "created"); $menu = new CustomMenuHolder(); $menu->Title = 'Footer Menu'; $menu->Slug = "footer-menu"; $menu->write(); $menu->flushCache(); DB::alteration_message("Footer menu created", "created"); } // Run migration task (if needed) $migrate = CustomMenusMigrationTask::config()->run_during_dev_build; if ($migrate && class_exists(SiteTree::class)) { $task = new CustomMenusMigrationTask(); $task->up(); } } /** * Setup permissions * * @return void */ public function providePermissions() { return [ 'MENU_VIEWALL' => [ 'name' => 'View all menus', 'help' => 'Allow viewing of all menus in the "Menus" section', 'category' => 'Menus', 'sort' => 100 ], 'MENU_CREATE' => [ 'name' => 'Create menus', 'help' => 'Allow creation of menus in the "Menus" section', 'category' => 'Menus', 'sort' => 110 ], 'MENU_DELETE' => [ 'name' => 'Delete menus', 'help' => 'Allow deleting of menus in the "Menus" section', 'category' => 'Menus', 'sort' => 120 ], 'MENU_EDIT' => [ 'name' => 'Edit menus', 'help' => 'Allow editing of menus in the "Menu" section', 'category' => 'Menus', 'sort' => 130 ], ]; } public function onBeforeWrite() { parent::onBeforeWrite(); // Ensure the slug is URL safe $this->Slug = ($this->Slug) ? Convert::raw2url($this->Slug) : Convert::raw2url($this->Title); } /** * Clean up after delete */ public function onBeforeDelete() { parent::onBeforeDelete(); foreach ($this->Links() as $link) { $link->delete(); } } public function canView($member = null) { if (Permission::check(['ADMIN','MENU_VIEWALL'])) { return true; } else { return false; } } public function canCreate($member = null, $context = []) { if (Permission::check(['ADMIN','MENU_CREATE'])) { return true; } else { return false; } } public function canDelete($member = null) { if (Permission::check(['ADMIN','MENU_DELETE'])) { return true; } else { return false; } } public function canEdit($member = null) { if (Permission::check(['ADMIN','MENU_EDIT'])) { return true; } else { return false; } } } |