protected function renderButton($name, $model, $key, $index)
{
if (!isset($this->buttons[$name])) {
return '';
}
$button = $this->buttons[$name];
if ($button instanceof \Closure) {
$url = $this->createUrl($name, $model, $key, $index);
return call_user_func($button, $url, $model, $key);
}
if (!is_array($button)) {
throw new InvalidConfigException("Button should be either a Closure or array configuration.");
}
// Visibility :
if (isset($button['visible'])) {
if ($button['visible'] instanceof \Closure) {
if (!call_user_func($button['visible'], $model, $key, $index)) {
return '';
}
} elseif (!$button['visible']) {
return '';
}
}
// URL :
if (isset($button['url'])) {
$url = call_user_func($button['url'], $name, $model, $key, $index);
} else {
$url = $this->createUrl($name, $model, $key, $index);
}
// label :
if (isset($button['label'])) {
$label = $button['label'];
if (isset($button['encode'])) {
$encodeLabel = $button['encode'];
unset($button['encode']);
} else {
$encodeLabel = true;
}
if ($encodeLabel) {
$label = Html::encode($label);
}
} else {
$label = '';
}
// icon :
if (isset($button['icon'])) {
$icon = $button['icon'];
$label = Html::icon($icon) . (empty($label) ? '' : ' ' . $label);
}
$options = array_merge(ArrayHelper::getValue($button, 'options', []), $this->buttonOptions);
return Html::a($label, $url, $options);
}