First, we decided to use events that can be activated on a button hit. However, nothing happened when we added a child. We checked this by adding the event console.log() class to the static:
pub/static/adminhtml/Magento/backend/en_US/Magento_Ui/js/lib/core/events.js
/**
* Calls callback when name event is triggered.
* @param {String} events
* @param {Function} callback
* @return {Object} reference to this
*/
on: function (events, callback, ns) {
var iterator;
if (arguments.length < 2) {
ns = callback;
}
console.log('events: ');
console.log(events);
iterator = addHandler.bind(null, this, ns);
_.isObject(events) ?
_.each(events, iterator) :
iterator(callback, events);
return this;
},
and added a log to the processingAddChild dynamic-rows
method:
pub/static/adminhtml/Magento/backend/en_US/Magento_Ui/js/dynamic-rows/dynamic-rows-grid.js
processingAddChild: function (ctx, index, prop) {
console.log('processingAddChild fire');
if (this._elems.length > this.pageSize) {
return false;
}
this.showSpinner(true);
this.addChild(ctx, index, prop);
console.log('processingAddChild END\'S');
},
The result:
Some additional options that you may think of:
- Replace this button for your own with a js-component expanding this
button. Hence, you'll get full control over it.
- Use simple events like click for home-elements (probably, not the
best decision).
- Replace a js-component for a dynamic row for your own and add the
code you need at the beginning of the
processingAddChild
method
processing and then call the parent method (this._super())
.
The first and third options look like the best solution if you need to add your own elements and not to modify the existing Magento code.
Uploader requires array of the values name, type, tmp_name, error, size. So when we are using uploader in dynamic rows, we need to provide array of above values to uploader object. Try below
$docs = array();
$docattchments = isset($_FILES['docattchment']) ? $_FILES['docattchment'] : array();
foreach ($docattchments as $key => $docattchment){
foreach ($docattchment as $doc){
if($key == 'name'){
$docs['name'] = $doc['image'];
}
if($key == 'type'){
$docs['type'] = $doc['image'];
}
if($key == 'tmp_name'){
$docs['tmp_name'] = $doc['image'];
}
if($key == 'error'){
$docs['error'] = $doc['image'];
}
if($key == 'size'){
$docs['size'] = $doc['image'];
}
}
}
if(!empty($docs)){
$result = $this->imageUploader->saveFileToTmpDir($docs);
$result['cookie'] = [
'name' => $this->_getSession()->getName(),
'value' => $this->_getSession()->getSessionId(),
'lifetime' => $this->_getSession()->getCookieLifetime(),
'path' => $this->_getSession()->getCookiePath(),
'domain' => $this->_getSession()->getCookieDomain(),
];
}
Best Answer
Your fieldset should look like this: