11 045 Adding your own rule validation to a field in JCB
Amigo edited this page 2019-08-26 14:10:54 +02:00


00:00:00 (Click on these time links to see Youtube video)

I would like to demonstrate how to add rules to the Model, basically to a Field. The custom rules are used to test a value before submitting it to the database. This is quite a good feature to have in your Component. 00:00:32 For this demonstration the Hello World Component is going to be used and a rule is going to be added to one of its Fields. Open Greeting (first) as the Admin View. To change the Field in it this(See video) 'Greetings' are used. 00:01:11 The Field attributes do not have the validation option switch in place. We might start shipping JCB with this new validation property which is not new, it has just not been added yet. If you have a version of JCB that does not have it set, then whatever Fieldtype which is selected and can be edited by going to the green button, or you could edit the Fieldtype by going to Fieldtypes. 00:01:47 Close out of Edit the Admin View again then go to Fieldtypes in Admin View.

Select Fieldtype To Add Validation - Textarea


A Fieldtype may be selected to add this validation too, for example, the Textarea. It has a filter in place. A validation is added just below it. Click a plus. It is 'adjustable', it is not 'required' and it is not 'translatable'. Then give it a little description. 00:02:22 We got it all set. A value would not be added because if you do not want to use it, leave it empty. Save and close. With the Textarea been done, go back to the Admin View Greetings and again open that Greetings(Textarea) field. Now, this 'validate' property is available to us and can be copied and added in the XML field definition.

Custom Validation Rule


Now we want to have a Custom validation here. There are built-in Joomla validations as well. But you can also set up a Custom validation rule and this is known as 'form rule'. This is what we want to demonstrate. We are going to call our rule 'strlenTen'. The string must be longer than 10 characters. 00:03:36 I am going to copy this 'strlenTen' again. Save and close. So now that the validation is set. JCB does not have an area for you to write the rule and have it included. So you have to write the file yourself, and put it into the custom folder of JCB and include it in the component that it can place it in the correct place.

JCB - Already Has Field Path And Rule Path


JCB creates a folder called 'rules' and in the forms, every XML has a field path and a rule path so you can add a rule to this folder(models/rules')

First Create A Rule

00:04:41 (Please follow on video)

First, create a rule. This rule 'JFormRule' is added. In the folder structure, in the Admin area, Components, Component Builder, and there is this folder called 'Custom'. In this folder, I have created 'strlenTen' file and placed this code here, it is a basic JFormRule. Now that our file is in place, it should be added to the component. Go to the components and open Hello World (v2) component. 00:06:03 Go to Settings and there at 'Adding Custom Files and Folders, click on 'Create component files and folders for this Joomla Component'. Click on that, and 'OK'. In 'A New Component Files & Folders' we want to add one file. Since we have added it to that custom folder, everything in that custom folder will come up as a file that you can select. So there is the 'strlenTen' file. Now to show the path that leads to the place where we want it to place the file. 00:06:38

In the back end of the component, go to models, forms, and this greeting form is targeted. It has '/models/rules'. Copy that. Remember that it is the Admin area and then '/models/rules'. 00:07:07 This Admin is the way the package is built. The target place should be the place inside the package. This is always the case for both Folders and Fields. In the Folder you want it to add it to the Admin models rules folder. Then you need to decide whether you want this file to be updated. At this stage that files do not need any updating.

Adding A License Tag


But we can change that. This new license tag has just been added to it(see video) as well as this '###BOM###'. When the file gets taken, it will take this part away and replace this with your component's license and so the file will become branded like every other file in your component. 00:08:06 Even if you use it in areas or components other than the one you originally made it for, it will dynamically look like it was made for it because it adds that components data at the header of the file. Even if you had the components name somewhere else in this, you can replace it with the well-known ###component### and it will be placed with the component name. With our file in place, we want it to be updated. Compile the component and see it in action. In 'A New Component Files & Folders' just tick this as 'Yes', that the file should be updated. 00:08:54 Then save and close. Closeout of the Component again. There is a shortcut to that file area below 'hello_world'. Then go to the Compiler and compile the component. Install the Component. Go look at the code to see what happened. In the components Admin area, if rules are opened, there is the file 'strlenTen', it was placed into rules folder. If we open 'strlenTen' file, it may be seen that it added our copy notice to the header of the file. Also, look at our greeting.xml. The validation is 'strlen.Ten'.

Testing The Validation


Now let us test this. Open the component in the back end, go to 'Greetings' and click 'New'. 'Greetings' had been set to have a length of at least 10 characters. Let's test this. 'Greeting' is added which does not have enough characters and click 'Save'. It tells us, 'WARNING: Invalid Field: Greetings'. 00:10:36 One little change is necessary to get this to work. For some reason, they want this file all lowercase. The 'T' uppercase in 'strlen.Ten' need to change to 'T' lowercase. Do this also with the file in our Custom folder. Then in the actual file, the 'T' should be lowercase. Perhaps the upper case camel rule had been used to sort of break-up the name to get it to work. 00:11:20 The component needs to be updated to include this file since the name has been changed, and will no longer know where it is. Go directly to that file area with the shortcut below 'hello_world' and see it is no longer selected. Scroll down, and select it again and save and close. Now that the little glitch which I had created is fixed, go back to see this again in action and save. 00:11:57 It shows 'Invalid field: Greetings'. That is is not very helpful. Maybe you would like to show a custom message so that the user would at least know more about what is going on. Before we do that let's add enough values and see that it actually saves. It was saved successfully. Close. Our 'Greetings' has been saved and our value here(Greetings) is more than 10 characters, so it was valid.

Add A Custom Messages To Validation


Now let's add a custom message to our validation. Remember whatever you do to the live version of this file, will not necessarily become part of the next compilation. Adding a custom message you have to go back to Component Builder, Custom, and to that actual file(strlenten.php) and add it in there(see video) then recompile the component and it will automatically update the live demonstration. The other way to test before doing it live or before adding it to the core of your component is to go to the live file which as we saw, is in 'com_hello_world', models, rules, 'strlenten.php'. 00:13:17 Now add the custom message in here to test. The element'->addAttribute' is used as the element message: 'Field must have more than 10 characters!' That is one way of doing this, of course, there is another way.

Add Messages In XML Path


Again this takes us back to JCB and we go to the Fields. Open 'Greetings' and look for the attribute message. It does not have a message. To add this attribute, click on Field Type and scroll down. Place this under 'Description'. Say 'Message'. It is changeable, translatable and optional. 00:14:21 It is not compulsory. With all set, Save and close. Let's add this message in Field Information in our XML field. Before we save this and go this path, let's first test our live change to the file and see if that also works. 00:15:00 In the file we added this attribute to the element and it returns false. Good, let's go test this. We again open Name item and we take away a few characters and click save. We get a 'WARNING' message that it needs more than 10 characters. 00:15:34

Now, use the other one which I suppose is more convenient unless you are checking multiple things and would like to give multiple error messages based on those results then this implementation is the better option. But if you just got one message and it just needs to explain to the user one issue, then using the XML path I suppose it is more convenient. In our custom file, we have not added that change. Compile the component and install it. First, save and close this Field so that the changes can be captured. Then go to the Compiler and compile the component and install. 00:16:20 In the code the custom message is again not showing up. The 'greeting.xml' is now this translated 'message='COM_HELLO_WOLRD_GREETING_GREETING_MESSAGES'. Test this. Open Name Field and first save it the way it is. 00:16:56 Take away two characters and save again. There is the expected message. This time around that message can be translated and as well it is in the XML file, it is not part of the actual function. We have now successfully added our own validation rule to one field within a view and were able to include that rule into our component on compilation by using adding custom files.