Pular para conteúdo

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:

settings::set(core_config::api_enabled, true);

Para remover:

settings::unset(core_config::api_enabled);

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:

mdg_{extension_slug}_{setting_name}

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 config
  • setting_type -- enum com todos os tipos suportados