diff --git a/README.md b/README.md index 339293f..83b004d 100644 --- a/README.md +++ b/README.md @@ -283,3 +283,148 @@ Methods in the table objects are: 1. **delete()** to delete the record from the database. --- + +### Get a Form in Joomla component + +The **Form** class of Joomla is used to create complex forms with flexible +layouts and dynamic properties. First, the form fields are defined in the +XML file. Then the view file gets the form from the model and layout file +displays the form. + +#### XML Form file +**admin/forms/part.xml** +```xml + +
+``` +Similarly you can add other fields to the XML file. + +#### View file +**admin/src/View/Part/HtmlView.php** + +This file is similar to the view file added earlier for the "Parts" view. +The view file gets the form from the model in the display() method. +```php +form = $this->get('Form'); + $this->item = $this->get('Item'); + + parent::display($tpl); + } +} +``` +The code will look for the method **getForm()** +and **getItem()** in the model file. +We need to get the item to get the ID +of the record in case of editing the existing record. + +#### Model file +**admin/src/Model/PartModel.php** + +We need to extend the model class with the **AdminModel**. +The AdminModel class extends FormModel class. The **getForm()** +method gets the Form object for the edit form. + +```php +namespace KW4NZ\Component\Depot\Administrator\Model; +use Joomla\CMS\MVC\Model\AdminModel; + +\defined('_JEXEC') or die; + +class PartModel extends AdminModel +{ + public function getForm($data = array(), $loadData = true) + { + $form = $this->loadForm('com_depot.part', + 'part', array('control' => 'jform', + 'load_data' => $loadData)); + + if (empty($form)) { + return false; + } + + return $form; + } +} +``` +The **loadForm()** and **preprocessForm()** methods are defined in +the FromModel class and the **bind()** method is defined in the +Form class. The first argument (name) of loadForm() is set to +"com_depot.part". The second argument (form xml source) is "part", +and the third argument is the associative array for options. + +The form is defined in the source file: **forms/part.xml** + +After you have set the $form variable with the Form object, +you check to see if you are loading data to the form. +If you want to pre-load data for the form, you include an element +called "load_data" that is set to a boolean true. +Then, the method calls the loadFormData() method to get the data +for the form. This method gets any previously loaded data from +the session or database. + +###### Modifying Form dynamically + +Inside the getForm() method, before returning the $form, you can modify the form with many methods of the Form class. You can easily fine-tune your forms dynamically before they are rendered. + +#### Layout file - rendering Form +**tmpl/part/edit.php** + +After you get the form in the view file ($this->form), the form +is rendered in the layout file (edit.php). + +```php +document->getWebAssetManager(); + +$wa->useScript('keepalive'); +$wa->useScript('form.validate'); +?> + +``` +The form validate script is required to submit the for. The renderField() method +of the Form class displays the field - both label and input. + +We can access the form using following URL: +```php +administrator/index.php?option=com_depot&view=part&layout=edit +``` +It displays edit.php layout file of the Part View. When the form is submitted, the +data is sent to the controller depending upon the action buttons in the toolbar. + +Please remember to add the additional folder `form` to the Manifest file "depot.xml", i.e. +just a line before `