ADD B4 Actions: Save and View
This commit is contained in:
87
README.md
87
README.md
@ -439,3 +439,90 @@ just a line before `<folder>services</folder>` :
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Adding administrator's actions (Back-end) - Save and Cancel
|
||||
In the form View, you can add action buttons like "Save" and "Cancel" to submit the form
|
||||
or cancel the editing respectively. These buttons are added to the toolbar.
|
||||
|
||||
These buttons require compound tasks (controller and method). For example,
|
||||
|
||||
- Save and Edit: part.apply
|
||||
- Save and Close: part.save
|
||||
- Cancel: part.cancel
|
||||
|
||||
#### View file
|
||||
**admin/src/View/Part/HtmlView.php**
|
||||
In the View file, we create a new method to add a toolbar: `addToolbar()`. The
|
||||
toolbar hides the sidebar menu on forms, sets the title and adds action buttons.
|
||||
```php
|
||||
use Joomla\CMS\Factory;
|
||||
use Joomla\CMS\MVC\View\HtmlView as BaseHtmlView;
|
||||
use Joomla\CMS\Toolbar\Toolbar;
|
||||
use Joomla\CMS\Toolbar\ToolbarHelper;
|
||||
|
||||
protected function addToolbar()
|
||||
{
|
||||
Factory::getApplication()->getInput()->set('hidemainmenu', true);
|
||||
ToolbarHelper::title('Part: Add');
|
||||
|
||||
ToolbarHelper::apply('part.apply');
|
||||
ToolbarHelper::save('part.save');
|
||||
ToolbarHelper::cancel('part.cancel', 'JTOOLBAR_CLOSE');
|
||||
}
|
||||
```
|
||||
The display() calls this method to include the toolbar.
|
||||
```php
|
||||
public function display($tpl = null)
|
||||
{
|
||||
$this->form = $this->get('Form');
|
||||
|
||||
$this->addToolbar();
|
||||
|
||||
parent::display($tpl);
|
||||
}
|
||||
```
|
||||
#### Controller file
|
||||
**admin/src/Controller/PartController.php***
|
||||
Now, when these action buttons are clicked, Joomla will look for apply(), save() or cancel()
|
||||
methods in the Part controller. So, create a controller clss that will extend FormController.
|
||||
These methods are already defined in the parent class.
|
||||
```php
|
||||
use Joomla\CMS\MVC\Controller\FormController;
|
||||
|
||||
class PartController extends FormController
|
||||
{
|
||||
}
|
||||
```
|
||||
#### Model file
|
||||
|
||||
**admin/src/model/PartModel.php**
|
||||
|
||||
If you click on Save button, it will save the data and redirect to the editing screen. However, the data will not be present in the form. Though, we have set `$loadData` to true, we also need to create a method `loadFormData()` to get the data for the form.
|
||||
|
||||
```php
|
||||
protected function loadFormData()
|
||||
{
|
||||
$app = Factory::getApplication();
|
||||
$data = $app->getUserState('com_depot.edit.part.data', []);
|
||||
|
||||
if (empty($data)) {
|
||||
$data = $this->getItem();
|
||||
}
|
||||
|
||||
return $data;
|
||||
}
|
||||
```
|
||||
First, this method tries to get the data from the session. If it fails to get data from the
|
||||
session, then it gets data from the database. The `getItem()` method is defined in the
|
||||
parent class.
|
||||
|
||||
Suppose the user has filled out the form to add a new item but has some invalid data in the
|
||||
form. In this case, the save will not be successful, so the data is not saved in the
|
||||
database. It would be very frustrating if the user hat to reenter all the fields to fix a
|
||||
single error. To handle this scenario, you save the entered data in the user's session.
|
||||
Only after the save is successful, you clear this out of the session.
|
||||
|
||||
So, you either have data from the database, which you can get with `getItem()`, or you have
|
||||
data from the session, which you can get with `getUserSate()`.
|
||||
|
||||
---
|
||||
|
Reference in New Issue
Block a user