Supported PHP8 and Composer 2
Symfony Powerful Dashboard & Admin. Developed with Symfony 5, Vue 3, Bootstrap 5 framework.
No changes were made to the symfony structure, the current directory structure is used. A custom namespace for Admin has been created. This field is used for all administrator operations.
The interface is designed to be responsive using Twitter Bootstrap. The least possible dependency was tried to be used.
Download pdAdmin
composer create-project appaydin/pd-admin pdadmin
Create and configure the .env
file.
Create database schemas
bin/console doctrine:schema:create --force
Run built-in web server
symfony server:start --no-tls -d
Install & Build assets
yarn install
yarn run build
Run Backround Process
pm2 start
# Manuel
# bin/console messenger:consume -vv
# bin/console schedule:run
There is pd-user for user management. All settings are in __config/packages/pd_user.yaml__ file.
bin/console user:create
bin/console user:changepassword
bin/console user:role
User logon for multi language is used. Each user can choose his / her own language. When you log in, you are automatically redirected.
New languages can be added from the kernel settings. You need to translate manually for the new language.
SensioFrameworkExtraBundle is used with Symfony security component. There are three default user roles.
ROLE_SUPER_ADMIN has full authority. ROLE_USER authorities can be restricted and panel access can be turned off in the security.yaml file.
System settings are stored in the database. All settings can be used as parameters after container assembly. Since all settings are compiled with the container it does not create any additional load on the system. Settings can be configured using Symfony Forms and added to the Settings menu from the outside via the "Menu Event" system. Clear the cache after changes to system settings, otherwise the new settings will not be enabled.
For general settings, you can add it to src/Admin/Forms/System/GeneralForm
Add New Menu to Settings:
<?php
//src/Admin/Menu/SettingsMenu.php
namespace App\Admin\Menu;
use Pd\MenuBundle\Builder\ItemInterface;
use Pd\MenuBundle\Builder\Menu;
class SettingsMenu extends Menu
{
public function createMenu(array $options = []): ItemInterface
{
// Create Root Item
$menu = $this->createRoot('settings_menu')->setChildAttr([
'class' => 'nav nav-pills',
'data-parent' => 'admin_config_general',
]);
// Create Menu Items
$menu->addChild('nav_config_general')
->setLabel('nav_config_general')
->setRoute('admin_config_general')
->setLinkAttr(['class' => 'nav-item'])
->setRoles(['ROLE_CONFIG_GENERAL'])
// Email
->addChildParent('nav_config_email')
->setLabel('nav_config_email')
->setRoute('admin_settings_email')
->setLinkAttr(['class' => 'nav-item'])
->setRoles(['ROLE_SETTINGS_EMAIL']);
return $menu;
}
}
Widget system was created with Symfony "EventDispatcher Component". It has an adjustable structure for each user and it can be specially designed with "Twig Template" engine. For more information visit pd-widget
Create New Admin Widget:
<?php
//src/Admin/Widgets/AccountWidget.php
namespace App\Admin\Widgets;
use Pd\WidgetBundle\Builder\Item;
use Pd\WidgetBundle\Event\WidgetEvent;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\Request;
class AccountWidget
{
private $entityManager;
public function __construct(EntityManagerInterface $entityManager)
{
$this->entityManager = $entityManager;
}
/**
* Build Widgets.
*
* @param WidgetEvent $event
*/
public function builder(WidgetEvent $event)
{
// Get Widget Container
$widgets = $event->getWidgetContainer();
// Add Widgets
$widgets
->addWidget((new Item('user_statistics', 3600))
->setGroup('admin') // Widget Adds to "Admin" Group
->setName('widget_user_statistics.name')
->setDescription('widget_user_statistics.description')
->setTemplate('@Admin/Widget/userStatistics.html.twig')
->setRole(['ROLE_WIDGET_USERSTATISTICS'])
->setConfigProcess(function (Request $request) {
/**
* Controller for Widget Settings
* The return value is stored in the user specific database
*/
if ($type = $request->get('type')) {
switch ($type) {
case '1week':
return ['type' => '1week'];
case '1month':
return ['type' => '1month'];
case '3month':
return ['type' => '3month'];
}
}
return false;
})
->setData(function ($config) {
/**
* The return value can be used in the twig template.
* The function will not execute unless you call it in the template.
* You can use the database operations here.
*/
// Set Default Config
if (!isset($config['type'])) {
$config['type'] = '1week';
}
// Create Statistics Data
if ($config['type'] === '1month') {
$data = ['chartDay' => '7'];
// Create Data
} else if ($config['type'] === '1month') {
$data = ['chartDay' => '30'];
} else {
$data = ['chartDay' => '90'];
}
return $data;
})
);
}
}
The menu system was created with Symfony "EventDispatcher Component". For each menu created, Event is generated by default, can be turned off by menu configuration. For more information visit the pd-menu
Create Menu:
<?php
// src/Admin/Menu/MainNav.php
namespace App\Admin\Menu;
use Pd\MenuBundle\Builder\ItemInterface;
use Pd\MenuBundle\Builder\Menu;
class MainNav extends Menu
{
public function createMenu(array $options = []): ItemInterface
{
// Create ROOT Menu
$menu = $this->createRoot('main_menu', true); // Event enabled
// Create Dashboard
$menu->addChild('nav_dashboard', 1)
->setLabel('nav_dashboard')
->setRoute('admin_dashboard')
->setRoles(['ROLE_DASHBOARD'])
->setExtra('label_icon', 'dashboard');
/*
* Create Account Section
*/
$menu
->addChild('nav_account', 5)
->setLabel('nav_account')
->setRoute('admin_account_list')
->setRoles(['ROLE_ACCOUNT_LIST'])
->setExtra('label_icon', 'people')
// Account List
->addChild('nav_account', 1)
->setLabel('nav_account')
->setRoute('admin_account_list')
->setRoles(['ROLE_ACCOUNT_LIST'])
// Group List
->addChildParent('nav_group', 2)
->setLabel('nav_group')
->setRoute('admin_account_group_list')
->setRoles(['ROLE_GROUP_LIST']);
return $menu;
}
}