Skip to content
Amigo edited this page Jun 14, 2019 · 34 revisions

DynamicGet

Sermon - Preacher Get Example

We are still working with Sermon Distributor; we are going to use Preacher, a 'get' I've already set up as an illustration. Here we have 'Back-end view' selected. (See video.) 00:00:25 For example: Select nothing. This is how it will usually look when you start. Select this, (depending on which area of the back end you want to get the data from) and select back end view. That is the best way to do it. 00:00:39

Dynamic Get Source Selection

The Joomla database option gives you the access to draw data from any other component installed that moment in the Joomla Website. 00:01:01 If you select your Joomla database, you can select any database that is installed on your database at the stage. This means that you can reach out to other components through this dynamic get. 00:01:21

This is an area that I haven't tested well yet. You might try to implement it and tun into some trouble. For now it is better to use the 'Back-end view' option. 00:01:42 The other option is there is because we want the feature in the application even while we are still working to improve it. If not very complex mapping is done (for instance, if you do a simple direct database fetch like 'cb_associations') you will be able to use this and there won't be any complications. 00:02:09 These other linked or joint database structures makes it complicated. 00:02:32

There is also the 'Custom' option, using Component Builder to write your PHP for you. At 'custom Get' you can add custom PHP, that will add the methods data for you. This is a 'custom get' option where you write the code by hand whereas this 'Custom - dropdown' option writes the code for you. (See video.) 00:02:55 Select the Back-end view that you want to use; it will be the view that you connect to your component. Type your name in here, select the package, and it will load all the field names. 00:03:20

Dynamic Get Preacher View

These are the fields inside of the 'Preacher' view. Load it and place this as 'asset_id'.(See video) It is suggested that you don't change that. 00:03:50 You can remove a row if it is not needed, but what remains is the data you might want. This would be the variable name of the data when the get is used. 00:04:13

Get Types - Get Item/List Get Custom

There are four getTypes: 'getitem' which will get one item from the 'preacher' table and 'getlistquery' which will get multiple items. 00:04:41 (Depending on how many items you want to get from the database, select either 'getitem' or 'getlist'.) Then 'getcustom' and 'getcustoms', plural. The difference between these four is that you will only use the 'getitem' once per view. 00:05:04 If you are building a custom admin view, you will select a main 'get', either of a 'getitem' or either of a 'getlist'. You can add multiple 'getcustom' item or 'getcustoms' items. This can be seen as other methods that can be added to the page, but it's not the main method. 00:05:30 You have main methods which are these 'getitem' and 'getlistquery', which is the exact naming of the methods that will be used. Then you have this 'getcustom' and 'getcustoms', which is almost the same as these two, it is just that they are not 'main'. There will only be another method in the model which will bring data to the view. 00:06:00 You can add as many 'getcustom' and 'getcustoms'methods to your view as you like, but you can only add one 'getitem', and one 'getlistquery'. To determine this is to ask what the main objective of the view is. What is the main dataset that need to be used in the view? That is what the 'getlistquery' and 'getitem' respectively are going to be used for.00:06:27

Get List Pagination

If the main purpose of the view is to show a list of preachers, then 'getlistquery' is used as the main selection. When a 'listquery' is done, there is the option of adding pagination. That is to decide whether the data should only return a certain number. Joomla has a global number which can be set in the system administrative area under 'Global' settings. 00:07:00 Go to 'System', then to 'Global configuration', there is a 'Default list limit'. That is what will be used as the amount that limits the data being returned to the page. In this instance it will only return 20 items. 00:07:26 If I set that pagination to 'yes'. If I set it to 'no', it will load all the data. 'Yes' would only load some of it, and 'no' will load all of the data, depending on what you want to do. Is it to do an Ajax, you want to be sure that all the data is being loaded every time or if you rather use JavaScript to set up pagination for your view, then that is why you would use the 'no' switch. Most of the time, just say, 'yes'. 00:08:00 Component Builder will automatically add the pagination code to the page. It will also automatically add pagination code to the model, at the bottom of the page, it will show a 1, 2, 3 pagination. Depending on the template you are using and the styles that are on the page. If bootstrap is not on the page, that 1, 2, 3 might possibly not look right and you will need to add styling to it. 00:08:31 Component Builder doesn't know what style is on your page so it cannot make provision for all of that. But it actually can load the pagination itself.

Join Data Views - Tables

In this area(see video) is data and this data can be joined to other database tables. In this area(See video) like with the main source it is possible to select joint views from a table.00:08:57 A view table which is the views of the component or just any database table. To one of the database tables I often connect to categories. Component builder integrates it's application. If you add a category field to any view, 00:09:22 it dynamically set up a category for your component. And integrates the category concept into your component, so it writes all that code for you and the way that Joomla's own applications like article manager does it. It's using the same conventions. If you know how Joomla article manager is bringing categories into the articles, then that is the way your component is going to do it. Here(DB Table - cb_categories) you can select categories. 00:09:54 These switches, I'll deal with them when we come and look in more detail at this area. Then you can model the data there(Selection). With 'Model' is meant to decide what needs to be returned, as not everything needs to be returned from categories. <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

Join View Tables Example

But the one I want to look at first is actually this joint view table. We'll come back to the DB option. The joint view Table, let you again select from any of the other views that is part of your component. 00:10:25 Again you can select whether it should return a single row or a list of rows. When you say single row, it means it's going to join it to this other data set that you have as your main data or your main source. It will just be another item in the array. That's why you can't use the name 'Name' for example here. 00:10:51 It needs to have that series_ in front of it. So that it doesn't clash with the other data set that possibly also has a value called name. So again if you select anything here(Scaling Factor - dropdown), Series, you will see that it will populate this(Selection) area with all the fields that is in that view. Then this 'AS' button here, 00:11:21 you can't use the same alphabetic number twice in the whole query. The whole get function can only use 'a' once and then 'b' once and then 'c' once and then 'd'. 00:11:40 We'd made provision up to z z. That is how many tables you can have. Only in this area here(AS).

You would first decide whether this 'Return Row Type', what type of return it will be? If you set it to multiple, these names automatically update. 00:12:02 The way that the get method will work, is it will create a new method which will get this data and add it into your item list via this relationship. I'm adding the 'On Field' as the a.series that's where the id is for the series. 00:12:24 In the joint field, I'm using the 'c.id'. In the main database, that is the 'a' database, there must be a field called series. It has the id of the series. It corresponds to the id in this list. If I wanted to return a multiple, it means that the main database which is in this case sermon, can be linked to multiple series's.

But in the system we are working with here, 00:12:56 that is not possible you can only connect a sermon to one series. That means it's certainly a single return. Then it will immediately add this series_ in front of everything to insure it doesn't clash with your a table. That's what it's doing. Again you can remove the fields you don't want but please do not edit 00:13:18 the string. It possibly would break. I want it to be possible that you can change this name to anything you like. We are going to try and do that eventually. You can be changing it will still write it this way in the code. That's part of why I'm saying you shouldn't change it not because it will break something, but because it will be ignored and you might expect something else than what it is actually doing. Still it is going to use this implementation, even if you change it. 00:13:54 It will drop the fields you don't select. If you say I don't want these, then it won't get those fields and you will only have this data returned. Again here you can have equal, not equal, equal or not. We also have 'IN' function. That means 00:14:22 if this 'On field' is an array, then you can use the 'IN' function to make sure that it actually looks whether the id is in this array. That's the in function. 00:14:45

Dynamic Get Preacher In Code

This code if we go to the component itself, I'll show you where it writes this code. We're looking into sermon (preacher id). We'll get to why it says preacher id, when we look at the filters and the where. 00:15:06 Let's go to the code. You can actually see I'm going to refresh this page, and then go to the code. Since this get is used in the front of the component, we will go to the front end and not to the admin area. We go to the front end of sermon distributor. Then we are looking at the model. The dynamic get is used in the model to get the data. 00:15:33 We are looking at sermons. Let me just make sure if that. Yes, it's sermons. It's getting a list query and it's using pagination getting all this. We're looking at sermons. Sermons under the preacher id, it should be this model. 00:16:02 I could get you into the code. You can see the main method which has this id(a.name)or the data set. It is written here(selected area on video). Here you can see id, asset, name, alias, link, types, short description. 00:16:26

If you look at the UI it says the same things, alias, link, type, short description, icon, preacher, series, category, id. This is where it writes it. It shows you where in the compiler it's done. Then it sets up the second one series. You can also see it says series 00:16:50 = c.id. So series, there(see video) is series, =, the c, this table, series, id. Then it also tells you what it wants from c. It wants the name and the alias and then it wants a series name that changes it to series. 00:17:12 Since this is in the select query. This is one function there. That array(array('c.name),'c.alias) transposes to this array(array('series_name', 'series_alias'). That is the way that you make use of Joomla's database API. It has a thing called quotename 00:17:35 which you can pass to arrays. The first array being the name of the value, which in this case is name and alias. The second array, is what you want once the query is completed. So it links this(selected area on video) into the the query one-by-one. All of those even the category one is linked in here. Then 00:17:59 it does a check whether there's an id. If it exists, it checks whether it's a string. If it's a string, it adds a quote. If it isn't a number, it adds it directly. That is where the query is done, here return false if there is no id. We'll look at this area in a moment. This is done 00:18:23 to the filtering and the wear.

I just wanted to show how it adds this preacher as well as series to the query. If we look at the back, open up here(Join View Tables - Add), you see that series and preacher 00:18:41 and statistics. We select multiple statistics because for one sermon there can be multiple files, and per file there will be a number. So if we look at how he does that. 00:19:02 It is first does the query and here in getitem, it adds a new function called 'getidSermonstatistics' and with a random key(Fcff_E) to ensure that it doesn't conflict with any other method on the page. We had to add this(Fcff_E) random key here. It puts it into this variable. That something that you need to 00:19:27 come and look at.

Possibly when we look at the site layout area as well as the templates, I'll be talking about this transition here again. What you need to know is that this variable, And I'm trying, inside of your layouts and your site views and these things, to give you the correct name. But it is not 00:19:51 type correctly. Possibly you need to come and check this if it doesn't work. I'll explain that when we get there. We're adding statistics into this(idsermonstatistic) variable through a method which is also on the page and we passing the id of the sermon. If you look at UI, this is exactly what we're saying here. We're saying, get statistics multiple, 00:20:19 join to the left. You can select any of these(dropdown). Then use the main table dot a.id, it must be equal to e.sermon. Then this is the only values I want to return from the e.sermon. The e.sermon is this(see video) value here. I'm saying a.id must equal with e.sermon. 00:20:48 If you look at the code, if we go to this function(idsermonstatisticFcff_E), it takes the id and places it next to e.sermon. Puts into its place. Here's the two arrays. What it is in the database, and what it should be now. It checks whether it executes or checks whether it's got any arrays or any values. 00:21:17 Then returns that as an object list, that then gets placed inside of this space inside here.

Dynamic Get Custom Script

Now you would see this area here(see video) is custom scripting. If we go back to the dynamic get, you will see that there is a custom script area. If you click on it, you'd see that there is different switches. 00:21:54 You can select 'getlistquery' or 'before getting the items'and 'after getting the items'. If you select 'after getting the items' and you place any code there, then data gets dumped right after the initial items we've received. It will add that 00:22:14 code in there, and then return the items. That is why you can model the data right there in the dynamic get. You going to write the code for the data after it's been get. You can check if I remove this code here, you'd see it tells you that there is an array of items 00:22:33 where all values are. Then I'm just saying I want to be sure that those items are set, and that they are there before I start doing it on each of them. Here I'm using the string bracket component helper functions to check whether the string is there. You can dump some nice PHP. Even before getting the item you can add some filters or get list query, 00:23:02 if this is model list. If this is item, you'd see that there's a different set of switches is available. It adjusts to the type of query up here. 00:23:19

Dynamic Get Join DB Tables

Coming back to this(Join View Tables) area. Let's again look at the database table option. I selected category and it's a single row that's returned. I called it b. I joined it left, and I set a.catid must be equal to b.id, which is the id of the category. I only want the title and the alias. That is 00:23:44 how we set that up. Only the title in the alias and it returns that for us. Then it links it in there(see video), and that's part of what you saw here when you looked at the query option here, it's the sixth section here.

Dynamic Get Filters - Where - Ordering - Globals

Now let's look at the filters where we have a filter and an ordering and setting of globals. 00:24:12 The setting of globals is if you have a value in this query that you want to use in a custom query, which isn't even setup yet, but you want you know I'm going to need this value in the model. Then you can through this global option here, you can set a global area. Here you should maybe test it. There is an option of using 'This' and 'State'. 00:24:38 There is the different of set types. You can set the value to 'State' or you can set the value to 'This'. Here you need to know the key. I want to do the name, in this case is not going to work. Because you got more than one name. Usually this global function only functions well 00:25:01 when you are returning a single item. When you do getitem not getlistquery, but you do getitem, then this make sense and then you can give it a name. It will add it to the global scope of the model which you can access through other 00:25:24 model methods. which are custom methods. That is setting the global.

The filtering you have a a list of possible filtering. Depending on what you want to do. You might select id, or user, access, level, group, category, 00:25:45 tags or date. Some of these are not formulated yet. Like date doesn't work that well yet. Categories does, user, group, access level, user and id does well. This function variable works well. As well as array, value, repeatable value, and other all those already work very well. You can use them and implement them. The only way for you to 00:26:15 know exactly how it works you need to know a little PHP, and then you need to compile it and go look in the code what it has done and where it's placed what. That is why I showed you that this is all set in the model. Currently we are saying we wanted to do a JRequest::getint by id. 00:26:39 This is the get area that I added. I look in the code it says 'State Key' and it's this(JRequest::getint by id) here. We set it is a function variable. It doesn't change or adapt this at all. Then says it must be equal to preacher. What we are doing, since component builder doesn't know where the this variable is going to be a string or integer, that's why we have this function which first checks were that is string, 00:27:08 and then checks whether it's a number. It related and builds up the query respectively. You might feel that is too much and you're possibly right. But that is the only way I am implement it at this stage. Getting more developers involved may possibly improve this long run.

Dynamic Get Get Access( Default added)

Then you see the access. We have a bunch of values that fire every time in a custom 00:27:39 dynamic get model. It is the these(see video) values. Often times you might need these values. Instead of you having to do custom scripting to get these values on the page, we add these values dynamically every time. The userid, the group, the authorised group, the access level, the app, and then the input values, which by other URL or post is on the page, 00:28:08 and it tells you that it's been initiated, and set it to true. That is if you have custom methods, like this one getpreacher, it checks whether it's been set. If it has been set it doesn't set that again, it can just use it. But if it hasn't been set, it sets it, and also again sets it to true. 00:28:32 These global variables can be used inside of the code like the global variable we spoke of earlier. Out of that global variable we are accessing this 'levels', which has the get authorized view levels of the specific user 00:29:00 that is now accessed this model or the view that this model belongs to. If he is in these access levels. You remember that public is another access level. If the user isn't signed in, he's a public. This will validate true in the query. We set that up simply by adding access level in a.access. 00:29:28 You must check in the main source table for a.access whether the user is in that. That means you don't need to add a state key because the code is done for you. That is some of the filters.

Dynamic Get Where

Then the where. 00:29:48 You can add any table key equals to a certain value. That value could be another table like b.field or it could even be a global variable like we said we could set up. It can also be an id, a userid. The userid is already on the table. It could be like we've done it in this case just an integer which is one. We want to make sure that all the 00:30:18 sermons returned is published. If you have an unpublished sermon it shouldn't even return it at all.

Dynamic Get Ordering

That is setting up a getlistquery with pagination through this ordering method we just saying use the a.ordering 00:30:39 and send. You can order all the items. Just add many as you like. Be sure that the table that you ordering, could even use a name. It could be a name as an ordering table key. Then you could do a descending or ascending. It would be added to the query. 00:31:03 That is also added ordering to the data set from your dynamic get method. Here with the joint view tables you can do very nice dependency calls from other tables in the back end, and bring the data together into one items array. 00:31:25 That's what dynamic get is for. As you saw we have a main source on the model.

Then we have this other one called getpreacher. That is another dynamic get function which we have 00:31:45 looked at. It's called this one getpreacher. If we open it, we see it's a getcustom. We gave it a custom name called getpreacher. This is its relationships, So it basically having no 00:32:04 relationship there. Neither here. It's not linking to other tables. It's simply getting the preachers details right there(see video) simple as that. But it has a filter which is basically using the same integer and access levels as the filters. It's also using a 'where' I suppose, yes published, and it doesn't need ordering, because it's just one preacher. 00:32:41 It doesn't have any globally settings. That is getpreacher. From the this settings here, component builder writes all this code. You'd see that we have this function everywhere called UIkitComp.

Then we using a global static method, getuikitcomp. It's a method that I built if you know Uikit, if you don't know it, go to getUIkit or just google.com it. It's a JavaScript, HTML Library, CSS JavaScript library, which really makes modeling of your views very nice and easy. It has components that you can use, like tool tip, and model, 00:33:45 all these kind of models. Gordian is another component. We don't load all of it's components every time. What we've done is we've written in PHP, a method that looks at fields that are text area fields. It's not looking at every field, is only looking at the text fields and editor fields. In this component we know that this description field, is a editor field, and so we are sending it to this(getuikitComp) method.

You can go look at this method in your helper class(sermondistributor). It has the classes that already has been identified which is what this 00:34:56 initial this field name, field value model field value is actually holding. It's holding any component names that already has been identified. This gets pass also here(classes) with the content. Then we check in the content whether there is a class='uk-' and if it's not false, we start looping to check what are all the components that are in there. Here is the list of the components that are available. On-the-fly we are determining whether these components should be loaded. Just by looking at the content that was placed in the description field. Then we added back to this array(see video). It updates this, eventually you have an array of all those items. In the view, we go to the view, 00:36:00 which in this case is going to be preacher. We open the view .HTML. We get to a place where everything is going to be happening. These are of the components that when component builder compiled the application, it looks inside of the content of your site view, as well as your custom admin view and it identify that these components must be loaded for uikit. It places it here dynamically but since you could've added some components inside of the script that is stored in the description area, it now has this getuikitcomponent which reach back into the model. In the model gets this variables value through a method which is here at the bottom of the page. There it is 00:37:04 getuikitComp. Through this method it is reaching in getting that array. Once it has that array we check whether it is set. Whether it is an array and if it is an array we set it to the array that is already on this page. Then over here we loop through that array we load in those components, CSS and JavaScript as required.

You can be sure that the uikits needed components will be loaded on the page. Simply by user adding some of that components to its description as style. Because the way uikit works is you just like Bootstrap you just add the class name to the specific div or html tag. Then it activates the needed scripting around it. Which is a nice library but it's 00:38:08 quite heavy and you don't want it on the page every time. I know you could have done this through JavaScript. They have a way for you to do this through the JavaScript, but I do the most of the work in the html, to leave the load on the server, and that the browser already has much more leverage and freedom. That's why we added this feature. This is maybe beyond the scope of the dynamic get. It is all also placed in the query that is developed by dynamic get, that's partly why it fits. Once you've got your dynamic get set up, you will add these dynamic gets to either site views or to custom admin views. These dynamic gets is what gets the data for you. It's where you model the data that you want to work with. You can then 00:39:12 use them in site views and custom admin views. Next stop we will look at adding it to a site view and how all of that works.

Clone this wiki locally