slogan3

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

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