Maak een aangepaste dashboard voor mijn Craft CMS beheerderspaneel
description
Door een aangepast dashboard te maken, kun je je workflow verbeteren, snel toegang krijgen tot belangrijke statistieken en de algehele efficiëntie van het beheer in je Craft CMS-omgeving verbeteren.
prompt
try_prompt
Help me bij het ontwerpen en implementeren van een aangepast dashboard voor mijn Craft CMS beheerderspaneel dat de volgende widgets bevat: {{dashboard_widgets}} ... more
generate_helper
...
tags
ai_answers
provider: openai
model: gpt-4.1-nano
Natuurlijk! Hier is een stapsgewijze handleiding voor het ontwerpen en implementeren van een aangepast dashboard in Craft CMS met de widgets "Recente Invoer" en "Gebruikersactiviteit".
### Stap 1: Voorbereiding
- Zorg dat je toegang hebt tot je Craft CMS installatie en dat je voldoende rechten hebt om het beheerderspaneel aan te passen.
- Maak eventueel een child plugin of voeg code toe via een custom plugin of module voor meer controle en onderhoudbaarheid.
### Stap 2: Maak een aangepaste Dashboard Widget
Craft CMS biedt de mogelijkheid om eigen widgets te maken via PHP.
**a. Creëer een plugin of gebruik een custom module**
- Als je nog geen plugin hebt, maak er een aan via de Craft CMS CLI of handmatig.
**b. Voeg een nieuwe widget toe**
- In je plugin of module, voeg code toe om nieuwe dashboard widgets te registreren.
```php
// In je plugin's init() methode
use craft\dashboard\Dashboard;
use craft\dashboard\Widget;
public function init()
{
parent::init();
// Voeg widget voor Recente Invoer toe
craft\dashboard\Dashboard::addWidget([
'label' => 'Recente Invoer',
'content' => function() {
return $this->renderRecenteInvoer(); // Methode die HTML teruggeeft
},
'sortOrder' => 1,
]);
// Voeg widget voor Gebruikersactiviteit toe
craft\dashboard\Dashboard::addWidget([
'label' => 'Gebruikersactiviteit',
'content' => function() {
return $this->renderGebruikersActiviteit(); // Methode die HTML teruggeeft
},
'sortOrder' => 2,
]);
}
```
### Stap 3: Definieer de render methodes voor de widgets
**a. Recente Invoer**
- Haal recent ingevoerde entries op, bijvoorbeeld de laatste 5.
```php
protected function renderRecenteInvoer()
{
$entries = craft\elements\Entry::find()
->orderBy('dateCreated desc')
->limit(5)
->all();
$html = '<ul>';
foreach ($entries as $entry) {
$html .= '<li>' . craft\helpers\Html::encode($entry->title) . ' - ' . $entry->dateCreated->format('d-m-Y H:i') . '</li>';
}
$html .= '</ul>';
return $html;
}
```
**b. Gebruikersactiviteit**
- Toon bijvoorbeeld de laatste login of aanmeldingen van gebruikers.
```php
protected function renderGebruikersActiviteit()
{
$users = craft\elements\User::find()
->orderBy('lastLoginDate desc')
->limit(5)
->all();
$html = '<ul>';
foreach ($users as $user) {
$lastLogin = $user->lastLoginDate ? $user->lastLoginDate->format('d-m-Y H:i') : 'Nooit gelogd';
$html .= '<li>' . craft\helpers\Html::encode($user->username) . ' - Laatste login: ' . $lastLogin . '</li>';
}
$html .= '</ul>';
return $html;
}
```
### Stap 4: Implementatie en testen
- Verplaats je code naar je plugin of module.
- Activeer de plugin via het Craft CMS beheerderspaneel.
- Ga naar het dashboard en controleer of de nieuwe widgets zichtbaar en correct werken.
### Beste praktijken voor gebruikersbetrokkenheid
- **Interactiviteit:** Voeg links toe naar relevante pagina's (bijvoorbeeld door te klikken op een entry of gebruiker).
- **Real-time updates:** Overweeg AJAX voor dynamische updates zonder paginareload.
- **Design:** Gebruik CSS voor een overzichtelijke en aantrekkelijke layout.
- **Beperk het aantal items:** Toon alleen de meest relevante data om info-overload te voorkomen.
### Extra tips:
- Documenteer je code en voeg commentaar toe voor onderhoud.
- Maak gebruik van caching indien nodig om performance te verbeteren.
- Overweeg om configuratieopties toe te voegen zodat je widgets eenvoudig kunt aanpassen.
Als je verdere hulp nodig hebt bij het coderen of integreren, laat het gerust weten!
provider: deepseek
model: deepseek-chat
Zeker! Hier is een stapsgewijze handleiding voor het ontwerpen en implementeren van een aangepast dashboard in Craft CMS met de gewenste widgets:
### Stap 1: Dashboard Template Aanmaken
1. Maak een nieuw template bestand aan in je `templates/` map genaamd `dashboard.twig`
2. Plaats deze code in het bestand:
```twig
{% extends '_layouts/cp' %}
{% set title = 'Dashboard'|t %}
{% block content %}
<div class="dashboard-grid">
<div class="dashboard-col">
{{ recentEntriesWidget() }}
</div>
<div class="dashboard-col">
{{ userActivityWidget() }}
</div>
</div>
<style>
.dashboard-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 24px;
margin: 24px 0;
}
.dashboard-col {
background: #fff;
border: 1px solid #e3e5e8;
border-radius: 4px;
padding: 16px;
}
@media (max-width: 992px) {
.dashboard-grid {
grid-template-columns: 1fr;
}
}
</style>
{% endblock %}
```
### Stap 2: Custom Module Aanmaken
1. Maak een nieuwe module aan in `modules/DashboardModule/Module.php`:
```php
<?php
namespace modules\DashboardModule;
use Craft;
use craft\base\Element;
use craft\base\Model;
use craft\elements\Entry;
use craft\events\RegisterTemplateRootsEvent;
use craft\web\View;
use yii\base\Event;
use yii\base\Module as BaseModule;
class Module extends BaseModule
{
public function init()
{
parent::init();
// Registreer template root
Event::on(
View::class,
View::EVENT_REGISTER_CP_TEMPLATE_ROOTS,
function(RegisterTemplateRootsEvent $event) {
$event->roots['dashboard'] = __DIR__ . '/templates';
}
);
// Voeg Twig extensies toe
Craft::$app->view->registerTwigExtension(new DashboardTwigExtension());
}
}
```
### Stap 3: Twig Extension voor Widgets
Maak `modules/DashboardModule/DashboardTwigExtension.php`:
```php
<?php
namespace modules\DashboardModule;
use Craft;
use craft\elements\Entry;
use craft\elements\User;
use craft\helpers\DateTimeHelper;
use Twig\Extension\AbstractExtension;
use Twig\TwigFunction;
class DashboardTwigExtension extends AbstractExtension
{
public function getFunctions()
{
return [
new TwigFunction('recentEntriesWidget', [$this, 'recentEntriesWidget']),
new TwigFunction('userActivityWidget', [$this, 'userActivityWidget']),
];
}
public function recentEntriesWidget()
{
$entries = Entry::find()
->orderBy('dateCreated DESC')
->limit(10)
->all();
return Craft::$app->view->renderTemplate('dashboard/_widgets/recent-entries', [
'entries' => $entries
]);
}
public function userActivityWidget()
{
$recentUsers = User::find()
->orderBy('lastLoginDate DESC')
->limit(15)
->all();
return Craft::$app->view->renderTemplate('dashboard/_widgets/user-activity', [
'users' => $recentUsers
]);
}
}
```
### Stap 4: Widget Templates
Maak de map `modules/DashboardModule/templates/dashboard/_widgets/` aan en voeg de volgende bestanden toe:
**recent-entries.twig:**
```twig
<div class="widget recent-entries-widget">
<h3>{{ 'Recente Invoer'|t }}</h3>
{% if entries|length %}
<div class="entries-list">
{% for entry in entries %}
<div class="entry-item">
<div class="entry-title">
<a href="{{ entry.cpEditUrl }}">{{ entry.title }}</a>
</div>
<div class="entry-meta">
<span class="date">{{ entry.postDate|date('d-m-Y H:i') }}</span>
<span class="author">door {{ entry.author.username }}</span>
</div>
</div>
{% endfor %}
</div>
{% else %}
<p>{{ 'Nog geen invoer gevonden.'|t }}</p>
{% endif %}
</div>
<style>
.entries-list {
margin-top: 12px;
}
.entry-item {
padding: 8px 0;
border-bottom: 1px solid #f0f0f0;
}
.entry-item:last-child {
border-bottom: none;
}
.entry-title a {
font-weight: 600;
text-decoration: none;
}
.entry-meta {
font-size: 12px;
color: #8f98a3;
margin-top: 4px;
}
</style>
```
**user-activity.twig:**
```twig
<div class="widget user-activity-widget">
<h3>{{ 'Gebruikersactiviteit'|t }}</h3>
{% if users|length %}
<div class="users-list">
{% for user in users %}
<div class="user-item">
<div class="user-avatar">
<img src="{{ user.getThumbUrl(32) }}" alt="{{ user.friendlyName }}" width="32" height="32">
</div>
<div class="user-info">
<div class="user-name">{{ user.friendlyName }}</div>
<div class="user-last-login">
{% if user.lastLoginDate %}
Laatst ingelogd: {{ user.lastLoginDate|date('d-m-Y H:i') }}
{% else %}
Nog nooit ingelogd
{% endif %}
</div>
</div>
</div>
{% endfor %}
</div>
{% else %}
<p>{{ 'Geen gebruikers gevonden.'|t }}</p>
{% endif %}
</div>
<style>
.users-list {
margin-top: 12px;
}
.user-item {
display: flex;
align-items: center;
padding: 8px 0;
border-bottom: 1px solid #f0f0f0;
}
.user-item:last-child {
border-bottom: none;
}
.user-avatar {
margin-right: 12px;
}
.user-avatar img {
border-radius: 50%;
}
.user-name {
font-weight: 600;
}
.user-last-login {
font-size: 12px;
color: #8f98a3;
margin-top: 2px;
}
</style>
```
### Stap 5: Module Registreren
Voeg de module toe aan `config/app.php`:
```php
return [
'modules' => [
'dashboard-module' => [
'class' => \modules\DashboardModule\Module::class,
],
],
'bootstrap' => ['dashboard-module'],
];
```
### Stap 6: Dashboard Instellen als Standaard
Voeg deze code toe aan `config/general.php`:
```php
'cp' => [
'baseUrl' => 'admin',
'path' => 'admin',
],
```
En maak een route in `config/routes.php`:
```php
<?php
return [
'admin' => 'dashboard/dashboard',
];
```
### Beste Praktijken voor Gebruikersbetrokkenheid:
1. **Real-time Updates**: Overweeg Ajax-implementatie voor live updates
2. **Personalizatie**: Voeg opties toe om widgets te herschikken/verbergen
3. **Snelkoppelingen**: Voeg "Snelle actie" knoppen toe
4. **Notificaties**: Toon ongelezen items/aandachtspunten
5. **Responsive Design**: Zorg dat het dashboard goed werkt op mobiel
6. **Prestatie**: Cache veelgebruikte queries waar mogelijk
7. **Toegankelijkheid**: Gebruik semantische HTML en ARIA-labels
### Extra Verbeteringen:
```php
// Voor caching (toevoegen aan DashboardTwigExtension)
public function recentEntriesWidget()
{
$cacheKey = 'recent-entries-widget';
$cacheDuration = 300; // 5 minuten
if (Craft::$app->cache->exists($cacheKey)) {
return Craft::$app->cache->get($cacheKey);
}
$entries = Entry::find()
->orderBy('dateCreated DESC')
->limit(10)
->all();
$html = Craft::$app->view->renderTemplate('dashboard/_widgets/recent-entries', [
'entries' => $entries
]);
Craft::$app->cache->set($cacheKey, $html, $cacheDuration);
return $html;
}
```
Dit dashboard biedt een overzichtelijke weergave van recente content en gebruikersactiviteit, met aandacht voor gebruiksvriendelijkheid en prestaties.

