Transcript
00:08 Let's see who test is. Might be booting test. I don't know. Wait, wait.
00:15 If you joined as the name test, I just advise you to rename yourself just for Let's see who test is. Might be booting test.
00:25 Scott, I muted you because you're causing an echo. How's everyone doing today?
00:33 All good so far. Excellent. Excellent.
00:38 Okay, stop whining. All right.
00:44 Um, if anyone's on the live stream and you want to join this the cool people in this hangout, then uh link is in the
00:52 email. It's the red button and the link is a text link under the video on the community. So, um there you go. Uh and
01:02 if you just happen to join the live stream and you want to want in, then uh because you got notification from YouTube, then head to the community and click the link.
01:16 I learned I cannot post Zoom links in YouTube chat or Twitter because uh bad things happen.
01:23 Exactly.
01:30 Okay, let's get uh let's get cooking here.
01:42 best.
01:56 Okay.
01:57 Um, so let's just start diving in. Why not? Unless anyone has any initial questions, I can start diving into some of the cool stuff that happened in 38
02:06 and 39. Um, I know many of you here are regulars at the hangouts, so this is probably going to be some
02:15 monotonous regurgitation, but hey, uh, you know, hearing stuff multiple times is always a good thing.
02:24 And one of the big features, uh, you can actually thank Steve who's here right now, um, for, uh, probably the first feature I'll review today, which is
02:32 going to be, um, the unique IDs.
02:38 [Music]
02:41 or sorry, incremental ids. That's what I meant to say. Incremental IDs. All right. Um,
02:52 okay.
02:55 While I'm I just thought while I'm sharing, I think it's sends me a little pop-up notifications if someone joins and I can't. Let me get the part
03:03 participants window open just so I can quickly do that. Okay, someone joins. Perfect. All right.
03:10 Um, so we'll go over beta 38 and 39.
03:15 Okay. First, uh, well, we'll go over beta 38 first and then we'll jump into 39 since that's the order things are in.
03:23 Um, and autogen was 38, I thought. So, okay. Uh, let's go ahead and don't need that right now.
03:34 All right.
03:38 So first uh first new feature that we'll talk about um in beta 38 is incremental
03:47 ids inside total CMS3. Um so total CMS3 has always been able to autogenerate IDs
03:56 based on fields. Okay. Um but those it was either like you can have like a unique ID but it was like some random
04:04 letters and numbers right and uh you can have a timestamp which you know obviously gave you a time stamp of right
04:11 now but like it it would have been nice to just to have like a database has a lot of us are
04:19 used to just to have an incremental ID so the first item we add is number one and then number two and then number three so on and so forth right um so
04:28 Yeah. Um, I finally I Steve wasn't the first person to ask this, but he just happened to be talking about it during a
04:34 hangout and, uh, it clicked in my head on how to implement it. Okay. Um, in a
04:41 in a pretty nice way. So, um, there we go. Let's look at it.
04:47 So as you probably know um inside uh total CMS in the schemas okay um in the
04:55 ID field there uh in the settings for we can set something called autogen okay
05:01 now autogen has a lot of options and if we go into the documentation and go into field settings um it's actually towards
05:08 the top there's ID autogen okay um so there's a lot of stuff that we can do and um here's an example right here that
05:17 basically will take the title. Let's say we have a field called title. Let's probably common inside like a blog post.
05:23 Okay. And then I can do now. And what now will do is it'll actually put the number of seconds. It's something called
05:30 Unix time, right? It's it's here's just a long what looks like a random number, but it's actually uh the the time the
05:38 number of seconds since January 1st, 1970 to be exact. Okay. Um so that's what that huge number is. Um so there's
05:46 a few like little special um indicators that we can do. We can do now again which is a this number. We can do a time
05:52 stamp which is um you know the year, month, date and time. Uh we can do
05:59 something called a UU ID which is a very long um bit of random strings and
06:07 letters and whatnot. Um so uh just basically a a standard UYU ID um if you're familiar with that. There is a
06:14 shorter UID which is is kind of similar but it's just much shorter. Um and then we have our two new options.
06:24 We have oid and then this oid dash and then uh the number of zeros. Okay. So what is that? Let's look at some at some
06:32 uh examples here. So here's the oid examples that we have in here. If I do
06:38 um autogen and then item dash oid, what this is going to do is as we see here, let me uh turn on my cool little cursor
06:48 tool here. Okay. Um as we see here, it'll do item one, item two, item three,
06:55 item four, and then once it gets into item 1,000, it would be item- 1000. Okay.
07:03 Now, while that's cool, it does give us an incremental um number from a visual standpoint. Sometimes it's
07:11 nicer to make sure that um we have a certain number of zeros, pre-leading
07:19 zeros is kind of common. So let's look at this example here where I can do product dash and then inside the little
07:27 uh this little uh dollar curly braces we have oid dash and then the number of zeros here corresponds to the size or
07:37 the minimum size of the number. So here we would have product dash and then four
07:44 zeros and a one and then products dash zeros two so on and so forth. And as this increments these the as the number
07:53 grows it'll fill up these zeros. So just a way of giving us the ability to um
08:09 well. Um and here's here's just one more example uh where I just have the ID is
08:15 purely just the auto incremental ID. So it would be um 01 002 003. And just to
08:22 let you know, once this hits 999 um and if and it went to 1,00 the actual ID would actually be 1,00. So again um
08:32 while this is stating uh three uh places, um be a little forward thinking
08:40 and think how many be real realistic on how many you're going to have and kind of plan that out. Okay. Um because yeah
08:48 um you can't go back and redo a thousand IDs. Uh well I guess you could but it would be a little bit of work. Okay. So
08:56 with a little bit of forethought um you can go ahead and uh just make sure you set that up. But this will grow past
09:03 three digits um if the number of objects that are created um exceeds that.
09:11 Any questions? All right. Let's show you a real live scenario. Um, so here I'm in my product schema.
09:18 We're going to go to the ID. And I already had this set up. So here I had um autogen and then I have P ID and then
09:26 and then this is where I want to set in the dynamic data. So I did uh 1 2 3 I did six zeros. This is going to generate
09:34 a sixdigit um ID that will auto increment. Okay.
09:40 And um that's all we have to do on the schema side. Um, and then on the product side or on the the object side, okay, you'll see that I already have a bunch.
09:49 Now, I had some uh pre-existing objects in this collection. Um, but I went ahead and dynamically created a lot of them.
09:57 Okay, so here you'll see that I have P ID dash and then a number. P ID dash and then a number. And if I go ahead and create a new product here, okay, you'll
10:06 see that the product ID has now incremented um to I'm out now at 1237.
10:17 Okay. Now, what's kind of cool, something that you um isn't necessarily visible here, okay, um is
10:28 before the ID needed to happen um
10:35 or the autogen I have to say would only actually occur in the form.
10:40 Okay. However, um what we've done now is I've added a feature where um if you go
10:47 ahead and either via the API or via um import, if you exclude an ID from that,
10:56 um it will actually autocreate the ID based on the autogen field that you have set inside the schema. Okay, let me show
11:04 you an example. So, I'm going to go ahead and export this collection. Let's just export it to a CSV file.
11:11 Okay. And uh let's just open this up and modify it slightly. Um yes. All right.
11:22 All right. So, what I'm going to do is I'm actually or I'm just going to trash the image. Um and then I'm going to trash the ID column so that there's no
11:30 ids. So, now I have a bunch of data here. Okay. Um that I want to import into my products collection. Now,
11:37 because I I completely trashed the ID column, uh what this is going to do is it's going to create new objects for me,
11:45 and each one is going to get an incremental ID. Right? So, let's go ahead and save that.
11:52 And we're going to go ahead and import. And I'm going to choose this CSV file.
12:04 We're going to import that. And uh just say import.
12:08 Done. That was fast. So if we go into products now. Okay. Um we should see Oh, might need to rebuild the index.
12:25 Oh, that didn't seem to work. What happened there? No cash thing.
12:32 H I don't think so. Let's see. I'll clear the cache. I don't think that was course still says 28 H. Interesting.
12:44 Let's try the import again.
12:47 Nothing's added to the queue. That's interesting.
13:01 Said it worked. I know. I know. I tested this before.
13:05 Like I implemented it. Interesting. All right. Well, that's something to look
13:11 into. Let's just quickly look at
13:21 Okay. Well, that should work, guys. I'll make sure I fix that. Okay. Interesting.
13:27 Actually, here I'm going to I'm going to try one more thing. I'm going to try this. Let's import I'm going to import that. Actually, you know
13:35 what? Sometimes I've noticed I'm just going to open this file in VS Code and
13:42 just save it. And close this again. I know some I I like that easy CSV editor,
13:50 but I've noticed that sometimes it uh yeah, I I'm not sure what it does.
13:55 So just by opening that file inside VS Code, sometimes I've seen things work differently.
14:09 Okay. Well, it obviously wasn't that, so oh well. Let's rebuild the index just for fun. Yep. H Okay, something to look
14:19 into. I broke something. Going to try one one last thing. Just open that. How dare you break stuff?
14:28 Going to cue Jav for import.
14:34 I know this works via the API because actually David, who I see is here, uses this uh uh via the API. So maybe I
14:41 didn't test it with CSV import. I swear I did though. Um and let's go to the job Q really quick.
14:51 Where is that? Here. Job Q.
14:54 Oh, there's there's no jobs in the queue. All right, so that's just totally busted. All right, I will continue to move on. Um, that should work, everybody.
15:05 Joe, did you show how to make it start that uh incremental uh how to make it start from from a higher number?
15:13 Uh, I have not. I I could show that. It's really easy.
15:18 So, if you notice um in this um in this when I added a new product, it started at 1237.
15:27 Now, obviously I only have 28 um objects in this collection. So, like how did I do that? Um so, right now it
15:37 is um there's nothing to do in the in this area. Um but if we go ahead and edit the collection, what we'll see is
15:46 there is um there is a field here that you can't edit. Okay? And it's read only that shows the number of objects
15:53 created. Okay. Um but we can tweak this if we wanted. So
16:05 You'd go into your data and you have to go into TCMS data and then you would go into this was my products collection. So
16:13 we'd go into products. Okay. And inside there you would see there's a meta.json file and you'll notice that there is a
16:22 count field. You can make this count be whatever you want. So let's say I'm going to make this to be 5,000 or let's
16:29 do 5,01. Okay, just for fun. And I'm going to save that. Okay. Um, so now if
16:36 I go into here and I uh create a new product, you'll notice that the incremental ID is now 5,0002.
16:45 So, um, yeah, that not sure. I'll I'll if you want something to do that's simple enough to handle. Um, I probably
16:54 won't add a way of doing that in the admin UI. Um but yeah, a simple little hack if you want to uh start at a specific number.
17:06 Okay, in general, you would do this if somehow the clients or users have access
17:14 to that ID and you don't want them to know they're number one or client number three, you know, it's Yeah, fair enough. you you might want to
17:22 start at some random number like 536, you know, instead of a thousand because if you started at a th00and and someone's a 101, it that that can look
17:31 almost as similar as 01. You know what I mean? Yep.
17:36 Yeah. So, you can start it at 503 and then they'd be like, "Oh, look, I'm 504." Yeah, exactly.
17:46 Um, good question. Okay, let's see. Um, any any questions on the autogen or the incremental IDs at all?
17:58 No. Okay.
18:09 Okay. Um, so, uh, I think I have them here. I have them both here. Okay. So, there is now a radio field.
18:18 Okay. So here you'll you'll see that I have um radio test yes or no. Okay. And I also have a price field.
18:29 Um I guess we'll let's look at the price field first. I'll show you how to do that. I mean it's dead simple. Okay. Um
18:36 the price field is a number field. uh but sometimes uh it it wasn't
18:43 necessarily apparent on how to create or turn the number field into a price field. So I thought this was going to be
18:51 uh something that people wanted enough where just creating a price field just made sense. Okay. Um and it has a custom
18:59 icon that we can customize for the currency that you are currently using.
19:03 Okay. So let's let's have a look at this price field. So all this obviously all this magic happens in the schema.
19:10 So if we go into products, you'll see that I have a price field.
19:14 And if we look here, um you would set the uh form field type to be price.
19:21 Okay. And then um there is a setting and uh you can set the icon that you want
19:29 using the class setting. So here I use icon pound. And if we go into the docs again and look at field settings, I'm just going to search for price here.
19:40 You'll see that uh it's at the very bottom and there is dollar, euro, pound, and yen are supported. Okay, if you
19:48 don't supply anything, uh the dollar is used by default. Um but you can then obviously easily configure that.
19:57 Okay, so pretty simple. That's it, right? It's just um setting up uh the price field. it automatically adds in um
20:06 the decimal places for you. Um and it adds a nice little icon. Okay, so there we go. And if you want to see what Let's just change that to euro for fun.
20:17 Save that. And we'll go into products.
20:24 And now that icon is euro. Okay, there you go. Pretty simple.
20:29 Um hey, radio. radios, I think, are really cool. Okay. Um I think I saw Bill Bur in here. Um he he uh he moved a lot
20:39 of his select boxes um to radios and essentially it's the same thing as a
20:46 select box. It just allows you to see all of your available options and you can only select one. So here I have yes
20:54 or no. Um obviously you can have as many options as you want. Okay. But let's um essentially what this will return is a string.
21:06 So um yeah, it will return in in this case either yes or no. Okay. Um but let's have a look at how to set this up.
21:14 So let's go into here. Obviously, it all starts in the schema and let's go to here. I just have I
21:22 added a field called radio. Okay. Um, and what you would do here is inside settings and options um you could define
21:30 the options that you have available using um the same way that we set up
21:36 select a select box. Okay. Um and so all of the options that we can use on a
21:43 select we can also use on a radio. What do I mean by that? Um so we can actually use settings and there's options. Let's
21:52 look at some of those. So, if we go into the docs and we look at field options, first off, there's a lot of different ways that we can do things here. Okay.
22:01 Um I guess well grouped options are not supported um in radio. Okay. You'd either have um options with values or a
22:09 simple option list. Okay. Let's look at the options with values. Okay. So, I'm going to go ahead and copy this
22:18 and we're going to go into uh into the schema.
22:24 Let's go into radio and let's go into the options here. Uh now, before I just had this simple yes, no. I'm going to
22:32 paste this in. Now, what this what this does is it allows us to give a label and a value being different. And the other
22:40 option where I just had yes no the label and the value were the same. Okay. When I clicked yes the value is saved as yes.
22:47 If I clicked no the value was saved as no. But here I can have a label of option one but then the value saved is something different.
22:57 Okay. So um let's just have a look at that. Let's go ahead and save.
23:05 So now if we go ahead and look at a product. Okay. Well, see now that I have I have option one, option two, and
23:11 option three. But when I click this, the this the term option one isn't saved.
23:18 The actually the value number the number one is saved, right? So what is this?
23:23 Let's just do this. This is PID 13. I'm going to go ahead and click on option two. We're going to save that.
23:31 And let's just go look at that data. So if we looked at um product 13, if we see radio, the value of two is saved. Right?
23:42 So again, that is just saying that the um the label and the value can be different. Okay?
23:50 Now, we can also do a lot of other really cool things, okay? um with just just like we can with select where we
23:57 can actually bring in data from a different collection. Okay. And display it as an option. Okay. So for example um
24:07 if we go into let's go into the docs and go into field settings.
24:12 Let's find relational options. Okay. So, I'm going to go ahead and copy this.
24:20 And um let's say I wanted to um now this is going to be a lot, but I do have a a members collection here. And let's say I
24:28 wanted to um show uh give an option to select a member from a radio. Okay. Um I think this is probably too much, but
24:37 it's it it will show you an example of what we can do. Okay. So, here I have first name, last name, and ID. Okay. In in the members collection. So, let's go ahead and let's look at my schema here.
24:49 Let's go into radio.
24:52 And what I'm going to do is I'm going to go ahead and delete all of that because we're going to paste this in. Okay. So, we're going to do collection is uh members.
25:03 Uh the label we're going to do um first space last. I think it was first last. I should have paid it better attention.
25:12 might have been first name, last name.
25:14 and the value is ID. So what I'm going to do is I'm going to um the label is going to be the first name and the last
25:20 name and the value is the ID. So um what I'm expecting here is the radios is
25:28 going to show there's going to be a radio button for every single member where the label is the first name and the last name and the value is the ID.
25:39 Okay.
25:41 Um, yeah, should be right. Save that.
25:50 I could have I could have messed up. It could have been first name, last name, but let's see if I if I got it right on the first go. So, let's go ahead and click on this guy. And there we go. That
26:08 think I don't think this is a valid use case. I there's just too many. I think radios look good if you have a certain number. Okay, but having this many
26:16 probably not good. Okay, but I can go ahead and click on one and the value would be the ID of this particular member that gets saved into the CMS.
26:25 Okay, pretty cool. Okay, now let's say I do have a lot. This sort of layout
26:33 doesn't really work very well. It doesn't look good at all. Okay. So, what can I do to um spread these out a little
26:40 bit so that I can, you know, I have all this space over here. Um let's turn these into a grid of radio buttons. So, um let's go into the docs again.
26:51 Let's go into field settings and let's just search for radio there. Okay. So, in radio, there is one setting that we can do. It's a setting called field
27:06 Okay. And it will fill in as many as it can. Okay. So, I'm gonna go ahead and just copy this. Let's go back into the
27:13 schema. Um, and go into radio, go into settings, and uh let's add this in here.
27:22 There we go. So, I added field grid of 250. Let's just stick with the default. See what that looks like.
27:30 And um let's go into products. Let's just go into one of these. And voila, there. Now I I have
27:38 each individual one is is 250 pixels wide. And it creates a nice grid of radio buttons for us. Pretty cool, right?
27:47 Sweet. Any questions on radios?
27:56 Can you sort that list? I'm sorry. Can you sort that list? Um, can you sort that list?
28:05 It's not in um these how Yeah, that's a good question. How are these sorted? Um,
28:13 those are sorted by what's currently sorted in the database. If you click members, it should be in order,
28:21 but you can add an option on there to resort them. Sort options, right?
28:25 Do I Yeah. Um, You have you have sort options. Yeah, you do. Yeah. Yeah.
28:31 Yeah. Just uh scroll down there somewhere. It's there. Command F. It's there. Sort.
28:39 I think you have it with list options. True. There we go.
28:43 Um but then does it sort it by the ID or the label? That's that's a good question. Yeah.
28:49 Let's see. Uh so we go into radio.
28:54 Let's do sort options. True.
29:01 Oops. I I broke I broke the JSON. What' I do? Oh, dot I put a dot instead of a comma.
29:11 What? Oh, I didn't copy the double quote.
29:19 Copy paste. Wo. All right, there we go.
29:24 Uh, let's see. I have no clue how that's going to work. Let's see.
29:31 I'm going to assume that's sorted by the value.
29:36 Go to the members collection for a second.
29:41 No, see that it's the same one.
29:45 Yeah, but I I added sort options. It's possible that sort options doesn't work in radio. Um, and yeah, it it definitely
29:54 works in select, but yeah, that option probably doesn't work in radio.
29:58 If you if you edit this collection and change the sorting of this collection by first name, does that change the radio? Check that.
30:06 You mean uh this sorting? No, change that. Uh, this this uh sorts this table only.
30:14 It doesn't affect the sorting of the index. You want to entertain me?
30:20 Okay, fine. Let's let's sort by last or no, let's sort by first name since that was uh the field. So, we'll sort by first name.
30:32 And if I go uh if we go back into the collection, right? So, it's sorted by first name. Yeah.
30:38 And if we go into collection and we go into products and we scroll down. No.
30:43 Yeah, it's still that's interesting. I can add a sort
30:50 options. And I think for a radio button, it should always sort by the label.
30:57 It would make the most sense. Yeah. Yeah.
31:11 But what is sort options true actually doing even on the other fields?
31:16 It's sorting the um options in a select uh dropdown. Yeah. Okay. That's where I've used it.
31:24 Yeah. I added that to the to to list. Good.
31:32 Good idea.
31:33 But is there a way go back to your documentation for relational fields?
31:39 Is there not a sorting of relational separate?
31:42 Right. There's a there's a sorting for relational. Okay, that's right.
31:50 There there's I thought there was a relational sorting option. Maybe I'm maybe I am using the select one, but I thought there was
31:58 a join option. I don't remember having a Okay, I think the select box. Yeah.
32:04 Yeah, I think you're right. It was the select box.
32:07 Let me double check my I'm gonna check my settings here. Got me curious.
32:17 Build something. I forgot how I did it.
32:20 Sessions, speakers.
32:29 I didn't even turn on sort options in that. Interesting.
32:38 All right, let's see what else. What else we got in here? Um, interestingly enough, for select, I
32:45 didn't turn on sort options, but it's like a list. It's a tag, like a select drop.
32:54 And and it is taking Oh, no, it isn't. Yeah, it's just auto sorted by alphabet, by label, it looks like.
33:03 Yes, I I think I I think I do sort selects by default by the label. So, I should probably I
33:10 should probably do that for um radios as well.
33:15 Although, I probably won't sort it by default for radios. I think I I I think it makes sense to sort the select options by default, but not radios
33:23 because radios I feel you could have a very specific order that you'd want it to be in.
33:28 Um Yes.
33:29 Such as such as yes and no instead of no and yes, right. Yeah. Correct. Yeah.
33:39 Um, okay. Let's see. Next up, um, I'm not going to go through everything I did. I did a ton of work, uh, I
33:48 just got flagged by YouTube, um, for, uh, being, uh, official support for PHP 8.4., okay, so, um, lot of code change.
33:58 Man, that was a lot of work. Okay, but, um, I'm glad I did it. I was on my I have to get this done before launch thing. So, there we go.
34:05 Um, but we're not going to go through that caching. Um, okay. Caching. There is a new um there.
34:13 Go ahead, Josh. I was going to shake the cash. Yeah. All right.
34:20 Uh, let's go. Let me open up a a system that actually has caching enabled. One second here.
34:30 Oops. Wrong password. Yeah, go away. One password. Thank you.
34:38 All right.
34:42 All right. So, um caching. Okay. Um,
34:52 caching is very important for a nice speedy zippy website, but it can be annoying as heck when
35:07 Okay, first off, at the very top, this isn't new, um, but I haven't talked in depth about all the caching options on a on a stream yet, so I figured I' I'd take a few minutes to do that right now.
35:18 Um, if you are actively developing a site, I totally ripped off a feature from Cloudflare called development mode.
35:25 Okay? And you can turn on development mode um in Total CMS3 and it will disable caching for 3 hours. Okay? In 3
35:35 hours, it'll automatically turn off so that you're you don't forget to turn it off and uh our websites will return back
35:42 to um having cash. Okay. So um a very cool feature this development mode toggle. Okay. Now um
35:52 what are all the caching options and which ones should you be using um with
35:58 total CMS3? Okay. Um the short version and make make sure
36:06 your host has opache and APCU and you're good to go.
36:12 Okay. Um now let me dive into the long version. Okay. Um essentially there are
36:19 three different types of caching um that uh total CMS3 leverages.
36:25 One type of cache is OP cache. Okay. Um and this is something that is um a
36:32 cache. Oh, let's let's back up. Um if you're ever aware or if you're PHP
36:39 itself is a is a language that is not compiled right um that is why we can publish PHP pages we can see all the
36:47 code right it is not compiled it is just text but computers need to compile that code
36:56 down so that it can be executed okay by the interpreter.
37:01 Now for every single request if uh it can slow things down if every single
37:09 request the PHP has to be compiled and then executed and then the results passed down to you. So what opcash does
37:16 or one of the things that it can do is it actually pre-ompiles your pages or act it actually um saves the compiled
37:24 version of your code um in memory so that it doesn't need to be compiled every single time at every request.
37:32 So, opache um it's something that is total CMS itself doesn't necessarily have control over the contents of that
37:40 cache. Um but I I have coded the ability to clear it. Okay. So, um whenever you
37:48 clear this this cache, it will flush all the OP cache which is really really nice. Okay. I think that is something that a lot of hosting companies I think
37:56 have enabled and it drives people insane because you publish changes and you don't see them. Okay. Um so yeah, this fixes that.
38:08 Um but it also makes an insane performance improvement on your website.
38:13 Okay, it really does. All right, next up. Um actually I'm going to I'm going to skip one, two, these three. We're
38:20 gonna come back to those and I'm going to dip down to file system cache. Um the there's just some things that um can't
38:28 be cached by opcache or these other three that we're going to talk about in a minute. And I have to cache some things on the file system. Okay. A lot of that's to do with twig and whatnot.
38:40 Okay. And so yeah, that that just uses files on your system and every every
38:48 host supports that. So there we go. But you can see kind of how many files are in there and whatnot. Okay.
38:55 Okay. So now APC, Reddus, and memcached effectively they're all the same. Okay.
39:02 They're they're different caching systems that I can store and retrieve data from.
39:09 Uh I support all three of these just in case your host supports one and not the other.
39:17 However, um as you see in this system, I've enabled all of them. Okay. Um but even though I've enabled all of them,
39:25 the order in which they're used is APC is prioritized. Um and then if if that isn't installed, it will use Reddus and
39:33 if that is not installed, it will use memcached. Okay, so that's kind of the order in which they are used um on the
39:41 system. So um what do these do for us?
39:47 So as you're as you're aware, okay, let's look at total CMS saves um all of its data in these files on the file
39:55 system. So as you see inside TCMS data, I have all these JSON files that store all of the data. Okay? And these index
40:03 files can actually be quite large. If you have 10,000 objects, it has like a summary of all the objects, right? So um
40:12 essentially whenever let's say an index is is requested. So if I were to go into my collection,
40:19 let's go into uh oh this I'm in a different system. Let's go to blog. I don't know how many I have. Okay. But here I'm in blog and it every time I hit
40:28 this page, it has to go and read from the file system, read in the JSON file, suck it in, convert the JSON into actual
40:37 data that can be processed with the PHP and then it displays it. Okay. So the
40:45 action of fetching the going into the file system reading in the file and getting all that
40:52 data okay can take some some obviously some processing time.
40:57 So what these cache uh things do APC reddus and memcached what these allow us to do is to instead
41:06 of every single time it's requested go to the file system and read in the file it will store that content in memory.
41:15 Okay. So um basically what total CMS does say it if it sees it has uh one of these systems enabled it says hey do you
41:24 have this in memory already? if you do, just give it to me really quick, or else I'm going to have to go to the file system and read it in from the file system. Right? So, that's essentially
41:34 what these three um pieces of the cache uh systems do is it just helps us not have to constantly access files from the
41:43 file system. Now, modern hosting services are using probably very fast SSDs. So,
41:51 you know, are we getting are we gaining a lot? Not as much as the OP cache.
41:55 Okay. But we are gaining some performance uh improvements. Um so there we go. Any questions on that?
42:03 All right. If you if you click this clear cache button, all of this cash here is nuked. All of it. Okay. So, um
42:12 yeah, that's what that clear cache button does. All right. Now, none of this has to do with image caching. Okay.
42:19 This clear cache button here will not clear off any image cache at all. If you really want to clear off your image
42:27 cache, you can do so down here. Um, and you can select the collection that you want to uh clear out cache from. And you
42:34 have a nice little report that shows you how many images are cached in that collection and how much file size that takes up. Okay. So, if you're looking
42:43 to, you know, release some file system space, maybe you can look here to see if the cached images are actually being, you know, using up a lot of space. Okay.
42:53 Um, now these cached images are I mean once you you visit the web page you're just they're just going to get recreated
43:02 anyway. Okay. So it is kind of a a necessary evil here. Now one thing you should I should note is let's say you
43:08 had 10,000 blog posts and you decided to um change the thumbnail size on all of them on the blog post page.
43:20 Okay. Um, that's something you might want to go in here and clear the cache because um, the cached version of those
43:27 10,000 thumbnails are going to be on the file system. So, if you change that on the live production websites, you're
43:34 you're now going to have 20,000 cached images, if that makes sense, right? So, you could clear it off, make sure all
43:42 the old versions of the images are no longer cached, um, and then the new ones will then get recreated.
43:49 Okay, does that make sense? Any questions there?
43:54 No. And uh I'm not going to dive into the entire demo. Uh I did a demo of the batch image processor. If you wanted to
44:02 precreate pre-cache images, this is a great way to do that. Okay.
44:11 All right. Any more questions? I guess not.
44:17 Um, I did a bunch of work on PHP XF data.
44:22 Uh, I won't go into that. It's just better. Okay. Um, extracting XF data from images is is much more reli
44:29 reliable now. Okay. And the data looks nicer. I do did a lot of cleanup there.
44:35 Um, a nicity for prousers, no matter where you are inside of a collection view. Okay. Um, so I'm not
44:44 sure if this has the latest version, but if no matter where you are in the collection view, um, these buttons up
44:51 here will always be visible. Okay, but not only that, it doesn't matter where you are if you just do command N. Well,
45:08 form for the collection that you are in, which is pretty nice.
45:14 Hey, you could thank Josh because he was too lazy to scroll up and click on a new post button.
45:22 First of all, the new plus button was the new post button wasn't even there. You added both of them at the same time.
45:30 Too lazy. For you had to hit blog, then you had to go new post again. You add You added both at the same time. Don't even Don't even start with me.
45:41 Oh, Josh.
45:46 Okay. Uh, I think that was it for beta 38. Why would people want rapid input?
45:51 Horrible, man. Exactly.
45:55 Okay. Uh, let's go to beta 39. Let's go to product updates here. Oh, beta 39 right here. Cool.
46:05 Um, beta 39 wasn't really a a planned beta. Um, we can actually thank Josh.
46:14 Now that I ripped Josh, let's let's go ahead and compliment him. Uh, you can all thank him for most of the features in here cuz uh he was building the site.
46:21 Um, with his permission, I might show it show it so we can see a live uh production use of what these features do. Um, yeah, we can thank him for a lot
46:30 of these enhancements. Okay. Um, let's see. There anything that isn't
46:37 related? I think all these are pretty much related. There is a couple bug fixes, but yeah. Let's see. Uh,
46:45 okay. Yeah. All right. Um, Josh, is it okay if I visit that site and show it off? Yeah. Yeah. Okay, cool.
46:52 All right. So, WPN, no WNP. There it is. WNPA.
46:58 All right. So um this site uh it uses total CMS to uh manage conference
47:06 registrations and conference speakers and whatnot. Okay.
47:11 And so um when I visit this particular web page um we have the ability to create an account or log into an
47:18 existing account. Okay. Um so uh I let's pretend I don't have an account. Um Josh, I'm going to create another separate account. Sorry.
47:29 Just use one of your Joe's. That's fine. Yeah. Um, so we'll just do Joe three. Okay.
47:35 Um, and then we're going to put in some uh some data in here.
47:42 Okay. And we'll use uh All right. And I'm going to sign up. And
47:52 what this does is uh that is an active um total CMS form. Okay. And what that
47:59 did is that created a new uh user inside a users collection. Okay. You're going to have to visualize that. I'm not going
48:08 to show you. Okay. Uh and then what that did is it then after it created the account, it redirected us to log in.
48:15 Right. So now I'm going to log in with the email that I just uh the account that I just created.
48:26 Okay. And then what that did is after I logged in, it took me back to the same page and because I'm logged in, it now
48:33 shows me this Viper cart form that allows me to then now purchase tickets.
48:44 Okay, pretty slick. So that that entire process took quite a bit of little um you know, working to get the redirects,
48:52 you know, working how we wanted. Um, another thing is I'm going to go ahead and log out.
49:09 know with total CMS, um, when you have a form, you can edit existing objects with the same form that you create new ones with.
49:22 Well, the problem with that is if this is a public-f facing form, any anyone who's clever enough, if they potentially
49:29 could figure out someone's ID, right, they could add ID equals whatever to the
49:37 URL and then they couldn't in theory edit someone's someone else's account information. Okay, obviously that's a
49:46 huge security hole, right? So, um, what we've done is let me go ahead and, uh, open up a project.
49:58 Let's go to is it this one? All right. Yep. All right. So, if we go to a custom form,
50:05 there is a new checkbox that says add only form. Okay. That means that this form can only be used to add new objects
50:15 or create new objects and not edit existing ones.
50:21 So now that that security hole of I can add the ID via the URL to edit some someone with this form doesn't work.
50:30 Okay. So this custom form you check this add only form box very important. Okay.
50:37 And that will plug that hole. Does that make sense? Okay.
50:45 Um then uh Josh, I I think with uh you we use
50:52 the redirect URL, correct? Is that what we had to use? Yes, I believe we did the redirect URL.
50:59 So we redirect to remember in this page it we redirect after um it successfully created a new user. Okay. Um uh we can
51:09 redirect to the URL and you can put whatever URL you want. We put in the URL to um the login form. Okay. So that the user can be directed to the login page.
51:21 Then they can log in and that will re that the login page is by default will redirect us back to where we were.
51:28 Okay. Um, you can also add in a uh a redirect option, I think. Right.
51:36 Yeah, we did. Uh, this one redirect.
51:39 Yeah, this one was still the hack though. This is the hack version.
51:42 Yeah, that one is still the hack with the uh with the tilda hack, the the comma or the quote. Yes. Yeah.
51:50 Um, but you could just put in the URL and if you want to redirect after they log in, if you want to redirect them back to a specific URL after login, you
51:58 could just do um, uh, you know, you would do here, let's add in a URL, right? Um, so you would put in a URL and then you would put question mark redirect equals.
52:09 Okay? And then you would put in another URL after that. And so what this is going to do is uh, you put in the URL to
52:16 your login form. Okay? Um, and you can get that from the browser. Um, and then, uh, yeah, then you can do maybe I'll add
52:26 an option here to redirect to login form. That actually probably a good idea. That'd probably be a good idea.
52:31 Yeah, that' probably be that that would fix our problem. Um, but you have to make sure you still have the option to do the custom redirect. Yes. Yeah. Yeah. Yeah. That's a good idea.
52:39 Not not the redirect, the uh custom collection. Yes. Yes. 100%.
52:45 Uh, hold on. Let me let me add that to my list. I like that idea. Um, making things better.
53:03 Okay. So, I will add options for you guys to do this. So, yeah, but if you wanted to do it today, you could add a question mark redirect and then that
53:11 will uh that'll sets up the redirect page to where you want to redirect after you log in. Okay. Um
53:19 cool. So that is let's see what else did we do. So we did uh yeah I did that
53:26 improved. Yep. Okay. Uh yeah. Okay. Uh better redirect options enhanced super
53:32 admin. Okay. Uh now um so as you probably you might be aware for authentication. See if I have one.
53:44 Let me go to a different uh again that is in uh if you go into the
53:52 collections and you go into O and you go into oh well this is my dev server which has nothing. Let's go into the O collection which here I am. Okay. You'll
54:01 see that uh in here you would do groups and you would set it to be admin. Okay.
54:07 So if you are in the off collection and you are in the admin group, you have essentially god rights. Okay. You can you can go anywhere in total CMS3.
54:20 Any questions on that? Okay.
54:30 Have a related question to the off though. Sure. when you created when you created the form for ad only I'm
54:37 assuming that you can later create a a form where the user can edit their some of their data. Yes. Yes, you can. Yeah. Once they logged in, right?
54:46 Exactly. And then that obviously that one wouldn't have because then you would only show that form to the logged in user and you would you would load in
54:54 their particular um so inside the form uh you would not do you would say load
55:02 specific object right so you would load in the form for their account only
55:09 does that make sense okay so here's this load specific object right because when they're logged in you you only want to
55:17 show their form. You don't even want them to be like a generic form where they be like they'd be able to with the URL to get somebody else's account,
55:24 right? So, here we're loading a specific object, their object. Okay?
55:36 And then uh if you wanted you can you can do a partial update form and then you you could have a form that has only their password or something like that,
55:44 right? So if you wanted to say update password, that's how you would do it.
55:47 You would load in their specific object, partial update, and then you have the password field. Boom. And then the person could update their own password.
55:56 All right. What was the load object area? Where were you loading the object?
56:07 you would have um where is user data? So you would have
56:15 you would add the user data stack right here. Right? So you'd have this user data on the page. Right? And so that loads in the logged in user. Okay? And
56:24 what you would do here is you would just put in use variable and the object ID is user ID. And at that point that would
56:32 and then the collection obviously wouldn't be products, it would be members, right?
56:38 And then Yeah. So then that would allow uh that would load in their specific object form and they couldn't load in anybody else's.
56:47 Oh. Uh random side note on loading objects. um had a really fun time uh the
56:54 other day with SEO and trying to load the object before the SEO got injected.
57:01 If you put the load object in the SEO helper stack, it loads first.
57:07 That's a nice trick that you have right now. I appreciate Yes. If if you want if you want to use any twig variables inside SEO helper,
57:15 you have to load it inside SEO helper specifically. Yeah. Um, yeah, it's something I'll fix that. It
57:23 actually requires an update to SEO helper and it's something that will um be in the next big upgrade of SEO helper that will be stack 6 only.
57:33 It's pretty good.
57:36 Oh yeah. Um, I think that does it for all the changes um in the last two upgrades.
57:46 Um, one thing I thought would be fun to to try to build. Okay. So, um Johan,
57:53 he had a problem, right? And he he wants manual sorting of objects. Okay.
58:01 Um and I don't have a an actual demo of of to to show you. Let's close this. Um Okay.
58:11 Let me clean up. I have too many tabs open here. All right.
58:15 Um, so he wants to be able to say, let's say I go into members and I want to manually
58:23 sort these things. I don't want to sort them alphabetically. Like I I I need a manual way of sorting these.
58:32 And um the way Total CMS is built right now, I I don't see that being ever being
58:40 possible, okay, for this collection to just drag and drop these and have a manual sort. Okay. Um the reason is this
58:49 data is based off the index, okay, and this index gets rebuilt in a lot of different ways, okay? And and it has to be rebuilt dynamically.
59:02 Okay. Um, and by manually uh defining an order here, that essentially means that
59:10 I I can no longer dynamically rebuild the index, which takes up a like it eliminates a lot of stuff in total CMS3 like that. It's a pretty core thing.
59:20 Okay. Um, so I got thinking of other thinking outside the box on other ways that we could accomplish this.
59:29 So it got me thinking um well there is something that we h we have okay that
59:37 does allow us to drag and drop and define an order okay and that is tags.
59:45 So in tags um I I can drag and drop these and define and have them saved as an order. Okay. Now, um I do have to say
59:55 the version beta 39 there was actually I introduced a bug where the order wouldn't be saved properly. So in the next beta um the order will be saved.
60:04 Okay, I fixed it already. Um but so the order in which these are dragged in will be saved. Okay,
60:12 so what if and I and tags also supports or list fields also supports relational options just as I see here. Right now,
60:21 this particular one only allows me to select one. But um if I have relational options and the ability to sort them,
60:30 can I leverage that to define some sort of sort order for my web page?
60:37 Right. And um so yeah, I think the answer to that is yes. Okay. Um if you
60:46 guys like I I can try to set that up. It might take a little while for me to set it up and to show it off. Um,
60:54 we'll take it right at it. Take your word. Okay.
60:57 Um, but yeah. Um, I think I think that'll be pretty cool. Uh, just a general gist of of the workflow for that, okay,
61:06 is basically we would define the order of our tags.
61:15 Okay. And then on the web on the web page side, what I would do is uh well a I would
61:25 create I would create a new collection that the only purpose of it is to have a select box that maintains the order.
61:35 Okay. Just as I I can have a generic text collection that contains bits of text, I would create a generic collection
61:44 um that is the sole purpose is to define the sort order of let's say my members collection.
61:51 Okay? And in there I would have one object or maybe if you had multiple if you wanted different sort opportunities for different places, whatever, right?
62:07 it would be the drag and drop order of those items. Okay, or in this case members
62:14 then okay on the content side how do we do that? Um essentially what I would do
62:22 is I would load a specific object.
62:28 Okay. So, I' I'd probably use object loader. Um, oops, not I hit the wrong button.
62:35 Um, quick question, Joe. Could you have groups of members?
62:43 Um, possibly. Uh, you could probably do some sort of filtering based on tags. Uh, you know, um, you know, uh, possibly. Yeah.
62:54 uh you could have maybe multiple of those list options and each one was a different category and then each one had the manual sort order inside of there.
63:05 Again, I think this is very edge case. I I mean the manual sorting of and a you can't really do it with a lot of data like who wants to manually sort a lot of
63:12 data, right? So, um but anyway, so uh okay, let me get back to this. So, we're going to do an object loader and we're
63:21 going to do again I'm just conceptualizing this here. I'm not going to build it all out.
63:28 Where is uh data loaders? Right here.
63:31 Um, okay. So, we do an object loader and then here I would load in let's say my collection is lists and I would do I maybe it's sort members. Okay.
63:43 Or actually that's probably my collection actually. sort uh my collection is going to be sort members and my object ID is I don't whatever
63:51 sort members again right okay whatever you whatever you define it as okay so I'm I'm loading in this object okay and
64:12 um so and then in here I would then uh well actually it wouldn't be we wouldn't loop through the collection there's
64:19 actually oh a new there's a new stack called for loop okay and um so here I have sort members and what I would do is
64:28 I would say um I would uh let's see the loop variable is member ID now remember what
64:37 what we're getting at is um this is a sort members has a let's say a property property called list. Okay. And that
64:47 list is a list of ids of members. Does that make sense? All right. So, um what
64:54 I'm going to do now is I have sort members. So, I'm going to do um sort members.list.
65:02 Okay. Because list is the name of the property. Okay. Again, I didn't create that whole schema and whatnot. Okay. But
65:09 let's say I'm I'm going to now sort through. I'm going to go through sort members.list and each one of those is a member ID.
65:18 Does that make sense? Now that I have that member ID, okay, I could then uh
65:26 inside this loop use that member ID to get that member's information and display it.
65:33 Okay. So in here you can then do object loader. Um and then you would do you would load in from members. The object ID is member ID. Uh that is a variable.
65:46 Okay. And the variable name is member.
65:51 So now now I have access to member and then I can do whatever I want now.
66:10 thousands of of things, but if you have a you know list of members that's not too too much. I I don't think you would see especially if if you have caching enabled, it would be pretty fast cuz you
66:18 have to think. So this is I'm just thinking from a data access thing, right? I'm here this sort members. This
66:26 is going to the file system. It's getting all my uh it's get fetching all of the member the sorted list. Okay.
66:33 Then we're going to loop through that and then this is going to go to the file system and it's going to get all the data for that member on every single iteration of the loop.
66:45 Okay. Um, now it's possible that we could we could um probably there's probably some twig we can come up with
66:52 if if I loaded in a members collection up here.
66:59 Uh, where the is data loaders? Data loaders here. Man, I haven't gotten used to the colors yet. Can't wait till I have custom stack icons. All right. Um, all right. So, if I did uh members.
67:12 All right. Let's just say this loads in the members collection. Okay. It's probably possible for me to based on
67:19 this and this like have some twig that basically sorts this to match this. I'm sure that's possible. And at that point
67:28 that would actually be faster than having an object loader inside the for loop. Okay. Um
67:36 so you you could potentially do it that way as well, but that's some custom twig code that we'd have to figure out.
67:43 But anyway, any questions on that?
67:46 This is definitely a simpler kind of solution for sure. And if you have caching, it's going to be ultimately pretty pretty darn quick.
67:57 It will be good. All right, there we go.
68:09 Any questions?
68:11 Even non-total CMS questions. I'm happy to talk about whatever.
68:15 First the CMS questions. I have I have two road two roadmap questions. You you talked about you've talked about uh active pieces
68:23 integration and is that a a pre-launch or post-launch?
68:30 Um so you can do it now. Um it does work. You just have to uh use a uh HTTP
68:38 request. Um, and then you'd have to uh yeah, I mean all the docs for all the
68:45 API routes are in the docs, but um
68:53 will I get it done before launch? That's probably a very soon after launch thing.
68:58 Yeah. Yeah. I just curious. All right. I haven't looked at my active pieces in a while, so I don't know.
69:04 Okay. The other one was your uh you could talk about replacing the style text.
69:10 Um yes, I do plan on that. Um will it be will that be that might be
69:18 it? All depends on how quickly what my to-do list is. Uh how I get through it.
69:24 Um that might be a a very shortly after post-launch thing. All right. It's something I definitely want to do as
69:31 soon as possible, but um I I don't think I I'm gonna let it hinder me launching
69:39 um launching. Okay. So, yeah, I know I in in an ideal world, I would uh do it
69:46 before launch so that it's it's all done, but I really want to get this launched. So, um, yeah, I I I think it's
69:55 it's for the best that I I probably delay that till after launch. Very soon after launch, though,
70:04 it's on the short it's on it's on my short list of things uh along with active pieces.
70:11 I I know we may have talked about this privately and I forget. Um, is there a
70:18 uh thought process of having different login screen messages for the different user groups?
70:25 Um, because like right now you're you have that that Yeah, it's the same. Um, so I haven't
70:33 uh when I build out the template stuff, I'll try to think about um what we can do for that. Because like
70:41 I know you can put that you have it that you can put those two files the pre and after but if you could just have one where it just appends the collection so
70:50 then we can have an additional file for the other collection then that would just make it easy.
70:54 I can agree with that. Um maybe not. I I'll have to think about the best way to implement that but um yeah I can agree.
71:01 Uh maybe another potential option is to have twig code um inside your the template that you can be like hey am I
71:09 in the user collection or or the member collection so you can actually have twig in there to do you know log you know if logic I think that would be cool anyway.
71:18 So maybe um you know I'll implement twig support in there which it actually might already work. I'm not sure. Um,
71:25 does that does that also support uh HTML in that file where we can add CSS?
71:31 HTML and CSS. Yeah, I mean if you Yeah, you can add your own that's how I uh if we looked here.
71:37 Yeah, I saw that was like the background color and the logo. Yeah.
71:40 Yeah, that I that's just CSS inside the template. Cool. Yeah. So, we we can go to town with that. That's fine.
71:47 Yep. Yeah.
71:50 Joe, there's that um keep me signed in option that you added recently that I don't know. I don't think it's working
71:57 for me. It's um if I come back a few hours later, I have to log in again. Um Oh, really?
72:05 Yeah. Okay. Do you try it? Does it work for you?
72:10 Uh I mean, I'm constantly flushing my system because I'm always testing. So, it's Yeah. Yeah.
72:18 I'm always obliterating everything just to test it from scratch again. So, I uh Okay, I'll I'll add it to my to-do list to look into.
72:26 Well, what what's actually really cool is since I publish with Git, um I use
72:33 that uh emergency cache link and every time I publish with Git, it auto clears
72:40 the cache for total CMS for me. So, on publish, it instantly clears the cache, which is so nice. Yeah,
72:47 very nice. Another another plus David to get publishing. Speaking of which, uh Joe, I don't know.
72:55 Did David do talk to you about his issue? You can't access any of his total CMS on his server right now.
73:01 Yeah, we we we haven't talked about it yet.
73:04 Ah, yeah. I mean, it's it's one specific website.
73:08 It's not all of them, but I'll let you know afterward. Like, okay, sounds good.
73:13 Give me an hour. I'll go eat something and then I'll then I'll send you a message. Okay.
73:21 I've been playing for uh the past 3 weeks or two three two or three weeks on the all the licensing store stuff. Um it's not in a state for me to show that off right now, but um it's coming along well.
73:33 It's exciting. Oh, good. And authentication for API calls.
73:40 Oh, yes. That's that's that's on the most likely before launch list. Awesome. Yeah.
73:49 Little I saw you had a question.
73:51 Yeah, maybe uh maybe you have told it but uh I can wait in uh for the members.
73:58 Uh can you give uh specific rights for the members? What can they change or what not? Not yet.
74:06 But if someone is Yeah. If someone is in an off collection um right now um they can do whatever they want. Okay. In the in the admin dashboard.
74:15 Um however, if you do have a custom admin area, then you have full control over what they have access to and not.
74:22 Um so, but in the admin dashboard, I I will have um permissions based on
74:29 groups. Um but I haven't I haven't added that. That that'll happen probably after launch.
74:40 Yeah, I want to give the ability so you know what collections do they have access like maybe maybe you want to limit what collections they have access to. Do you want them to be able to
74:49 create, edit, delete? Um, you know, do you want them to be able to access schemas or not? Right. So, we'll hide
74:56 all those interface components based on the groups.
75:03 Oops. You're muted. All right. I can't hear you. That's weird. Or maybe it's me.
75:12 So now you can hear me. Oh, there you are.
75:14 Yeah. Sorry, it's the wrong mic. Yeah, but I want you to give them specific options to to what they can change. So
75:22 So as as you say, if it uh possible, not right now, but in the future, yes.
75:28 Now, now that being said, if you went the route of building your own admin, then you could do something like that um
75:37 with with the stacks. It's just it it'd be a custom it'd be a custom admin versus using the total CMS3 admin, which you can totally do.
75:47 Okay. And that's possible now. Correct. Perfect.
75:55 Yeah. Yeah, if you didn't know. So, um I'm not sure if I've really shown off the security stacks. Maybe I can give a quick overview of those. Right. So, um
76:05 in the here it's these these three stacks here. Okay. The authentication.
76:09 It's really we have two stacks we have access to. Okay. So, first is page lock.
76:15 Okay. And when you add page lock to the page, this will lock an entire page.
76:21 Okay. So um if someone visits this page and they are not logged in, they will automatically get redirected to the
76:27 login page. Okay. Um and in here you can say um what authentication collection
76:34 the default is off. So if you have this turned off it will use the off collection. But if you had a members collection you would add in members.
76:42 Okay. So that means someone has to be logged into the members collection in order to access this page. And then on top of that you can also add groups.
76:50 Okay. So here you can you can say um in order to access this entire page you have to be able in the members group and
76:58 then in one of these groups right so that that allows you to lock down a web an entire web page. Okay.
77:07 Now, um there's also the section lock stack and what that does is it has
77:14 similar ability, but instead of locking down an entire page, I mean, it will basically show and hide stuff on the
77:22 page based on if you're logged in or not. Right?
77:25 And that's the same thing I use on that WNPA site for switching out the cart.
77:30 And if you noticed in the navigation, it switches out the link to sign in or sign up or log out.
77:39 So on on this page here, if you notice, uh this URL is the same URL as if I were to log in. Okay, but when I'm logged
77:47 out, we see this and up here we see a button that says sign up. Okay, the web page is the same. It's just these are
77:56 these components are inside of a section lock. So that when I'm not logged in, I see this. Right? And if I go ahead and
78:02 log in, right now I'm logged in. You'll notice
78:13 that because I'm logged in, I see this on this web page and up here instead of the sign up, I see log out. Right?
78:21 That's all done with the section lock stack.
78:26 Super simple stack but really powerful right and again you can control it based on the authentication or the collection
78:33 as well as the groups and there's also else content. So if they're logged in else show this, right?
78:41 Yeah. So like for instance that site right now when when Joe signed up he signed up as a regular user no user
78:49 group. Then when we add in the user group of member then additional um content is then available because now
78:58 he's a member uh in that user group which then gives additional content. It's like a paying members content.
79:06 Yep.
79:14 I don't know. Nobody else has anything right now. Go for it. Non a non CMS question. Sure. Moving box three.
79:23 Mhm. Um, I I like the uh slider syncing where you have the the two different
79:30 syncs and um the vertical layout is what I want, but I can't seem to get it to
79:37 work with only three slides. It works great with four slides, but with three,
79:43 the it it always um scrolls out and then the first slide never comes back into in the in the synchronized section on the vertical side. it never comes back in.
79:54 Um, so it it doesn't quite work right. At least because what what I wanted what I
80:01 wanted to be able to do is have a uh like a center main object and then then like the other one would almost look
80:08 work like buttons or indicators to show where you are in the in the list.
80:14 So, uh, and you're showing how many at a time vertically? Uh, three. So there's only three.
80:22 Then you only have three slides, right? There's only three slides and there's only Right. And Right. There's only three slides and there's and you're
80:29 showing three. Um it doesn't work. I was trying to figure I I could switch to using um do the same thing with like a
80:38 tabs interface, you know, have have with tabs, but then you can't have it, you know,
80:46 automate, you know, you can't have it show. You can only a person has to actually press the button says. Okay. Right.
80:52 Yeah. Um
81:03 let's see if we can replicate it real quick. All right. So, here's a demo project.
81:11 Let's see. The slider syncing's down here, I think. Where is it? Right there.
81:26 So, here I have Let's see. How many do I have? I have You have five or six?
81:31 I have five. All right. So, let's do All right. So, now I have three. And let's go over here.
81:43 websides three.
81:58 Yeah.
82:13 And then when it animates the A never comes back. Yeah. But if I just add a fourth in here.
82:21 Yeah. Works fine. Yeah. Yeah.
82:26 Um can you not hide the fourth one?
82:34 Yeah.
82:39 I the reason I mean I I know the reason for that and uh I I don't know if it if it is fixable um because essentially
82:47 yeah you kind what you're looking for is like a tabbed interface where you click on this and then but then you probably want it to automatically circulate through them maybe so that it kind of
82:56 goes ABC and kind of circulate circles through them. Yeah.
83:09 like right now we don't see A. A is actually here and it's down here. Um it it actually duplicates it right. So that if it doesn't matter what direction you
83:17 go into you get you end up with A because it's invisible here and and down here. And when
83:24 yeah when you only have three th those elements don't exist. Um so yeah I I
83:32 don't think that's fixable without a lot of work.
83:36 Yeah. No. Yeah. Maybe just tabs, but no way to no way to animate the tabs.
83:46 Yeah, I know. I've se I've seen something like
83:53 this somewhere on some sites and I I I need to find one and see see what they're doing. It's probably just I mean, you could probably do it in JavaScript, but I don't want it around.
84:04 Yeah. Um, AI AI does know Foundation pretty well. And if you use the foundation tabs, I mean there is
84:11 JavaScript just say go to tab B, go to tab C and then it just say, hey, just create a little loop that every 5
84:19 seconds. But then you have all these edge cases like like if someone's looking at that tab and they click on it, do you you you don't want that
84:26 JavaScript to run because, you know, so yeah. Um, yeah, it's a rabbit hole of of things where you think, "Oh, I can
84:34 create a little timer that just automatically swifts through them, right?" But then you need if they their mouse hovers over it, then you need to pause that. And if it hovers out, you
84:42 need to resume it, you know? And so, yeah, all these edge case little scenarios you'd have to take take into account.
84:52 Okay, then I I'll stop playing. You know, the most important thing is knowing that it's not possible, trying to keep playing with it and seeing
85:03 there.
85:11 Cool. Any other uh questions, CMS related or unseated? And happy to help out with anything we do.
85:22 Oh, I'm just having a ball of a time with that URL filter inside of the CSV feed. I'm like, the bald spot is
85:29 starting to go down, so I took my hat off to be reminded to relax. You figuring it out?
85:38 Well, Josh and I were working late last night and I just I I'm going to be annoying the crap out of him tomorrow.
85:46 Um, but like when we have a URL filter and I'm dynamically loading things, what are little key points inside of that URL
85:54 filter box when you're doing that feeds filter so that I'm dynamically creating service pages? That was the key. That's the part that always gets me like ah.
86:08 So, I'll open up my last project. Where was it? There we go.
86:16 You understand what I'm talking about, right? Totally.
86:20 So, this this like I'm at the point now where actually being able to move to that level is just, you know, fantastic
86:27 considering I couldn't figure out which end of an HTML stack to use. Yeah. Yep.
86:33 But, uh, anyway, so if you have any hints, then I can potentially not annoy Josh too much tomorrow.
86:41 So, okay. Uh it I'm very visual. So you kind of give me a clue at at what what we're working with and I can give you some definitely give you some pointers.
86:51 So inside of my CS I have feeds, right? Mhm.
86:55 That CS I have the CSV feed. Then I have the
87:05 um what did I do?
87:09 Got to step away for a sec. I think he just needs to edit the link to with the key that it loads the ID into the post page. He has like a feeds post page.
87:19 Oh, you're using feeds to to do a blog type thing. Got it.
87:23 Yeah, there we go. I'm on the wrong thing. So, like you're not sharing your screen if you think you are.
87:30 Oh, Joy.
87:36 Okay. So, here we go. I'm in here. And what I did is I set we set up the CSV table. And what I wanted to do is make a
87:45 post page kind of like what we used to do in what we did in here. So what I'm trying to do is get this to just have
87:53 one service on that page. Mhm.
87:58 So that that way I'm creating dynamic pages. So when I went into this and where are we? Let's go here.
88:08 CSV data above. That didn't work either.
88:12 But um this this is the URL key. That whole
88:18 thing makes me not understand too much cuz I know it's got uh No, you don't use base URL in there.
88:27 The URL key is the uh so you would just use ID. The URL key is the is the parameter that you pass to the URL. So
88:37 it would it would be just ID if that's what you're p if that's what you're going to query.
88:44 So how am I passing that? I guess I'm missing how it passes to the image. But so what what is the um
88:51 I don't know your CSV data. So your CSV data has an ID.
88:55 His ID is it? So it's an ID, right? So all you're going to do is go back to your list page and edit the link. That's
89:02 it. Like you don't do anything on this page. Well, he's on the post page and uh so yeah, the the URL key is going to be ID.
89:11 Yeah, it's ID, but he has to do that from his list page. He has to edit the Yeah, we can we can do that. So, set
89:18 that to ID. Okay. And then on the on the list page, on the services page,
89:26 uh here. Mhm.
89:33 Okay. So, uh where is the there? Uh well, yeah, service listing. So, that's has all your services.
89:41 This is the one that's going to have all of them. If you click into that one service, it would then take you to that specific page.
89:48 Yep. Exactly. Okay. So, um so we have to add where do you have a link anywhere in here? Like, uh in in the layout, not in the feed. Yeah.
90:12 So, this doesn't have a link yet to go anywhere.
90:15 Okay. So, you're going to have to add one, right? Do you want it to be able to Do you want it to be a button or is it like do you want to click on the whole thing or what do you want it?
90:23 If you hover over it and click on it, it would be obvious that you know Okay.
90:27 because you can see I got a hover effect on it. If you clicked it would change into a clicking kind of thing.
90:34 Okay. So, if you want the whole thing, it could be a link container. If you want a button, you add a link button.
90:39 Um, some days I I like today's just one of those days.
90:52 Let's try that again in English. So, just a link container.
91:05 Red. So, I would put this into Put that above here. Right. Uh, yes.
91:14 And then drop the whole card into the link container. Correct.
91:17 And then we're going to make this link container into a link. Yep.
91:25 And that would be mustache mustache base URL ID.
91:31 Uh so well I I I need to know the UR it would be the URL to your services post page.
91:40 Um and then slash and then I don't Yeah, it has to be the full Yeah. services.
91:56 Yep, that's the page I believe.
91:58 Uh why don't you set link and look at the and go to and verify. I don't I think it's something else.
92:08 Just save that. Click set link and let's go to the other page.
92:13 Go to services post page and look at the page properties.
92:19 Okay. Oh, it is services index. Okay. I made a mistake. Then what's the main services page? I think I made a mistake there.
92:27 Oh yeah. Yeah. You can't have those be the same. That that one needs to be uh either rename it to be service.php or
92:35 something like that instead of index or or you can do services service. I
92:42 don't know. It's up to you there. Sure.
92:48 Okay. So that is going to come here and then this is the first time I'm actually
92:54 getting anything close to something like this. So then that would be placed at the end here.
93:02 Correct. Okay. And then you would do a uh you have two slashes before services
93:10 and then um you would do a slash and then question mark.
93:18 ID equals curly brace curly brace
93:26 ID close curly brace done.
93:36 Okay.
93:39 So that passes the ID to the service post page and then the service post page reads in that ID via your filter and Bob's your uncle.
93:48 So I don't do anything on this page except set it up to receive. Correct.
93:56 But I've managed to put it all back in again.
94:05 So, go go go to your your uh go to the feed stack.
94:10 Okay. You see where you say it says ignore filter if not present?
94:15 Uh turn that off because then it won't ignore the filter.
94:20 And then you can put in an ID for preview if you want to have a specific value to preview. So like you give it an
94:27 ID that would show up in preview from your CSV data.
94:35 I hope David's watching because he said that this was one of those things but deeds or not notary or something like that.
94:45 Done.
94:50 Okay. So now I just finish out this page and then I guess I want to add this up here to this menu. But then I did
94:59 something with the menu that I don't remember what I did, but I did it and it worked well. Oops.
95:06 This is where I kind of made different versions of that.
95:16 And I don't I didn't put enough notes down to remember what I did.
95:21 I not sure what your goal is here.
95:28 I think there's a version that if you shrink it down, it goes to one thing and then it goes to another or I don't
95:36 recall. I have no idea what I did, but I'm I want to make a drop down now for the services and then have that
95:43 dynamically fill. So, it will dynamically go to that service page.
95:50 But I'll that I'm going to annoy Josh on. Okay, Josh. Yeah, you you would need to probably do a
95:58 different uh a different menu stack or you could there's a lot of different ways you could potentially do that, but then maybe in a drop down or something
96:05 and in the drop down you can have another feed CSV that then loops through or something like that.
96:12 Because then what I did is I also made it so that if you're on that page it stays stuck up at top.
96:21 Mhm. I did not know how to do that with stack. So I went to chat gpt and annoyed the crap out of
96:28 I mean you don't one thing one thing to be wary of is I mean you don't have to put every page in your menu, right? So
96:35 um you know I I guess services I guess it could make sense to have something up there if you really wanted to.
96:46 Okay, thank you. So that's fixed. I'll go play with this for the rest of the day.
96:51 And I'm going to do the same thing for uh the other site that I'm working on.
96:54 And then I'm going to go back to the uh the paint one. So I've got three sites I've been plugging away at. But uh thank
97:03 you score.
97:06 I'm I'm like, "Oh, okay. So that's how you get it over there." So now I'm going to go back and put those notes someplace while I'm working on that. So thanks
97:15 Josh for jumping on that, too. Anything else, guys?
97:28 No. All right. Well, I guess we'll call it quits then. Sweet.
97:34 Any fun stuff you picked up on um on Absumer or these other places recently?
97:42 No, I've been I I' I've had I've had blinders on for those places for right now.
97:48 Maybe maybe after I ship Total CMS 3.
97:52 Okay. Well, I'm looking forward to this, you know, this building of all these sites right now and getting them
97:59 stylized. So, that's Yeah. Good job, dude. Keep up the good work. Thank you. Thank you.
98:05 Cool. Take care, everyone. Have a great rest of your week. Hopefully, we'll see some of you on Friday at the hangout. You take care. Bye.
98:13 Thanks a lot.