Settings¶
O MIDDAG oferece uma DSL tipada para declarar settings de admin. A extension nunca instancia admin_setting_* do Moodle diretamente -- declara objetos tipados que o framework converte.
Moodle padrao vs MIDDAG¶
| Aspecto | Moodle padrao (settings.php) |
MIDDAG (DSL tipada) |
|---|---|---|
| Declaracao | $settings->add(new admin_setting_configtext(...)) |
new text('api_url', default: '...') |
| Organizacao | Tudo em settings.php monolitico |
get_settings() na extension ou {slug}_settings.php auto-discovered |
| Leitura | get_config('local_middag', 'key') retorna string\|false |
settings::get(enum) com tipo definido pelo enum |
| Escrita | set_config('key', $value, 'local_middag') |
settings::set(enum, $value) |
| Tipo seguro | Nao — tudo e string no banco, cast manual | Sim — enum implementa config_schema_interface com type() |
| Prefixo | Manual (risco de colisao) | Automatico: mdg_{slug}_{key} |
Moodle padrao (settings.php):
$settings->add(new admin_setting_configtext(
'local_middag/api_url',
get_string('api_url', 'local_middag'),
get_string('api_url_desc', 'local_middag'),
'https://api.example.com'
));
$settings->add(new admin_setting_configcheckbox(
'local_middag/enabled',
get_string('enabled', 'local_middag'),
'',
1
));
MIDDAG:
public function get_settings(): array {
return [
new page('general', settings: [
new text('api_url', default: 'https://api.example.com'),
new checkbox('enabled', default: true),
]),
];
}
Declarar settings inline¶
Para extensions com poucas settings, faca override de get_settings() na extension:
use local_middag\framework\moodle\settings\page;
use local_middag\framework\moodle\settings\text;
use local_middag\framework\moodle\settings\checkbox;
use local_middag\framework\moodle\settings\select;
public function get_settings(): array
{
return [
new page('general', settings: [
new text('api_url', default: 'https://api.example.com'),
new checkbox('enabled', default: true),
new select('mode', options: ['manual', 'auto'], default: 'manual'),
]),
];
}
Cada page vira uma aba no painel de admin. Cada setting dentro da page vira um campo.
Arquivo de settings dedicado¶
Para extensions com muitas settings, crie {slug}_settings.php no diretorio da extension. O framework descobre automaticamente.
namespace local_meuplugin\extensions\catalogo;
use local_middag\framework\moodle\settings\page;
use local_middag\framework\moodle\settings\text;
use local_middag\framework\moodle\settings\checkbox;
use local_middag\framework\moodle\settings\heading;
class catalogo_settings
{
public function pages(): array
{
return [
new page('general', settings: [
new heading('config', label: 'settings_catalogo', description: 'settings_catalogo_desc'),
new text('api_endpoint', default: 'https://api.example.com'),
new checkbox('sync_enabled', default: false),
]),
new page('notifications', settings: [
new text('email_subject', default: 'Novo item'),
]),
];
}
}
A convenção e: arquivo {slug}_settings.php com classe {slug}_settings e método pages().
Ler configuracoes em runtime¶
Use a facade settings com um enum de config:
use local_middag\facade\settings;
use local_middag\extensions\core\core_config;
$enabled = settings::get(core_config::api_enabled);
$mode = settings::get(core_config::debugmode);
Para gravar:
Para remover:
Config enum¶
Cada extension com settings deve ter um enum {slug}_config que implementa config_schema_interface. O enum define tipo, valor padrão e opções de cada setting:
namespace local_meuplugin\extensions\catalogo;
use local_middag\framework\contract\config_schema_interface;
use local_middag\framework\moodle\settings\setting_type;
enum catalogo_config: string implements config_schema_interface
{
case api_endpoint = 'api_endpoint';
case sync_enabled = 'sync_enabled';
case sync_interval = 'sync_interval';
public function type(): setting_type
{
return match ($this) {
self::sync_enabled => setting_type::checkbox,
default => setting_type::text,
};
}
public function default(): mixed
{
return match ($this) {
self::api_endpoint => 'https://api.example.com',
self::sync_enabled => false,
self::sync_interval => '3600',
};
}
public function options(): ?array
{
return null; // sem opções para estes tipos
}
public function is_lazy(): bool
{
return false;
}
}
Depois, leia em qualquer parte do código:
use local_middag\facade\settings;
use local_meuplugin\extensions\catalogo\catalogo_config;
$endpoint = settings::get(catalogo_config::api_endpoint);
Convencao de chaves¶
Chaves de config são resolvidas automaticamente pelo settings_resolver:
Exemplo: a setting api_endpoint da extension catalogo vira mdg_catalogo_api_endpoint no banco do Moodle.
Tipos de setting disponiveis¶
O MIDDAG suporta 21 tipos de setting, mapeados 1:1 para as classes admin_setting_config* do Moodle:
Tipos com armazenamento:
| Tipo | Classe DSL | Descricao |
|---|---|---|
text |
text |
Input de texto |
checkbox |
checkbox |
Boolean |
select |
select |
Dropdown |
password |
password |
Senha |
textarea |
textarea |
Texto multi-linha |
htmleditor |
htmleditor |
Editor rich text |
colourpicker |
colourpicker |
Seletor de cor |
duration |
duration |
Duracao (seg, min, h, dias) |
time |
time |
Hora do dia (HH:MM) |
multicheckbox |
multicheckbox |
Checkboxes multiplos |
multiselect |
multiselect |
Select multi-valor |
storedfile |
storedfile |
Arquivo via File API |
filepath |
filepath |
Caminho de arquivo |
directory |
directory |
Caminho de diretorio |
executable |
executable |
Executavel no servidor |
iplist |
iplist |
Lista de IPs |
portlist |
portlist |
Lista de portas |
autocomplete |
autocomplete |
Select com busca |
encrypted_password |
encrypted_password |
Senha criptografada |
Tipos de exibicao (sem armazenamento):
| Tipo | Classe DSL | Descricao |
|---|---|---|
heading |
heading |
Cabecalho de secao |
description |
description |
Texto estatico |
link |
link |
Link clicavel |
Fluxo¶
graph TD
EXT["Extension"] -->|"get_settings() ou {slug}_settings.php"| DSL["Objetos tipados (page, text, select...)"]
DSL -->|settings_resolver| MDL["admin_settingpage + admin_setting_*"]
MDL --> UI["Painel admin do Moodle"]
RT["Runtime"] -->|"settings::get(enum)"| SR["settings_support"]
SR -->|"resolve_config_key()"| DB["config do Moodle (mdg_slug_key)"]
Referencias¶
config_schema_interface-- contract para enums de configsetting_type-- enum com todos os tipos suportados