Тема на Drupal 7: hook_theme или drupal_get_form

Чудя се кой е най-добрият начин за показване на формуляр на страница (например: регистрационен формуляр за vip потребители ... и не в блок, а като основно съдържание).

User.module начинът в user_menu (*hook_menu*) :

  $items['vip/register'] = array(
    'title' => 'Create new vip account',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('vip_register_form'),
    'access callback' => 'user_register_access',
    'type' => MENU_LOCAL_TASK,
  );

Или чрез създаване на тема чрез use_theme (*hook_theme*) (фиктивен) :

$items['vip/register'] = array(
    'title' => 'Create new vip account',
    'page callback' => 'theme',
    'page arguments' => array('vip_register'),
    'access callback' => 'user_register_access',
    'type' => MENU_LOCAL_TASK,
);

function user_theme() {
  return array(
    'vip_register' => array(
    )
  );
}

function theme_vip_register(){
    return drupal_get_form('vip_register_form');
}

Чудя се за това с тематична цел, защото дизайнер ще направи графичната интеграция след това.

Благодаря ви за съветите.


person Community    schedule 06.11.2012    source източник
comment
Беше за най-добрата практика, но е много специфична, вярно е. В крайна сметка дизайнерът предпочита да има деклариран шаблон и функциите за тематизиране да връщат Render Array вместо рендирани.   -  person    schedule 14.11.2012


Отговори (1)


Това не е истински отговор, но не съм съвсем сигурен какъв е вашият въпрос на първо място. Drupal обичаи #1: Никога не хаквайте ядро!

Както се казва, функциите за тема са само за тема нещо. Така че първо трябва да изградите формата.

$items['vip/register'] = array(
    'title' => 'Create new vip account',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('vip_register_form'),
    'access callback' => 'user_register_access',
    'type' => MENU_LOCAL_TASK,
  );

Когато потребител отвори страница example.com/vip/register, функцията drupal_get_form ще бъде извикана с аргумент vip_register_form.

Така че сега трябва да дефинирате функция за връщане на този формуляр (регистрация на vip потребител).

function vip_register_form($form, &$form_state){
  ..your FAPI stuff here.
  return $form;
}

Сега потребителят, който отвори страницата за vip регистрация, ще види този формуляр вместо обикновения формуляр. дори полетата за парола и потребителско име няма да са налични, освен ако не ги добавите. Ако искате да промените съществуващия формуляр, просто копирайте куката на менюто в нов път:

$user_menu_routers = user_menu();
$items['vip/register'] = $user_menu_routers['user/register'];

Сега можете да промените формуляра си на страницата vip/register (която е същата като нормалната страница за регистриране на потребители), като използвате кука form_alter. Можете да тематизирате формуляра ръчно, без да засягате и съществуващия.

person AKS    schedule 07.11.2012