For adding image field, you can try using plugin and always try to avoid overwrite whole class.
Vendor/Module/etc/adminhtml/di.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<type name="Magento\User\Block\User\Edit\Tab\Main">
<plugin name="sr_stackexchange_user_form" type="Vendor\Module\Plugin\Block\Adminhtml\User\Edit\Tab\Main" sortOrder="1"/>
</type>
</config>
Vendor/Module/Plugin/Block/Adminhtml/User/Edit/Tab/Main.php
namespace Vendor\Module\Plugin\Block\Adminhtml\User\Edit\Tab;
class Main
{
/**
* Get form HTML
*
* @return string
*/
public function aroundGetFormHtml(
\Magento\User\Block\User\Edit\Tab\Main $subject,
\Closure $proceed
)
{
$form = $subject->getForm();
if (is_object($form)) {
$fieldset = $form->addFieldset('admin_user_image', ['legend' => __('User Image')]);
$fieldset->addField(
'user_image',
'image',
[
'name' => 'user_image',
'label' => __('Image'),
'id' => 'user_image',
'title' => __('Image'),
'required' => false,
'note' => 'Allow image type: jpg, jpeg, png'
]
);
$subject->setForm($form);
}
return $proceed();
}
}
Clear cache.
Configure the container with XML
Just create a NameSpace/ModuleName/view/adminhtml/ui_component/product_form.xml
file with this content:
<form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
<fieldset name="my_fieldset" class="My\Module\Ui\Component\Form\Fieldset">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="label" xsi:type="string" translate="true">More Product Links</item>
<item name="sortOrder" xsi:type="number">1000</item>
</item>
</argument>
</fieldset>
Dynamically create fields with PHP
This is where we will write our custom logic to inject fields into this fieldset.
So here is the NameSpace\ModuleName\Ui\Component\Form\Fieldset
PHP class which.
<?php
namespace My\Module\Ui\Component\Form;
use Magento\Framework\View\Element\UiComponent\ContextInterface;
use Magento\Framework\View\Element\UiComponentInterface;
use Magento\Ui\Component\Form\FieldFactory;
use Magento\Ui\Component\Form\Fieldset as BaseFieldset;
class Fieldset extends BaseFieldset
{
/**
* @var FieldFactory
*/
private $fieldFactory;
public function __construct(
ContextInterface $context,
array $components = [],
array $data = [],
FieldFactory $fieldFactory)
{
parent::__construct($context, $components, $data);
$this->fieldFactory = $fieldFactory;
}
/**
* Get components
*
* @return UiComponentInterface[]
*/
public function getChildComponents()
{
$fields = [
[
'label' => __('Field Label From Code'),
'value' => __('Field Value From Code'),
'formElement' => 'input',
],
[
'label' => __('Another Field Label From Code'),
'value' => __('Another Field Value From Code'),
'formElement' => 'input',
],
[
'label' => __('Yet Another Field Label From Code'),
'value' => __('Yet Another Field Value From Code'),
'formElement' => 'input',
]
];
foreach ($fields as $k => $fieldConfig) {
$fieldInstance = $this->fieldFactory->create();
$name = 'my_dynamic_field_' . $k;
$fieldInstance->setData(
[
'config' => $fieldConfig,
'name' => $name
]
);
$fieldInstance->prepare();
$this->addComponent($name, $fieldInstance);
}
return parent::getChildComponents();
}
}
NOTE : In above logic i added simple field. so you need to add logic for add more field using Jquery or Javascript or any other logic. i have give a siple logic how to add dynamic UI component field.
Best Answer
In your
<fieldset>
section you could use<insertListing>
.In the
ns
config you specify the listing UI component's name. Then you define this component separately in theview/adminhtml/ui_component/applicants_form_listing.xml
and describe what should be in the grid (you can check this thread for details).