when-not-a-module-for-that/content/_index.md
2020-03-18 15:55:17 -04:00

320 lines
5.4 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 %}}
---
![Regular node add form with Save button](images/create-frankenstein-unmodified.png)
{{% 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
```
&nbsp;
`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
![Folder hierarchy of custom module in Drupal](images/frankenstein-location-in-ranger.png)
---
![Regular node add form with Save button](images/create-frankenstein-unmodified.png)
---
**Enable your module:**
`drush -y en frankenstein`
---
*That slide was the most important you're going to be shown.*
# Enable your module
---
![Regular node add form with Save button as reanimate](images/create-frankenstein-reanimate.png)
---
![Adam Scott staring at the camera](images/adam-scott-conan-stare.gif)
{{% 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.
But first, two secrets.
{{% /note %}}
---
### Now you know where to paste
![How do I exit the Vim editor? viewed 2.1 million times](images/stack-overflow-helping-devs-quit-vim.png)
{{% note %}}
(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 %}}
---
### 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?
[![Turtle with golf ball on spring contraption on back.](images/rube-goldberg-tortoise.jpg)](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
![Ginger Howard completing her swing after hitting a golf ball](images/ginger-howard-golf-swing.jpg)
{{% note %}}
find a contrib module that does it
Should it be in a template
{{% /note %}}
---
### When to make a module
![Lego heart with a missing piece](images/lego-heart-missing-piece.jpg)
{{% 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?
{{% /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.
I do not advocate self-reflection at this point
Credit: lego heart is credited to Llama-Muffin-Kelly on DeviantArt but only see it on Pinterest
{{% /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 %}}
---
---
{{% note %}}
{{% /note %}}
---