“System_settings_form” é vodu?

8

Um amigo acabou de me mostrar system_settings_form em ação em um arquivo de configuração de um formulário.

O código em questão se parece com isso (simplificado).

function my_module_generateAdminForm($form){
  $form = array();
  $form['super_secret_password'] = array(
    '#type' => 'textfield',
    '#title' => t('Headline'),
    '#default_value' => variable_get('super_secret_password','password'),
  );
  system_settings_form($form);
}

system_settings_form adiciona botões de envio e lida com o envio do formulário, salvando as variáveis. Ele também adiciona um botão "Redefinir para o padrão" - que redefine toda a variável para o padrão.

Eu basicamente adivinhei o que faz, porque não há muita documentação por aí e meu amigo também não sabe exatamente o que faz. Minha pergunta é como ele conhece as variáveis ​​para salvar / redefinir? Não estou apenas passando uma matriz?

Também há alguma outra mágica no system_settings_form que eu deveria conhecer?

Coomie
fonte

Respostas:

14

Consulte system_settings_form e system_settings_form_submit para obter detalhes da implementação. No Drupal 7, o botão Redefinir para padrão é removido do formulário Configurações do sistema.

function system_settings_form($form) {
  $form['actions']['#type'] = 'actions';
  $form['actions']['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Save configuration'),
  );

  if (!empty($_POST) && form_get_errors()) {
    drupal_set_message(t('The settings have not been saved because of the errors.'), 'error');
  }
  $form['#submit'][] = 'system_settings_form_submit';
  // By default, render the form using theme_system_settings_form().
  if (!isset($form['#theme'])) {
    $form['#theme'] = 'system_settings_form';
  }
  return $form;
}

System_settings_form:

O botão Enviar configuração da adição e o retorno de chamada para a função system_settings_form_submit.

system_settings_form_submit:

function system_settings_form_submit($form, &$form_state) {
  // Exclude unnecessary elements.
  form_state_values_clean($form_state);

  foreach ($form_state['values'] as $key => $value) {
    if (is_array($value) && isset($form_state['values']['array_filter'])) {
      $value = array_keys(array_filter($value));
    }
    variable_set($key, $value);
  }

  drupal_set_message(t('The configuration options have been saved.'));
}

Repete todos os elementos do formulário e define variáveis ​​para cada elemento do formulário com chave como chave do elemento de formulário e valor como valor do elemento do formulário enviado pelo usuário, lido usando $ form_state ['values']

Portanto, é apenas um formulário com o manipulador de envio que define variáveis ​​para todos os valores de formulário usando a função variable_set.

Anil Sagar
fonte
5
Boa explicação. Se você está confuso com "cada elemento do formulário com chave como chave do elemento do formulário", o que ele quer dizer é que, no seu exemplo acima, $ form ['super_secret_password'] fará com que o Drupal chame o variable_set ('super_secret_password', ...), porque system_settings_form_submit leva o nome da variável da chave da matriz ('super_secret_password') do seu formulário.
greg_1_anderson
11
Isso é útil. Por que o api.drupal.org não pode apenas explicar o que ele faz em inglês puro. Em vez disso, apenas fornece o código ... Então, em resumo, não vodu, apenas usando minhas chaves de campo.
Coomie 29/10/12
11
Eu acho que vale a pena notar que você não deve usá-lo para armazenar variáveis ​​grandes, pois ele permanecerá na memória para cada solicitação de página, independentemente de haver uma variável_get direta para isso ou não. Todos eles são armazenados em cache uma vez na memória. Além disso, os manipuladores regulares de envio e validação funcionarão sem problemas. Sinta-se livre para adicioná-los.
AyeshK