Advies voor het Maken van Geavanceerde Drupal Modules
description
Met deze prompt krijgt de gebruiker deskundige begeleiding bij het ontwikkelen van geavanceerde Drupal modules. Het helpt ontwikkelaars efficiënte en goed gestructureerde modules te maken die naadloos integreren met Drupal. Dit lost het probleem op van het gebrek aan kennis over Drupal API's en module architectuur en biedt concrete codevoorbeelden. Het is beter dan alternatieven doordat het specifiek is afgestemd op Drupal ontwikkeling en diepgaande technische inzichten biedt.
prompt
Help me bij het ontwerpen en ontwikkelen van een geavanceerde Drupal module die specifieke functionaliteiten toevoegt aan mijn website. Mijn Drupal versie is: <voer je Drupal versie in>. Beschrijf de beste ontwikkelpraktijken, structuur v ...
try_prompt
generate_helper
disclaimerOnPageApi
tags
ai_answers
provider: openai
model: gpt-4.1-nano
Natuurlijk! Hieronder vind je een overzicht van best practices, structuur en voorbeeldcode voor het ontwikkelen van een geavanceerde Drupal 9.4.0-module.
### 1. Best practices voor Drupal module-ontwikkeling
- **Gebruik de Drupal API**: Maak gebruik van bestaande API’s en hooks om compatibiliteit en onderhoudbaarheid te waarborgen.
- **Modulariteit en uitbreidbaarheid**: Ontwerp je module zo dat het makkelijk uit te breiden en te onderhouden is.
- **Veiligheid**: Voer validaties uit en ontsmet gegevens waar nodig, vooral bij externe integraties.
- **Documentatie**: Documenteer je code en gebruik duidelijke namen.
- **Versiebeheer**: Gebruik Git of een andere versiebeheerder.
---
### 2. Structuur van de module
Stel dat je module `mijn_geavanceerde_module` heet:
```
mijn_geavanceerde_module/
├── src/
│ ├── Form/
│ │ └── MijnCustomForm.php
│ └── Plugin/
│ └── ExamplePlugin.php
├── config/
│ └── schema/
│ └── mijn_geavanceerde_module.schema.yml
├── templates/
│ └── my-template.html.twig
├── mijn_geavanceerde_module.info.yml
├── mijn_geavanceerde_module.module
├── mijn_geavanceerde_module.routing.yml
└── mijn_geavanceerde_module.services.yml
```
### 3. Belangrijke bestanden
- **`.info.yml`**: Metadata van de module.
- **`.module`**: Voor hooks en PHP-logica.
- **`routing.yml`**: Voor pagina’s en routes.
- **`services.yml`**: Voor dependency injection en services.
---
### 4. Voorbeeld `.info.yml`
```yaml
name: 'Mijn Geavanceerde Module'
type: module
description: 'Een geavanceerde module met custom content types en integraties.'
core_version_requirement: ^9.4
package: 'Custom'
```
---
### 5. Voorbeeld van het definiëren van een custom content type
Gebruik `hook_install()` om een content type te maken via code, of definieer het in YAML:
#### Via code (in `.install` file of in een `hook_install()`):
```php
use Drupal\node\Entity\NodeType;
function mijn_geavanceerde_module_install() {
if (!NodeType::load('mijn_custom_type')) {
$type = NodeType::create([
'type' => 'mijn_custom_type',
'name' => 'Mijn Custom Type',
]);
$type->save();
}
}
```
#### Via YAML (voor configuratie):
Plaats in `config/schema/mijn_geavanceerde_module.schema.yml`:
```yaml
mijn_custom_type:
type: mapping
label: 'Custom content type'
mapping:
id:
type: string
label:
type: string
```
### 6. Een formulier maken met validatie
Maak een formulier class in `src/Form/MijnCustomForm.php`:
```php
namespace Drupal\mijn_geavanceerde_module\Form;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
class MijnCustomForm extends FormBase {
public function getFormId() {
return 'mijn_custom_form';
}
public function buildForm(array $form, FormStateInterface $form_state) {
$form['naam'] = [
'#type' => 'textfield',
'#title' => $this->t('Naam'),
'#required' => TRUE,
];
$form['submit'] = [
'#type' => 'submit',
'#value' => $this->t('Verstuur'),
];
return $form;
}
public function validateForm(array &$form, FormStateInterface $form_state) {
if (strlen($form_state->getValue('naam')) < 3) {
$form_state->setErrorByName('naam', $this->t('De naam moet minimaal 3 tekens bevatten.'));
}
}
public function submitForm(array &$form, FormStateInterface $form_state) {
drupal_set_message($this->t('Formulier succesvol ingediend!'));
// Externe API call of andere logica hier
}
}
```
### 7. Hook gebruiken om functionaliteit toe te voegen
Bijvoorbeeld, om een veld toe te voegen aan een content type bij het opslaan:
```php
/**
* Implements hook_entity_insert().
*/
function mijn_geavanceerde_module_entity_insert(Drupal\Core\Entity\EntityInterface $entity) {
if ($entity->getEntityTypeId() == 'node' && $entity->bundle() == 'mijn_custom_type') {
// Voer acties uit bij het aanmaken van het content type
}
}
```
### 8. Integratie met externe diensten
Gebruik `GuzzleHttp\Client` voor API-calls:
```php
use GuzzleHttp\Client;
function mijn_geavanceerde_module_externe_api() {
$client = new Client();
try {
$response = $client->get('https://api.externe-dienst.com/data');
$data = json_decode($response->getBody(), TRUE);
// Verwerk data
}
catch (\Exception $e) {
\Drupal::logger('mijn_geavanceerde_module')->error('API fout: @message', ['@message' => $e->getMessage()]);
}
}
```
---
### Samenvatting
- Volg Drupal coding standards.
- Gebruik hooks en services voor extensibility.
- Organiseer je code logisch in mappen.
- Maak gebruik van dependency injection.
- Test je module grondig en documenteer je code.
Indien je specifieke functionaliteiten of voorbeelden nodig hebt, vraag gerust!
provider: deepseek
model: deepseek-chat
Zeker, ik help je graag met het ontwerpen van een geavanceerde Drupal 9.4.0 module. Hier is een complete handleiding volgens de beste praktijken:
## Module Structuur
```
mijn_geavanceerde_module/
├── mijn_geavanceerde_module.info.yml
├── mijn_geavanceerde_module.module
├── src/
│ ├── Controller/
│ ├── Form/
│ ├── Plugin/
│ │ ├── Block/
│ │ └── Field/
│ ├── Service/
│ └── Entity/
├── templates/
├── config/
│ └── install/
├── js/
└── css/
```
## Beste Ontwikkelpraktijken
1. **Volg Drupal coding standards**
2. **Gebruik dependency injection**
3. **Implementeer propere caching**
4. **Schrijf unit tests**
5. **Documenteer je code**
## Basis .info.yml Bestand
```yaml
name: Mijn Geavanceerde Module
type: module
description: 'Voegt geavanceerde functionaliteiten toe aan de website'
core_version_requirement: ^9.4 || ^10
package: Custom
dependencies:
- drupal:node
- drupal:user
```
## Aangepast Content Type
```php
<?php
// mijn_geavanceerde_module.module
/**
* Implements hook_entity_bundle_field_info().
*/
function mijn_geavanceerde_module_entity_bundle_field_info(EntityTypeInterface $entity_type, $bundle, array $base_field_definitions) {
$fields = [];
if ($entity_type->id() === 'node' && $bundle === 'article') {
$fields['aangepast_veld'] = BaseFieldDefinition::create('string')
->setLabel(t('Aangepast veld'))
->setDescription(t('Een aangepast tekstveld'))
->setDisplayOptions('view', [
'label' => 'above',
'type' => 'string',
'weight' => 0,
])
->setDisplayOptions('form', [
'type' => 'string_textfield',
'weight' => 0,
]);
}
return $fields;
}
```
## Formuliervalidatie Voorbeeld
```php
<?php
// src/Form/CustomForm.php
namespace Drupal\mijn_geavanceerde_module\Form;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
class CustomForm extends FormBase {
public function getFormId() {
return 'mijn_custom_form';
}
public function buildForm(array $form, FormStateInterface $form_state) {
$form['email'] = [
'#type' => 'email',
'#title' => $this->t('Email'),
'#required' => TRUE,
];
$form['submit'] = [
'#type' => 'submit',
'#value' => $this->t('Versturen'),
];
return $form;
}
public function validateForm(array &$form, FormStateInterface $form_state) {
$email = $form_state->getValue('email');
if (!\Drupal::service('email.validator')->isValid($email)) {
$form_state->setErrorByName('email', $this->t('Voer een geldig emailadres in.'));
}
}
public function submitForm(array &$form, FormStateInterface $form_state) {
// Verwerk formulier data
\Drupal::messenger()->addMessage($this->t('Formulier succesvol verzonden!'));
}
}
```
## Externe Service Integratie
```php
<?php
// src/Service/ExternalApiService.php
namespace Drupal\mijn_geavanceerde_module\Service;
use Drupal\Core\Http\ClientFactory;
use GuzzleHttp\Exception\RequestException;
class ExternalApiService {
protected $httpClient;
public function __construct(ClientFactory $http_client_factory) {
$this->httpClient = $http_client_factory->fromOptions([
'base_uri' => 'https://api.externe-service.nl/',
'timeout' => 30,
]);
}
public function fetchData($endpoint) {
try {
$response = $this->httpClient->get($endpoint, [
'headers' => [
'Accept' => 'application/json',
],
]);
return json_decode($response->getBody(), TRUE);
} catch (RequestException $e) {
\Drupal::logger('mijn_geavanceerde_module')->error('API fout: @error', [
'@error' => $e->getMessage()
]);
return FALSE;
}
}
}
```
## Service Definition
```yaml
# mijn_geavanceerde_module.services.yml
services:
mijn_geavanceerde_module.external_api:
class: Drupal\mijn_geavanceerde_module\Service\ExternalApiService
arguments: ['@http_client_factory']
```
## Hook Implementatie Voorbeeld
```php
<?php
// mijn_geavanceerde_module.module
/**
* Implements hook_node_presave().
*/
function mijn_geavanceerde_module_node_presave(NodeInterface $node) {
if ($node->getType() === 'article') {
// Voeg automatisch een timestamp toe
$node->set('field_laatst_bewerkt', time());
}
}
/**
* Implements hook_cron().
*/
function mijn_geavanceerde_module_cron() {
// Voer periodieke taken uit
$api_service = \Drupal::service('mijn_geavanceerde_module.external_api');
$data = $api_service->fetchData('/updates');
if ($data) {
// Verwerk de data
\Drupal::logger('mijn_geavanceerde_module')->info('Cron taak uitgevoerd met @count items', [
'@count' => count($data)
]);
}
}
```
## Belangrijke Hooks om te Overwegen
1. **hook_help()** - Module documentatie
2. **hook_permission()** - Aangepaste permissies
3. **hook_menu()** - Custom routes
4. **hook_form_alter()** - Formulier aanpassingen
5. **hook_theme()** - Custom theming
## Caching Best Practices
```php
// Gebruik Drupal's caching API
$cid = 'mijn_module_data_' . $node_id;
$cache = \Drupal::cache()->get($cid);
if (!$cache) {
$data = // Haal data op
\Drupal::cache()->set($cid, $data, time() + 3600); // 1 uur cache
} else {
$data = $cache->data;
}
```
## Aanbevolen Tools
- **Drush** voor command-line beheer
- **Devel module** voor debugging
- **Drupal Console** voor code generatie
- **PHPStan** voor code analyse
Zorg ervoor dat je:
- **Dependency injection** gebruikt i.p.v. globale functies
- **Services** maakt voor herbruikbare logica
- **Proper error handling** implementeert
- **Security checks** toevoegt (CSRF protection, access checks)
Wil je dat ik me focus op specifieke functionaliteiten of heb je vragen over bepaalde aspecten?
error: Generation failed [deepseek] prompt_id=2407 locale=en err=DeepSeek connection/timeout | Generation failed [deepseek] prompt_id=2407 locale=fr err=DeepSeek connection/timeout