Newsfeeds

Migrate Source iCal

New Drupal Modules - 4 November 2017 - 3:50am

This module provides a source plugin to migrate iCal data.
e.g Google Calendar or a .ical file.

Categories: Drupal

Views Taxonomy Parent ID from Term

New Drupal Modules - 4 November 2017 - 3:39am

This module provides a filter for views that display taxonomy terms. This filter works like the 'Parent Term' filter however it takes the term id from an argument and converts it to the parent id.

Categories: Drupal

Keycloak OpenID Connect

New Drupal Modules - 3 November 2017 - 6:07pm

The Keycloak module provides a Keycloak login provider client for the OpenID Connect module.

What does the module do?

The module allows you to authenticate your users against a Keycloak authentication server.

Categories: Drupal

One modder is on a quest to preserve Nintendo's forgotten Flash games

Social/Online Games - Gamasutra - 3 November 2017 - 4:24pm

A game maker and modder who operates under the name "Skelux" is in the middle of a quest to find and preserve "ancient relics": the many Flash games Nintendo once made and hosted on its website. ...

Categories: Game Theory & Design

Responsive Table Filter

New Drupal Modules - 3 November 2017 - 4:12pm

As described in https://alistapart.com/article/web-typography-tables

This text format filter will wrap your body content's tables with a <figure class="responsive-figure-table"> tag and CSS class and provides the basic styles to make these tables scrollable on mobile.

Categories: Drupal

B-Horror RPG Up On Kickstarter

Tabletop Gaming News - 3 November 2017 - 3:00pm
Sure, Halloween’s just passed, and with it came and went a whole slew of awful (in a good way, to many) horror movies. And, I mean, we’ve pretty much all stared at a screen, biting our nails, and occasionally shouting, “Don’t go in there!” We think about what we’d do in such a situation. Well, […]
Categories: Game Theory & Design

WizKids Posts new Star Trek Attack Wing Changes Article

Tabletop Gaming News - 3 November 2017 - 2:00pm
The rules for Star Trek Attack Wing are getting some retrofits. The rules are getting a going-over and various things are changing about the game. But what, exactly, are those changes? Inquiring captains want to know! Well, WizKids is here to help. In this article, they go over what’s being altered for Capital Ships, Shuttlecraft, […]
Categories: Game Theory & Design

Blizzard has its own classic World of Warcraft server in the works

Social/Online Games - Gamasutra - 3 November 2017 - 1:11pm

Blizzard has not announced when the server will go live, saying only that it is currently in development. ...

Categories: Game Theory & Design

Cryptozoic Announces Release Date for Cartoon Network Crossover Crisis: Animation Annihilation Deck-Building Game

Tabletop Gaming News - 3 November 2017 - 1:00pm
Cryptozoic: Home of the really long game names. O,o But that’s what happens when you team up with some cool licensed properties. In this case, it’s basically all of Cartoon Network, as their Cartoon Network Crossover Crisis: Animation Annihilation Deck-Building Game will be coming out in just a couple of weeks. From the announcement: Cryptozoic […]
Categories: Game Theory & Design

Wyrd Previews Crow Runners For The Other Side

Tabletop Gaming News - 3 November 2017 - 12:00pm
You’d think that crows would fly, or just kinda walk. But these are Crow Runners. They’re an Abyssinian unit for Wyrd’s upcoming The Other Side minis game. And seeing how Wyrd loves to make Fridays as awesome as they can be, they’ve posted up a preview. From the post: It’s Friday, and that is the […]
Categories: Game Theory & Design

Variable MimeMail

New Drupal Modules - 3 November 2017 - 11:51am

Want to send Commerce Emails with an attachment? This module provides a rules action "Send MIME mail with variable" that combines the benefits of Variable Email and Mime Mail (and depends on both).

Categories: Drupal

Bootstrap Basic Image Gallery

New Drupal Modules - 3 November 2017 - 11:15am

This module provides an image formatter that displays your images as a simple Bootstrap-based image gallery. The main purpose of this module is to easily display a main image for a piece of content, with subsequent images being available for viewing on hover/click. This is commonly used in instances such as product displays

Categories: Drupal

Niantic acquires team behind social video app Evertoon

Social/Online Games - Gamasutra - 3 November 2017 - 11:12am

The Pokemon Go developer says that the acquisition ultimately will assist it in building social systems for its platform and products. ...

Categories: Game Theory & Design

Friday Snippets

Tabletop Gaming News - 3 November 2017 - 11:00am
It’s Friday! Gateway to the weekend. I’m… just kinda chilling. Yeah… just chilling. Not gonna really go anywhere. Not really gonna do anything special. Just… chill. I think it’s a good idea to do that occasionally. And this weekend, it’s what I want/need. But that’s not to say we can’t still munch on some bite-sized […]
Categories: Game Theory & Design

Piwik Actions

New Drupal Modules - 3 November 2017 - 10:47am

View Piwik visit actions in a table

Categories: Drupal

Agaric Collective: Using CKEditor plugins in Drupal 8

Planet Drupal - 3 November 2017 - 10:21am

CKEditor is well-known software with a big community behind it and it already has a ton of useful plugins ready to be used. It is the WYSIWYG text editor which ships with Drupal 8 core.

Unfortunately, the many plugins provided by the CKEditor community can't be used directly in the CKEditor that comes with Drupal 8. It is necessary to let Drupal know that we are going to add a new button to the CKEditor.

Why Drupal needs to know about our plugins

Drupal allows us to create different text formats, where depending on the role of the user (and so what text formats they have available) they can use different HTML tags in the content. Also, we can decide if the text format will use the CKEditor at all and, if it does, which buttons will be available for that text format.

That is why Drupal needs to know about any new button, so it can build the correct configuration per text format.

Adding a new button to CKEditor

We are going to add the Media Embed plugin, which adds a button to our editor that opens a dialog where you can paste an embed code from YouTube, Vimeo, and other providers of online video hosting.

First of all, let's create a new module which will contain the code of this new button, so inside the /modules/contrib/ folder let's create a folder called wysiwyg_mediaembed. (If you're not intending to share your module, you should put it in /modules/custom/— but please share your modules, especially ones making CKEditor plugins available to Drupal!)

cd modules/contrib/ mkdir wysiwyg_mediaembed

And inside let's create the info file: wysiwyg_mediaembed.info.yml

name: CKEditor Media Embed Button (wysiwyg_mediaembed) type: module description: "Adds the Media Embed Button plugin to CKEditor." package: CKEditor core: '8.x' dependencies: - ckeditor

Adding this file will Drupal allows us to install the module, if you want to read more about how to create a custom module, you can read about it here.

Once we have our info file we just need to create a Drupal plugin which will give info to the CKEditor about this new plugin, we do that creating the following class:

touch src/Plugin/CkEditorPlugin/MediaEmbedButton.php

With this content:

namespace Drupal\wysiwyg_mediaembed\Plugin\CKEditorPlugin; use Drupal\ckeditor\CKEditorPluginBase; use Drupal\editor\Entity\Editor; /** * Defines the "wysiwyg_mediaembed" plugin. * * @CKEditorPlugin( * id = "mediaembed", * label = @Translation("CKEditor Media Embed Button") * ) */ class MediaEmbedButton extends CKEditorPluginBase { /** * Get path to library folder. * The path where the library is, usually all the libraries are * inside the '/libraries/' folder in the Drupal root. */ public function getLibraryPath() { $path = '/libraries/mediaembed'; return $path; } /** * {@inheritdoc} * Which other plugins require our plugin, in our case none. */ public function getDependencies(Editor $editor) { return []; } /** * {@inheritdoc} * The path where CKEditor will look for our plugin. */ public function getFile() { return $this->getLibraryPath() . '/plugin.js'; } /** * {@inheritdoc} * * We can provide extra configuration if our plugin requires * it, in our case we no need it. */ public function getConfig(Editor $editor) { return []; } /** * {@inheritdoc} * Where Drupal will look for the image of the button. */ public function getButtons() { $path = $this->getLibraryPath(); return [ 'MediaEmbed' => [ 'label' => $this->t('Media Embed'), 'image' => $path . '/icons/mediaembed.png', ], ]; } }

The class's code is pretty straightforward: it is just a matter of letting Drupal know where the library is and where the button image is and that's it.

The rest is just download the library and put it in the correct place and activate the module. If all went ok we will see our new button in the Drupal Text Format Page (usually at: /admin/config/content/formats).

This module was ported because we needed it in a project, so if you want to know how this code looks all together, you can download the module from here.

Now that you know how to port a CKEditor plugin to Drupal 8 the next time you can save time using Drupal Console with the following command:

drupal generate:plugin:ckeditorbutton

What CKEditor plugin are you going to port?

Categories: Drupal

At GDC 2018, For Honor devs share lessons learned sustaining a live game

Social/Online Games - Gamasutra - 3 November 2017 - 10:03am

At GDC 2018 For Honor creative director Roman Campos Oriola and game director Damien Kieken will tell the tale of their game, its post-launch troubles, and how they addressed them. ...

Categories: Game Theory & Design

Kitty Quest Board Game Up On Kickstarter

Tabletop Gaming News - 3 November 2017 - 10:00am
Well, I guess that headline should technically say, “Kitty Quest No-Board Game Up On Kickstarter,” as the game does not have a board in the traditional sense. Instead, players will create the board as they go along, in this twist on the classic form of board games. You can check it out on Kickstarter now. […]
Categories: Game Theory & Design

Galactic Warlords: Battle for Dominion Board Game Coming to Kickstarter

Tabletop Gaming News - 3 November 2017 - 9:00am
You know what’s fun? Being in charge. And I don’t just mean of your home or your job. I’m talking of being in charge of an entire section of a galaxy. That’s what you’ll be trying to do in Galactic Warlords: Battle for Dominion, a new tactical board game that’s coming to Kickstarter in just […]
Categories: Game Theory & Design

Lullabot: Decoupled Drupal Hard Problems: Schemas

Planet Drupal - 3 November 2017 - 8:59am

The Schemata module is our best approach so far in order to provide schemas for our API resources. Unfortunately, this solution is often not good enough. That is because the serialization component in Drupal is so flexible that we can’t anticipate the final form our API responses will take, meaning the schema that our consumers depend on might be inaccurate. How can we improve this situation?

This article is part of the Decoupled hard problems series. In past articles we talked about request aggregation solutions for performance reasons, and how to leverage image styles in decoupled architectures.

TL;DR
  • Schemas are key for an API's self-generated documentation
  • Schemas are key for the maintainability of the consumer’s data model.
  • Schemas are generated from Typed Data definitions using the Schemata module. They are expressed in the JSON Schema format.
  • Schemas are statically generated but normalizers are determined at runtime.
Why Do We Need Schemas?

A database schema is a description of the data a particular table can hold. Similarly an API resource schema is a description of the data a particular resource can hold. In other words, a schema describes the shape of a resource and the datatype of each particular property.

Consumers of data need schemas in order to set their expectations. For instance, the schema tells the consumer that the body property is a JSON object that contains a value that is a string. A schema also tells us that the mail property in the user resource is a string in the e-mail format. This knowledge empowers consumers to add client-side form validation for the mail property. In general, a schema will help consumers to have prior understanding of the data they will be fetching from the API, and what data objects they can write to the API.

We are using the resource schemas in the Docson and Open API to generate automatic documentation. When we enable JSON API and  Open API you get a fully functional and accurately documented HTTP API for your data model. Whenever we make changes to a content type, that will be reflected in the HTTP API and the documentation automatically. All thanks to the schemas.

A consumer could fetch the schemas for all the resources it needs at compile time or fetch them once and cache them for a long time. With that information, the consumer can generate its models automatically without developer intervention. That means that with a single implementation once, all of our consumers’ models are done forever. Probably, there is a library for our consumer’s framework that does this already.

More interestingly, since our schema comes with type information our schemas can be type safe. That is important to many languages like Swift, Java, TypeScript, Flow, Elm, etc. Moreover if the model in the consumer is auto-generated from the schema (one model per resource) then minor updates to the resource are automatically reflected in the model. We can start to use the new model properties in Angular, iOS, Android, etc.

In summary, having schemas for our resources is a huge improvement for the developer experience. This is because they provide auto-generated documentation of the API, and auto-generated models for the consumer application.

How We Are Generating Schemas In Drupal?

One of Drupal 8's API improvements was the introduction of the Typed Data API. We use this API to declare the data types for a particular content structure. For instance, there is a data type for a Timestamp that extends an Integer. The Entity and Field APIs combine these into more complex structures, like a Node.

JSON API and REST in core can expose entity types as resources out of the box. When these modules expose an entity type they do it based on typed data and field API. Since the process to expose entities is known, we can anticipate schemas for those resources.

In fact, assuming resources are a serialization of field API and typed data is the only thing we can do. The base for JSON API and REST in core is Symfony's serialization component. This component is broken into normalizers, as explained in my previous series. These normalizers transform Drupal's inner data structures into other simpler structures. After this transformation, all knowledge of the data type, or structure is lost. This happens because the normalizer classes do not return the new types and new shapes the typed data has been transformed to. This loss of information is where the big problem lies with the current state of schemas.

The Schemata module provides schemas for JSON API and core REST. It does it by serializing the entity and typed data. It is only able to do this because it knows about the implementation details of these two modules. It knows that the nid property is an integer and it has to be nested under data.attributes in JSON API, but not for core REST. If we were to support another format in Schemata we would need to add an ad-hoc implementation for it.

The big problem is that schemas are static information. That means that they can't change during the execution of the program. However, the serialization process (which transforms the Drupal entities into JSON objects) is a runtime operation. It is possible to write a normalizer that turns the number four into 4 or "four" depending if the date of execution ends in an even minute or not. Even though this example is bizarre, it shows that determining the schema upfront without other considerations can lead to errors. Unfortunately, we can’t assume anything about the data after its serialized.

We can either make normalization less flexible—forcing data types to stay true to the pre-generated schemas—or we can allow the schemas to change during runtime. The second option clearly defeats the purpose of setting expectations, because it would allow a resource to potentially differ from the original data type specified by the schema.

The GraphQL community is opinionated on this and drives the web service from their schema. Thus, they ensure that the web service and schema are always in sync.

How Do We Go Forward From Here

Happily, we are already trying to come up with a better way to normalize our data and infer the schema transformations along the way. Nevertheless, whenever a normalizer is injected by a third party contrib module or because of improved normalizations with backwards compatibility the Schemata module cannot anticipate it. Schemata will potentially provide the wrong schema in those scenarios. If we are to base the consumer models on our schemas, then they need to be reliable. At the moment they are reliable in JSON API, but only at the cost of losing flexibility with third party normalizers.

One of the attempts to support data transformations and the impact they have on the schemas are Field Enhancers in JSON API Extras. They represent simple transformations via plugins. Each plugin defines how the data is transformed, and how the schema is affected. This happens for both directions, when the data goes out and when the consumers write back to the API and the transformation needs to be reversed. Whenever we need a custom transformation for a field, we can write a field enhancer instead of a normalizer. That way schemas will remain correct even if the data change implies a change in the schema.

undefined

We are very close to being able to validate responses in JSON API against schemas when Schemata is present. It will only happen in development environments (where PHP’s asserts are enabled). Site owners will be able to validate that schemas are correct for their site, with all their custom normalizers. That way, when a site owner builds an API or makes changes they'll be able to validate the normalized resource against the purported schema. If there is any misalignment, a log message will be recorded.

Ideally, we want the certainty that schemas are correct all the time. While the community agrees on the best solution, we have these intermediate measures to have reasonable certainty that your schemas are in sync with your responses.

Join the discussion in the #contenta Slack channel or come to the next API-First Meeting and show your interest there!

Hero photo by Oliver Thomas Klein on Unsplash.

Categories: Drupal

Pages

Subscribe to As If Productions aggregator