From f0b8e1ed02976d37902c414deb396067614f16af Mon Sep 17 00:00:00 2001 From: Thomas Kuschel Date: Thu, 5 Oct 2023 02:28:17 +0200 Subject: [PATCH] ADD MVC for part --- README.md | 145 +++++++++++++++++++++++++++++++ admin/form/part.xml | 9 ++ admin/src/Model/PartModel.php | 30 +++++++ admin/src/View/Part/HtmlView.php | 28 ++++++ admin/tmpl/part/edit.php | 24 +++++ depot.xml | 3 +- 6 files changed, 238 insertions(+), 1 deletion(-) create mode 100644 admin/form/part.xml create mode 100644 admin/src/Model/PartModel.php create mode 100644 admin/src/View/Part/HtmlView.php create mode 100644 admin/tmpl/part/edit.php 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'); +?> +
+ + form->renderField('title'); ?> + + + +
+``` +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 `services` : +```xml +form +``` + +--- diff --git a/admin/form/part.xml b/admin/form/part.xml new file mode 100644 index 0000000..4dbecc3 --- /dev/null +++ b/admin/form/part.xml @@ -0,0 +1,9 @@ + +
+ + diff --git a/admin/src/Model/PartModel.php b/admin/src/Model/PartModel.php new file mode 100644 index 0000000..6d2266e --- /dev/null +++ b/admin/src/Model/PartModel.php @@ -0,0 +1,30 @@ + + * @copyright (C) 2023 KW4NZ, + * @license GNU General Public License version 2 or later; see LICENSE.md + * @since 0.0.3 + */ + +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; + } +} diff --git a/admin/src/View/Part/HtmlView.php b/admin/src/View/Part/HtmlView.php new file mode 100644 index 0000000..62c75a9 --- /dev/null +++ b/admin/src/View/Part/HtmlView.php @@ -0,0 +1,28 @@ + +* @copyright (C) 2023 KW4NZ, +* @license GNU General Public License version 2 or later; see LICENSE.md +* @since 0.0.3 +*/ + +namespace KW4NZ\Component\Depot\Administrator\View\Part; +use Joomla\CMS\MVC\View\HtmlView as BaseHtmlView; + +\defined('_JEDEC') or die; + +class HtmlView extends BaseHtmlView +{ + protected $form; + protected $item; + + public function display($tpl = null) + { + $this->form = $this->get('Form'); + $this->item = $this->get('Item'); + + parent::display($tpl); + } +} diff --git a/admin/tmpl/part/edit.php b/admin/tmpl/part/edit.php new file mode 100644 index 0000000..5397f82 --- /dev/null +++ b/admin/tmpl/part/edit.php @@ -0,0 +1,24 @@ + + * @copyright (C) 2023 KW4NZ, + * @license GNU General Public License version 2 or later; see LICENSE.md + * @since 0.0.3 + */ +use Joomla\CMS\HTML\HTMLHelper; + +$wa = $this->document->getWebAssetManager(); + +$wa->useScript('keepalive'); +$wa->useScript('form.validate'); +?> +
+ + form->renderField('title'); ?> + + + +
diff --git a/depot.xml b/depot.xml index 33f4353..40019df 100644 --- a/depot.xml +++ b/depot.xml @@ -7,7 +7,7 @@ GPL v2 +; see LICENSE.md thomas@kuschel.at https://kuschel.at - 0.0.2 + 0.0.3 COM_DEPOT_XML_DESCRIPTION KW4NZ\Component\Depot @@ -55,6 +55,7 @@ + form services sql src