advanced webforms part i - demo · advanced webforms part i - demo this work is licensed under a...
TRANSCRIPT
![Page 1: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/1.jpg)
advancedwebforms PART I - DEMO
This work is licensed under a Creative Commons Attribution 4.0 International License.
![Page 2: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/2.jpg)
Hello!Hi, my name is Jacob Rockowitz.
× I am known as jrockowitz on the web.× I am a Drupal developer and software architect.× I built and maintain the Webform module for Drupal 8.
![Page 3: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/3.jpg)
Goals for this presentation× Walk-thru Webform features and functionality
× Show you how to create rich applications
× Think about how to improve your webforms
× Inspire you to learn more about the Webform module and Drupal
![Page 4: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/4.jpg)
our Iterative ProcessPlan: What are we trying to buildBuild: Walk-thru how to build itTest: Review and test what we builtImprove: Enhance what we builtReview: Recap what we explored
![Page 5: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/5.jpg)
Webform introduction
![Page 6: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/6.jpg)
The Webform module is a
powerful and flexible Open Source
form builder & submission manager
for Drupal 8
![Page 7: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/7.jpg)
It provides all the features expected
from an enterprise proprietary form
builder... ...combined with the flexibility and
openness of Drupal
![Page 8: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/8.jpg)
Webform: The use case… × BUILD a form or copy a template× PUBLISH the form as a page, node, or block× COLLECT form submissions× SEND confirmations and notifications× REVIEW results online× DISTRIBUTE results as CSV or remote post
![Page 9: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/9.jpg)
Webform: ONCE AGAIN, THE USE CASE…
BUILD COLLECT DISTRIBUTE
![Page 10: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/10.jpg)
Feedbackform
![Page 11: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/11.jpg)
this is afeedbackform
![Page 12: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/12.jpg)
feedback form: plan× Collect feedback about a website from users
× Submissions will generate emails
× Display a confirmation page
![Page 13: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/13.jpg)
feedback form: BUILD× Elements (Type, Message, Name, and Email)
× Confirmation email
× Notification email
× Confirmation page
![Page 14: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/14.jpg)
feedback form: test× Generate a submission
× Confirm that emails are sent
× Confirm that results are saved
× Confirm that results can be exported
![Page 15: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/15.jpg)
<demo>Build & Test
![Page 16: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/16.jpg)
feedback form: improveElements: Default values; Layout
Settings: Ajax; Preview; Modal confirmation
Handler: Route notifications to different emails
Block: Place feedback form on every page.
Advanced: Subscribe users to a mailing list
![Page 17: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/17.jpg)
<demo>Improve
![Page 18: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/18.jpg)
feedback form: review× Form builder× YAML source editor× Form settings× Confirmations× Email handling× Blocks× Add-ons
![Page 19: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/19.jpg)
ANY questions?
Ben says...
![Page 20: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/20.jpg)
event registrationsystem
![Page 21: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/21.jpg)
this is anevent Registrationform
![Page 22: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/22.jpg)
event registration: plan× Allow users to register for an event (node)
× Registration form (webform)
× Admins can review registrants (submissions)
![Page 23: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/23.jpg)
event registration: GlossaryWebform: Collects a submission via a form
Submission: Data collected via a webform
Content type: Defines a node
Node: A piece of individual content
Reference: A relationship between entities
![Page 24: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/24.jpg)
event registration: BUILD webform× Registration form (Event and Contact)
× Confirmation page
![Page 25: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/25.jpg)
event registration: BUILD event× Event content type (node)
× Includes date/time field
× Webform field (entity reference/relationship)
![Page 26: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/26.jpg)
event registration: test× Create an event× Generate a registration
× Check confirmation page× Confirm event specific registration× Customize results
![Page 27: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/27.jpg)
<demo>Build & Test
![Page 28: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/28.jpg)
event registration: improveElements: Additional guests
Settings: Ajax; View previous submissions
Handler: Scheduled email reminders
Advanced: Open in a modal dialog
![Page 29: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/29.jpg)
<demo>Improve
![Page 30: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/30.jpg)
event registration: review× Composite elements× Element with multiple values× Webform nodes× Settings× Scheduled email handler× Modals
![Page 31: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/31.jpg)
ANY new questionS?
LILI says...
![Page 32: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/32.jpg)
to be continued…
![Page 33: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/33.jpg)
advancedwebforms PART II - APIS
This work is licensed under a Creative Commons Attribution 4.0 International License.
![Page 34: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/34.jpg)
Goals for this presentation× Explore the code behind Webforms
× Understand how a Webform is built
× Learn how to extend the Webform module
× Inspire you to become Webform expert
![Page 35: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/35.jpg)
Building advancedwebforms requires leveraging hooks,
understanding plugins, building render arrays,
& writing tests
![Page 36: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/36.jpg)
testingwebforms
![Page 37: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/37.jpg)
Tests confirmexpectations
![Page 38: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/38.jpg)
Webform Tests confirm× Rendering: Check an element's markup
× Processing: Check an input's default value
× Validation: Check required error messages
× Settings: Check labels and layout
× Access: Check user access controls
![Page 39: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/39.jpg)
testing best practices× Create a test module with exported webforms× Write tests for every element and setting× Establish repeatable testing patterns× Organize tests into groups/subdirectories
× Having easy-to-repeat manual tests is okay× Some tests are better than no tests
![Page 40: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/40.jpg)
BY the way, the WEbform module
Still uses deprecated simpletests…
…you should only write
PHPUnit tests
![Page 41: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/41.jpg)
<demo>Testing Webform
Overview: /admin/structure/webformSettings: ../webform?search=confirmationElements: ../webform?search=emailModules: /admin/modules(webform_test)
![Page 42: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/42.jpg)
@see \Drupal\webform\Tests\Element\WebformElementEmailTest
// Check basic email multiple rendering.$this->drupalGet('webform/test_element_email');$this->assertRaw('<label for="edit-email-multiple-basic">Multiple email addresses (basic)</label>');$this->assertRaw('<input type="text" id="edit-email-multiple-basic" name="email_multiple_basic" value="" size="60" class="form-text webform-email-multiple" />');$this->assertRaw('Multiple email addresses may be separated by commas.');
// Check that second email address is not valid.$edit = [ 'email_multiple_basic' => '[email protected], xxx',];$this->drupalPostForm('webform/test_element_email', $edit, t('Submit'));$this->assertRaw('The email address <em class="placeholder">xxx</em> is not valid.');
![Page 43: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/43.jpg)
@see \Drupal\webform\Tests\Settings\WebformSettingsConfirmationTest
// Check confirmation modal.$webform = Webform::load('test_confirmation_modal');$this->postSubmission($webform, ['test' => 'value']);$this->assertRaw('This is a <b>custom</b> confirmation modal.');$this->assertRaw('<div class="js-hide webform-confirmation-modal...>');
// Check custom confirmation page.$webform = Webform::load('test_confirmation_page_custom');$this->postSubmission($webform);$this->assertRaw('<div style="border: 10px solid red; padding: 1em;" class="webform-confirmation">');
// Check confirmation URL.$webform = Webform::load('test_confirmation_url_message');$this->postSubmission($webform);$this->assertRaw('This is a custom confirmation message.');$this->assertUrl('<front>');
![Page 44: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/44.jpg)
@see \Drupal\webform_ui\Tests\WebformUiElementTest
// Check access allowed (200) to textfield element.$this->drupalGet('admin/structure/webform/manage/contact/element/add/textfield');$this->assertResponse(200);
// Check access denied (403) to password element,// which is disabled by default.$this->drupalGet('admin/structure/webform/manage/contact/element/add/password');$this->assertResponse(403);
![Page 45: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/45.jpg)
Additional resources× Testing | Drupal.org
http://dgo.to/2819027
× An Overview of Testing in Drupal 8 | Lullabothttps://www.lullabot.com/articles/an-overview-of-testing-in-drupal-8
× Automated Testing in Drupal 8 | Drupalize.mehttps://drupalize.me/series/automated-testing-drupal-8
![Page 46: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/46.jpg)
Webformentities
![Page 47: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/47.jpg)
Everything in Drupal 8 is an entity
(or a plugin)
![Page 48: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/48.jpg)
what is an entity?Any defined chunk of data in Drupal. This includes things like nodes, users, taxonomy terms, files, etc. Contributed modules can define custom entities. Each entity type can have multiple bundles. -- https://dgo.to/937
![Page 49: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/49.jpg)
THis is aWebformentity
![Page 50: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/50.jpg)
THis is aWebformsubmissionentity
![Page 51: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/51.jpg)
About webform entities× Webforms are config entities (exportable)
× Submissions are content entities (database)
× Webforms do not use Field API
× Submissions use an Entity–attribute–value model
![Page 52: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/52.jpg)
Entity–attribute–value modelEntity–attribute–value model (EAV) is a data model to encode, in a space-efficient manner, entities where the number of attributes (properties, parameters) that can be used to describe them is potentially vast, but the number that will actually apply to a given entity is relatively modest.-- https://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model
![Page 53: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/53.jpg)
A simple wayto store
A lot of data
![Page 54: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/54.jpg)
<demo>Webform Entities
Overview: /devel/entity/infoExport: …/webform/manage/contact/exportAPI: /webform/contact/api
![Page 55: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/55.jpg)
Additional resources× Introduction to Entity API in Drupal 8 | Drupal
http://dgo.to/2078191
× What Are Drupal Entities? | Drupalize.me https://drupalize.me/videos/what-are-drupal-entities
× Entities 101: Understanding Data Structuresin Drupalhttps://youtu.be/LT83PfumjPU
![Page 56: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/56.jpg)
discovering the source entity
![Page 57: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/57.jpg)
a SOURCE ENTITY TRACKS & CREATES A RELATIONSHIP TO the Drupal ENTITY
From which A WEBFORM WAS SUBMITTED
![Page 58: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/58.jpg)
source entity overview× Allows a webform to be reused multiple times× Determined via the current route or query string
× Webform nodes use source entities× Webform blocks use source entities× Even paragraphs use source entities
![Page 59: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/59.jpg)
THese are source entities
![Page 60: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/60.jpg)
THE SOURCE ENTITY CAN BE USED to track...× Site Feedback
A form that tracks which page the comments are related to.
× Event RegistrationA registration form that tracks which event a user has registered for.
× Application EvaluationAn evaluation form attached to applications.
![Page 61: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/61.jpg)
@see \Drupal\webform\Plugin\WebformSourceEntity\QueryStringWebformSourceEntity
public function getSourceEntity(array $ignored_types) { // Get and check source entity type. $source_entity_type = $this->request->query->get('source_entity_type'); if (!$source_entity_type || !$this->entityTypeManager->hasDefinition($source_entity_type)) { return NULL; }
// Get and check source entity id. $source_entity_id = $this->request->query->get('source_entity_id'); if (!$source_entity_id) { return NULL; }
// Get and check source entity. $source_entity = $this->entityTypeManager ->getStorage($source_entity_type)->load($source_entity_id);
return ($source_entity) ? $source_entity : NULL;}
![Page 62: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/62.jpg)
@see \Drupal\webform\Plugin\WebformSourceEntityInterface
/** * Interface of a webform source entity plugin. */interface WebformSourceEntityInterface extends PluginInspectionInterface {
/** * Detect and return a source entity from current context. * * @param string[] $ignored_types * Entity types that may not be used as a source entity. * * @return \Drupal\Core\Entity\EntityInterface|null * Source entity or NULL when no source entity is found. */ public function getSourceEntity(array $ignored_types);
}
![Page 63: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/63.jpg)
UnderstandingForm API (FAPI)
![Page 64: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/64.jpg)
Webforms are render arrays which containelements that
builD, validate, & submit form Values
using Drupal's Form API (FAPI)
![Page 65: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/65.jpg)
Render arrays are the basic
building blocks of Drupal content
![Page 66: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/66.jpg)
Drupal'S FORM API overview× An element is anything displayed on a page
× An input is an element that collects data
× A composite is a group of elements
× A form is collections of elements and inputs
![Page 67: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/67.jpg)
THis is aform
![Page 68: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/68.jpg)
THIS IS A RENDER ARRAYAS YAML
name: '#title': 'Your Name' '#type': textfieldemail: '#title': 'Your Email' '#type': emailsubject: '#title': 'Subject' '#type': textfieldmessage: '#title': 'Message' '#type': textarea
![Page 69: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/69.jpg)
THIS IS A RENDER ARRAYAS PHP
$form['name'] = [ '#title' => $this->t('Your Name'), '#type' => 'textfield',];$form['email'] = [ '#title' => $this->t('Your Email'), '#type' => 'email',];$form['subject'] = [ '#title' => $this->t('Subject'), '#type' => 'textfield',];$form['message'] = [ '#title' => $this->t('Message'), '#type' => 'textfield',];
![Page 70: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/70.jpg)
@see \Drupal\system\Form\SiteInformationForm
class SiteInformationForm extends ConfigFormBase { public function buildForm(array $form, FormStateInterface $form_state) { $site_config = $this->config('system.site'); $form['site_information'] = [ '#type' => 'details', '#title' => t('Site details'), ]; $form['site_information']['site_name'] = [ '#type' => 'textfield', '#title' => t('Site name'), '#default_value' => $site_config->get('name'), '#required' => TRUE, ]; $form['site_information']['site_slogan'] = [ '#type' => 'textfield', '#title' => t('Slogan'), '#default_value' => $site_config->get('slogan'), ]; return parent::buildForm($form, $form_state); }}
![Page 71: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/71.jpg)
HOW DRUPAL HANDLES A FORM
BUILD VALIDATE SUBMIT
![Page 72: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/72.jpg)
@see \Drupal\Core\Form\FormInterface
interface FormInterface { /** * Returns a unique string identifying the form. */ public function getFormId();
/** * Form constructor. */ public function buildForm(array $form, FormStateInterface $form_state);
/** * Form validation handler. */ public function validateForm(array &$form, FormStateInterface $form_state);
/** * Form submission handler. */ public function submitForm(array &$form, FormStateInterface $form_state);}
![Page 73: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/73.jpg)
Additional resources× Form API | Drupal.org
http://dgo.to/2817929
× Forms (Form API) | Drupalize.mehttps://drupalize.me/topic/forms-form-api
× Examples for Developershttps://www.drupal.org/project/examples
![Page 74: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/74.jpg)
Creating Form elEments
![Page 75: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/75.jpg)
A form ELEMENT IS DEfined using a RENDER ARRAY,
which is processed by a render element
Plugin, whichcreates an input
ON A FORM
![Page 76: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/76.jpg)
Plugins are small pieces of
functionality that are swappable
![Page 77: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/77.jpg)
Reusable Extendable
Plugins are...
Standardized
![Page 78: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/78.jpg)
Form elements overview× Form elements are plugins
× Form elements extend render elements
× Element properties begin with a hash (#)
× Elements must have keys
![Page 79: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/79.jpg)
name: '#title': 'Your Name' '#type': textfield '#attributes': style: 'bg-color:yellow' class: - my-custom-class
INPUT NAME (KEY)
PROPERTIES
LABEL
INPUT TYPE
INPUT ATTRIBUTES
![Page 80: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/80.jpg)
<div class="js-form-item form-item js-form-type-textfield form-type-textfield js-form-item-name form-item-name"> <label for="edit-name">Your Name</label> <input style="background-color:yellow" class="my-custom-class form-text" data-drupal-selector="edit-name" type="text" id="edit-name" name="name" value="" size="60" maxlength="255"></div>
FORM ELEMENT
INPUT ATTRIBUTES
INPUT TYPELABEL
INPUT NAME (Key)
XHTML MARKUP
![Page 81: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/81.jpg)
Form element PLUGIN Methods× Define properties FormElement::getInfo
× Set input value FormElement::valueCallback
× Build input FormElement::buildElementName
× Process input FormElement::processElementName
× Render input FormElement::preRenderElementName
× Validate value FormElement::validateElementName
![Page 82: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/82.jpg)
Form element TIPs× Copy and extend existing elements
× Use #element_validate to alter form values
× For composite elements you must use #tree
![Page 83: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/83.jpg)
// @see \Drupal\Core\Render\Element\Textfield
class Textfield extends FormElement {
public function getInfo() {}
public static function valueCallback(&$element, $input, FormStateInterface $form_state) { if ($input !== FALSE && $input !== NULL) { return str_replace(["\r", "\n"], '', $input); } return NULL; }
public static function preRenderTextfield($element) { $element['#attributes']['type'] = 'text'; Element::setAttributes($element, ['id', 'name', 'value', 'size', 'maxlength', 'placeholder']); static::setAttributes($element, ['form-text']); return $element; }}
![Page 84: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/84.jpg)
@see \Drupal\Core\Render\Element\FormElementInterface
/** * Provides an interface for form element plugins. */interface FormElementInterface extends ElementInterface {
/** * Determines how user input is mapped to an * element's #value property. */ public static function valueCallback(&$element, $input, FormStateInterface $form_state);
}
![Page 85: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/85.jpg)
Additional resources× Render arrays | Drupal.org
http://dgo.to/2456267
× Form Element Reference | Drupalize.me https://drupalize.me/tutorial/form-element-reference
× Form and render elements | Drupal APIhttps://api.drupal.org/api/drupal/elements
![Page 86: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/86.jpg)
Creating webform elements
![Page 87: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/87.jpg)
Webform elements are Wrappers that enhancedrupal form elements
![Page 88: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/88.jpg)
WebForm element plugins overview× Requires a corresponding FormElement
× Both plugins must use the same plugin ID (#type)
× Handles everything related to an element
× Base classes help organize related elements
× Traits also help organize related behaviors
![Page 89: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/89.jpg)
webForm element PLUGIN Methods× Defines default properties WebformElement::getDefaultProperties
× Prepares an element WebformElement::prepare
× Determine behaviors WebformElement::hasMultipleValues
× Display submission value WebformElement::buildHtml
× Exports values WebformElement::getTableColumn
× Builds configuration form WebformElement::form
![Page 90: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/90.jpg)
<demo>Webform Elements
Overview: …/reports/webform-plugins/elementsModules: webform_example_element.module webform_example_composite.module
![Page 91: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/91.jpg)
@see \Drupal\webform\Plugin\WebformElementInterface
interface WebformElementInterface { function getDefaultProperties(); // Inspection. function isInput(array $element); function isContainer(array $element); function isComposite(); function supportsMultipleValues(); // Element processing. function initialize(array &$element); function prepare(array &$element, $webform_submission); function finalize(array &$element, $webform_submission); // Submission rendering. function buildHtml(array $element, $webform_submission); function buildText(array $element, $webform_submission); // Entity operations. function preCreate(array &$element, array $values); function postLoad(array &$element, $webform_submission); function postSave(array &$element, $webform_submission); function postDelete(array &$element, $webform_submission); // Configuration form. function form(array $form, $form_state);}
![Page 92: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/92.jpg)
@see \Drupal\webform_example_composite\Element\WebformExampleComposite
class WebformExampleComposite extends WebformCompositeBase {
public function getInfo() { return parent::getInfo() + ['#theme' => 'webform_example_composite']; }
public static function getCompositeElements(array $element) { $elements = []; $elements['first_name'] = [ '#type' => 'textfield', '#title' => t('First name'), ]; $elements['last_name'] = [ '#type' => 'textfield', '#title' => t('Last name'), ]; return $elements; }}
![Page 93: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/93.jpg)
Creating Custom Webform Elements× Create a custom module× Extend or copy existing form element plugin× Build a test webform× Define webform element plugin× Test webform integration× Write tests
![Page 94: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/94.jpg)
Implementingwebform handlers
![Page 95: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/95.jpg)
Webform Handler plugins are used to
route submitted data to applications
& send email notifications
![Page 96: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/96.jpg)
THesearewebformHandlers
![Page 97: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/97.jpg)
THis is anemail Handler
![Page 98: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/98.jpg)
webform handler plugin overview× Contains methods that act like hooks
× Reacts to a submission’s state
× Supports conditional logic
![Page 99: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/99.jpg)
webForm handler PLUGIN Methods× Configuration settings WebformHandler::getConfiguration
× Override settings WebformHandler::overrideSettings
× Alter forms & elements WebformHandler::alterElements
× Entity operations WebformHandler::postSave
× Element operations WebformHandler::createElement
× Handler operations WebformHandler::createHandler
![Page 100: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/100.jpg)
<demo>Webform Handlers
Overview: …/reports/webform-plugins/handlersTest: …/contact/settings/handlersModules: webform_example_handler.module
![Page 101: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/101.jpg)
@see \Drupal\webform\Plugin\WebformHandlerInterface
interface WebformHandlerInterface { // Configuration form. function defaultConfiguration() function buildConfigurationForm(array $form, $form_state); function validateConfigurationForm(array &$form, $form_state); function submitConfigurationForm(array &$form, $form_state); // Elements. function alterElements(array &$elements, $webform); // Settings. function overrideSettings(array &$settings, $webform_submission); // Submission form. function alterForm(array &$form, $form_state, $webform_submission); function validateForm(array &$form, $form_state, $webform_submission); function submitForm(array &$form, $form_state, $webform_submission); function confirmForm(array &$form, $form_state, $webform_submission); // Operations. function postLoad($webform_submission); function postSave($webform_submission); function postDelete($webform_submission);}
![Page 102: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/102.jpg)
@see \Drupal\webform_example_handler\Plugin\WebformHandler\ExampleWebformHandler
class ExampleWebformHandler extends WebformHandlerBase {
function defaultConfiguration() { return [ 'message' => 'This is a custom message.', 'debug' => FALSE, ]; }
function confirmForm(array &$form, $form_state, $webform_submission){ $message = $this->configuration['message']; $message = $this->tokenManager->replace($message, $webform_submission);
$this->messenger() ->addStatus(Markup::create($message), FALSE); }
}
![Page 103: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/103.jpg)
extendingwebform exporters
![Page 104: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/104.jpg)
Webform Exporter plugins are used to
download submissions into spreadsheets
& other applications
![Page 105: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/105.jpg)
THese areexporters
![Page 106: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/106.jpg)
webform exporter plugin overview× Always extend an existing Webform Exporter
× Use DelimitedWebformExporter for CSV files
× Drush command is available for automation
![Page 107: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/107.jpg)
WebForm exporter PLUGIN Methods× Configuration settings WebformExporter::getConfiguration
× Writing data WebformExporter::writeHeader
× File naming WebformExporter::getBaseFileName
![Page 108: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/108.jpg)
<demo>Webform Exporters
Overview: …/reports/webform-plugins/exportsTest: …/contact/results/download
![Page 109: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/109.jpg)
@see \Drupal\webform\Plugin\WebformExporterInterface
interface WebformExporterInterface {
/** * Write header to export. */ public function writeHeader();
/** * Write submission to export. */ public function writeSubmission($webform_submission);
/** * Write footer to export. */ public function writeFooter();}
![Page 110: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/110.jpg)
@see \Drupal\webform\Plugin\WebformExporter\TableWebformExporter
class TableWebformExporter extends TabularBaseWebformExporter {
public function writeSubmission($webform_submission) { // Get the submission's data as a simple associative array. $record = $this->buildRecord($webform_submission); // Build the table data. $row = []; foreach ($record as $item) { $row[] = '<td>' . nl2br(htmlentities($item)) . '</td>'; } // Write the table row. $file_handle = $this->fileHandle; fwrite($file_handle, '<tr valign="top">'); fwrite($file_handle, implode(PHP_EOL, $row)); fwrite($file_handle, '</tr>'); }
}
![Page 111: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/111.jpg)
Are we done?
![Page 112: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/112.jpg)
implementingwebform hooks
![Page 113: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/113.jpg)
Hooks are functions that define or alter
behaviors
![Page 114: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/114.jpg)
webform & Drupal Hooks overview× Handler plugins and hooks are very similar
× Handlers are applied to a single form
× Hooks can be applied to all forms
× All entity hooks are applicable to webforms
![Page 115: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/115.jpg)
PLUGINS & EVENT SUBSCRIBERS
ARE THE "new" hooks for Drupal 8
![Page 116: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/116.jpg)
FORM hookshook_webform_submission_form_alter
element hookshook_webform_element_alter
option hookshook_webform_options_alter
handler hookshook_webform_handler_invoke_alter
entity hookshook_webform_submission_inserthook_webform_submission_loadhook_webform_submission_savehook_webform_submission_deleteetc…
more hooks…hook_webform_libraries_info_alterhook_webform_access_rules_alter
@see webform.api.php
![Page 117: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/117.jpg)
@see webform.api.php
/** * Act on a webform handler when a method is invoked. * * @param \Drupal\webform\Plugin\WebformHandlerInterface $handler * A webform handler attached to a webform. * @param string $method_name * The invoked method name converted to snake case. * @param array $args * Argument being passed to the handler's method. */function hook_webform_handler_invoke_alter($handler, $method_name, array &$args) { $webform_id = $handler->getWebform()->id(); $handler_id = $handler->getHandlerId(); // If contact webform email confirmation has been saved. if ($webform_id === 'contact' && $handler_id === 'email_confirmation' && $method_name === 'post_save') { $webform_submission = $handler->getWebformSubmission(); // Do something with the webform submission. }}
![Page 118: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/118.jpg)
ARE WE THERE YET?
![Page 119: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/119.jpg)
Additional webformresources
![Page 120: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/120.jpg)
Connecting with Me× Jacob Rockowitz (Blog)
http://jrockowitz.com
× jrockowitz on Drupal.orghttps://www.drupal.org/u/jrockowitz
× jrockowitz on Twitterhttps://twitter.com/jrockowitz
![Page 121: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/121.jpg)
Getting help & support× Drupal Slack #Webform
https://drupal.slack.com/messages/C78MFLN9K
× Drupal Answers https://drupal.stackexchange.com/questions/tagged/webforms
× Webform Issue Queuehttps://www.drupal.org/project/issues/webform?version=8.x
![Page 122: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/122.jpg)
webformopen collective
![Page 123: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/123.jpg)
What is OPen Collective?Open Collective is a service which allows Open Source projects to transparently collect and distribute funds. Organizations who back an Open Collective will get a receipt for their financial contributions and be able to see exactly how the collected money is being spent.
![Page 124: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/124.jpg)
× Marketing - Dedicated logo× Security - Providing $50 USD thanks× Training - Offset travel costs× Accessibility - Professional a11y review× Support - Priority support (TBD)× More to come…
Why should you Support the Webform module?
![Page 125: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/125.jpg)
Join the Webformmodule'sOpen Collective
![Page 126: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/126.jpg)
opencollective.com/webform
![Page 127: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/127.jpg)
Getting involved
![Page 128: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/128.jpg)
Join us for contribution opportunities
Mentored Contribution
9:00-18:00Room: 602
First Time Contributor Workshop
9:00-12:00Room: 606
GeneralContribution
9:00-18:00Room: 6A
Friday, April 12, 2019
#DrupalContributions
![Page 129: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/129.jpg)
Locate this session at the DrupalCon Seattle website:
http://seattle2019.drupal.org/schedule
Take the Survey!https://www.surveymonkey.com/r/DrupalConSeattle
What did you think?
![Page 130: advanced webforms PART I - DEMO · advanced webforms PART I - DEMO This work is licensed under a Creative Commons Attribution 4.0 International License. Hello! Hi, my name is Jacob](https://reader030.vdocuments.site/reader030/viewer/2022040204/5ec579a56f458307fe416c70/html5/thumbnails/130.jpg)
Thank You!!!
ANY QUESTIONS?
Ralph says...