DrupalCon Vienna 2017: Twig recipes - Making Drupal 8 render the markup you want

Video Statistics and Information

Video
Captions Word Cloud
Reddit Comments
Captions
okay welcome everyone again thank you for being here this is tweak recipes making Drupal 8 render the mark-up that you want my name is Mauricio in RT I am known as dinner Conan drupal.org Twitter and pretty much everywhere on the Internet I am from Nicaragua I also one of the organizers of the local Drupal community I work for a company called agari we are distributed team pretty much like in Europe and America and I am really passionate about teaching and very soon I will start this personal project about teaching Drupal in different languages so I got some stickers on the table if you want to grab some and before going any further I would like to know a little bit about you so if you can raise your hand when I ask these questions have you ever downloaded and configured Drupal contributed team no matter what version so most people how about creating a custom theme no matter the version well how about creating a soup thing a lot of people have you work with tweak either in Drupal or Symphony or another play excellent and have you created a Drupal 8 theme Wow okay well maybe you will teach me some lessons too so the session is from the basics building up knowledge so at the beginning there will be a lot of basic concepts because most of you already know this I will try to you know not spend a lot of time with that and I want you to remember this the objective of the session is not just have you to give you a piece of code that you can copy and paste and just magically work my my objective is that you understand how the different pieces interact together so that you can you know create your own solutions and we are below author of CSS secrets put it put it in a very good way understanding the process of finding a solution is far more valuable than the solution itself and we are looking for that for understanding the process to find a solution so we're going to start talking about week three as you might know is a PHP project a templating engine it comes from the symphony ecosystem and we adopted it for Drupal 8 when working with tweet and in particular with Drupal 8 themes we are going to interact with a lot of templates a template is basically HTML markup with some placeholders that will be dynamically modified and in the template you can embed CSS JavaScript and images as needed so this is an example of a tweet template and as you can see it's basically an HTML skeleton with the placeholders and you can use tweak outside of Drupal again this is not a specific to Drupal and some basics we're going to cover tweek syntax and see some examples of how tweek is used in Drupal core to explain the different concepts so for the very basics if you want to print anything he used to print something syntax which is two curly brackets if you want to do something like evaluate the condition or go over a loop you use that do something syntax which is curly bracket % and if you want to add a comment your tweet template you use curly bracket and a hash tag so I would be saying imprint something and do something a lot while explaining that template so I just want to set that stage about that that vocabulary that that I will be using now in Drupal 8 most of the time we're going to use one syntax to print variables and it is the dot notation which we see here in line number one twit provides other mechanisms like line two and three in which we can use a square bracket notation or the attribute function but we're going to see just in a moment why 99% of the time we will want to use that dot notation but before doing that I want to tell you when you cannot use it so if the variable that you want to print start with a hash sign you cannot use the dot notation so for example in line number 6 we have a variable conform inside that one I know everybody will call an operator and inside that one hash sign and type because you know that that name will start with a hash sign you cannot use the dot notation another scenario where you cannot use the dot notation is when the variable name has some - as part of the name because tweak will think that this is a dramatic operation and it will actually try to perform a subtraction so in that case you cannot use the dot notation these two other options are rarely used in fact the square bracket notation appears about five times in Drupal core at all and attribute function it doesn't appear at all but because using that attributes is very common nowadays if you have to do it this is how you how you how you go about it now why is the dot notation so useful because it is going to give to do a lot of evaluations for you in the past the female had to know the underlying that structure is this an array it is an object and so on with tweak now in Drupal 8 that is abstracted making the life easier for the female and dot notation is going to perform all of these checks for you and return whatever you know returns a value everything up set line number 15 is tweaked by itself in Drupal 8 we had a little bit of more night if you will to tweak and in the case of the dot notation we had a final check before returning nothing and that is if this is a render array if the variable I am trying preen is originally called automatically the render function and return whatever you know come from that another difference between dropout seven and eight when theming is that in the past with the recommended way to add classes to the template was using pre process functions in Drupal 8 it is recommended now to do it in directly in the template because for one the theme will know which classes are available right away and also because there are the tools and mechanisms to do it for example here we're using that said keyword to define a variable and that variable is going to be an array of classes that then we're going will going to be added to to add HTML tag one thing to notice that when you're working with tweak you have all the functionality available for you so in this case I am building an array dynamically so sometimes depending on the conditions the element that the number of elements will be different so in line number four for example we are concatenating strings we are doing see like sanity checks when before printing the variable names we are evaluating if the node in this case is promoter or a sticky and if if that is the case add some classes and we can do a lot of stuff you know anything that Rick provides in the template and when we have the array of classes we just call the attribute object it has a add class method we pass the array and then we will get you know the classes as we want them Twitter also has the concept of filters so filters are used to modify something before it is being printed the way that you work with the filter is you pass either a variable or a string or some other color like a number and then the pipe symbol and then the name of the field so for example in line number two we are transforming a text to uppercase filters can also be applied using a different syntax like in line number five and seven so if you want to apply the same filter to multiple lines instead of doing it like one by one you can just use the do something syntax use the filter keyword and then the name of the filter and then you can have as many lines as needed and the filter is going to be applied also filters can be concatenated or chain that means there is on the resolve one filter is going to be sent to the next one so in this case we have a variable with the name of name we strip the tags and the result of that we make it uppercase and filters can also receive arguments and this is not a security you know focus session but just for you to know tweak core provides filter called join in Drupal we provide one call safe join so there are some security implications related to them and there is actually an issue to bring the changes that we're suggesting upstream but anytime that you have to do joining in a trick template in Drupal 8 use safe journey so and in the case of safe join it receives a parameter that is going to be you know what is going to be the separator between the different elements and talking about parameters they can be optional and if you don't provide them you will get some defaults provided by trick so for example the number format you can define the decimal places how many decimal places you want the decimal point separate trader the thousand separator and so on but if you don't provide we will use some defaults for you we also have functions in this case functions are used in many different ways in line number two we are using a function to print a value directly in the template in line number five through seven we're using the range function to generate an array and then we are using the for loop syntax to do something with that array and in line number ten this is probably the more interesting example in contrast to filters where the output is right away like in the template where you put the filter it is going to be printed right away in this case with a touch library function we are actually adding CSS to the header and JavaScript to the footer so when you use a function the resolve of what is going to be output is not necessarily right away in the template in here we are modifying the whole Drupal page and there are some filters and functions specific to Drupal and you can find them on those links we also have tests so tests are usually used when you want to evaluate a condition in this case these are example mostly from Drupal core if the variable Q which in Drupal represents the query string parameters is empty or it's not empty if a label is the value of a label is in one of this array if a variable is not empty if a number is odd and or even there are many options technically speaking the only test in this slide is the word of the word is not in or those are called operators but they are usually used in the context of tests so I just grouped them two together here and this is a summary of like all the three things that we just saw so a filter requires an expression preceding you know some text some variable they can receive arguments and the result of applying the filter is always a scalar that is going to be printed right away with functions they do not require an expression preceding them they can receive arguments and the return value is mix it can be something to print right away like a number or a string or in the case of the attached library it is something that modifies the whole page I need a case of test they require an expression preceding them they can receive arguments and the return value is always going to be a boolean either yes or no now another example from core about control structures so when you say my node in Drupal you'll get a message this node has been saved successfully so those messages this is the way that core prints them there is a variable called messages which is an array and we applied the length filter if is if the value is more than one we print them as a list otherwise we print them you know just like the text itself this is the length filter is another example of how we're making things easier for themers because in the past if the variable was an an an array you have to use a PHP function to count how many elements are in the array if the variable was a string you have to use a different PHP function to how to can how many characters are in the string we tweak you know the limit doesn't need to know about the underlying data structure you apply the filter and it will give you sensible defaults so in this case we have an if condition and inside a for loop this is another example for printing the breadcrumb so this is like when you go to a page you have like home and then the section and then the title of the page so that is called a breadcrumb this is how triple princedom you get read from us an array and you use a for loop to iterate over each element and then for each element in is also like and structure does that element has a URL if so preen and a tag and a which is all intact otherwise just print the text now let's talk about Drupal templates Drupal templates are like onions and if you saw the movie you will guess why because they come in layers so we want when we want to print something on a Drupal website we will be interacting with a lot of templates at the same time let's give an example we have a blog section in our website and we have on the sidebar a blog that shows more articles written by the same author so to bring that Drupal will have at least to interact with five different layers of template one is the theme region because every blog needs to be placed in a themed region then you have the blog itself then let's because this is a listing let's assume that we build the blog using views W is showing different nodes nodes created by the same author and then for each node we might print the title we might print attacks and image and so on so we are printing individual fields so it is very important to understand that Drupal will be working in layers to print whatever you want and you need to know exactly in which layer you're dealing with to modify Drupal as as you need and you know I just gave one example but in just to build one Drupal page you can actually interact with 100 or 200 or even more templates so it might be overwhelming and we are going to see some techniques to identify which one of all of those templates are the ones that you need to modify and how to do it so again in trouble we work with templates and in different layers so one template will cause the other the outermost template in Drupal it's called HTML dot HTML that TWIC so every template is going to end with HTML to it and in this case this is the HTML template five lines from the bottom to the top we see that we're printing something it says print page when we when that line is evaluated we are actually calling the next template in the hierarchy which is the page template in the page template we're going to see that will we will be printing page dot something like in this case page the primary menu H dot secondary menu page the red term and so on so those page dot something are the theme regions available for you so if you ever want to know what regions are available in your template in your theme you can see the page template and look for page dot and those are the regions each of these is going to call a region template which is actually really simple it you just check is there any content to print within this region if there is one you call the blog template let's assume that we are printing a note so the blog template will call the node template and you can continue going on and on you know to the field level or you can skip some of these layers for example if you're printing a user or if you are printing a view and so on the thing is that you will be interacted with a lot of different things now why so many templates rupaul well you know Drupal is very flexible but with flexibility you know we also get some complexity Drupal core comes with about six or seven things one of which is called stable so a stable alone has 159 templates so you know it's it might get complicated to find wishes the right to to modify and I in started giving this presentation a little bit over a year ago and that actually that number has actually been increasing over time so I know when if it's going to be 200 or more at some point but it has never gone gone down so when you have so many templates what do you do so to override Drupal markups this is we're going to see an of how to do it so let's say that we are installing Bartok you know a French Drupal installation with Bartok when we create an article we get attack line that says submitted by the author on and then the date let's say that we want to change the format of of how the data is presented this is the recipe this is how you were going to do it you will enable theme debug you are going to locate a proper template to modify you are going to copy over the template to your theme if you need it you are going to use file name suggestions then you make your changes you clear the cache and you rinse and repeat so you do this process over and over till you get the results that you want and it is very important at the end to disable theme debug or you might get some weird stuff happen so first step enabling theme debug in those links you can find the commentation and how to do it but basically it's fighting the services that yml file in your installation and modifying some parameters there once you do that Drupal will be you know working as usual but if you inspect the source code of a page now you will get HTML comments with very useful information so you get three different piece of information when you enable tin debug going from top to bottom from bottom to top where it says begin output you see exactly which template it's being used so that is the first step you need to locate what is the template being used so you know you already know it is in the back Bartik theme in the templates folder and it is the node template another thing that you get remember that there are different layers view space users and so on well it says thin who note that means we're dealing with a note here if it said in who user we're dealing with the user field we're dealing with a field and so on so that's how you know what you're dealing with this is at this level and then we get the file name suggestions so for example in the case of a node in Drupal you might want to modify how all the notes in the system are presented but maybe instead of doing that you only want to modify the articles so if you want to modify only one content type how one content type is presented you can use node - - and then the machine name of the content type in this case article and then the modifications to that template will apply only to articles and basic pages and any other content type will remain unchanged you can also apply filename suggestion for view modes so maybe you might you might have heard about teasers or full content those are view modes so you can also apply filename suggestion based on that and you can combine both content type and and be human in that link in the first one you can get a list of different templates suggestion that you can use unfortunately there is a book in Drupal core that not all the template suggestions are available I checked today and it is actually in our TBC which means that it should be available very soon but while that happens for example if you are dealing with views one single view actually provides several templates and in that link below you can see all the templates that abuse provides okay back to the example we want to modify the tagline so we already know which template - to modify and if we inspect the template in 9 number 42 we actually see where this string is being printed and if we go a little bit up in the same file in lines 26 and 27 we see that we have these two variables date and author name and in the case of the date it says theme creation date field and it might not be apparent but we actually have a problem here in Drupal 8 it is not recommended to pass HTML directly to the template it is better to pass render arrays so in Drupal 7 we after the pre-process layer we had a process layer that converted the render arrays to HTML strings and that was passed to the template in Drupal 8 we have changed that now we expect to receive render arrays because if we receive render is it will be easier to modify them in the template if we receive an HTML string we will have to apply regular expressions to make any change and it is going to be really hard to do so because it is it says team that means HTML markup and if we want to change it we will have to use regular expressions so we will find a different way to do this and just for you to know this is actually pretty rare Drupal core for the most part gives you render arrays but these two variables they are HTML strings and in a moment I will explain why so because we cannot use those variables let's see if the templates give me another one that I could use and indeed in line number 10 I see that I have no get period time and this returns the node creation timestamp like a UNIX timestamp so I can use that in addition with a date filter and then passing some parameters to modify to make the change that I need so now that I know the file and under variables that I have available I copy over the file to my team and I revealed the cache for for Drupal to pick the new template and I make the change so in this case in line number 94 I said a variable you know not create a time filter day with some parameters and then I used that variable to print that the string now for the most part you don't need to assign variables and then print them usually you can print the variables directly but we cannot do that and we cannot do that for the same reason that Drupal cannot pass render arrays in these cases when you here in line number 95 we are inside trans and entrance tax those are used for translations and translation tax in Drupal 8 only work with the scalar values that means either strings numbers integers or number of floats if you if you try to pass node credit time it's a pipe date the filter will not be applied filters and functions do not apply within that trans and entrance so that is why true pal doesn't do it and that is why we are required to have an extra variable but for the most part you just directly print whatever you need and now we get the resource that we want now if you were paying very close attention in the node template the comment says that we will use node dot get created time with parentheses but in my in my example I use note that clearly time and this is probably an you know average over use of twig syntax but died I just want to show that which is very flexible and you will actually try to do a lot of things all those three lines at the bottom they are equivalent group a twig will try to look for a get method and call the method so all of those are available for you and they they are equivalent now a word of warning this was for demonstration purposes only there are many reasons not to do what I just did one I took the template from from Bartok and you are never supposed to sue something from Bartok in Drupal 8 you either choose stable or classy as your base theme from the ones that core provides at the end of the slide ik there is a presentation a link to a presentation where you can learn more about this another reason why you might not use this technique is because when using that date filter the server will return the language of the server itself so in if the server is in English you will get the strings in English but if you are working on a multilingual site then you don't get the proper translations so for those cases there are modules one of them is called bamboo tweak we have I have a list of resources at the end that actually allows you to pass the UNIX timestamp but then apply the internet internet internet internationalization process that Drupal does ok now we're going to go to the recipes themselves but before one last recommendation when working in your no template we have two very important variables one is called content and the other one is called node and they serve a very different purpose so the content variable has render arrays as I said before in Drupal 8 the recommendation is to pass render arrays to the template for all the fields defined in the manage display section so the manage display section is how you configure the view modes for your nodes and the content variable is going to to have the renderer arrays as you configure the View mode and he also had the node variable which is the node object itself as you remember in the example we used that variable to get that creation timestamp that is not a field that is part of the node itself but in addition to those metadata you have the field values and any reference entity as a store in the database for example for a boolean field you will have either a 1 or a 0 so there will be some cases where using the node variable is actually very useful and in that link you can find a blog post by very high profile Drupal contributor that explains a little bit more about this and in particular how to work with a node variable with reference entities let's say that you have one node that caused a user and you want to check one you of one field value of that user so you can do you can change this stuff using the node variable so the first recipe how can I pass information from Drupal to tweak or basically from the back end to the front end so in everything you will have a file called you know the name of or your theme call thing so you will have to modify that file then you need to implement a pre process hook and in this case we see lower case hook an upper case hook so the lower case hook is going to be replaced by by your thing name and the upper case hook is going to be replaced for whatever layer you are interacted with remember when we enabled in debug it says thing who note so the that is what you're going to replace the operative and then you receive an array of variables that is a key value array the keys are going to become the variables available inside the treat template you make all the changes you can add you can remove you can you know modify and then you simply print the variables in the template so this is an example let's say that I have a node and I have an image field in that node but I want to print in a different region that image I want to put it somewhere else so how do I do that to modify the whole page I use the the page pre-process so in this case Nicaragua is the name of my theme underscore pre process and then underscores what simple I am dealing with in this case page when you are visiting a Drupal node you will get a variable called node so you check if that variable exists and then I am doing an extra check for the bundle the bundle in Drupal is the content type so if this is if this is a node of content I page which is basic page then I want to do something and that something is I am going to create new erectus those two erectus will become variables in the trick template and what is going to be a story in toast in those are a keys I look for variable node so give me the node then get field image and fill teasers those are two fields inside the node and then it's I call beautiful fool there represents the full bloom mode so if you want to print a variable using the configuration in the full view mode you can use that you can also change that for teaser or for any other view mode and then you are going to be populating these variables with render arrays as configuring the full teaser whatever be you know you are using and once you have those variables available in your template you simply print them now let's analyze for a moment line number 3 and line number 5 it's the same variable but in line number 3 I am calling the render filter why do I have to do that remember that that when we use the dot notation Drupal will call rendered automatically for you in this case we don't have a dot but the same logic applies when you print a variable Drupal will try to verify if it is a render array and if so it will you know it will call the render function in line number 3 we are forced to do it because this automatic rendering only happens when you print something if you are doing something it doesn't happen so we have to do it manually and the reason that we do it here is because we don't want to print this markup if there is no value for that variable so the value the the content the HTML is going to be printed if we actually have a cover title and again render only is called with print something syntax you not do something thing syntax you have to explicitly call render yourself another example how do I conditionally render field values based on the content of our field values let's say that I have a boolean field in my note and depending on their you know if it is yes or no I bring something else some other feels inside the same note so in this case I am using the node variable because again this will give you the raw database storage so no field light box in this case field light box is the boolean field and then I get the value and here it will return either 0 or 1 and the if condition is going to be evaluated and if you devaluates to true I print the video in this case recipe number 3 how can I render an image field as a background image so this recipe applies from Drupal 8.3 onwards in the past we needed to use an extra module but because we are about to release Drupal a 24 I don't see the need to explain the old method and in the new method is when you go to the manage display configuration node for the boom oh you now have a new formatter that says URL to image for the image field and then you simply render the variable itself so this is like how you do it this is the manage display section you hide the label you use the URL to image format and optionally you can define which image style you want to use and with this Drupal will give you the link directly to the image file and then you just print the image in this case I am using a style tag with background image and then I print the image content that feel horizontal image in line number two you you can check that I am using this faceless operator and why is that you know that you know the community is very friendly Drupal is you know Barry it gives you a lot of a stuff and sometimes it gives you a stuff that you don't need so when you print a variable in Drupal it will actually give you white spaces before and after and if you have white spaces in a URL attribute for CSS that is actually invalid so it will not work so what you have to do you have to remove the white space and to do it use that space less operator so anything that you put between a spaceless all that white space between tack is going to be removed and with that we cut we get valid CSS and we get our image field as a background image inside that weak template something similar if you want for example to have a SVG file upload and then use that as a path as an image source file so in this case I configure the file field to hide the label and show that URL to file and the same stuff like in I have an image tag I have the source attribute use the spaceless operator to remove the white space the derpa will give me and print the content as configured in dependably mode this is another example let's say that you have an entity reference field and you want to use the destination of that entity reference field as HH h ref attribute in a link tag let's say that in this content type you have an image but you want to use the link of the entity reference field as the etch rate for the image so how do you do that in this case feature content is the entity reference field you have hide the label you make the entity reference field to point to the to the entity and then you need to use a file named suggestion to print that field specifically in this case I am printing a field inside a node the field is called featured image content and in particular when using the feature view mode and then you know just print the URL I don't want to bring anything more than the URL and once you do that it's the same recipe over and over you just like you have eh tag an ETF attribute print the content of the of the URL and then use a spaceless to remove the white spaces and with that you have your a tag and in saying your a tag you can put an image or whatever or field that you might be and last example this is actually I'm not going to go in deep there are some things that we still need to do for me the theme layer more usable for steamers so someone was someone asked in his luck once that they wanted to print a link to and no and how did they do it so maybe this doesn't make any sense and I understand it's really complicated you have to use a URL function that expects to receive Symphony route inside Drupal I mean why do I femur needs to know about routes in Drupal and then those routes expect certain parameters so if you ever have to do it this is how you do it and actually Drupal console is your friend with Drupal console you can look for all the routes and when you know the route is in particular you can issue an order command to see what parameters this route expects so again this is something that we can improve in Drupal but as of today that's how you how you how you do it now what we have covered so far it's Drupal core and tweak core but as you can imagine there you know we like to make things easier for for the front-end developers and we have a huge ecosystem of contributed modules to extend tweak so as I said before bamboo tweak and there are many some of these are very popular orders are not that popular but if you ever need one of their functionality they are available and I am certain that there are more modules that I have on the slide I just I'm not aware of them so if you want to learn more about tweak in general I recommend this session by Xavier Achilles which is part of the Symphony team from two years ago still relevant if you want to learn how why using Bartok is a bad idea you know you see yourself as a sub-theme you can see this our session by Darrell Norris from two in series last year and if you need help you can jump into either IRC or slack those are the resources and just before going to the questions if the slide is already available in that URL you can you can have it ready and please rate this session I will really love to have your feedback and I invite you to the sprints on Friday so the best way to learn is by doing actually I am a back-end developer I am on a theme in Maryland developer once I was tasked to create a theme in Drupal 8 and I had no idea how to do it so it was a long and somewhat painful process and this session is actually the result of that first exercise and because it was difficult for me I wanted to you know save other people a little bit of time and that's why I am here today so come and learn thank you very much so if there are questions you can come to the mic hi in terms of performance is it okay to go deeper in array or object to get a value in a trick in a process so question about performance I know the intrigue itself that dot notation because it has to do a lot of checks it is you know there is a performance hit there but it is negligible for the most part and one thing to remember is that you need to focus on maintainability you know how easy is to maintain this theme or if it is easy to understand you can do a lot of performance but for performance improvements but unless you are actually certain that it is a problem don't do it my recommendation there is actually there is a C extension for tree for the dot notation and installing that will actually improve how that works in terms of doing in a pre process function twig is actually compiled to PHP so I don't think there will be a lot of difference there okay thank you for the good presentation on slide 36 where you're showing how to set up the twig debug you have cash set to true mm-hmm you have to manually each time clear the cache ideally fir a development site you want to set the defaults that way it doesn't catch it and every change you make then it's automatically right there yes yes so one one observation is about the caching and yes I live it as true and the reason is because even though on during development you you want you know not have to reveal the cache every time on a real website you will have that turned on and sometimes you know things asleep and you get unexpected results when you have cache disabled versus having cash enabled so at the beginning it was recommended to turn cash off now we just leave it on there are you know there are arguments and issues about that I just followed the recommendation in the slide deck and one example you know of having unexpected behavior remember that I enabled Cindy walk and I said that you should disable Steen debug at the end and the reason is when we are using you know when we are printing variables as CSS attributes then if we have teen debug enable in addition to the value itself we get the HTML comments for the fields you know every variable at some point might be a field and you will get the HTML comment for that and that will render the whole thing you know invalid so that's why it is better to work as if you were in production so when you are done with your changes you disable theme they work and you track with that because you know that that might happen I might have a first of a great presentation I think and I might have a tip when you enable the template suggestions the help debug function it's pretty annoying because your entire web developer tool gets filled with these suggestions and it's really hard to see the structure there is a Chrome extension Drupal template helper that you can install it needs a little bit of work to get it working you need to enable experimental settings and enable custom theme in chrome but then it separates those comments in a separate tab in your chrome so you can quickly copy the suggestion and find it with phpstorm or whatever be the name of the it's Drupal template helper okay so yeah Drupal templates for Chrome it's actually a helper for you know working with the template suggestions yeah thank you makes it a lot cleaner thank you well twick when you have a lot of Twix statements or functions or filters used in your template it can get quite you say that cluttered mm-hmm and the purpose of tweak as I understand it is just to remove the clutter do you have recommendations for death to get those big chunks out of the template or just use variables in your process so actually the many of the modules that I show like at the end as extra modules their purpose is to just be wrappers around a lot of you know filters and functions so for example there is one called field value usually you will go like name of the field dot zero that something that whatever this field value module will actually just like pipe field value and you get a result by field label and you get the result so these modules are are you know aim to do exactly what you say instead of having this long change of you know going deep or applying filters you have one module that provides one filter function and that is a wrapper for something else so because otherwise you lose it becomes less readable okay in your question comment suggestion well if not just a reminder I have some stickers on the table you can pick some and please fill out the survey for feedback and come to the sprints on Friday thank you very much for your time [Applause]
Info
Channel: Drupal Association
Views: 1,159
Rating: 4.8000002 out of 5
Keywords: drupalcon, drupal, 2017, Vienna
Id: bqfxaFLQ8D4
Channel Id: undefined
Length: 49min 20sec (2960 seconds)
Published: Wed Sep 27 2017
Related Videos
Note
Please note that this website is currently a work in progress! Lots of interesting data and statistics to come.