 Just so you know, you're in the re-architecting for Drupal 8 talk, and you're also right here in the galaxy. Okay, so what we'll be talking about today is we'll be looking at, you know, what we did is a, you know, basically a case analysis of a previous job that we had worked. So we'll be looking at why to do something like that to familiarize yourself with Drupal 8. We'll take a look at the custom LMS that we built with Drupal 7, the features, our content strategy, the modules used for Drupal 7 and the custom development that was required. And then we'll look into the considerations of rebuilding that site with Drupal 8, any architectural differences with Drupal 8, the UI changes that Drupal 8 gives us, and also what the module landscape is in Drupal 8. And then we'll look at specifically what we needed to change within that custom LMS that we built to make it work with Drupal 8. So a little bit about myself. My name is Frank Anderson. I'm a father and a technology enthusiast online. You can find me as frog on Drupal.org, IRC, or GitHub. You can follow me on Twitter at frogdfs or read my blog at frogbyvox.com. I work for a company called Clarity Innovations. Clarity Innovations is a professional services firm based in Portland, Oregon. We focus on providing K-12 and higher education technology consulting to nonprofits, corporations, and schools. We have 25 employees that provide leading edge technology and design skills, and we combine that with direct experience in the classroom and university. We develop solutions for our clients using strategic consulting, professional development, and content creation and engineering solutions such as apps and web apps and websites to help support those teaching and learning projects. And today we're going to be looking at a client project. So this is a real world example of a custom LMS that we built. This one is for new perspectives online. It's a custom LMS built around our client's curriculum. First we're going to take a look at why you do something like this. This particular project that I'm doing right now as in the talk that we're listening to was a project that we did internally to help evaluate Drupal 8 because every time we do an evaluation or an estimation of a new project we have to ask ourselves should we do this with Drupal 8 or Drupal 7 because it really comes down to Drupal 7. It still has a lot of life left in it and it's still a very viable product. So we need to really get more familiar with Drupal 8 in order to properly assert which version we should look at. Please don't crowd by the door. We need to fill in the aisles and the spaces around and there are still some seats. I want to make sure I get this out of the way right away which is I'm not going to be going over any hard numbers for any particular projects. It's not going to be two times more expensive or anything like that because basically based off of what I know right now about your particular project and your question is it depends. One of the primary reasons why I personally wanted to take on this session was I create things with Drupal 8. I build stuff with Drupal 7 and I want to start using Drupal 8 more which means I need to know the key differences between the two platforms and I'd like to know more how I can leverage a lot of the new features with Drupal 8 so that when I am approached with a Drupal 8 project I am less like this and more like this. So let's take a look at our custom LMS architecture and first I want to get through some of the prerequisites on this because it is a kind of a niche product in LMS and so what an LMS is is a learning management system and that's software that's designed to allow for the organization and delivery of course training programs. So if you've used DrupalizeMe or buildamodule.com you've actually used an LMS, you may just not have realized that. So a traditional LMS is based on a traditional course layout and that is a collection of lesson plans which are a collection of units or modules which are themselves a collection of either lessons, projects, assessments or many lessons. And so to build this out we basically we took the modules themselves and we made those into menus, not Drupal modules this is a module as in a collection of those lessons and many lessons and so on and then we built those out using segments which those are the actual node equivalents and then inside of those nodes we had paragraph items that allowed us to build everything up and so the lesson plans, because there are multiples of them we built those out using select fields on the nodes themselves. So now I want to apologize in advance for the unskippable tutorial that you're about to do but I think that it's important that we take a look at some basic Drupal architecture just to make sure that we're all on the same page so as I start talking about bundles and properties and entities and that sort of thing where we're not losing anybody. But don't worry too much because we're really going to be speaking primarily on entities, fields and variables so don't think it's going to get too basic or take too long. So basically in Drupal, Drupal 7 starting with entities are things, they're how we build things in Drupal so in Drupal 6 we built custom things typically it was either a node or it was totally custom but in Drupal 7 they ported the content creation kit that allowed us to attach fields to nodes over into core which gave us fieldable entities and so it's even gotten better with Drupal 8 because in Drupal 7 they didn't really have an API around any of that it was just that entities are things they exist have at them there was no real good entity API except for in contrived but in Drupal 8 we have a fully fledged entity API which is derived from the capabilities of the entity API that was in contrived in Drupal 7 and so starting with Drupal 7 everything from users and taxonomy terms and nodes those are all really just types of entities so an entity can also have bundles to allow for multiple collections of fields so a field instance would be unique to that bundle and so a bundle would be, you know, allocated to a content type so you can have one entity type which is the node or the content entity and then you have multiple types of contents and those multiple types of content can have fields attached to them so that you can have unique fields across different bundles but an entity also has properties that span across the entire bundle so the properties would be like who created that entity what's the status of the node is it published or unpublished and those are the created date those are all properties that would be on that so the field instance is a place for complex data in an entity bundle and a property is more for simple storage so properties are linked to the entity themselves such as nodes and fields are linked to the bundle or the content type such as page and properties are stored more closely to the node specific table which makes them much faster to access but the fields are stored on their own tables and then variables are basically the kind of the last batch and the only thing that Drupal 7 really gives developers as a place to store things that isn't in a custom table itself is in variables which is just one big monolithic table where everything's in there and there's only one access to it and it really isn't that great of a system which is why we got configuration in Drupal 8 but that's getting ahead of myself so getting back to the LMS part of it so in a traditional LMS the curriculum designer will design the curriculum based around something called a backwards design philosophy so that starts with the standard and then they build everything out using something that they call the five E's the engage, explain, explore, elaborate and evaluate and these are all tools that the curriculum designers use to put all of that information into an actual curriculum so we distill that down to these three things the teaching, application and assessment so that gives our LMS the ability to allow the curriculum designers to achieve their goals of activating prior knowledge modeling or teaching, practice, application and assessment and so we did all that with our LMS structure with just the menus, nodes and paragraph items and the way we accomplished that is using these core modules not Drupal core but these modules that are core to our functionality so I gave a talk on modern Drupal 7 development at a meetup in Portland a year or two ago and I'm not going to go through every single module for Drupal 7 that was really cool that we should be using to develop stuff but I did write a blog post on it and if you want to read it it's probably out of date because it's a year or two old but the link will be in the slides slide notes that get posted at the end but I will go over the modules that we used in this project that are core to the functionality and then later I'll talk about how they relate in terms of building with Drupal 8 and remember when building a site in general since this is the site building track that the output when picking a module the output that Drupal gives us is always a suggestion you know do the content creators a favor and put their needs above what actually gets output for the design and then leave that to the themers and the developers to figure out how to take that content that can be input and managed properly and get displayed the way that the design requires so the first module that's really core to our functionality is the paragraphs module if you are familiar with the field collection module paragraphs module is kind of excerpt that with one major key feature that the field collection module didn't give you and that is the ability to pick what bundle the entity that you're linking to at the time of content creation so you can't when you're creating your node your node type you're not saying like oh this field will always be this collection of fields instead is this is a paragraph item and then when the content creators are coming in they can say oh this is going to be a block of text or this is going to have an image that's over here and so you can then put an image field in and a long text field and then when it gets displayed it can be put in properly marketing heavy people love this type of thing because they can pick out very highly structured you know theming that you can then build into this as full out templates that's then never break the HTML because all you're doing is entering raw text and putting images into fields so it works really well for that and then there's the entity form module in Drupal 8 this module was renamed to eform because entity forms are an actual like reserved thing in Drupal 8 but the cool part about this module allows us to use the field API to create web forms so unlike the web form module where the form itself is also considered content you would create the forms and then you would give them people who are doing the content creation the ability to choose between pre-built forms and the really awesome part about this is that the form submissions themselves are entities so they go through the entire entity workflow and they can be displayed in views with different display modes and all kinds of things that you can do that you can't do with web form you can do with entity form right out of the box another module that we used is the entity view attachment module which allows you to create views and attach them as pseudo fields so that you can display those views on the entity itself this is really handy for things like taxonomy terms and also related content anytime that you can use the arguments of whatever it is to filter out the results of a view to make the results dynamic this becomes a very very powerful tool on those types of things and then one of the last modules that we used as part of the core functionality of the LMS is the flag module now the flag module allows users to flag entities that are most likely familiar with the flag as inappropriate or if you're on Drupal.org you'll see the like subscribe so that your user can subscribe to follow particular issues and that sort of thing that's done with the flag module these last two modules that I'm going to put out we didn't use much per se as far as core functionality but I just have to point at them because they're just awesome modules the first one is coffee for site builders these two modules are really pertinent coffee allows you to quickly just go from one place to another by much like the spotlight on your Mac or the start button on your Windows machine you can just put in a key command start typing out and it'll find that admin route and it'll go there without having to go through a bunch of things like an admin menu or you clicking through a bunch of things or you just being so involved with the Drupal project that you instinctively know every route in your head you just type in the URL and the next module is the speed boxes module this allows us to check multiple check boxes at the same time which is super useful for the permissions page so let's watch the GIF here tada yay that's worth it right there right so one thing that I haven't spoken about at all with in terms to this is blocks just a quick word on blocks this isn't a block heavy site because there's not a whole lot of reusable content the LMS itself is the course is the content and so it works more like a web app in that sense because of that there aren't really any blocks that aren't just displaying navigation but when I do use blocks the bean module is kind of the go to for that so bean stands for block entities aren't nodes which is a slight jab at the node blocks module that gives you similar functionalities but just again like in Drupal 6 days just turns all your blocks into nodes but what this does is it allows you to attach fields directly to different block types so you can say this is a block type that displays this type of content and then you can put in fields that are pertinent specifically for that type of block and then you can have multiple types that when content creators are going through and they're saying yeah I want to create a new block so almost everything that has to do with the sort of default Drupal block management system and then mirror the content creation system so like admin content blocks in this case and then add new block and then have that add new block go to a you know select what block type you want mirroring the sort of content creation workflow and it's just really awesome so I don't always use blocks but when I do I use the bean module so I'm going to tell you a little bit about the content strategy around our LMS so in the end we had 13 different paragraph item types that are bundles that went all along with one content type three of these were interactive we had a text response, a checkbox list and a drag and drop all of these required users to submit their data and for that data to be stored that data was always stored in entity forms that correlated so in the text response we have the ability for people to just input their stuff it's a very simple one then checkbox list all of the stuff that they fill out there for the question and those options those are all done in the paragraph item that's not done in an entity form so we've got pre-built entity forms that are there just for storing the data but when the form is presented it has the information from the paragraph item then lastly the drag and drop so these all allow them to do that to do that application and evaluation portion of the LMS strategy and then all of these can be combined to form larger whole components so we had some that were used for like inter and intra module navigation so the person can like I want to learn more about this they don't want you to sit in front of the door there's still some seats available and in the back too they don't want you guys standing in front of the doors because it's a fire hazard so we had some that were for inter navigation some that were for support and then the rest were mainly for the actual instruction of the videos the images and the text but every time one of those form submissions goes through it has to link back to the paragraph item that presented the form so linking the entity form submission to the paragraph item each interactive paragraph item had a corresponding entity form that had an entity reference back to the paragraph item that displayed the form and we used the paragraph item bundle machine name to pick which entity form to display and that was all done in code put it all together using Drupal's you know ingenious render array system that really just doesn't care what it's rendering it's just if it's in a proper render array structure and it's themable we can just Hulk smash these entity forms into paragraph items and just display it all and save any user's response and have it linked so that we know what user was responding to the entity form and we know what paragraph item was displaying that entity form at the time so that we could so that we could save all the correlating data and we know who was doing what at what time and then we also had to provide for self evaluation within the LMS so the client wanted us to be able to have people share their responses and then learn from the responses of others to do that self evaluation and so we used the flags module to let users share their responses so after somebody saved then the share button that you see right now labeled as unshare becomes active once that becomes active those three responses on the bottom become populated and then people can unshare the responses if they no longer once they're embarrassed with what they shared after reading other people's stuff they can oh I want to retract that don't show that and then we could also they could also go through edit their response and save again so when we were building all this out our initial expectation was that all of this content would be entered into a spreadsheet and then at one point I was writing a migration that migrated all that content from the spreadsheet into the LMS so that we could have both projects kind of running simultaneously once we chose the paragraph items or the paragraph module and we had all of that stuff built out our client and our content creators saw it and like yeah this is easier than trying to input the stuff into Excel so we're just going to start using the site which saved a lot of development time because I no longer had this big long migration that took a bunch of stuff out of CSV and then put it all into like interrelated content paragraph items so that kind of brings us into the custom developments now the majority of our functionality was all put into the an implementation of hook entity view alter for the paragraph items and then hook form alter to have put all the corresponding fields in there so in our hook entity entity view alter what we did is we used the machine names to correlate the paragraph item with the right with the correct entity form and so we used a call user call which is basically the same way that hooks work in Drupal so all we had to do then is implement that custom function to then bring basically combine those and this is what that implementation looks like here so we basically just get the entity we have to load the entity form stuff so we have to include all of the entity form module includes then we have to set the entity form name and then we get the type of entity and we pass it all we had to wrap it over into our own implementation of get entity form here which basically means that we had to copy some of the code from the entity form module into our own module and modify a couple key bits just to make sure that all the stuff happens we set some attributes on the form and we did other stuff and then we just render the form out and throw it into the render array as a rendered form so that's in the form altar that's when we actually change the form itself to change the labels of the form of the different form items to display what's the paragraph item told it to display but that's also where it gets much more complicated mainly because Ajax so all of these forms had to had to display they had to submit and then they had to be shared all through Ajax so that means that we had to have the we had to have the we had to have the the actual flag not not display so it's not flaggable until after the save event happens because then they would be flagging that they've shared that's something that they've never input and then we also needed to be able to only share those things you know the shared responses after they flagged it so all of these had to hook into the flagging events so that we can do it and I'm not going to go into the specific code of doing the Ajax stuff because that's just documented in a lot of other places and I don't know that would be boring I think so we have some considerations in building a new LMS with Drupal 8 so those considerations are any architectural differences that Drupal 8 has the UI changes that Drupal 8 has the module availability and then we need to look at specifically what do we need to adapt in our code to port from Drupal 7 to Drupal 8 so those would be the any custom developments or content strategy or anything along those lines but there's also some general considerations and these are more things that as I was working with Drupal 8 knowing Drupal 7 pretty intimately these are things that I kind of stub my toe on and so sharing that knowledge with you one thing to remember is to set up the develop module Kumo isn't really there anymore so that whole nice develop ability to set up the PMPM things and click through and see the nice hierarchy of stuff Kumo doesn't work with real objects and thus it's not going to really work because now Drupal uses all real objects there's also no module disable so the okay so there it is okay good found my cursor there's also no module disable so it's really you uninstall the module that's the only two options there if you're trying to remove a module because Drupal 7's configuration management system makes the database of configuration more of an ephemeral thing it's not supposed to be that's not the permanent storage it's supposed to be in the file system if you disable a module all of the configuration related to that module has to be deleted or else that things happen to the site so they've removed the ability to disable modules which means that you turn it off and your configuration is erased and if you didn't back up that configuration by exporting it in the configuration management system then you're hosed so the other kind of things to remember is there's no more cache clearing it's now your cache rebuilding entire cache system in Drupal 8 has been rebuilt and it's much, much more robust to the point of there's certain experimental modules out there that allow you to click on things that only load the part of the page that would change on that page load that's how robust the caching system is with Drupal 8 but the problem with that comes down to the caches are very, very aggressive and so any little change could require a cache rebuild which means that you probably want to enable developer mode which has a really nice long tutorial that kind of works on Drupal.org there will be a link in the thing there but there's also a you could use Drupal console to enable that and it does drop down the aggressiveness of the caches but there's really not a good way to disable the caches completely in Drupal 8 none that I've found anyway but the nice thing about doing work with Drupal 8 is that there's lots and lots of stuff out there there's lots of people who are working on all these problems for Drupal 8 but there's also a problem with all of the documentation that we find for Drupal 8 and that is that a lot of it is really out of date because a lot of this documentation was written well before Drupal 8 was anywhere near release and this includes the documentation that you'll find on Drupal.org so one such thing is we're working on a Drupal 8 project that required the pull module and everything that we read on Drupal.org said yeah, the pull module is in core like no, the pull module was removed like two years ago from core but nobody ever updated any of those pages on Drupal.org of like what's still in core, what's not in core so we had to put in an issue, get that and fix the documentation on Drupal.org when we found that but nobody was really paying attention so there was that as well there we go so now we're getting into the architectural differences with Drupal 8 and I'm not going to give you an exhaustive list of all the new Drupal 8 features because that would just take way too long and be really boring but I'm going to give you sort of a list of things to Google and kind of research on your own time with Drupal 8 and so the first thing I'm going to dive into with a little bit of detail I'm not going to go into super detail as configuration entities I'm not going to go into super detail other than to say that the configuration management initiative is probably one of the largest changes and positive changes to developing and deploying stuff with Drupal and it's all for the better of course so one of the great things about it though in my opinion is that if you really have your heart set on the Drupal 7 like database syncing modules and you just want to completely ignore the configuration management initiative you actually can you can nothing's going to stop you from keeping your databases all in sync and developing like you were still developing on Drupal 6 the main thing that you need to know those configuration entities allow the developers to actually create a structure for their data that structure is all supported within Drupal and so you can really take a lot of advantage along this as well and there's even you know there's issues out there to try to make like configuration entities much more along the same lines of content entities bringing them back into views bringing them back into like the REST API and that sort of thing and making it so that they're more exposed which is all good stuff but I'm not really going to go into too much more detail basically because there's you know I could do one or two talks just on configuration entities they wouldn't be good talks they would be really really boring but I could do it there's that much content out there does anybody anybody unfamiliar with semantic versioning every you don't know what semantic okay so semantic versioning is the other really big cool feature with Drupal 8 and it allows you to have your you've seen like oh 8.3 just came out now everybody's working on 8.4 well that .4 there's really three numbers there and so you've got 8.4.x is the new Drupal like 8 development branch that's where all the new cool features are being developed and all the new bugs are going in and then 8.3 is just in bug fixing mode so the idea being that you know like first dot second dot third number that third number is really just there to say that yeah bugs have been fixed everything's still backwards compatible everything should still work but bugs are being fixed that second number that first dot second dot third the second number in there in the middle that means new features are being added it's not just a bunch of bug fixes these aren't just security fixes or you know things that we found that were wrong we're adding new features to Drupal 8 will get more robust as time goes on and then that first digit the big 8 there you know so first dot second dot third the first digit the 8 that means backwards compatibility is gone we changed that number and the stuff you can no longer count on everything that worked on Drupal 8 to be working with Drupal 9 so as those numbers increments you know they will be able to fix bugs with the last number will be able to add new features with that first number and still keep it backwards compatible and then we can break backwards compatibility with that first number so everything is very transparent and a lot of that just works because it works really well because the Drupal associations put a lot of time and effort into proper unit testing and making sure that's everything is as you know backwards compatible as it's going to be because everything is very tested so now you know about semantic versioning blocks now function much more like nodes as well so they so they're full-fledged entities all of that stuff that I told you about the bean module that all works in Drupal 8 out of the box with no contribe so you can have different types of blocks and those different types of blocks can have different fields attached to them and those and so you can have all kinds of really cool stuff that you can build out there but they still have a big Achilles heel and that is the content is a content entity that's the block the placement is a configuration entity and so the configuration is exportable the content is not so you can really work yourself into some issues if you're trying to export that configuration for a block that's not going to exist in production so you export all that block configuration all that new stuff and then you import it into production but none of those blocks exist yet so all you have now are a bunch of dependency errors and that sort of thing so there's various workflows that you can use to get around this there's a really good blog post that just that came out a couple weeks ago on a website called valuebound.com but that kind of explore different scenarios for this but again that link will be in the slides so now we've got content view modes so we've got we had content display content view modes in Drupal 7 but there was no UI built around it so if you're familiar, if you ever use display suites or you used the entity view mode module those two modules really gave you the ability to display content in different ways so you could have a view mode for the user maybe a blurb about the description and then that could be on a user listing page but if you went to the full view of the view you would have a different view of that user and the configuration for that is stored with the user entity so now we have view modes and we in Drupal 8 we have a full-fledged UI to create new view modes for any of your entities and do all of these things it's a really robust system so now without installing any other modules you can go into the Drupal UI you can edit the view modes you can add a teaser view mode you can add a grid view mode or some other listing view mode or all these different things to create all these different ways of displaying your content in Drupal 8 now this is the bigger one with the view modes and that's form view modes so all of that stuff I was just talking about with content being able to display content in different ways now you can do that with forms in Drupal 8 so that means your user registration form that has the thousand things that your client wants to know about your user but none of it's required you can now have two of those two user input forms one that's very simple what do you want for your username what's your email address now that you've input all that stuff and you have a user here's your user edit page that has a thousand things on it so now you can edit that and input those things so you can create multiple forms for individual entities and bundles and things and it has a full fledged UI in Drupal 8 and that's all just really cool now there's also new field types that are in core one that we make a lot of use of and use very heavily in core as well which is great is the entity reference field so that's no longer a contrib one there's also the link field and the telephone number field and this is your list of things to google so now we have composer support and most of these things to google are actually backboarded to Drupal 7 as well except for the experimental modules but anyways the composer support is really cool it's going to change your entire workflow if you're still using Drush DL you need to stop and start using composer and you need to watch Jesus did a really good presentation yesterday on workflows new workflows for Drupal talking about the composer and how you use composer with Drupal and definitely go watch that because that's the most detail I'll go into any of these though so there's the toolbar update which gives you a responsive nav bar that's also been ported to Drupal 7 as the nav bar module there's the responsive image styles so you can have different image styles that work responsibly depending on the breakpoints you have source sets and all that fun stuff for your image styles that's been backboarded as the picture module in Drupal 8 now in core there's a restful API in core which you can handle any number of ways with Drupal 7 and then there's a whole slew of experimental core modules now experimental core modules are more like functionality that you're not going to be able to hang your hat on because if there isn't a lot of support for it in core it's going to go away but these are some of the things that I think are not going to be going away because these are kind of things that are right now in the latest version of Drupal 8 3 and that's content moderation content workflows field layouts and the migrate stuff so there's now a migrate Drupal user interface so if you were familiar in Drupal 7 with the Drupal to Drupal migrate module that's coming into core to help with migrating sites from old versions of Drupal in bringing them up to date with new versions of Drupal this is also a bunch of stuff from the outside initiative so those are all your things to Google I hope you took notes so we're going to talk about the UI changes and it's good news because there's not a whole lot of UI changes in Drupal 8 if you're new to Drupal that could be bad news too because Drupal 8 has kind of a reputation for it but these are some of the the more notable things that have changed in the UI so there's an operations dropdown so you're no longer just going to be able to hit the delete button really quickly on things because you're going to have to click through stuff and I don't know how they pick what the default is supposed to be for those so if anybody out in here does know how the default operation is picked come see me afterwards because I'd love to know like I was saying before with the form display so this is something that I struggled with for longer than I wanted to just because I was so overconfident in my knowledge of Drupal but the form there's a new tab for manage form display so the actual form widgets and field widgets and things are no longer in the field settings tab so on manage fields you're just saying yeah use this field it's not a drag and drop you're not reordering things it's not for figuring out how the form is supposed to look that's on the manage form display section so I spent like two hours dealing with that when I was doing this longer than I'd care to admit but I'm admitting it for your benefit so this is good news for the learning curve of Drupal because if you already know Drupal 7 you're already past that you're up at the top where the bulldozer is so so now we need to acknowledge the elephant in the room with Drupal 8 so the big problem is really the the module availability issue with Drupal 8 the entity form module is not supported it has no plans for being supported and so there's no discussion as to whether or not the module is even necessary I of course do believe it's necessary because I love that module it's a great module and there's nothing really in core or elsewhere in contrib that does the things that I use the entity form module for but the the module worked well enough to complete this experiment but not really well enough to use it on an actual client project there were some bugs of like adding fields to things and then deleting those fields and coming back and the fields are still there and stuff like that just like general weird bugs that were going on so I would never use it currently in a production website as it sits which means we have to find an alternative so custom entities are always an option that would require custom code using Drupal console scaffold me out a new entity type and make it have these bundles and these types of fields on it which wouldn't be difficult but I mean if I'm building a site I want to use the user interface so let's look at other things it gives us the comment module comments are also full fledged entities in Drupal 8 and comments can be put in Drupal 8 on different types of entities than just nodes so this is a pretty viable solution it would require a lot more custom code and also kind of thinking about it these things aren't content these responses are not comments they're responses to questions so it doesn't really match the the idea and then there's the there's a bunch of like contact module extras so storing the stuff from the contact module is the contact forms in Drupal 8 are fieldable so you can go and you can create multiple bundles of contact forms and then have those contact forms have fields on them that are all unique and you can really do all the things that you did with entity form with the contact form except for one big thing and that is out of the box it doesn't store any of that information it just prevents the form and also again it's a module in core it's designed around being for contacts putting a send an email to this person form on your module which means you're not using a module as it's designed which means that whatever you do to make it work is going to be kind of hacky and could possibly break in the future so another another really good contender though probably the best contender is the relation module this isn't a module I brought up from there but it's a Drupal 7 it has a Drupal 8 version but it's a really really cool module and it gives us the ability to sort of mirror or supplant some of the functionality that you would find in like the flag module organic groups in the sense that it allows you to sort of bind entities together not in the way that an entity relation does where you're just like okay this module is pointing at that one but more of a this module has a relationship with these other entities so it brings this concept of entity endpoints which allows fieldable relations between entities I've used this module in like saving user states for web apps where the configuration of the app is like a node and then somebody goes on and they're saving that and they're interacting with it and they're saving their user states so that would be a good use of like the relation module or keeping track of somebody's user their progression in a professional development portal those are all good uses of the relation module and I would use it in this case but the issue is that it's really not any more stable than the E4 module at this point so there's that the only difference is that it the people who are behind the relationship module are also saying that they're going to support Drupal 8 whereas the E4 module they're questioning as to whether or not they need to so the last alternative is the one that I would really like to push people toward and that is the funding the development of a stable release of the module so I do encourage finding alternatives but at this state in Drupal 8 I would also encourage everybody to choose that final option of telling our clients like in order to build this with the newest version of Drupal that's going to have the longest term support we need to up the budget a bit and fund the actual development of this module that's going to bring in this functionality that we require that's what already happened with Drupal 7, that's why the Drupal 7 contrib space is as robust as it is because it's been out from everybody who's needed functionality has already paid to have that functionality built and we really need to do that with Drupal 8 now so the big problem was more a problem with me and this is what I was talking about before with the field widget selection or field widget selection and that's the paragraphs doesn't want me to reference paragraph items it is possible there's nothing stopping me from doing it but as soon as I saw that I didn't have that field widget I immediately thought that the paragraphs module was hiding something from me so I started diving into that code and trying to figure out what is it doing to keep this away from me and then I realized that there is a field widget the field widgets were on a different page and I was just jumping the gun there so it is marked an experimental widget because they don't want you to use it because the paragraphs are not meant to be reusable content that's more of like what blocks are meant to be but again, they're not stopping you it turned out to be a non-problem it was my own unfamiliarity my own overconfidence that drove that problem so we do have an elephant in the room but if we act now it's going to just remain a baby elephant so let's look at specifically what needs to change and so the great thing is is not much because the site works more like an app than a traditional site it means that our expectations on choosing a framework are slightly different initially Drupal was chosen because of its scalability its user centric permission based content model its high quality contrib space and my own familiarity with the project I've been doing Drupal for close to 10 years so I'm very familiar with the project I am always looking at other things because I am technology enthusiast so this wasn't a choice made from the Drupal island as much as Drupal is really if you have something that requires multiple users Drupal is most likely had the right choice for the job and Drupal has a lot of new features but the biggest advances are in underlying architecture so with the content and config entity system, view modes all that fun stuff and the development workflow with the switch to semantic versioning so there's not really a whole lot that site builders need to worry about as far as all that's concerned so architecturally our site remains the same as the same features, the same modules the same architecture, the same content strategy and so the biggest changes were really in the custom development so in our custom development this is where a lot of the biggest changes were made but probably not where a lot of you are expecting necessarily so in Drupal 7 we accomplished the Hulk smash with the implementation of the hook entity view alter and the implementation of the hook form alter and Drupal 8 has a new object oriented architecture and we were able to accomplish all of this in the exact same way but I know you're thinking like Drupal 8 is object oriented programming now we're not supposed to use the .module file the .module file is supposed to be just for decoration never put code there but the joy of modifying aspects of a program hooks are good things they're not gone in Drupal 8 so Drupal likes to change a lot of things but they're not going to remove it hopefully probably the best lowest bar means of making an application just because they stepped in OOP so really lots changed because of the object oriented architecture it's a little bit misleading but it's all for the better so when building this stuff in Drupal 7 Drupal 7 does not have a fully fledged entity API so we still use entity field queries to figure out do we have this save data already or not so we get the entity form submission that way but the entity form submission object is something that we can actually use so in order to build the new entity this could be a node or a need form submission or a comment or anything we can just use the entity type manager class and call the create method to create a new one so no longer create standard object or any of that stuff and then we can just use the entity form builder service to build out the form for that existing entity all of the fields will be in there so the bottom there form equals service entity.formBuilder getForm that gets you the form for any entity object that you have so no longer in our own module to reimplement that stuff it all just works so Drupal 8 has a very intelligent use of object oriented programming that makes site building a lot easier what was over 100 lines of code is now reduced to around 10 lines of code to accomplish the exact same thing so we just took a look at why to look at Drupal 8 we went through the custom LMS architecture the considerations with building with Drupal 8 the architectural differences the user interface differences in Drupal 8 the module availability which was the big problem with Drupal 8 and then specifically what we needed to change which was really just utilizing Drupal's APIs which now exist in core so now achievement unlocked you have sat through my Drupal con session so I want to make sure that I point out here there are sprints this says that's the 24-hour sprint lounge closes on April 24th sorry April 27th at midnight so I don't know if that was last night at midnight or tonight at midnight but ask somebody there's also the sprinting going on tomorrow mentor sprinting so take a look at that and don't forget to go back this is node 17242 so let me know how I did help me to get better or just tell me never do this again so thank you very much