Files
Emanuel Almeida 6b3a6f2698 feat: refactor 30+ skills to Anthropic progressive disclosure pattern
- All SKILL.md files now <500 lines (avg reduction 69%)
- Detailed content extracted to references/ subdirectories
- Frontmatter standardised: only name + description (Anthropic standard)
- New skills: brand-guidelines, spec-coauthor, report-templates, skill-creator
- Design skills: anti-slop guidelines, premium-proposals reference
- Removed non-standard frontmatter fields (triggers, version, author, category)

Plugins affected: infraestrutura, marketing, dev-tools, crm-ops, gestao,
core-tools, negocio, perfex-dev, wordpress, design-media

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 15:05:03 +00:00

396 lines
9.3 KiB
Markdown

---
name: perfex-menus
description: Criação de menus para módulos Perfex CRM — sidebar, menus de cliente, add_sidebar_menu_item(), posições e ícones. Baseado apenas na documentação oficial.
---
# /perfex-menus - Menus Perfex CRM
Criação de menus para módulos. **Zero assumptions, zero hallucinations** - apenas documentação oficial.
---
## Documentação Base
- [Create Menu Items](https://help.perfexcrm.com/create-menu-items/)
---
## Menu Admin (Sidebar)
### Adicionar Item Simples
```php
// No init file do módulo
hooks()->add_action('admin_init', 'meu_modulo_init_menu');
function meu_modulo_init_menu()
{
$CI = &get_instance();
$CI->app_menu->add_sidebar_menu_item('meu-modulo-menu', [
'name' => _l('meu_modulo_title'),
'href' => admin_url('meu_modulo'),
'position' => 25,
'icon' => 'fa fa-cube',
]);
}
```
### Parâmetros
| Parâmetro | Tipo | Descrição |
|-----------|------|-----------|
| `name` | string | Texto do menu (usar _l() para tradução) |
| `href` | string | URL destino |
| `position` | int | Posição no menu (menor = mais acima) |
| `icon` | string | Classe Font Awesome |
| `collapse` | bool | Se tem sub-items (default: false) |
| `badge` | array | Badge com contagem |
---
## Menu com Sub-Items (Collapsible)
```php
hooks()->add_action('admin_init', 'meu_modulo_init_menu');
function meu_modulo_init_menu()
{
$CI = &get_instance();
// Menu pai (collapsible)
$CI->app_menu->add_sidebar_menu_item('meu-modulo-menu', [
'name' => _l('meu_modulo_title'),
'collapse' => true,
'position' => 25,
'icon' => 'fa fa-cube',
]);
// Sub-item 1
$CI->app_menu->add_sidebar_children_item('meu-modulo-menu', [
'slug' => 'meu-modulo-lista',
'name' => _l('list'),
'href' => admin_url('meu_modulo'),
'position' => 1,
'icon' => 'fa fa-list',
]);
// Sub-item 2
$CI->app_menu->add_sidebar_children_item('meu-modulo-menu', [
'slug' => 'meu-modulo-criar',
'name' => _l('create'),
'href' => admin_url('meu_modulo/create'),
'position' => 2,
'icon' => 'fa fa-plus',
]);
// Sub-item 3
$CI->app_menu->add_sidebar_children_item('meu-modulo-menu', [
'slug' => 'meu-modulo-settings',
'name' => _l('settings'),
'href' => admin_url('meu_modulo/settings'),
'position' => 3,
'icon' => 'fa fa-cog',
]);
}
```
---
## Posições Padrão Admin
| Posição | Menu Item |
|---------|-----------|
| 1 | Dashboard |
| 5 | Customers |
| 10 | Sales |
| 15 | Subscriptions |
| 20 | Expenses |
| 25 | Contracts |
| 30 | Projects |
| 35 | Tasks |
| 40 | Tickets |
| 45 | Leads |
| 50 | Knowledge Base |
| 55 | Utilities |
| 60 | Reports |
**Dica:** Usar posições intermédias (ex: 27, 32) para inserir entre items existentes.
---
## Badge (Contador)
```php
$CI->app_menu->add_sidebar_menu_item('meu-modulo-menu', [
'name' => _l('meu_modulo_title'),
'href' => admin_url('meu_modulo'),
'position' => 25,
'icon' => 'fa fa-cube',
'badge' => [
'value' => meu_modulo_count_pending(),
'type' => 'danger', // primary, success, warning, danger, info
'show_on_sidebar' => true,
],
]);
// Função de contagem
function meu_modulo_count_pending()
{
$CI = &get_instance();
$CI->db->where('status', 'pending');
return $CI->db->count_all_results(db_prefix() . 'meu_modulo');
}
```
---
## Menu Condicional (Permissões)
```php
function meu_modulo_init_menu()
{
// Só mostrar se staff tem permissão
if (!staff_can('view', 'meu_modulo')) {
return;
}
$CI = &get_instance();
$CI->app_menu->add_sidebar_menu_item('meu-modulo-menu', [
'name' => _l('meu_modulo_title'),
'href' => admin_url('meu_modulo'),
'position' => 25,
'icon' => 'fa fa-cube',
]);
}
```
---
## Menu Cliente (Área Cliente)
### Adicionar Item
```php
hooks()->add_action('clients_init', 'meu_modulo_client_menu');
function meu_modulo_client_menu()
{
// Só mostrar se cliente logado
if (!is_client_logged_in()) {
return;
}
add_theme_menu_item('meu-modulo', [
'name' => _l('meu_modulo_title'),
'href' => site_url('meu_modulo'),
'position' => 35,
'icon' => 'fa fa-cube',
]);
}
```
### Posições Padrão Cliente
| Posição | Menu Item |
|---------|-----------|
| 5 | Knowledge Base |
| 10 | Projects |
| 15 | Invoices |
| 20 | Contracts |
| 25 | Estimates |
| 30 | Proposals |
| 40 | Subscriptions |
| 45 | Support |
| 99 | Registration |
| 100 | Login |
---
## Menu no Setup (Administração)
Para adicionar configurações ao menu Setup:
```php
hooks()->add_action('admin_init', 'meu_modulo_setup_menu');
function meu_modulo_setup_menu()
{
$CI = &get_instance();
// Adicionar ao sub-menu de Setup
$CI->app_menu->add_setup_menu_item('meu-modulo-settings', [
'name' => _l('meu_modulo_settings'),
'href' => admin_url('meu_modulo/settings'),
'position' => 50,
'icon' => 'fa fa-cog',
]);
}
```
---
## Ícones Font Awesome 4
### Mais Usados
| Ícone | Classe |
|-------|--------|
| Lista | `fa fa-list` |
| Adicionar | `fa fa-plus` |
| Editar | `fa fa-edit` / `fa fa-pencil` |
| Apagar | `fa fa-trash` |
| Configurações | `fa fa-cog` / `fa fa-cogs` |
| Utilizador | `fa fa-user` |
| Utilizadores | `fa fa-users` |
| Ficheiro | `fa fa-file` / `fa fa-file-o` |
| Pasta | `fa fa-folder` / `fa fa-folder-o` |
| Email | `fa fa-envelope` / `fa fa-envelope-o` |
| Calendário | `fa fa-calendar` |
| Gráfico | `fa fa-bar-chart` / `fa fa-line-chart` |
| Dinheiro | `fa fa-money` |
| Cubo | `fa fa-cube` |
| Sino | `fa fa-bell` |
| Check | `fa fa-check` |
| Warning | `fa fa-exclamation-triangle` |
| Info | `fa fa-info-circle` |
### Referência Completa
[Font Awesome 4.7 Icons](https://fontawesome.com/v4/icons/)
---
## Exemplos Completos
### Módulo com Menu Completo
```php
// modules/meu_modulo/meu_modulo.php
hooks()->add_action('admin_init', 'meu_modulo_init_menus');
hooks()->add_action('clients_init', 'meu_modulo_client_menu');
/**
* Menus Admin
*/
function meu_modulo_init_menus()
{
if (!staff_can('view', 'meu_modulo')) {
return;
}
$CI = &get_instance();
// Menu principal com sub-items
$CI->app_menu->add_sidebar_menu_item('meu-modulo', [
'name' => _l('meu_modulo'),
'collapse' => true,
'position' => 27,
'icon' => 'fa fa-cube',
'badge' => [
'value' => meu_modulo_count_pending(),
'type' => 'warning',
'show_on_sidebar' => true,
],
]);
// Sub-items
$CI->app_menu->add_sidebar_children_item('meu-modulo', [
'slug' => 'meu-modulo-dashboard',
'name' => _l('dashboard'),
'href' => admin_url('meu_modulo'),
'position' => 1,
'icon' => 'fa fa-tachometer',
]);
$CI->app_menu->add_sidebar_children_item('meu-modulo', [
'slug' => 'meu-modulo-items',
'name' => _l('items'),
'href' => admin_url('meu_modulo/items'),
'position' => 2,
'icon' => 'fa fa-list',
]);
if (staff_can('create', 'meu_modulo')) {
$CI->app_menu->add_sidebar_children_item('meu-modulo', [
'slug' => 'meu-modulo-create',
'name' => _l('create'),
'href' => admin_url('meu_modulo/create'),
'position' => 3,
'icon' => 'fa fa-plus',
]);
}
// Settings no Setup
if (is_admin()) {
$CI->app_menu->add_setup_menu_item('meu-modulo-settings', [
'name' => _l('meu_modulo_settings'),
'href' => admin_url('meu_modulo/settings'),
'position' => 80,
'icon' => 'fa fa-cog',
]);
}
}
/**
* Menu Cliente
*/
function meu_modulo_client_menu()
{
if (!is_client_logged_in()) {
return;
}
add_theme_menu_item('meu-modulo', [
'name' => _l('meu_modulo'),
'href' => site_url('meu_modulo'),
'position' => 32,
'icon' => 'fa fa-cube',
]);
}
/**
* Contador para badge
*/
function meu_modulo_count_pending()
{
$CI = &get_instance();
$CI->db->where('status', 'pending');
return $CI->db->count_all_results(db_prefix() . 'meu_modulo');
}
```
---
## Anti-Patterns (NUNCA FAZER)
| Anti-Pattern | Risco | Alternativa |
|--------------|-------|-------------|
| Menu sem verificar permissões | Acesso não autorizado | `staff_can()` |
| Posição fixa sem considerar conflitos | Sobreposição | Posições intermédias |
| Hardcode nome do menu | Não traduzível | Usar `_l()` |
| ID duplicado | Menu não aparece | IDs únicos com prefixo |
| Badge com query pesada | Performance | Cache ou contagem eficiente |
---
## Checklist Menu
```
1. [ ] Hook correcto (admin_init / clients_init)
2. [ ] ID único com prefixo do módulo
3. [ ] Permissões verificadas
4. [ ] _l() para nome do menu
5. [ ] Posição apropriada (não conflitar)
6. [ ] Ícone Font Awesome 4 válido
7. [ ] Badge eficiente (se usado)
8. [ ] Sub-items com slugs únicos
```
---
**Versão:** 1.0.0 | **Autor:** Descomplicar®
**Fonte:** help.perfexcrm.com/create-menu-items