Panel Settings and Tool Hooks
The thirty-seven placement points of the settings, staff, module, automation and tool screens: tab points, forms and toolbars.
Overview
The placement points of the settings, staff, module, automation and tool screens live here.
What marks this group out is how many tab points it holds: the general, security, tax, account, automation and staff settings each carry their own. All of them hand you an object rather than HTML, and the tab is added through a method call.
Reference
A new tab in the general settings
Runs once the general settings tabs are built.
Hook::add('ui:admin.settings.tabs', 10, function ($tab) {
$tab->add('acme', 'Acme', Acme::renderSettings());
});A new tab in the security settings
Runs once the security settings tabs are built.
Hook::add('ui:admin.security_settings.tabs', 10, function ($tab) {
$tab->add('acme-sec', 'Acme', Acme::renderSecurity());
});A new tab in the tax settings
Runs once the tax settings tabs are built.
Hook::add('ui:admin.taxation_settings.tabs', 10, function ($tab) {
$tab->add('acme-tax', 'Acme', Acme::renderTax());
});A new tab in the account settings
Runs once the tabs of an administrator’s own account settings are built.
Hook::add('ui:admin.account_settings.tabs', 10, function ($tab, $udata) {
$tab->add('acme-me', 'Acme', Acme::renderMyPrefs((int) ($udata['id'] ?? 0)));
});A new tab in the automation settings
Runs once the automation settings tabs are built.
Hook::add('ui:admin.automation_settings.tabs', 10, function ($tab) {
$tab->add('acme-cron', 'Acme', Acme::renderCronSettings());
});A new tab on the staff form
Runs once the staff edit tabs are built.
Hook::add('ui:admin.staff_edit.tabs', 10, function ($tab, $detail) {
// Ekleme modunda kimlik YOK.
if (!($detail['id'] ?? 0)) return;
$tab->add('acme', 'Acme', Acme::renderStaffTab((int) $detail['id']));
});A new tab in the action logs
Runs once the action log tabs are built.
Hook::add('ui:admin.tools_actions_list.tabs', 10, function ($tab) {
// Bu ekranda metot farkli.
$tab->set('acme', 'Acme', Acme::renderActions());
});The bottom of the general settings
Appears at the very bottom of the general settings page.
null and false are skipped, so return null when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.Hook::add('ui:admin.settings.bottom', 10, function () {
return '<div class="alert alert-info">Acme</div>';
});The staff list toolbar
Appears in the toolbar of the staff list.
null and false are skipped, so return null when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.Hook::add('ui:admin.staff_list.toolbar', 10, function () {
return '<div class="alert alert-info">Acme</div>';
});Above the table on the staff list
Appears immediately above the staff table.
null and false are skipped, so return null when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.Hook::add('ui:admin.staff_list.before_table', 10, function () {
return '<div class="alert alert-info">Acme</div>';
});The privilege list toolbar
Appears in the toolbar of the privilege group list.
null and false are skipped, so return null when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.Hook::add('ui:admin.privilege_list.toolbar', 10, function () {
return '<div class="alert alert-info">Acme</div>';
});Above the table on the privilege list
Appears immediately above the privilege table.
null and false are skipped, so return null when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.Hook::add('ui:admin.privilege_list.before_table', 10, function () {
return '<div class="alert alert-info">Acme</div>';
});The add-on list toolbar
Appears in the toolbar of the add-on list.
null and false are skipped, so return null when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.Hook::add('ui:admin.tools_addons_list.toolbar', 10, function () {
return '<div class="alert alert-info">Acme</div>';
});The task list toolbar
Appears in the toolbar of the panel task list.
null and false are skipped, so return null when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.Hook::add('ui:admin.tools_tasks_list.toolbar', 10, function () {
return '<div class="alert alert-info">Acme</div>';
});Above the staff form
Appears above the staff add and edit form.
null and false are skipped, so return null when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.Hook::add('ui:admin.staff_edit.before_content', 10, function () {
return '<div class="alert alert-info">Acme</div>';
});Below the staff form
Appears below the same form.
null and false are skipped, so return null when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.Hook::add('ui:admin.staff_edit.bottom', 10, function () {
return '<div class="alert alert-info">Acme</div>';
});Above the privilege form
Appears above the privilege group form.
null and false are skipped, so return null when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.Hook::add('ui:admin.privilege_edit.before_content', 10, function () {
return '<div class="alert alert-info">Acme</div>';
});Below the privilege form
Appears below the same form.
null and false are skipped, so return null when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.Hook::add('ui:admin.privilege_edit.bottom', 10, function () {
return '<div class="alert alert-info">Acme</div>';
});Above the add-on settings
Appears on the add-on settings page, above the module’s own content.
null and false are skipped, so return null when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.Hook::add('ui:admin.addon_configure.before', 10, function ($module, $module_data) {
// Kanca HER eklentinin ayar sayfasinda calisir: kendinizinkini secin.
if (($module_data['name'] ?? '') !== 'Acme') return null;
return '<div class="alert alert-info">Acme</div>';
});Below the add-on settings
Appears on the same page, below the module’s content.
null and false are skipped, so return null when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.Hook::add('ui:admin.addon_configure.after', 10, function ($module, $module_data) {
// Kanca HER eklentinin ayar sayfasinda calisir: kendinizinkini secin.
if (($module_data['name'] ?? '') !== 'Acme') return null;
return '<div class="alert alert-info">Acme</div>';
});Above the module settings
Appears above the content on the module configuration page.
null and false are skipped, so return null when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.Hook::add('ui:admin.module_settings.before', 10, function () {
return '<div class="alert alert-info">Acme</div>';
});Below the module settings
Appears below the content on the same page.
null and false are skipped, so return null when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.Hook::add('ui:admin.module_settings.after', 10, function () {
return '<div class="alert alert-info">Acme</div>';
});Above the module page
Appears above the content on a module’s own management page.
null and false are skipped, so return null when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.Hook::add('ui:admin.module_page.before', 10, function ($module_key, $module) {
// Ornek BOS gelebilir.
if (!$module) return null;
return Acme::renderModuleBanner($module_key);
});Below the module page
Appears below the content on the same page.
null and false are skipped, so return null when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.Hook::add('ui:admin.module_page.after', 10, function ($module_key, $module) {
// Ornek BOS gelebilir.
if (!$module) return null;
return Acme::renderModuleBanner($module_key);
});The module list toolbar
Appears in the toolbar of the module list.
null and false are skipped, so return null when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.Hook::add('ui:admin.module_list.toolbar', 10, function () {
return '<div class="alert alert-info">Acme</div>';
});Above the grid on the module list
Appears above the module cards.
null and false are skipped, so return null when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.Hook::add('ui:admin.module_list.before_grid', 10, function () {
return '<div class="alert alert-info">Acme</div>';
});Above the theme settings
Appears above the content on the theme configuration page.
null and false are skipped, so return null when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.Hook::add('ui:admin.theme_settings.before', 10, function () {
return '<div class="alert alert-info">Acme</div>';
});Below the theme settings
Appears below the content on the same page.
null and false are skipped, so return null when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.Hook::add('ui:admin.theme_settings.after', 10, function () {
return '<div class="alert alert-info">Acme</div>';
});The bottom of the automation board
Appears at the very bottom of the scheduled task board.
null and false are skipped, so return null when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.Hook::add('ui:admin.automation_dashboard.bottom', 10, function () {
return '<div class="alert alert-info">Acme</div>';
});The bottom of the automation system tab
Appears below the scheduled task system settings.
null and false are skipped, so return null when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.Hook::add('ui:admin.automation_settings.system_tab.bottom', 10, function () {
return '<div class="alert alert-info">Acme</div>';
});Adding an operation to a task card
Appears in the operation area of the scheduled task cards, separately for every task.
null and false are skipped, so return null when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.Hook::add('ui:admin.automation_task_card.actions', 10, function () {
return '<div class="alert alert-info">Acme</div>';
});The analytics overview toolbar
Appears in the toolbar of the report overview page.
null and false are skipped, so return null when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.Hook::add('ui:admin.analytics.overview.toolbar', 10, function () {
return '<div class="alert alert-info">Acme</div>';
});The bottom of an analytics report
Appears at the very bottom of a report page.
null and false are skipped, so return null when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.Hook::add('ui:admin.analytics.report.bottom', 10, function () {
return '<div class="alert alert-info">Acme</div>';
});Adding an operation to the distribution card
Appears in the operation area of the distribution chart.
null and false are skipped, so return null when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.Hook::add('ui:admin.analytics.distribution_card.actions', 10, function () {
return '<div class="alert alert-info">Acme</div>';
});Above the import wizard
Appears above the import wizard.
null and false are skipped, so return null when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.Hook::add('ui:admin.tools_imports_wizard.before_content', 10, function () {
return '<div class="alert alert-info">Acme</div>';
});Below the licence details
Appears below the licence information screen.
null and false are skipped, so return null when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.Hook::add('ui:admin.help_license.after', 10, function () {
return '<div class="alert alert-info">Acme</div>';
});Above the updates screen
Appears above the version update screen.
null and false are skipped, so return null when you have nothing to add. The output enters the page unescaped — clean anything coming from outside yourself.Hook::add('ui:admin.help_updates.before_content', 10, function ($new_version) {
// Yeni surum yoksa dizi degil YANLIS gelir.
if (!is_array($new_version)) return null;
return '<div class="alert alert-info">Acme uyumluluk notu</div>';
});Pitfalls
Every tab point looks alike, but the action log screen uses another method. Code copied from a sibling point quietly does nothing here: no error appears, and neither does the tab.
The configuration array on the system tab holds the secret key that guards the scheduled task address. Printing it to the screen or copying it into your own store makes the tasks triggerable from outside.
Related Articles
Thanks for your feedback!
Our support team is here around the clock for anything you can't find above.