430 lines
8.1 KiB
Markdown
430 lines
8.1 KiB
Markdown
+++
|
|
title = "When There's Not a Module For That"
|
|
outputs = ["Reveal"]
|
|
+++
|
|
|
|
# When There's Not a Module For That
|
|
|
|
###### [mid.camp/6337](https://mid.camp/6337)
|
|
|
|
<img alt="Agaric" src="images/o-midcamp.png" class="plain" />
|
|
|
|
{{% note %}}
|
|
mid-air camp
|
|
{{% /note %}}
|
|
|
|
---
|
|
|
|
###### Presented by
|
|
|
|
**Benjamin Melançon** & **Mauricio Dinarte**
|
|
|
|
###### AKA
|
|
|
|
**[mlncn](https://agaric.coop/mlncn)** & **[dinarcon](https://agaric.coop/dinarcon)**
|
|
|
|
---
|
|
|
|
|
|
### Together,
|
|
|
|
## We are
|
|
|
|
#### ⅓
|
|
|
|
#### of
|
|
|
|
|
|
---
|
|
|
|
|
|
<img alt="Agaric" src="images/agaric-logo-stacked.png" class="plain" />
|
|
|
|
**ask@agaric.coop**
|
|
|
|
---
|
|
|
|
|
|
<img alt="Agaric" src="images/o-midcamp.png" class="plain" width="47%" />
|
|
|
|
{{% note %}}
|
|
mid-air camp
|
|
{{% /note %}}
|
|
|
|
|
|
---
|
|
|
|
|
|
> When building a Drupal site, “there’s a module for that” can be the sweetest words you can hear.
|
|
|
|
|
|
{{% note %}}
|
|
{{% /note %}}
|
|
|
|
---
|
|
|
|
|
|

|
|
|
|
|
|
{{% note %}}
|
|
Say you're creating a site where people can relive great literature that may have been inspired by a global pandemic.
|
|
{{% /note %}}
|
|
|
|
---
|
|
|
|
|
|
`frankenstein.info.yml`
|
|
|
|
```yaml
|
|
name: Frankenstein
|
|
type: module
|
|
description: "Rename save button for Frankenstein's content."
|
|
core: 8.x|9.x
|
|
```
|
|
|
|
|
|
|
|
`frankenstein.module`
|
|
|
|
```php
|
|
<?php
|
|
function frankenstein_form_node_frankenstein_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state) {
|
|
$form['actions']['submit']['#value'] = t('Re-animate!');
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### Where to put these files
|
|
|
|

|
|
|
|
|
|
---
|
|
|
|
|
|

|
|
|
|
|
|
---
|
|
|
|
|
|
**Enable your module:**
|
|
|
|
`drush -y en frankenstein`
|
|
|
|
|
|
---
|
|
|
|
|
|
*That slide was the most important you're going to be shown.*
|
|
|
|
# Enable your module
|
|
|
|
|
|
---
|
|
|
|
|
|

|
|
|
|
---
|
|
|
|

|
|
|
|
{{% note %}}
|
|
So you're all sitting* there thinking ... sure, that's easy if you know the exact words and symbols to *put* in that file. And you're absolutely right.
|
|
|
|
And we're going to tell you how you can figure out all of that.
|
|
|
|
The examples with the what will tell you a lot about the how.
|
|
|
|
A few specific examples will give you a lot of tools.
|
|
|
|
But first, two secrets.
|
|
|
|
One's good news, second is bad news.
|
|
{{% /note %}}
|
|
|
|
---
|
|
|
|
|
|
### 1. Now you know where to paste
|
|
|
|

|
|
|
|
{{% note %}}
|
|
And knowing where to paste unleashes the power of Stack Overflow / Stack Exchange sites.
|
|
|
|
(yes, the same family of sites that has helped a couple million developers figure out how to quit vim.)
|
|
|
|
Knowing where to put this code unleashes the power of Stack Overflow.
|
|
|
|
You now know enough to be dangerous.
|
|
{{% /note %}}
|
|
|
|
|
|
---
|
|
|
|
|
|
### 2. That simple form alter has hidden gotchas
|
|
|
|
|
|
|
|
* As written, it only applies to the create (node/add) form— not the edit form.
|
|
* There's a dozen variations of the humble form alter hook, and all are valid.
|
|
|
|
{{% note %}}
|
|
{{% /note %}}
|
|
|
|
|
|
---
|
|
|
|
#### We'll cover
|
|
|
|
* Hooks
|
|
* Form alter
|
|
* Node insert
|
|
* Plugins
|
|
* Block
|
|
* Formatter
|
|
* Services
|
|
* Route subscriber
|
|
* Event subscriber
|
|
|
|
{{% note %}}
|
|
|
|
the three main ways to mess with Drupal 8 and 9: hooks, plugins, and services, with a couple examples in each.
|
|
|
|
{{% /note %}}
|
|
|
|
---
|
|
|
|
|
|
{{% note %}}
|
|
both examples of what technically to do and how to do general things
|
|
|
|
For example:
|
|
|
|
Doing something with a form? You want hook_form_alter() or one of its variants.
|
|
{{% /note %}}
|
|
|
|
|
|
---
|
|
|
|
|
|
## Learning to learn
|
|
|
|
* Drupal documentation
|
|
* Drupal contributed modules
|
|
* Drupal core and *its* modules
|
|
* Drupal forums and issues
|
|
* Drupal.StackExchange.com
|
|
* The rest of the Internet
|
|
* Debugger
|
|
* Code search / grep
|
|
|
|
{{% note %}}
|
|
Where to start if i don't cover it in this session
|
|
{{% /note %}}
|
|
|
|
|
|
---
|
|
|
|
|
|
#### When not to make a module?
|
|
|
|
[](https://www.koreus.com/video/machine-rube-goldberg-lente.html)
|
|
|
|
{{% note %}}
|
|
You can do anything with a module! Why wouldn't you make one every day?
|
|
{{% /note %}}
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
#### …when there's an easier way
|
|
|
|

|
|
|
|
{{% note %}}
|
|
find a contrib module that does it
|
|
|
|
Should it be in a template
|
|
{{% /note %}}
|
|
|
|
|
|
---
|
|
|
|
##### Thre's a module that *almost* does exactly what you want
|
|
|
|
* Contribute a patch!
|
|
|
|
|
|
{{% note %}}
|
|
Even if your patch is not accepted nor is there any way given to build on the module, you can fork the module— maintain your own copy.
|
|
{{% /note %}}
|
|
|
|
---
|
|
|
|
|
|
### When to make a module
|
|
|
|
|
|

|
|
|
|
{{% note %}}
|
|
You've identified to the best of your ability that there's definitely not something out there that does what you want to do.
|
|
|
|
I personally do not advocate introspection at this point: Why am i trying to do something that no one else is trying to do?
|
|
|
|
Credit: lego heart is credited to Llama-Muffin-Kelly on DeviantArt but only see it on Pinterest
|
|
{{% /note %}}
|
|
|
|
|
|
---
|
|
|
|
|
|
#### Step 1: Write up what you plan to do
|
|
|
|
[groups.drupal.org/contributed-module-ideas](https://groups.drupal.org/contributed-module-ideas)
|
|
|
|
{{% note %}}
|
|
The module does not exist.
|
|
|
|
|
|
{{% /note %}}
|
|
|
|
|
|
---
|
|
|
|
|
|
### The Rest of the Internet
|
|
|
|
* Duck Duck Go (!g for Google results)
|
|
* [ddg.co](https://duckduckgo.com/)
|
|
* [agaric.coop/blog](https://agaric.coop/blog)
|
|
* Your own notes
|
|
|
|
{{% note %}}
|
|
{{% /note %}}
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
## Why contribute?
|
|
|
|
* Right thing to do
|
|
* I asked you to
|
|
* People may contribute to it
|
|
* Someone may take it over and upgrade it or improve it greatly
|
|
|
|
{{% note %}}
|
|
{{% /note %}}
|
|
|
|
---
|
|
|
|
[](https://www.drupal.org/project/workflow_buttons/issues/3120524)
|
|
|
|
{{% note %}}
|
|
Or someone may make a tiny improvement that makes everyone's lives better.
|
|
{{% /note %}}
|
|
|
|
---
|
|
|
|
## Nice touches
|
|
|
|
`workflow_buttons.info.yml`
|
|
|
|
```diff
|
|
type: module
|
|
description: 'Provide workflow buttons for content moderation instead of a select dropdown of states.'
|
|
core: 8.x
|
|
+configure: workflow_buttons.settings
|
|
|
|
dependencies:
|
|
- drupal:system (>=8.4)
|
|
```
|
|
|
|
{{% note %}}
|
|
{{% /note %}}
|
|
|
|
---
|
|
|
|
### How to develop while sharing the same code you're using
|
|
|
|
Your module `composer.json`:
|
|
|
|
```json
|
|
{
|
|
"name": "drupal/cyborgtranslate",
|
|
"description": "Trigger Google translate and Drupal interface translation at the same time, allowing sections of your site's localization to be done by humans and the rest by machines.",
|
|
"keywords": ["drupal", "translation", "multilingual", "localization", "google translate"],
|
|
"type": "drupal-module",
|
|
"license": "GPL-2.0+",
|
|
"homepage": "https://www.drupal.org/project/cyborgtranslate",
|
|
"minimum-stability": "dev",
|
|
"support": {
|
|
"issues": "https://www.drupal.org/project/issues/cyborgtranslate",
|
|
"source": "https://gitlab.com/agaric/drupal/cyborgtranslate/tree/8.x-1.x"
|
|
}
|
|
}
|
|
```
|
|
|
|
{{% note %}}
|
|
Composer makes a lot of stuff seem more complicated, but it makes it easier to contribute.
|
|
|
|
Trust me... this will only be three screens of gibberish.
|
|
{{% /note %}}
|
|
|
|
---
|
|
|
|
Your project root `composer.json`:
|
|
|
|
|
|
```json
|
|
{
|
|
"require": {
|
|
"drupal/core": "^8.8.0",
|
|
"drupal/cyborgtranslate": "dev-8.x-1.x as 1.x-dev",
|
|
"drush/drush": "^9.0"
|
|
},
|
|
"repositories": {
|
|
"drupal": {
|
|
"type": "composer",
|
|
"url": "https://packages.drupal.org/8"
|
|
},
|
|
"drupal/cyborgtranslate": {
|
|
"type": "git",
|
|
"url": "git@gitlab.com:agaric/drupal/cyborgtranslate.git"
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
|
|
{{% note %}}
|
|
{{% /note %}}
|
|
|
|
|
|
---
|
|
|
|

|
|
[MID.CAMP/6337](https://mid.camp/6337) · <a href="mailto:ask@agaric.coop">ASK@AGARIC.COOP</a>
|
|
|
|
{{% note %}}
|
|
It's a big wild world out there. Bite off a piece you can chew.
|
|
|
|
Links for all of this and more on the session page.
|
|
{{% /note %}}
|
|
|