 Hello? I guess we'll get started. You're in the school room, that's an accident, I'll give you an opportunity to leave. It was a very badly named session I think because I looked at it, I set it up in September and I looked at it and I said, I wouldn't go to that, I don't know what it's about. And so thank you for getting past that and actually turning up in this room. What I think is actually quite an interesting topic. So I'm going to be talking about the Sculled Swear of Modules and how it can help you manage your media. So that's what I turn it to, Sculled Media Management and New Hope for any Star Wars buffs out there. My name's James Golden, I'm a technical architect at Acquia and they're my contact details. And I use the New Hope, it's kind of partly in a reference to a talk that I gave at Drupal Down Under about three years ago on the Media Module. And the Media Module at the time was an exciting sort of development and handling media on Drupal sites and it wasn't without its problems. And I'm imagining some of you have encountered those problems. And so I call, and I also had some Lego Star Wars in there, so the New Hope kind of made sense in terms of Sculled, maybe improving the experience with media. So today what we're going to talk about, an introduction to Sculled. So I'm going to give you a brief background on what Sculled is and why you would use it. We're going to look at some of the Sculled features that both caught a Sculled and a couple of extra providers. And then we're going to create a very simple Sculled provider, more as a proof of concept than as final code, but just to get you thinking how Sculled can be used to do a lot of your media management and the editor experience that you'll be providing. So as I said, Sculled is a suite of modules and it's focused on managing and reusing media. So very important that we sort of like understand when you would use it and we'll go through some use cases, but essentially the problem Sculled is trying to solve is how to manage and reuse media throughout your site and in an editor friendly way. It's also important to note that Sculled is one of a number of solutions to this problem and the most common solution to this problem at the moment is media. We're going to be talking about a brief comparison between Sculled and the media set of modules soon. There are other, I think, asset is another module which sort of like tries to deal with the same problem. So there are a growing number of solutions to this problem. And surprisingly, Sculled has actually been around since 2008 in Drupal 6. I say surprising because I didn't find out about it until a year or a year and a half ago and most people I talk to about it have no idea what it is. And I think you might be surprised at how mature the module actually is and how sort of like integrated the editor experiences. It was developed by a French company called Open Web Solutions, you can tell by the name probably, and sponsored by Radio France. So that's sort of like it was it's Genesis in Radio in Drupal 6 and that's how it's like got ported to Drupal 7. All right, so I guess as a developer or site builder, it's important to know why you would use Sculled. So what are the use cases for it? So the primary use case is you want to maintain a library of media that can be reused throughout your site. And I think it's important to sort of like think about that because reuse is one of the main purposes. If you have no need to reuse media throughout your site, there are simpler solutions that may meet your use cases. So most of the things like media and Sculled are actually about reuse so that you can build up a library and you can share things on that library, metadata, etc. And you can use it in multiple places on your site without uploading the same asset twice. Another reason you might use it is you have media items and you want to add fields to them. So Drupal 7, the entity system, great files as entities, fantastic. Common misconception and entity means it's fieldable. It's not actually the case. So Drupal 7 shipped with files as entity but they weren't fieldable. And one of the really important things you want to manage with your media is metadata. And so there's certain data that applies to the image no matter where it is. And to have to enter that twice doesn't make a lot of sense. And so media solves this problem but so does Sculled. As I said, we'll discuss the differences soon. Okay, this one, you want to give your editors a great user experience. That is becoming increasingly important. And I think that the media experience isn't great out of the box. I think that there are some competing sort of like approaches. Actually I say competing but maybe complimentary. So paragraphs is gaining a lot of traction. There's some talks at the conference this week about the paragraphs module. And it's kind of designed to give editors a flexibility to add arbitrary content onto their pages. But as you see, Sculled gives you that ability as well. Okay, this one, this one's an important one, like a really important one. Again, it relates back to the editor's experience. But it's all about giving them a great experience through a WYSIWYG editor. Okay, because that's where they're comfortable. So like Sculled will work without WYSIWYG but it works really well with WYSIWYG and that's probably another area where media has struggled in my experience. It's been a little while since I've used media basically since I found Sculled. Okay, and here's a funny one. You need tighter control over file access. So if anybody's ever tried to control access on files, but the file entity doesn't really give you anything out of the box. It gives you a hook where you can actually tell if somebody's allowed to use a file. But it doesn't really implement it. It's not implemented with anything like the Node access API. And so an access API for files or I should say media is something that some people need. And so Sculled gives you a sort of like a leg up to getting that working. All right, so I keep on bringing up media and pretty much because it's the main competitor and it's the sort of de facto solution to this problem. So how does Sculled differ from media? Okay, so media is based upon this module called the file entity module. And the file entity module tries to take the core Drupal file entity and enhance it. One of the main things it does is it gives it fields, all right? Or it makes it fieldable, sorry. But another thing it does, which you may not realize, is that it actually creates a whole lot of bundles. So remember entities are sort of like the main, the sort of parent. And then you've got collections of fields, which are called bundles. So media actually installs file entity and file entity on installation goes through your managed files table and tries to sort them out into appropriate bundles. So Drupal by default just gives you the one bundle. And so this is a kind of destructive effect that happens in the database. And it's an important one to sort of like understand. It also, I mean, the media approach is, well, we already have a file entity. Let's just make it the entity it should have been in the first place, right? And there's nothing really wrong with that approach. Part of sort of like an end point of that is that media requires everything to be a file in the managed file table, all right? So you don't need to worry about this really, but it's an important distinction between how Skull approaches media and how media approaches media. So media always assumes that media is associated with a file and that file lives in the Drupal managed files table. Now, that doesn't literally mean a file on the server. It can be a stream wrapper, which is just kind of a way of plugging, of abstracting a remote data stream. And don't worry, it's going to get a little less technical. Or don't worry, it's going to get more technical as well. So I've got to cover all the bases. So media actually will work through these stream wrappers. So Skull actually takes a different approach. And it's actually an approach that you've probably done in Drupal six sites and possibly even in Drupal seven sites. It's the approach where you create an entity and then you associate that entity with the file entity, right? So Skull introduces this atom entity type. Now, you've probably done it maybe without even realizing, but has anybody ever created a node and called it like an image node and then associated with an image? It was a pretty common thing in Drupal six and probably still happens in Drupal seven. That's essentially what Skull is doing, but it's removing a lot of the craft of the node system, right? So it's a much lighter weight kind of like approach. But it also means that it can customize that entity type to work really well. And that's how it introduces things like its access control through that entity. And so one of the implications of this approach is that an atom, a Skulled atom, I just realized I have a slide defining what an atom is. But I'll talk about an atom like you know, okay? So an atom is essentially how Skulled freaks a piece of media. So Skulled atoms don't necessarily reference a managed file in your system, all right? So there's no requirement that they link to it. They can and most do and most also use sort of stream wrappers to embed things like external data sources such as YouTube. But they don't necessarily reference a managed file. And this is kind of important, and it's important now, but it's also important in the future because Drupalate is, well, has been having that discussion about how to handle media. And there were these two approaches put forward, which were debated quite sort of vigorously. And it turns out that it seems at the moment that the Skulled approach where media may be an actual file, but it doesn't need to be, is the approach which is moving forward. And I think at the end when we create a quick provider, you'll see why you wouldn't always want a digital media asset to actually be a managed file. Going on about how it actually differs from media, okay? Five and a half thousand sites report using Skulled, okay? It's been around since 2008, five and a half thousand sites. How many people actually use Skulled at the moment? All right, you're one of the five and a half, yeah. Okay, compared to it, two hundred and twelve and a half thousand sites reporting using the media module, all right? So you can see that, I say they were market leader, like they've got a fair sort of like percentage. This next slide is a little bit sort of facetious, but there are 40 open bugs reported for Skulled. Any guesses for the next transition? Yeah, actually, yeah, any numbers? Anyone want to guess? You're pretty close. Yeah, yeah. It's actually only 350, which was a disappointingly low number for me, actually. And it certainly didn't accord with my experience of using media, because I reckon I could have logged half of those as I was using media. So I guess what I'm saying though is that media, if you've been using, sorry, how many people use media? I should have asked that. Okay, so I'd like, I mean, quite a few. How many people have found the experience absolutely seamless? All right, so that was my experience with media, and that's probably why when I tried Skulled that it, yeah, it sort of really appealed to me. And just in terms of scaling, that's a really valid concern. I mean, media module has been sort of stress tested with that number of people using it, and that bug list, I mean, you would expect that, because so many people use it for so many different reasons, you would expect the bug list to actually be a lot higher. Skulled, I mean, there's, Radio France I think are running close to a million sort of like media items. Skulled actually provides its own sort of caching system, all right? So it is actually quite performant. So how does, and we're gonna get into a demo soon, because talking about a great user experience isn't really a great way of seeing sort of like what Skulled can offer you. But like, I just wanna get some preparatory stuff out of the way. So how does Skulled work? Well, as I said, Skulled defines kind of like, first of all, an atom entity type, all right? That's the main sort of like way of dealing with the media. And then it defines some core bundles. And those core bundles are essentially like image, video, documents, etc. All right, so familiar, probably familiar to you from working with media, that's kind of what media does. Skulled creates its code base in a very modular way. So one of the really big problems with media is that it's not very modular. A lot of the WYSIWYG integration was kind of built into the module and it made it very hard to sort of like to get the core media working really, really effectively. And sort of like I think led to a bit of a loss of focus on what they were actually trying to do. And so Skulled takes a much more kind of like modular approach to the problem. So it provides like a core and then various sort of like integration APIs to actually work on top of it and makes it very easy to develop for. The other thing is it integrates into the editor experience in two ways. One, any, three ways, two ways. One is through just fields. So you can attach fields to any article or any sort of like node content type or probably any entity type. And those fields can either be just standard Drupal text fields, which are enhanced to accept media. So you can just drag and drop media into standard text fields. There's an atom reference. So an atom reference is like an entity reference field, but it's specific for Skulled atoms, all right? So that's that and you would normally use kind of like either text fields or probably the atom reference field. If you have a very structured idea of how you want your content to work. So maybe there's always an image up the top. You'd keep that out of the WYSIWYG area so that you force that control on editors and didn't let them muck it up, basically. But then probably the most exciting thing is the WYSIWYG editor sort of experience. And it works best with CK editor, okay? So it works with the CK editor plugin system. And CK editor has a really nice plugin system. And that's how Skulled works with it. So that's actually quite easy to enhance as well. So I'm gonna go through a quick demo of Skulled. For those of you who haven't used it or seen it. So a few things about the demo. First, I'm using a Skulled Galaxy distribution, which kind of is a distribution for testing Skulled. So it installs core, but it installs a whole lot of extra stuff. And then also, just to sort of like try to sell you on the approach, I've also installed Skulled Maps and Skull PDF. So they're two other contrary modules that don't come with the Galaxy distribution, but they sort of like work well in terms of a demo and giving you a feel for how it works. So I'm just going to move over to any questions to cover this awkward pause? No? No, it's actually like it's the opposite. It's a very broad definition of what a digital media is. So it may be a file, but it doesn't have to be a file. So later on we'll see examples of where it can be all of the standard. Yep, yep. So a managed file in Drupal is any file that gets uploaded into Drupal and Drupal kind of knows about it because it's stored in the database. And so you can start sort of like doing things with it. So Drupal tracks certain files. So there's managed and unmanaged files. Yeah, yeah, revisions. Yeah, look, that's a great question. Anyone else? No, sorry. I don't actually have the answer to that, is what I was saying. Yeah, I'll take that as a comment. Yeah, it was something actually I meant to look into before this because I thought it was actually really relevant. So that's a great question. I'll actually look into it and I'll just tweet it out or something. Yep. Yep. Yeah, well, yep. Yeah, I'll show you that. So that's a great question. It's coming up. Oh, OK. Yep. How do you control access to that library on a group basis, something like that? Yeah, I'm saying, OK, this file, I'm going to give access to those three groups. Yeah, look, I'm going to talk about access a little bit. And so you'll see the system that it implements. And then it would be up to, like I mean, later on I can discuss how you might go about it. Yeah. So this is kind of like, there's a point in my small, high res, sorry, screensaver. OK, so this is a site. And as I said, I've done the hard, well, not the hard work. I've installed sort of like the media module. Now the first, that's a scald module. The first thing that you'll notice, scald presents itself as this kind of like a little dock on the side of your screen. So whenever you go to a page in an edit mode, which actually supports any kind of scald, you'll see that bar there. And so it'll slide out. And that presents you with your media library. So at the moment, I don't have any media installed. Uploaded, so my library is empty. And then down the side, you've got icons for all of the various bundle types, basically. So you can see that there's audio, documents, flash, that just kind of gets installed with the Galaxy distribution, and a few others. So the first thing that you need to do, obviously, as an editor, is upload an image. So that can be done from within this screen without actually leaving the editing interface. So it's through the icon. So because we've done it through a scald Galaxy, we've got integration for the upload plugin. So we can drag and drop multiple files. So here's some I prepared earlier. Now, please. I mean, of course. All right, so what that's allowed me to do is go straight from the file system, drag into the interface. It's queued these things for upload. And I can start the upload, and it churns through them. And they've all been uploaded into the temporary file directory. I can, at this point, I can start adding a bit of metadata. So I can actually do the sort of, if there's any kind of like, if there's any generic tags or author you want to give for all of these items, you can do it at this point. So there's a second step. So I click Continue. And then it will actually list out all of the media that I just uploaded and allow me to, on a per item basis, it allows me to add in extra metadata, change the author, that kind of thing. And when I've finished, I just click on Finish. Churns away for a while. So I've populated my media library. You can see them inside there. From there, I can actually go in and edit individual items, delete them, and manage the library. So manage the library from straight within, kind of like the edit form. Probably more exciting. I can now sort of say to my content editor as well, you need to add an image. No problem. We can add in Han Solo. All right, so I'll just make that a little bit bigger so you can actually see it. OK, so we've just embedded an image. It was quite easy. You'll notice that it actually provides a caption. The thing about captions is that they're kind of not metadata. They're sort of like in many ways they're describing the relationship to this image of the current context. So whilst it sort of gives you a default metadata here, it also allows you to edit that and change it. Right, so you can see from an editor's point of view, they can see the media in there. I'm just going to save that. OK, and there's my media in the page. Right, going back to edit, I can control the size that this image displays by actually right-clicking and editing the properties. And here we'll get into context soon, but here I can actually change essentially the image style. So to your question. Not your question, somebody's question. All right, so you can see that the WYSIWYG is updating to sort of like show the new format. You'll also notice that because the full display mode has the authors and tags, it will give me all the fields attached to that media. They're not editable. So if I save that. All right, so that's sort of like the ease of use of using Skold, but it sort of, it does get better. So say they weren't happy with just that one image. They actually wanted a gallery of images. Now you could drag them all in, but from within Skold, I'll just get rid of that. Yeah, sure. Yeah, so like they're bundles. So you can actually add the like the alt text at the theme layer. And so like, yeah, you, yeah. So it's like the alt text, I guess, is associated with the image itself as a sort of metadata, like rather than being done on a per instance basis, which is consistent with alt text because it's meant to be about the content of the image, not necessarily the context. Yeah, you can add all of those kind of things on the entity itself. Yeah. So it comes from, I'll show you where they live because they're actually entities now, like a node. And so you can actually add all of that metadata onto the entity itself. It's not configured that way at the moment, but it's fieldable, so it's completely free how you do it. Yep. So from within here, I can actually, rather than sort of like asking my users to add lots of images, I can make my toy gallery. Right, this is sort of like, okay, this feels a little bit like not as smooth, but it's sort of like, it's still quite usable. So I'm just using sort of like a multi-delta field here and basically adding all of my images to my gallery. So it's something which users will be able to sort of like get a feel for quite quickly, like a bit of training and metadata can do this. So I'm just gonna finish that. So what I've done is I've added something to the library. I haven't actually put it onto the page yet. So again, it's seamless in terms of, I don't have to leave the editing environment to actually add my media. So here's my gallery over here. And I'm just gonna drop it down in the page because the editor wants control over where it goes. Okay, so that's just like doing a little bit of work there. And if I save that, okay, so now we've got the image gallery. So we've actually added items and added a gallery and then embedded it into our page. And this is using a sort of like gallery, a sort of plugin. You could create any plugin you want there. But you can see it sort of like gives, use the ability to create arbitrary galleries on the fly and to embed them. So it's based on the player. So there's, yeah, like you can implement them all as responsive, yeah. So that's images and galleries. YouTube, obviously, a very common use case. So we can see here adding video is just like adding an image, it's the same user experience. You hit the first form, you choose which provider you're gonna use. So I'm gonna use YouTube as a provider. And I click continue. The next thing is I need to, nah, sound clear. I need to just dump in a YouTube URL. All right, so I click continue and internet willing. It goes off, it grabs that YouTube video. It pulls down a lot of metadata about it. It pulls down a thumbnail from YouTube. You can see it's pulling in the tags from YouTube and the author. Click on finish. Now, clicking on finish puts in the library. It hasn't put it into the content yet. For this one, I might actually want to drag it down into this media area. Okay, so maybe I have an editorial control where I only want the YouTube video to appear at the top or the bottom of the page. So I can create a special field type for that. And you can see here that I can pretty much dump anything into that field type, but I can restrict that, right? So if I only want this ever to be a video, I can restrict it to video. I don't think you can restrict it just to YouTube video. All right, so again, coming back here, I see my YouTube video is in my library. I drop it in and there it is in the in the WYSIWYG and you'll find that the YouTube is just embedded on the page. And the position of that is controlled by the display on the content type, right? Now, I think I'll be mindful of time and I won't show you, but you can actually just drop that YouTube into the gallery and have the YouTube work in the gallery so you can mix images and videos within that gallery and drag them into a WYSIWYG editor. Couple of other ones that I just wanted to show though because they're kind of cool. One is embedding maps. So we can, we can embed coordinates like addresses. So I'm gonna put in the address for the convention center. All right, so that's basically using the address field and then geocoding that. And so now I've got a reusable map in my media library which can just be dragged in. Okay, so like that now is available throughout the site to be reused. All these things can actually be styled as well. Like this is just kind of the default way they drop in the width and height and stuff. Finally, this is, I don't know if you've had this requirement. I'm just gonna delete that video and I'm going to deal with the use case where the user wants to be able to upload a PDF. All right, so I'm just gonna choose a file. This is just one I found on Microsoft security. I'm in the Microsoft room, so it's appropriate. Upload that file. Right, but one of the requirements was, we need an inline image PDF viewer. We've all been there. Well, this module basically implements that inline media viewer. All right, so that's using the Mozilla library for PDF viewing. And so you've got your PDF inline, well, on-screen. Horrible user experience, by the way. Don't do it. But you're probably gonna have to deal with a client who wants it, okay? Yeah, yeah, yeah. Okay, so that's kind of what you can do out of the box and with a few Contrib modules. Any, like, I'm gonna push forward, but any sort of questions or comments, like, does it seem easy to, like, I hope so, yeah. Yeah, okay, which bits out of the box? Yeah, I've got a couple of slides on that, so I'll, like, okay, okay. Yeah, so, yeah, that's actually a good point. Like, we'll just very briefly look at it, but this is all based on views, okay? And it's all pluggable, totally pluggable. So this is the core library that comes with the module, but you can actually create your own completely separate sort of library using views or not using views. But because it's views, it's all configurable via the views interface, so that search will search on some predefined fields, okay? So you can filter by type. Like, obviously, when you're using a million images, things like tagging is important, like sort of the editors actually doing some of that work. But yeah, and you can configure this view by just going into the view and you'll find that you get the filter options there. Yeah, yeah. There is two. It's, because it's a really nice implementation. So I imagine some of you have had the user request that we want to pull in a tweet and you think, oh, I could use the Twitter block module, but then I kind of got to expose an entire feed and I don't have control of what's on the page and that's a bit of a problem. So with the Twitter, with that Twitter score plugin, we can simply put in a unique identifier from Twitter and upload, again, it's a two-step process and there's a good reason for that, which we'll sort of see with our provider. In our library, okay, there's our tweet and I'm just going to remove that so it doesn't sort of like, doesn't get overwhelming, what can I right click? What was that? Okay. Yeah, so we get kind of like preview there that's using a particular view mode we can actually see it in our page and it will embed the tweet using the Twitter styling. All right, and so that's totally curated. So a nice use of this is to actually have a multi-delta field reference, all right, and then just actually put the work into curating the tweets you want to appear on your page. Yeah, five, oh, God. Okay. So going back to, that was the demo. That's kind of like hopefully selling it. I'm going to move through this really quickly and a lot of this, taking the truth, like I mean, yeah, Skull terminology, okay, so Skull has some weird terminology and it came from building it in six and then applying it to the seven entity system. So this is kind of just a mapping of names you'll see and what they really mean. So Adam is just an entity type. A unified atom type is an entity bundle. A context is a view mode, a transcoder. For most parts it's an image style. Okay, somebody asked about image styles. So transcoder is for the most part an image style, although with video it's anything that happens between the source file and the rendering. So you could sort of like do encoding there or something crazy. And a player is just a field formatter. Configuring Skulled, this is the bit which we'll probably skip through so we can just talk about the final kind of like use case. The configuration page is kind of like a little bit confusing, but it's very similar to the way media approaches the problem where you've kind of got like a view mode on the actual piece of media, but also a view mode on the kind of like the wrapper, the wrapper entity. So I'll put those slides up. But essentially that's how it all sort of fits together with fields. Okay, so you've got your parent entity, which in our case was an article. It's referenced to a unified entity type, which is kind of like the Skulled atom, okay? And then that atom actually has a display which is controlled by the Skulled context. That won't have made any sense to anybody who has never used Skulled, but it's maybe a useful thing to keep in mind when you actually encounter the configuration page. Quickly on access control. Skulled introduces its own access control mechanism on top of the normal Drupal roles. It introduces, you probably noticed, if you're like watching those uploads, there were these checkboxes for fetch, create, view, and delete, okay? So they're the kind of granular Skulled provided access control. And the one that's the most confusing probably is fetch. And fetch really controls whether or not it appears in lists. So a list or a view, i.e. your library. So if you don't have fetch permissions, it's not gonna show up in your library, right? Very related to kind of like the view permissions. In terms of how it's implemented, Skulled does a couple of things. First, Skulled just checks to see if you've got a Drupal permission of administers Skulled. If you do, then you're allowed through. But then, this is where it gets different. If no, it actually goes through the Skulled access control sort of API. And Skulled essentially sends out like a, it implements a hook, it invokes a hook, and it asks lots of modules to say, can this person use, look at this. And it passes them the permissions of the, in those checkboxes. And then it's up to you to provide a module, which actually comes back and says, either no, yes, or ignore. It's a restrictive permission control system by default. So if any module says you can't see it, you can't see it, right? So it doesn't do the kind of, oh, whoever gets in first actually has control over whether you can see the file. If we get to an ignore, so nobody's actually given an opinion on whether somebody can see it or not, then we just go through standard Drupal permissions, right? So at the out-of-the-box experience, so like to your point, if you don't install via the Galaxy distribution, which I wouldn't recommend that you do unless you're just trialing it, it comes with Skulled Core, which gives you the entity and the access control and that kind of stuff, but doesn't do much on its own. It gives you an atom reference field, which is the one that we just drag and drop to. It gives you the D&D library, okay? So that's a library which abstracts the library from drag and drop, and it provides all of the CK Editor and other other WYSIWYG integration. Then it gives you the Skulled D&D library, which is actually an implementation, okay? So which is just that slider that we saw. But as I said, that's completely pluggable. You can build your own if you wanted to. And then it also gives you this confusingly multimedia editorial element, which essentially just allows you to add Skulled Atoms into text areas and text fields, okay? So that's what comes out of the box. The only one that's required is Skulled Core, but I would recommend that you actually turn on all of these modules. In terms of providers, a provider is just like a source of a digital media. So we looked at a YouTube provider, a Twitter provider, those kind of things, okay? So they're all providers. The Core ones, the ones that come with the distribution are Audio, Image, YouTube, Vimeo, and Daily Motion, right? Yeah. Pick the odd one out. So they're all in there, okay? Some useful contributed providers that we use today. Skulled Twitter, Skulled Galleria, and Skulled Map. And very quickly, in my remaining minus 30 seconds or something, creating a provider, okay? So it's incredibly easy from a developer's point of view. There's only a few hooks that you have to implement. So what we're going to actually do, this is not complete or well-tested disclaimer, we just wanna show you an example of something that's not handled out of the box by Skulled, and show sort of like the minimum number of hooks required. The use case that we're doing is polls, okay? So Drupal comes with a polling system, but you have to embed it via sort of like a block. Wouldn't it be great if an editor could just embed a poll into their WYSIWYG editor, where it probably makes a lot of sense, okay? So that's the example we're gonna go through. First of all, because poll doesn't fit into image or video or audio, we create a new bundle. And the way you do that is very simple. You create a new module, to start with, obviously. And in the install file, you add the hook install, and you're just creating a poll bundle, all right? So it's very simple static method on the Skulled atom controller, okay? Just one line and it will create your bundle for you. And so what that has done is it's told Skulled that there's this new bundle, but it hasn't provided, like if you clicked on create new poll, you wouldn't have any options, because there is no provider yet. That's just set up the bundle. The next thing that we do is provide that bundle is provide that bundle through, why do I feel like I'm missing a slide? So actually, no, no, I think that's right. So this actually, this hook, it's a Skulled hook, and it's the Skulled add form, all right? And so we're actually telling it that we've got a new form and it's providing a poll. That gives you the first step. So when you actually click add new poll, that will give you the form. The next step, remember there's two steps to that thing. The reason there are two steps, think about Twitter. The first thing you have to do is say what Twitter ID is. The second thing is to make a meaningful form, Skulled actually has to go off and grab stuff from Twitter and put it in and then give you the second stage so you can actually tweak it. So that second stage is controlled by this hook. And in this hook, all we're actually gonna do is use the node ID of the poll we want to embed. And finally, so that's enough to get it into Skulled and allow you to upload it and manage it through your library. The final thing that we want to do is hook in to the pre-render pipeline, okay? So Skulled has this pipeline where when it's rendering things, it calls a lot of hooks. And so in this case, it's only calling the hook specific to the atom. And I check the mode, which is a little bit like the dreaded op variable in some old Drupal. And all I'm doing in this thing is I'm loading the node based on that node ID. I'm creating sort of like a view of that using the full view mode. And then I'm adding it to the rendered property of an atom. Sorry, it's the player property of the rendered atom. So, ah, no questions. Um, actually, I'll just show you doing that. So I've actually created the poll and I'll just embed it. So, and again, this is really like, I actually know at least one crucial flaw in this. So because I added a bundle, you can see it down here now. Unfortunately, I'm on the computer without sort of like any graphics thing. So I just reused the Twitter logo, but I used the blue one so I know what it is. You'd probably want to do a little sort of poll icon. So it's just asking me to upload a node ID. So again, because we're just doing the very simplest, there's like, I mean, that's terrible. You'd obviously want some kind of order lookup to find polls in the system, but we'll continue. Okay, so now we've gone from that first form to the second form. We need to give it a title. All right, and then we can click on finish. Now, here we go. Let's see if that works. So, okay, so that's the poll that I just created. I'm just gonna drag it into my WYSIWYG editor. Okay, and in the editor, you can see that we're actually getting some responses. I'm gonna save that. Okay, so there's our poll, like it's the poll rendered. Now, obviously like in terms of layout, that may not sort of like work for some people because it's sort of like a block level layout. So with any of these, you can edit properties. And I'm just gonna put an alignment of left. Okay, so it updates the WYSIWYG. You can tailor the styles more so that you get a better feel for what it's gonna look like. But when we actually save that, that property is floating that poll off to the left. Now, I probably don't have time to show you, it's like changing the state of the poll. So if I open that, that becomes a node vote form. But it also exposes one interesting thing, which is that is actually cached by Skulled, all right? So if you're worried about embedding something that's gonna get rendered a lot, Skulled has its own level of caching above the page cache. That's it. All right. Yeah.