Planet Drupal

Syndicate content - aggregated feeds in category Planet Drupal
Updated: 28 min 27 sec ago

Dries Buytaert: Help me write my DrupalCon Amsterdam keynote

Mon, 08/11/2014 - 14:56
div class=field field-name-taxonomy-vocabulary-1 field-type-taxonomy-term-reference field-label-abovediv class=field-labelTopic:nbsp;/divdiv class=field-itemsdiv class=field-item evena href=/tag/drupal typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=Drupal/a/divdiv class=field-item odda href=/tag/drupalcon typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=DrupalCon/a/div/div/divdiv class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item even property=content:encodediframe width=500 height=281 src=// frameborder=0 allowfullscreen=/iframep For my DrupalCon Amsterdam keynote, I want to try something slightly different. Instead of coming up with the talk track myself, I want to crowdsource it. In other words, I want the wider Drupal community to have direct input on the content of the keynote. I feel this will provide a great opportunity to surface questions and ideas from the people who make a href=http://drupal.orgDrupal/a what it is./p pIn the past, I've done traditional surveys to get input for my keynote and I've also done keynotes that were Qamp;A from beginning to end. This time, I'd like to try something in between. /p pI'd love your help to identify the topics of interests (e.g. scaling our community, future of the web, information about Drupal's competitors, headless Drupal, the Drupal Association, the business of Open Source, sustaining core development, etc). You can make your suggestions in the comments of this blog post or on Twitter (tag them with a href= and a href=;q=driesnoteamp;src=typd#driesnote/a). I'll handpick some topics from all the suggestions, largely based on popularity but also based on how important and meaty I think the topic is./p pThen, in the lead-up to the event, I'll create discussion opportunities on some or all of the topics so we can dive deeper on them together, and surface various opinions and ideas. The result of those deeper conversations will form the basis of my DrupalCon Amsterdam keynote./p pSo what would you like me to talk about? Suggest your topics in the comments of this blog post or on Twitter by tagging your suggestions with a href=;q=driesnoteamp;src=typd#driesnote/a and/or a href= emThank you!/em/p /div/div/div

drunken monkey: Updating the Search API to D8 – Part 5: Using plugin derivatives

Mon, 08/11/2014 - 14:42
div class=field field-name-field-image field-type-image field-label-hiddendiv class=field-itemsdiv class=field-item evenimg typeof=foaf:Image src= width=159 height=240 alt= title=Derivatives: usually, but not always a bad thing. //div/div/divdiv class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item even property=content:encodedpThe greatest thing about all the refactoring in Drupal 8 is that, in general, a lot of those special Drupalisms used nowhere else were thrown out and replaced by sound design patterns, industry best practices and concepts that newcomers from other branches of programming will have an easy time of recognizing and using. While I can understand that this is an annoyance for some who have got used to the Drupalisms (and who haven't got a formal education in programming), as someone with a CS degree and a background in Java I was overjoyed at almost anything new I learned about Drupal 8, which, in my opinion, just made Drupal so much / But, of course, this has already been discussed in a lot of other blog posts, podcasts, sessions, etc., by a lot of other people./p pWhat I want to discuss today is one of the few instances where it seems this principle was violated and a new Drupalism, not known anywhere else (as far as I can tell, at least – if I'm mistaken I'd be grateful to be educated in the comments), introduced: plugin / Probably some of you have already seen it there somewhere, especially if you were foolish enough to try to understand the new block system (if you succeeded, I salute you!), but I bet (or, hope) most of you had the same reaction as me: a very puzzled look and an involuntary “What the …?” In my case, this question was all the more pressing because I first stumbled upon plugin derivatives emin my own module/em – a href=édéric Hennequin/a had done a lot of the initial work of porting the module and since there was a place where they fit perfectly, he used them. Luckily, I came across this in a href= where a href= Goffings/a was close by and could explain this to me slowly until it sank in. (Looking at the a href= documentation/a now, it actually looks quite good, but I remember that, back then, I had no idea what they were talking about.)br / So, without (even) further ado, let me now share this arcane knowledge with you!/p h2What, and emwhy/em, are plugin derivatives?/h2 h3The problem/h3 pPlugin derivatives, even though very Drupalistic (?), are actually a rather elegant solution for an interesting (and pressing) problem: dynamically defining / For example, take Search API's datasource plugins. These provide item types that can be indexed by the Search API, a further abstraction from the entity concept to be able to handle non-entities (or, indeed, even non-Drupal content). We of course want to provide an item type for each entity type, but we don't know beforehand which entity types there will be on a site – also, since entities can be accessed with a common API we can use the same code for all entity types and don't want a new class for / In Drupal 7, this was trivial to do:/p div class=codeblock precodespan style=color: #000000span style=color: #0000BBlt;?phpbr //spanspan style=color: #FF8000/**br / * Implements hook_search_api_item_type_info().br / */br //spanspan style=color: #007700function /spanspan style=color: #0000BBsearch_api_search_api_item_type_info/spanspan style=color: #007700() {br /  /spanspan style=color: #0000BB$types /spanspan style=color: #007700= array();br /  foreach (/spanspan style=color: #0000BBentity_get_property_info/spanspan style=color: #007700() as /spanspan style=color: #0000BB$type /spanspan style=color: #007700=gt; /spanspan style=color: #0000BB$property_info/spanspan style=color: #007700) {br /    if (/spanspan style=color: #0000BB$info /spanspan style=color: #007700= /spanspan style=color: #0000BBentity_get_info/spanspan style=color: #007700(/spanspan style=color: #0000BB$type/spanspan style=color: #007700)) {br /      /spanspan style=color: #0000BB$types/spanspan style=color: #007700[/spanspan style=color: #0000BB$type/spanspan style=color: #007700] = array(br /        /spanspan style=color: #DD0000'name' /spanspan style=color: #007700=gt; /spanspan style=color: #0000BB$info/spanspan style=color: #007700[/spanspan style=color: #DD0000'label'/spanspan style=color: #007700],br /        /spanspan style=color: #DD0000'datasource controller' /spanspan style=color: #007700=gt; /spanspan style=color: #DD0000'SearchApiEntityDataSourceController'/spanspan style=color: #007700,br /        /spanspan style=color: #DD0000'entity_type' /spanspan style=color: #007700=gt; /spanspan style=color: #0000BB$type/spanspan style=color: #007700,br /      );br /    }br /  }br /  return /spanspan style=color: #0000BB$types/spanspan style=color: #007700;br /}br //spanspan style=color: #0000BB?gt;/span/span/code/pre/div pSince plugin definition happens in a hook, we can just loop over all entity types, set the same controller class for each, and put an additional codeentity_type/code key into the definition so the controller knows which entity type it should use./p pNow, in Drupal 8, there's a problem: as discussed a href= the previous part of this series/a, plugins now generally use annotations on the plugin class for the definition. That, in turn, would mean that a single class can only represent a single plugin, and since you can't (or at least really, emreally/em shouldn't) dynamically define classes there's also not really any way to dynamically define / One possible workaround would be to just use the alter hook which comes with nearly any plugin type and dynamically add the desired plugins there – however, that's not really ideal as a general solution for the problem, especially since it also occurs in core in several places. (The clearest example here are probably menu blocks – for each menu, you want one block plugin defined.)/p h3The solution/h3 pSo, as you might have guessed, the solution to this problem was the introduction of the concept of emderivatives/em. Basically, every time you define a new plugin of any type (as long as the manager inherits from a href=!lib!Drupal!Core!Plugin!DefaultPluginManager.php/class/DefaultPluginManager/8codeDefaultPluginManager/code/a you can add a codederiver/code key to its definition, referencing a class. This deriver class will then automatically be called when the plugin system looks for plugins of that type and allows the deriver to multiply the plugin's definition, adding or altering any definition keys as appropriate. It is, essentially, another layer of altering that is specific to one plugin, serves a specific purpose (i.e., multiplying that plugin's definition) and occurs before the general alter hook is invoked./p pHopefully, an example will make this clearer. Let's see how we used this system in the Search API to solve the above problem with datasources./p h2How to use derivatives/h2 pSo, how do we define several datasource plugins with a single class? Once you understand how it works (or what it's supposed to do) it's thankfully pretty easy to do. We first create our plugin like normally (or, just copy it from Drupal 7 and fix class name and namespace), but add the codederiver/code key and internally assume that the plugin definition has an additional codeentity_type/code key which will tell us which entity type this specific datasource plugin should work with./p pSo, we put the following into a href= div class=codeblock precodespan style=color: #000000span style=color: #0000BBlt;?phpbr //spanspan style=color: #007700namespace /spanspan style=color: #0000BBDrupal/spanspan style=color: #007700\/spanspan style=color: #0000BBsearch_api/spanspan style=color: #007700\/spanspan style=color: #0000BBPlugin/spanspan style=color: #007700\/spanspan style=color: #0000BBSearchApi/spanspan style=color: #007700\/spanspan style=color: #0000BBDatasource/spanspan style=color: #007700;br /br //spanspan style=color: #FF8000/**br / * @SearchApiDatasource(br / *   id = entity,br / *   deriver = Drupal\search_api\Plugin\SearchApi\Datasource\ContentEntityDatasourceDeriverbr / * )br / */br //spanspan style=color: #007700class /spanspan style=color: #0000BBContentEntityDatasource /spanspan style=color: #007700extends /spanspan style=color: #0000BBDatasourcePluginBase /spanspan style=color: #007700{br /br /  public function /spanspan style=color: #0000BBloadMultiple/spanspan style=color: #007700(array /spanspan style=color: #0000BB$ids/spanspan style=color: #007700) {br /    /spanspan style=color: #FF8000// In the real code, this of course uses dependency injection, not a global /    /spanspan style=color: #007700return /spanspan style=color: #0000BBentity_load_multiple/spanspan style=color: #007700(/spanspan style=color: #0000BB$this/spanspan style=color: #007700-gt;/spanspan style=color: #0000BBpluginDefinition/spanspan style=color: #007700[/spanspan style=color: #DD0000'entity_type'/spanspan style=color: #007700], /spanspan style=color: #0000BB$ids/spanspan style=color: #007700);br /  }br /br /  /spanspan style=color: #FF8000// Plus a lot of other methods …br /br //spanspan style=color: #007700}br //spanspan style=color: #0000BB?gt;/span/span/code/pre/div pNote that, even though we can skip even required keys in the definition (like codelabel/code here), we still have to set an codeid/code. This is called the plugin base ID and will be used as a prefix to all IDs of the derivative plugin definitions, as we'll see in a / The codederiver/code key is of course the main thing here. The namespace and name are arbitrary (the standard is to use the same namespace as the plugin itself, but append Deriver to the class name), the class just needs to implement the a href=!lib!Drupal!Component!Plugin!Derivative!DeriverInterface.php/interface/DeriverInterface/8codeDeriverInterface/code/a – nothing else is needed. There is also a href=!lib!Drupal!Core!Plugin!Discovery!ContainerDeriverInterface.php/interface/ContainerDeriverInterface/8codeContainerDeriverInterface/code/a, a sub-interface for when you want dependency injection for creating the deriver, and an abstract base class, a href=!lib!Drupal!Component!Plugin!Derivative!DeriverBase.php/class/DeriverBase/8codeDeriverBase/code/a, which isn't very useful though, since the interface only has two methods. Concretely, the two methods are: codegetDerivativeDefinitions()/code, for getting all derivative definitions, and codegetDerivativeDefinition()/code for getting a single one – the latter usually simply a two-liner using the former./p pTherefore, this is what a href= looks like:/p div class=codeblock precodespan style=color: #000000span style=color: #0000BBlt;?phpbr //spanspan style=color: #007700namespace /spanspan style=color: #0000BBDrupal/spanspan style=color: #007700\/spanspan style=color: #0000BBsearch_api/spanspan style=color: #007700\/spanspan style=color: #0000BBPlugin/spanspan style=color: #007700\/spanspan style=color: #0000BBSearchApi/spanspan style=color: #007700\/spanspan style=color: #0000BBDatasource/spanspan style=color: #007700;br /br /class /spanspan style=color: #0000BBContentEntityDatasourceDeriver /spanspan style=color: #007700implements /spanspan style=color: #0000BBDeriverInterface /spanspan style=color: #007700{br /br /  public function /spanspan style=color: #0000BBgetDerivativeDefinition/spanspan style=color: #007700(/spanspan style=color: #0000BB$derivative_id/spanspan style=color: #007700, /spanspan style=color: #0000BB$base_plugin_definition/spanspan style=color: #007700) {br /    /spanspan style=color: #0000BB$derivatives /spanspan style=color: #007700= /spanspan style=color: #0000BB$this/spanspan style=color: #007700-gt;/spanspan style=color: #0000BBgetDerivativeDefinitions/spanspan style=color: #007700(/spanspan style=color: #0000BB$base_plugin_definition/spanspan style=color: #007700);br /    return isset(/spanspan style=color: #0000BB$derivatives/spanspan style=color: #007700[/spanspan style=color: #0000BB$derivative_id/spanspan style=color: #007700]) ? /spanspan style=color: #0000BB$derivatives/spanspan style=color: #007700[/spanspan style=color: #0000BB$derivative_id/spanspan style=color: #007700] : /spanspan style=color: #0000BBNULL/spanspan style=color: #007700;br /  }br /br /  public function /spanspan style=color: #0000BBgetDerivativeDefinitions/spanspan style=color: #007700(/spanspan style=color: #0000BB$base_plugin_definition/spanspan style=color: #007700) {br /    /spanspan style=color: #0000BB$base_plugin_id /spanspan style=color: #007700= /spanspan style=color: #0000BB$base_plugin_definition/spanspan style=color: #007700[/spanspan style=color: #DD0000'id'/spanspan style=color: #007700];br /    /spanspan style=color: #0000BB$plugin_derivatives /spanspan style=color: #007700= array();br /    foreach (\/spanspan style=color: #0000BBDrupal/spanspan style=color: #007700::/spanspan style=color: #0000BBentityManager/spanspan style=color: #007700()-gt;/spanspan style=color: #0000BBgetDefinitions/spanspan style=color: #007700() as /spanspan style=color: #0000BB$entity_type_id /spanspan style=color: #007700=gt; /spanspan style=color: #0000BB$entity_type_definition/spanspan style=color: #007700) {br /      if (/spanspan style=color: #0000BB$entity_type_definition /spanspan style=color: #007700instanceof /spanspan style=color: #0000BBContentEntityType/spanspan style=color: #007700) {br /        /spanspan style=color: #0000BB$label /spanspan style=color: #007700= /spanspan style=color: #0000BB$entity_type_definition/spanspan style=color: #007700-gt;/spanspan style=color: #0000BBgetLabel/spanspan style=color: #007700();br /        /spanspan style=color: #0000BB$plugin_derivatives/spanspan style=color: #007700[/spanspan style=color: #0000BB$entity_type_id/spanspan style=color: #007700] = array(br /          /spanspan style=color: #DD0000'id' /spanspan style=color: #007700=gt; /spanspan style=color: #0000BB$base_plugin_id /spanspan style=color: #007700. /spanspan style=color: #0000BBPluginBase/spanspan style=color: #007700::/spanspan style=color: #0000BBDERIVATIVE_SEPARATOR /spanspan style=color: #007700. /spanspan style=color: #0000BB$entity_type_id/spanspan style=color: #007700,br /          /spanspan style=color: #DD0000'label' /spanspan style=color: #007700=gt; /spanspan style=color: #0000BB$label/spanspan style=color: #007700,br /          /spanspan style=color: #DD0000'description' /spanspan style=color: #007700=gt; /spanspan style=color: #0000BB$this/spanspan style=color: #007700-gt;/spanspan style=color: #0000BBt/spanspan style=color: #007700(/spanspan style=color: #DD0000'Provides %entity_type entities for indexing and searching.'/spanspan style=color: #007700, array(/spanspan style=color: #DD0000'%entity_type' /spanspan style=color: #007700=gt; /spanspan style=color: #0000BB$label/spanspan style=color: #007700)),br /          /spanspan style=color: #DD0000'entity_type' /spanspan style=color: #007700=gt; /spanspan style=color: #0000BB$entity_type_id/spanspan style=color: #007700,br /        ) + /spanspan style=color: #0000BB$base_plugin_definition/spanspan style=color: #007700;br /      }br /    }br /    return /spanspan style=color: #0000BB$plugin_derivatives/spanspan style=color: #007700;br /  }br /br /}br //spanspan style=color: #0000BB?gt;/span/span/code/pre/div pAs you see, codegetDerivativeDefinitions()/code just returns an array with derivative plugin definitions – keyed by what's called their derivative ID and their codeid/code key set to a combination of base ID and derivative ID, separated by a href=!lib!Drupal!Component!Plugin!PluginBase.php/constant/PluginBase%3A%3ADERIVATIVE_SEPARATOR/8codePluginBase::DERIVATIVE_SEPARATOR/code/a (which is simply a colon (:)). We additionally set the codeentity_type/code key for all definitions (as we used in the plugin) and also set the other definition keys (as defined in the annotation) accordingly./p pAnd that's it! If your plugin type implements a href=!lib!Drupal!Component!Plugin!DerivativeInspectionInterface.php/interface/DerivativeInspectionInterface/8codeDerivativeInspectionInterface/code/a (which the normal a href=!lib!Drupal!Component!Plugin!PluginBase.php/class/PluginBase/8codePluginBase/code/a class does), you also have handy methods for finding out a plugin's base ID and derivative ID (if any). But usually the code using the plugins doesn't need to be aware of derivatives and can simply handle them like any other plugin. Just be aware that this leads to plugin IDs now all potentially containing colons, and not only the usual alphanumerics plus underscores ID characters./p h3A side note about nomenclature/h3 pThis is a bit confusing actually, especially as older documentation remains unupdated: The new individual plugins that were derived from the base defintion are referred to as derivative plugin definitions, plugin derivatives or just derivatives. Confusingly, though, the class creating the derivatives was emalso/em called a derivative class (and the key in the plugin definition was, consequently, codederivative/code).br / In a href= Reconsider naming conventions for derivative classes/a, this discrepancy was discussed and eventually resolved by renaming the classes creating derivative definitions (along with their interfaces, etc.) to / If you are reading documentation that is more than a few months old, hopefully this will prevent you from some confusion./p psmallImage credit: a href= /div/div/div

Paragon-Blog: Performing DRD actions from Drush: Drupal power tools, part 2 of 4

Mon, 08/11/2014 - 10:33
div class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item evenpDrupal Remote Dashboard (DRD) fully supports Drush and it does this in two ways: DRD provides all its actions as Drush commands and DRD can trigger the execution of Drush commands on remote domains. This blog post is part of a series (see a href= 1 of 4/a) that describes all the possibilities around these two powerful tools. This is part 2 which describes on how to trigger any of DRD's actions from the command line by utilizing Drush./p/div/div/div

Pronovix: Drupal uncoded

Mon, 08/11/2014 - 00:09
pIn open source, something magical happens when like-minded people meet. You find out somebody else is dealing with a similar problem, you combine ideas and before you know it an ad hoc working group has formed to fix the problem. It's a public secret that at Drupalcon the good stuff happens in the BOF sessions./p pAs the Drupal community has grown we've seen new community events spring up that catered to whole groups of people that before weren't able to meet and talk:/p

VM(doh): OPCache Module for Drupal

Sun, 08/10/2014 - 13:08
pLast Friday, we published the start to our a href= module for Drupal/a. While it's still lacking a few features to be ready for a tagged release, we thought it'd be a good idea to get some working code out there./ppThe goal for this module is to allow Drupal site administrators to clear their opcode cache if they are using the a href= OPcache extension/a (also known as Zend OPcache or Zend Optimizer+) as well as provide an interface similar to the Memcache Admin module./ppAs of right now, the only implemented feature is cache flushing. We understand that you might be running on multiple webservers (we build a lot of sites that run on multiple webservers), so we included the ability to flush caches on all of your webservers at once./ppGo try the module and feel free to submit patches!/p

Joachim's blog: Using Human Queue Worker to process comments

Sat, 08/09/2014 - 11:44
div class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item even property=content:encodedpSome time ago, I released a href= Queue Worker/a, a module that takes the concept of the Drupal Queue system, but where the processing of the items is done by human users rather than an automated process. I say 'takes the concept'; it in fact uses the Drupal Queue to create and claim queue items, but instead of declaring your queue with a href=, you declare it to Human Queue Worker as a queue that humans will be working on./p pThis was written for my current project and for a fairly specific need, and I didn't imagine many sites would be using it. However, it has an obvious and popular application: approving comments. I always figured it would be nice if someone wrote a little module to define a comment processing human queue./p pWell, that someone is me, and the time is now. You see, I'm an idiot: when I set up this new blog site of mine, I totally forgot to set up a CAPTCHA, and then when I added Mollon, I didn't set it up properly. So this site has a few hundred spammy comments that I need to delete./p pThe problem is that comment management takes time. Unless there are some magical area of the core UI I've completely missed, I can either visit each node and delete them one by one, or use the comment admin form. There, I can mass-delete the ones with obvious spammy titles, but all the others will still need individual inspection./p pThe Human Queue UI simplifies this hugely. There's just one page for the queue. When you go to that page, you're presented with an item to process. In the case of comment approval, that's the comment itself, plus the parent node and parent comment to give you some context. To process the comment, click one of two buttons: 'Publish' or 'Delete'. The comment is dealt with, and the form reloads, with a brand new comment for you to process. Which means that the only clicking you do is the action buttons: Publish; Delete; Publish; Delete. (Though with the amount of spam on my site, it's probably Delete; Delete; Delete, like the Cybermen.)/p pI've not timed it, but I reckon I can probably go at quite a rate. And that's with just one of me: the core Queue system guarantees that only one worker can claim an item at any one time, and that applies to human workers too. So if another user were to work the queue too, by going to the same page, they would be getting shown different comments to work on, and we'd work through the comments at twice the rate./p pNow I just need to find a compliant friend and make them into my worker drone. If you're interested, please don't post a comment!/p /div/div/div

X-Team: ContributeX: Drupal 8 needs you

Sat, 08/09/2014 - 02:38
#8220;Contributing to Drupal is life-changing.#8221; Dries, you couldn#8217;t be more right. At DrupalCamp Singapore 2014, developers from all over Asia had the opportunity to spend a day focused on learning, collaborating and preparing for Drupal 8. One takeaway was being reminded of the fact that Drupal 8 still needs significant help from its community to be...

tsvenson: How Open Source worx

Fri, 08/08/2014 - 22:00
div class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item evenpIt's funny how quick things happen - Really it is!/p pJust a week ago I posted a href= am a Follower amp; Thinker/a describing some of my experiences from a href= Source/a. Then, just days later, someone had left me a message in an open Drupal chatroom. What happened after is the result of a chain of interesting - but more or less isolated - events and situations./p h2Quick background/h2 pI'm currently spending some of my time working on an open initiative called a href=http://baksteg.seBaksteg/a. I have quite a bit of experience with Drupal and for me it is more than good enough to build the site I have in mind with. Just recently I begun doing some real prototyping of ideas too. Most of the testing have gone very well, but some not so and for those I have started to seek the online community more - poking for help to find solutions or alternative ways./p h2Online communities are everywhere/h2 pa href= is a fantastic resource to start with. Many problems can quickly be solved doing a quick search there, or it's related sites such as a href= and a href= Then, when you struggle to find useful help by just searching, you have already started to find other channels to communicate on. In fact you find people using, working with, Drupal everywhere these days. That even includes the same social networks everyone else uses, such as a href=https://twitter.comTwitter/a, a href=https://www.facebook.comFacebook/a and a href=https://www.linkedin.comLinkedIn/a. Personally I prefer Twitter as it fills my needs and interests good enough, both with Drupal and other ones./p pOver the last few months I have worked on tuning my own use of Twitter. I wanted it less as a *megaphone* and more a communication tool to have meaningful, while at the same time a bit entertaining, conversations on. It has worked out really well, while also - as an welcomed bonus - helped me much better appreciate what others actually share out there. My two main feeds are now a href= (personal, mainly in English)/a and a href= (mainly in Swedish)/a. They both play important roles for my daily needs, which - totally coincidently - works really well with how I now see open source collaboration works out to ;)/p h2Kinda one of the original Social Networks, not that long time ago/h2 pHowever this story happenednbsp;in the Swedish Drupal-channel on a href= - a social network for geeks and nerds since long ago. It was from a href= (Kristoffer Wiklund)/a asking me about this entity ID *problem* I was having troubles with. Some days earlier I had posted a href= description of it in the Swedish Drupal Group/a. While that post resulted in some nice advices and ideas, they all turned out to be dead ends. Still, it gave me opportunity to play around with some other modules that later will be used./p p- Practice is always good I'm told ;)/p pKristoffer was one of them who had helped there. We also go further back, including several Drupal events around. Thus we already know each other, at least when it comes to Drupal stuff. I explained that testing been good, but the work had to, for good reasons, be *pushed* forward. That's when Kristoffer offered to help and write a simple module, if nothing else just to get some coding experience poking around./p pemAs things often end up then, when passionate nerds and geeks find an interesting problem or challenge, brainstorming starts and ideas flows back and forth./em/p pIRC is an important channel in the Drupal community, but it is not because of it's fancy features. It's its simplicity that makes it into such a useful tool to use as a communication hub. A hub that a href= us to worldwide chatrooms/a that can run in the background only to be brought forward when needed or when we have a moment to spare. Or just as inspiration.../p pJust following the discussions is itself educational and often spurns new ideas. There are many different specialized chatrooms too, one simply called strong#Drupal-support/strong, most often filled with several hundreds of users, helping each other. It is in these chatrooms many of the toughest challenges with improving the project is ironed out./p h2A new project is born/h2 pIt is also here many new projects are born, small as larger ones. As Kristoffer and I began to talk, we quickly found a much more interesting approach. This one had much better potential and many more use cases as well as better flexibility and UX benefits too - So we a href= a sandbox project on It is now used so that we can experiment further in a better collaborative, open and efficient way./p pIf this module turns out the way we think it will, then we can take the next step and a href= for it to become a Full project/a. This is a form of quality assurance process that includes us behind the project too, but to get there we need to pass gateways. These are not put in place to stop us though, quite the opposite. Many members in the community voluntary spend their own time to help others to pass. The whole guided process is filled with tools, tips and personal advices about how to make the project work as good as possible, not just for one self but for others too./p pOnce a full project, access to new features to organize and administrate is granted. Includes proper name space and better ways to manage versions and releases. These are features rarely needed when just poking around and testing ideas in the sandbox./p pWhat I have also learned is what an amazing way to improve my own skills this is. Not just coding related, but also the way to collaborate and how great knowledge transfer can work too. All while at the same time get to know new interesting people and getting exposed to new cultures and ideas./p pFor me the Drupal community encapsulates all this, and more. Then, taking its size and success into count, it is a pretty remarkable achievement that shows how things can be done quite differently./p pAdd this to the mix:/p ul liDrupal is used on millions of sites/li liDrupal probably already generates a multi billion dollar ecosystem around it/li /ul pnbsp;/p pStill there is room for practically anyone, like myself, to feel welcomed and included./p pEven if it just starts out as a learning experience!/p h2What this module does/h2 pAt first glance it looks to do little more than adding an extra step, when creating new content, while hiding parts of the form from displaying. That's right, that is basically what it does and one of its main purposes./p pSome might now say - Hey, you just going to end up with tons of garbage content! - and they would be right too. Sure, this is going to make it quicker to create a lot of content - Yes, it can certainly be used for that!/p pBut it also makes some other quite interesting new things possible - This is why:/p ul liEntities in Drupal have unique ID-numbers, which can be used for all sorts of interesting things./li liA new entity doesn't get its own ID until after it has been saved the first time./li /ul pnbsp;/p pTherein we find my initial problem! There where no smooth way to get around the fact: Users filling in those forms emmust remember and manually save/em once before adding content to certain fields. Worse, it would be tricky to notice, when forgotten, as in most cases the data would evaluate, just with something much different than the entity ID needed./p pAs I played around, with several other modules to see if it was possible to circumvent this somehow, I always hit the same brick-wall. Problem was: Every new idea that showed promise resulted in a solution with tons of complexity, not just in one place but several. Gladly, that complexity was what Kristoffer and I could avoid with just a little bit collaborative brainstorming!/p pWhat this module now does is simple:/p ol liHijacks entity create (just for content types yet)/li liAllows to limit to content create form down to only display the Title field/li liCreates the new entity/li liImmediately reopens it in normal edit/li /ol pnbsp;/p pstrongContent type settings:/strong/p pstrongimg height=343 width=600 class=media-element file-media-original content-image-center content-image-shadow src= alt=Pre Content Create - Content Type settings title=Pre Content Create - Content Type settings //strong/p pnbsp;/p pstrongAdding a new node:/strong/p pstrongimg height=540 width=600 class=media-element file-full-width content-image-center content-image-shadow src= alt=Pre Content Create - Adding new content title=Pre Content Create - Adding new content //strong/p pnbsp;/p pThanks to this, I can now avoid displaying any fields that needs the entity ID, minimizing the risk of mistakes. At the same time it also means this new - pre create content - step can be used to only show the bare essential fields while opening up to new interesting possibilities. Any rarely used, and other optional, fields can be dealt with better as they come into play./p pThis new, less complex, solution will also be much easier to improve upon. It has actually already allowed me to visualize and identify a whole bunch of interesting uses and UX-benefits. It will improve for many roles, not the least site builders and content editors./p pSo, for me, this is no garbage creator. Instead I see how a small improvement can open up many new creative ways to work and collaborate on content. However that depends, after all it is still a href= a sandbox project on a kind of - emOpen Source playground/em - for nerds and geeks like myself./p pNot everything is as limited as what is usually read on the tin. For me, this is a few good examples of how things in Open Source can work out just nicely./p pstrongNote/strong: What *specifics* Kristoffer gets out of this I know little of. Those specifics are his to share and actually not that important for me - As long as I sense we both get something of value out of the collaboration./p/div/div/div

Drupal 8 Rules: #d8rules update July-August 2014

Fri, 08/08/2014 - 17:24
div class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item evenpSince our last update, May 2014, the #d8rules initiative was able to complete funding for a href= 1/a and has made major development progress with two unstable releases and loads of commits on our GitHub repository./ppThanks to 142 great supports, we were able to raisenbsp;$ 15knbsp;on Drupalfund. In addition to that, a href= stepped in with buying our second largest sponsor package a href= component providers/a which helps us cover 100 hours of Rules 8.x development. All in all, we are excited to say that a href= 1/a is now fully funded thanks to the a href= funding/a and a href= companies sponsoring/a #d8rules./ppIf you are interested in more background on the #d8rules Drupalfund campaign, make sure to a href='s blog post with all the details/a.nbsp;/ph2#d8rules Rulers amp; invoices info/h2pAs promised, everybody who has donated $65+ on the Drupalfund will get one of the fancy Rulers provided by Nico from! We just finished production amp; packaging and will send them out by the next week!/piframe class=vine-embed src= width=320 height=320 frameborder=0/iframescript async src=// charset=utf-8/scripth2Development update/h2pDevelopment has mainly focused on working with Drupal's context system. Rules actions and conditions need parameters (for example a node object), which is represented as plugin context as used in Drupal core. They also need to provide variables (for example an entity load action will provide the loaded node object), which is implemented as provided plugin context in Rules itself. Provided context might be interesting for other Drupal 8 modules as well, so this might be moved out of Rules either into Drupal core or a Ctools-like project in D8 contributed space./ppCurrently we try to figure out all parts of the Rules core engine, how context is passed around and how data selectorsnbsp;are applied (example: node:uid:entity:mail:value to access the email adress of a node author). We implemented prototypes of those system parts, but the API is still experimental and we expect to change and improve things here a lot./ppA number of action and condition plugins have been ported from Drupal 7 with the help of new Rules contributors, thank you to a href=, a href=, a href= /aand a href=!/ppWe are currently working towards milestone 1 of our a href= and we are doing monthly unstable releases to keep you up to date with development progress./ph2Drupalaton training amp; sprints: Porting Actions/h2pAfter a great a href= session at DrupalCamp Alpe-Adria Portoroz/a we finished a href= most of the conditions/a. This weekend, a href= Drupalaton we just delivered our second training session/a to get contributors up to speed with Rules in Drupal 8. Topics delivered include our git pull request workflow and the new and shiny things about Drupal 8 including the plug-in system, CMI and many more./ppimg alt=d8rules drupalaton training height=240 width=240 class=panopoly-image-quarter media-element file-teaser panopoly-image-quarter src= title= //ppimg alt=d8rules drupalaton training height=178 width=240 class=panopoly-image-quarter media-element file-teaser panopoly-image-quarter src= title= //pdiv style=clear: left;/divdiv style=clear: left;Follownbsp;a href=[META] Port all actions to 8.x/anbsp;to find out about the current status of actions being ported. Our a href= started google doc/anbsp;provides steps in addition to the documentation available on a href='s Rules GitHub repository/a.nbsp;/divh2Upcoming sprint: DrupalCon Amsterdam/h2ulliSee the a href= information/a amp; make sure to fill in at the #d8rules section in the a href=;usp=drive_web#gid=0sign-up sheet/a./lilia href= 8 Contrib Module Update/a/li/ulpThank you all for contributing./ppJosef / dasjo on behalf of the #a href= team/a/p/div/div/div Creating Custom Forms in Drupal 8

Fri, 08/08/2014 - 16:38
div class=field-body pDrupal 8 is not far off from being released, and you may have heard some chatter about the differences in how you create custom modules. The reality is that, while there are some differences, it's not really that hard to wrap your head around them. This article provides a gentle introduction to creating forms in Drupal 8, and highlights the differences and similarities to how you would do this in previous versions of the platform./p /div ul class=field-taxonomy-vocabulary-2 li a href=/category/blog-tags/drupal typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=Drupal/a /li li a href=/taxonomy/term/245 typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=Drupal 8/a /li li a href=/category/blog-tags/forms typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=forms/a /li li a href=/taxonomy/term/248 typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=Form API/a /li li a href=/taxonomy/term/249 typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=Controllers/a /li li a href=/taxonomy/term/250 typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=OOP/a /li /ul

Lullabot: Front-end Rapport #7

Fri, 08/08/2014 - 16:35
h2a id=toc-what-are-you-going-to-learn-this-month class=anchor/aa href= title=What are You Going to Learn This MonthWhat are You Going to Learn This Month?/a/h2 pTopics: Tools, Technique, Education/p

Drupal Association News: Introducing Terms of Service and Privacy Policy

Fri, 08/08/2014 - 16:32
div class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item evenpimg class=left width=150px src= /Almost half a year ago, with the help of the Content Working Group and lawyers, the Drupal Association started working on a Terms of Service (ToS) and Privacy Policy. After a number of drafts and rewrites, we are now ready to introduce both documents to users. Read a href= announcement on for more information./p /div/div/div

Aten Design Group: Declarative Programming and Drupal

Fri, 08/08/2014 - 16:17
img src= width=1000 height=600 alt= /pLately I've been very interested in declarative programming. Last week Smashing Magazine published a href= article on Declarative Programming and the Web/a, and last weekend I gave a talk at DrupalCamp Colorado on a href= Drupal/a in which I talked about how Drupal 8 is using declarative programming for configuration; how the a href= in Code (CINC)/a module is aiming to, among other things, backport that to Drupal 7; and how it's already possible to use custom configuration workflows outside the default Drupal interfaces./p pIf you're not already familiar with declarative programming and/or the Drupal 8 configuration API, I recommend reading my a href= programming article in Smashing/a (of course I do), as well as a href='s configuration API documentation/a before continuing. All caught up? Great, let's talk about some next steps for expanding declarative programming in Drupal./p h2Custom Configuration Tools/h2 pFirst, we need more tools for managing configuration, with interfaces designed around more specific workflows. We're using a wide variety of approaches to building Drupal sites, and with a standard configuration format, there's no reason we shouldn't have the same variety of configuration interfaces. Do you define your content types in spreadsheets? Me too. I made a href= interface for that/a. Do you test your menus as static HTML? Great, let's make an interface that converts HTML menus to Drupal menu config. Do 90% of your views show all content of a given type? Let's auto-generate those Views configs./p pWhile there's still a lot changing in Drupal 8, and some of that will likely impact configuration structures, those structures are stable enough and simple enough that we should be building our own tools around them today. And as CINC gets closer to D8 config API parity, we can use more and more of the same configuration in D7 as well. These tools can be written entirely outside Drupal, in a completely different language if you prefer, which then exports to a href= Or you can take advantage of the information available within Drupal, i.e. current site configuration and content, and build modules with new interfaces. The world is our new Drupal configuration playground. Let's get playing./p h2Declarative Forms/h2 pBut there's also no reason declarative programming in Drupal needs to stop at configuration. Drupal has a wide variety of non-configuration concepts that could benefit from declarative approaches. One area I've been thinking a lot about lately is forms. Drupal's form API is already mostly declarative, but it's built around PHP arrays, and we interact with form arrays with imperative code. We could probably learn a lot by comparing Drupal forms to existing standards for declarative forms, like a href= But simply taking a form array and formatting it as YAML would be a good start. (Or we could do it as JSON, as a href= Burstein has suggested/a)./p pI'm sure declarative forms in Drupal would end up being a large and complex project, but it would come with large benefits as well. Many form alters apply universally to a given form, so they might as well be editing the original form definition directly. That wouldn't make sense in community module code, but moving the form definition outside code would allow such form alters to happen directly in the configuration. The same way we can now do span class=geshifiltercode class=text geshifilter-text\Drupal::config('')-gt;set('name', 'Basic page')-gt;save()/code/span, we could do form alters with something like span class=geshifiltercode class=text geshifilter-text\Drupal::form('formid')-gt;set('mytextfield.#title', 'My Text Field')-gt;save()/code/span. Or with a YAML workflow, simply editing a YAML file would edit the form. That's already a huge benefit, as it would open up many form alters to a much wider group of implementers. Remember when we edited forms directly in HTML? A YAML form interface could give us that same ease of editing while still maintaining the power of Drupal's form API./p pAnd just like with declarative configuration, declarative forms would open up a wider world of use cases. Forms created in a href= or the field API could be easily reused in custom modules. And the same forms could be built or used entirely outside Drupal, opening the door for more form-building tools focused on specific workflows./p pHopefully this is enough to get more people excited about taking advantage of the parts of Drupal that already have declarative interfaces, and also pushing declarative programming even further in Drupal. I'm continuing to work on these ideas and will likely have more examples to share soon, but I'd really like to see more people playing here. If you're already working or interested in working on declarative programming in Drupal, let's talk./p

Lullabot: Keeping Up with Drupal News

Fri, 08/08/2014 - 09:38
div class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item evenpThis week the podcast gets a little bit meta by discussing how to find Drupal news. Addison Berry is joined by three different community news sources: Mike Anello of a href= podcast/a, Bob Kepford of a href=http://theweeklydrop.comThe Weekly Drop newsletter/a, and Chris Weber from Drupal and Coffee in the Morning hangout and the a href= Drupal community/a. We discuss why following the news is important, and how we manage to keep up with it./p/div/div/div ul class=field field-name-field-show-notes field-type-link-field field-label-hidden li a href= Video Tutorials/a /li li a href= Podcast/a /li li a href=http://theweeklydrop.comThe Weekly Drop Newsletter/a /li li a href= Drupal Community/a /li li a href= Planet/a /li li a href= RSS Feeds/a /li li a href= Weekly/a /li li a href= Weekly/a /li li a href= Frontend Podcast/a /li /ul

DrupalCon Amsterdam: Register before midnight and save 50€ on tickets to DrupalCon Amsterdam

Fri, 08/08/2014 - 08:16
div class=field field--name-body field--type-text-with-summary field--label-hiddendiv class=field__itemsdiv class=field__item evenpWill you be coming to DrupalCon Amsterdam?/p pDrupalCon is where all the big magic happens. From sprints that improve the project to training that brings in new talent, attending DrupalCon is the best way to get involved, get connected, and give back. /p pTake a break from your summer holiday and secure your place at DrupalCon before ticket prices rise on 8 August (that's tonight!) at 23:59 Amsterdam local time. Save the €50 you'd pay on a late ticket and make sure you a href= your tickets now/a to take advantage of the regular rate. You can even buy for your company, with our easy a href= tickets/a. /p h3On the fence about attending?/h3 pIf you're having trouble deciding whether to attend, we suggest you check out the a href=//”schedule of sessions, BoFs, parties, and more/a, see a href=//”who's going to be in Amsterdam/a, a href=//”what you can learn/a, and a href=//”how you can help the project/a while you're there. We've even got a href= Doctorow/a keynoting the event on Wednesday! What's not to love about that?/p pIf you're having trouble convincing your boss to send you, a href=//”check out these resources/a we've put together to help you get your manager's buy-in on the conference./p pThere will be a href=//”great sessions/a, a href=//”fantastic training opportunities/a, a quickly-filling a href=//”business summit/a, a a href=//”community summit/a, a href=//”tons of sprints/a, and lots of fun at DrupalCon Amsterdam./p pHave more questions? Check out the @a href=//”DrupalConEur/a Twitter handle for breaking news and new information, or a href=//”let us know if you need help/a./p pWe hope to see you in Amsterdam!/p /div/div/div

Barnettech: Introducing the new OG Group Content Module

Thu, 08/07/2014 - 23:05
!-- google_ad_section_start --!-- google_ad_section_end --div class=field field-name-taxonomy-vocabulary-4 field-type-taxonomy-term-reference field-label-abovediv class=field-labelWiki Terms:nbsp;/divdiv class=field-itemsdiv class=field-item evena href=/category/drupal-7Drupal 7/a/divdiv class=field-item odda href=/category/drupal-planetDrupal Planet/a/div/div/divdiv class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item evenpI've just released the OG Group Content module nbsp;a href= on nbsp;Here is the description of the module from

Mediacurrent: What organizations can expect in Drupal 8

Thu, 08/07/2014 - 22:47
img typeof=foaf:Image src= width=200 height=152 alt=What Organizations Can Expect with Drupal 8 title=What Organizations Can Expect with Drupal 8 / pJoin me and Acquia on Tuesday, August 12, 2014, to a href= Drupal 8/a from a business owner's perspective. In this session, you’ll get to see what Drupal 8 has in store for you, including better support for mobile, internationalization, web services, HTML5 and the enterprise marketplace. For attendees already using Drupal, we’ll dive into how to prepare your site now for Drupal 8 and what you can do to get help when the newest version comes out./p pWe will review:/p

Last Call Media: Design 4 Drupal, A First Timer's Perspective

Thu, 08/07/2014 - 22:39
span class=field field-node--title field-name-title field-type-string field-label-hidden data-quickedit-field-id=node/104/title/en/rssDesign 4 Drupal, A First Timer#039;s Perspective/span div class=field field-node--field-blog-image field-name-field-blog-image field-type-image field-label-hidden data-quickedit-field-id=node/104/field_blog_image/en/rss div class=field-items div class=field-item img class=image-style-blog src= width=758 height=527 alt= / /div /div /div div class=field field-node--body field-name-body field-type-text-with-summary field-label-hidden data-quickedit-field-id=node/104/body/en/rss div class=field-items div class=field-itempspanI just joined Last Call Media a couple of weeks ago, and was invited to join my new peers for a trip to Boston for Design 4 Drupal.  I was super excited for a couple of reasons.  A) I love a road trip, and B) this was my first opportunity to meet my new and extended Drupal family./span/p pspanSo, given that I am not a morning person, I set two alarms.  I did not want to be late to the meet-up spot and have my new coworkers leave without me, or think that I am a total slacker.  I showed up at 5:57am and was the only car there.  I started to feel foolish, like I had been the subject of a hilarious practical joke designed to break in the new team members.  I imagined my coworkers plotting against me “Just string a couple letters and numbers together, make an early meeting time on one of her first weekends.  You can imagine my relief, as the earliest of my coworkers started to trickle in, oh, and it turns out they are not the bullies I had imagined.  I now know that 6am means 6ish  (I think this is called Last Call standard time or LCST, for any event that begins before 8am).  From here we started our convoy, with 11 Last Callers en route.  Monster Energy Drink and Old School Rap tunes first thing in the morning had me amped for my first day long All-Geek event!/span/p pspanWe arrived at MIT (what an amazing campus, btw) with plenty of time to set up a booth and attend the Keynote:  Steve from a href=http://www.republicofquality.comRepublic of Quality/a gave a heartfelt talk about being emotionally connected to your work and how to demonstrate this with your content./span/p pspanimg alt= data-editor-file-uuid=4662ef12-f129-458b-9105-5d78821c0d84 src=/sites/default/files/inline-images/blog_08-14_d4d-jill_02.jpg //span/p pspanWe had one of the first sessions of the morning, a href= Study:,  where we were able show how heartfelt and connected we all are to our work./span/p pspanIt became clear to me that I have joined a very engaging team, as I sat in on my new coworkers presenting their work; I learned that we have the first commercial site in the US running on Drupal 8. It was a great opportunity to treat ourselves to a very special site redesign and tackle Drupal 8, which was still alpha, and get our hands dirty with constant upgrades.   The team was so pumped to share their experience with the Drupal community!/span/p pspanimg alt= data-editor-file-uuid=ae447fea-354d-4abe-9d39-574db8fcd22f src=/sites/default/files/inline-images/blog_08-14_d4d-jill_03.jpg //span/p pspanThere was a great deal of excitement from the attendees who were impressed that we invested the time and resources to work with Drupal 8. It made me very proud of where I work!  After the session, attendees flocked to our booth to find out more about our site and to ask more specific questions.  There is certainly is a lot of buzz about Drupal 8 and pspanI met a lot of great people in the Drupal community, and went to a few sessions myself./span/p pspanErin Holloway gave a lot of nice pointers for streamlining communication in the a href= session and visuals to increase efficiency in the design/development process, from emails to Photoshop shortcuts.   This session was well attended by Last Call; I looked around the room and saw, Sean, Colin and Julia./span/p pspanJeff reported that he really enjoyed a href= Accessible Experience: Designing for Everyone/a /spanspansession, where he was introduced to different accessibility tools and was able to see them demonstrated./span/p pspanJayme reported that the presentation a href= on a Budget WTF/a offered a good reminder about the countless small non-profits who both require and deserve a quality responsive website, but who do not have much of a budget. Large scale, and hence, expensive projects have more and more become the central focus of the industry. In our enthusiasm to see how far we can push the envelope of what we can do with Drupal for clients who have the budget to allow us to take it to this level, smaller companies--and in particular smaller non-profits--often get left behind. Johanna Bates and her collaborative made the important point that Drupal is still an excellent tool for making responsive websites that, while are perhaps not as ambitious to produce, offer a way to contribute to making the world a better place.”/span/p pspanOur very own Rob hosted a href= well-attended session/a at the end of the day, although technically way over my head, it must have had some good meat that developer types could chew into because I received several requests for the slides and code samples.  You can find his presentation a href= pspanMost of us finished out the night at the a href= Assembly/a in Boston for a super time at thea href= WeWork/a coworking space.  What a cool spot.  We challenged other developers to table tennis, learned a little mixology as we played “bartender” by hand squeezing our own lemons and crafting our Tom Collins drinks./span/p/div /div /div

Drupal core announcements: Priority TCDrupalaton sprint tasks!

Thu, 08/07/2014 - 20:07
pToday is the start of a double dose of sprint awesome at a href= and a href= Here are some important sprint tasks to help get Drupal 8 done. /p ol li h3Beta blockers/h3 pOur top goal for the sprints is to make significant progress on the a href=;status%5B%5D=1amp;status%5B%5D=13amp;status%5B%5D=8amp;status%5B%5D=14amp;status%5B%5D=4amp;version%5B%5D=8.xamp;issue_tags_op=%3Damp;issue_tags=beta+blockerthree remaining beta blocker/a issues. These issues aren't the best place to jump in if you're not already following them, but plach, alexpott, effulgentsia, fago, and others are going to do what they can to get these issues done./p /li li h3Beta deadline issues/h3 pThe next priority for the sprints are the a href=;status%5B%5D=1amp;status%5B%5D=13amp;status%5B%5D=8amp;status%5B%5D=14amp;status%5B%5D=4amp;version%5B%5D=8.xamp;issue_tags_op=%3Damp;issue_tags=beta+deadlinebeta deadline issues/a, which are non-critical issues that will have to be postponed to either Drupal 8.1.x or Drupal 9 if they are not done by the time the beta is ready. Many of these issues are related to the Entity Field API, so if you're interested in those systems, reach out to entity and field maintainers fago and swentel at Drupalaton to see if there's a beta deadline issue for you./p /li li h3Twig autoescape followups and double-escaping bugs/h3 pOne of the beta-blocking issues that's already been resolved is a href= Twig's autoescape functionality/a, so that strings that have not already been sanitized by Drupal can be escaped automatically in the theme layer. There are a lot of important followups to this change, which can be grouped into two categories:/p ul li h4Double-escaping issues (a href= pSince Drupal already does its own sanitization at many different points, there are a number of places where we are unintentionally escaping markup twice, resulting in double-escaping bugs like:br / codeamp;lt;emamp;gt;My double-escaped stringamp;lt;/emamp;gt;/code/p pWhen code uses the appropriate sanitization functions or the theme and render systems so that the output can can be themed, escaped, and altered properly, double-escaping is not an issue. So, we need to fix these regressions, ideally by removing the markup from the code entirely and converting to a Twig template, or failing that, by using the a href= templating render element/a. In some cases these issues might be simple to fix; in others they will require some refactoring./p /li li h4Improper uses of SafeMarkup::set() (a href= pIn order to inform the theme layer about what markup Drupal has already sanitized, strings that have been processed by a href=, a href= or a href= are automatically marked safe, as are markup strings created from render arrays via a href= This list of sanitized strings is stored by the a href= class, which is intended for stronginternal use only/strong. However, the initial conversion patch added codeSafeMarkup::set()/code calls in many places as an interim fix. We now need to remove as many of these improper uses of SafeMarkup as possible, by converting or refactoring the code in the same way that we would to fix double-escaping bugs./p /li /ul pWe will be sprinting on these issues at TCDrupal. Talk to YesCT or mdrummond for help getting started./p /li li h3Critical issue triage/h3 pOnce Drupal 8 is in beta, the next step will be to resolve the other a href=;version=8.xcritical issues that block a Drupal 8 release candidate/a. As a first step, we need to assess all of the critical issues to determine which are most important, which are no longer relevant, etc., as well as what the path to get each done is. In each critical, we should clearly identify:/p ol liWhy is it critical?/li liWhat would be the implications of not fixing the issue?/li liWhat would be the implications of fixing the issue between betas? (Code changed for modules, upgrade path, etc.)/li liWhat would be the implications of fixing the issue after the first release candidate?/li liWhat is the next step to make progress? What are the remaining tasks?/li /ol pTalk to xjm to help with this essential task./p /li /ol pIf you're sprinting at TCDrupal, remember to put the a href= 2014/a issue tag on issues you work on at the sprint. Similarly, use the a href=;project_issue_followers=amp;issue_tags_op=%3Damp;issue_tags=Drupalaton+2014Drupalaton 2014/a tag at Drupalaton. And whether you're sprinting in Minnesota, in Hungary, or remotely, join the #drupal-contribute IRC channel to coordinate with other sprinters./p

Get Pantheon Blog: Headless Websites - Headless Drupal Options

Thu, 08/07/2014 - 19:44
div class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item evenpThis past week at a href= Costa Rica/a, I had a nice conversation with Todd Ross Neinkerk of a href=https://fourkitchens.comFour Kitchens/a, who was there presenting on the notion of de-coupling content management and content display (a href=;feature=youtu.behere's video of a similar talk he did in Austin/a). I also spoke with Jesus Olivias who recently did a great a href= podcast/a with a href= Aguierre/a on the topic, and he was kind enough to give me his two cents./p pemHeadless Drupal is officially now a thing/em. It's all happening. If you're curious why this is exciting people, see my previous blog post on the topic: a href='s the big deal with headless websites/a? In this blog post I will dig into the technologies at your disposal for exploring Headless Drupal today./p !--break--p img src= alt=Heady Topic width=540 height=405 /br / h4Headless Drupal Now!/h4 pFor those looking to develop Headless Drupal websites right now, you can totally do it with version 7. Even though there's excitement about the upcoming Drupal 8 release — and I'll detail the action below — you don't need to wait to get started with these techniques. Drupal 7 still has a long life ahead of it, and with the right contrib modules it is usable for anyone looking to build headless websites today./p pThe most well-known interface for Drupal 7 and an alternate front-end is the a href= module/a, which has a very Drupal-ish manner (e.g. codehook_services_alter()/code) of exposing various interfaces. It comes with built-in REST and XML-RPC interfaces, and allows you to expose, nodes, users, taxonomies and other core data fairly easily behind custom endpoints (API paths). You can also use it as a basis for specifying your own custom services./p pThere's also the a href= module, which exposes any Drupal entity on its existing URL based on headers. This module is the basis for Drupal 8's REST module, which we'll discuss more later./p pFinally there's a really interesting package from the developers at a href=http://www.gizra.comGizra/a, a href= Restful module/a, which is also entity-centric, but takes a different philosophical approach. Rather than exposing Drupal's internals, it allows developers to define what data they specifically want sent in response to a request. It also allows the exposure of some entity types and not others (e.g. the Article nodes, but not Pages). This module is definitely more developer-centric, but they have some nice a href= posts/a about how they use it a href= AngularJS/a that will help you get up to speed./p h4The Future of Headless Drupal in Version 8/h4 pThe future of Headless Drupal opens up significantly with version 8. Core includes both a REST interface module and a brand new routing system built on the Symphony2 HTTP kernel. This provides a lot of opportunity for headless implementations both for beginning and more advanced developers./p pa href= REST module/a is a souped-up version of what you got from RestWS in Drupal 7. Your core entities are all eligible for exposure, using the JSON+HAL format by default. This gives consumers of entity data the ability to follow links to other data sources — for instance you can pull the definition of a content type from any node. /p pMaking Drupal's native entity data model accessible to other apps via REST takes only a few clicks. Views — also in core for Drupal 8 — a href= supports REST export/a as a type of display. You can configure your way to a robust REST API into your content without installing a single extra module./p pFor those looking for more specific or nuanced functionality, the core HTTP routing framework is one of the most exciting pieces. It's a general upgrade for how all Drupal modules handle requests, replacing the legendary codehook_menu()/code with a fully-featured HTTP server. You can set up custom routes, define controllers for callbacks, and manage responses based on headers, status codes, and all the other things one cares about once you make the mental leap from serving pages to talking HTTP in your application./p pFor developers with experience building server-side applications in Python, Ruby on Rails, or Node, this is a welcome change. It opens the door to much more sophisticated implementations with Drupal — powering the backend for complex mobile applications, serving as a lightweight integration point for different kinds of data, even acting as a pure API to external application developers./p h4Much More To Come/h4 pThere's still more to come. A big part of the equation is what's on the other side: now that we know how to build a headless backend in Drupal, what's the client? There are many exciting answers, which I'll address in another post, ideally with code samples for AngularJS, Backbone, and others. /p pThere's also exciting movement in the headless direction in WordPress, where the a href= project/a aims to have a native REST/JSON server bundled into the 4.1 or 4.2 releases later this/next year. I'll be doing a dive into the potential for those implementations soon as well./p pAre you building headless applications? Do you have tips tricks or techniques to share? Let me know and let's spread the word!/p /div/div/divdiv class=field field-name-field-blog-categories field-type-taxonomy-term-reference field-label-abovediv class=field-labelBlog Categories:nbsp;/divdiv class=field-itemsdiv class=field-item evena href=/blog/engineeringEngineering/a/div/div/divdiv class=field field-name-field-blog-related-posts field-type-entityreference field-label-abovediv class=field-labelRelated posts:nbsp;/divdiv class=field-itemsdiv class=field-item evenHeadless Websites: What#039;s the big deal?/divdiv class=field-item oddWP REST API - A Superficial Review/div/div/divdiv class=easy_social_box clearfix horizontal easy_social_lang_und div class=easy_social-widget easy_social-widget-twitter firsta href= class=twitter-share-button data-url= data-count=horizontal data-lang = en data-via= data-related=:Check it out! data-text=Headless Websites - Headless Drupal OptionsTweet/a/div div class=easy_social-widget easy_social-widget-facebookiframe src=//;href=https%3A//;send=falseamp;layout=button_countamp;width=88amp;show_faces=trueamp;action=likeamp;colorscheme=lightamp;font=amp;height=21amp;appId= scrolling=no frameborder=0 style=border:none; overflow:hidden; width:88px; height:21px; allowTransparency=true/iframe/div div class=easy_social-widget easy_social-widget-googleplusdiv class=g-plusone data-size=medium data-annotation=bubble data-href= div class=easy_social-widget easy_social-widget-linkedin lastscript type=in/share data-url= data-counter=right/script/div /div !-- /.easy_social_box --