Темизация форм. Вопрос

Главные вкладки

Аватар пользователя digital_sword digital_sword 29 сентября 2009 в 22:28

По статье "Темизация форм":
Для форм, которые не имеют шаблонов или зарегистрированных функций, нам нужно не только перекрыть функцию темизации, но и зарегистрировать ее в системе темизации, чтобы Друпал о ней знал. Больше информации о регистре темизации можно найти на страницах документации. Наша форма как раз такой и является. Как только добавите следующие функции в ваш template.php, обновите регистр темизации, сбросив кеш на странице "Администрация" > "Производительность".

Вот функция регистрации, которая нам нужна:

/**
 * Реализация hook_theme.
 *
 * Регистрирует пользовательские функции темизации
 */

function themename_theme() {
   return array(
    // ID формы
    'user_profile_form' => array(
       // Формы всегда имеют аргумент form
       'arguments' => array('form' => NULL),
     ),
   );
}

Так вот, если вместо function themename_theme() поставить themename_theme_drugoe_nazvanie ничего работать не будет. Но если мы хотим темизировать другую форму, то заводить еще одну function themename_theme() нельзя, а в старую не впишешь. Что делать?

Комментарии

Аватар пользователя digital_sword digital_sword 29 сентября 2009 в 23:00

Вписываю. Таким образом:

function themename_theme() {
   return array(
    // ID формы
    'user_profile_form' => array(
       // Формы всегда имеют аргумент form
       'arguments' => array('form' => NULL),
     ),
'Другая_form' => array(
       // Формы всегда имеют аргумент form
       'arguments' => array('form' => NULL),
   );
}

Не работает. По отдельности и то и другое работает...

Аватар пользователя Ромка Ромка 29 сентября 2009 в 23:44

digital_sword wrote:
Вписываю. Таким образом:

function themename_theme() {
   return array(
    // ID формы
    'user_profile_form' => array(
       // Формы всегда имеют аргумент form
       'arguments' => array('form' => NULL),
     ),
'Другая_form' => array(
       // Формы всегда имеют аргумент form
       'arguments' => array('form' => NULL),
   );
}

Не работает. По отдельности и то и другое работает...


Должно работать, значит делаете что-то не так. Приведите полностью используемый код.

Аватар пользователя digital_sword digital_sword 30 сентября 2009 в 7:07

Заработало :). Теперь надо указать переменную в массиве, которую надо заменить.
Использую конструкцию:

function garland_product_node_form($form) {
  $output = '';
  print_r($form);

 $form['prices']['list_price']['#title'] = t('Слово, на которое заменяю');
  $output .= drupal_render($form);
  return $output;
}

[#field_name] => field_image_cache [#tree] => 1 [#weight] => -2 [#access] => 1 [#count] => 8 [#post] => Array ( ) [#programmed] => [#parents] => Array ( [0] => field_image_cache ) [#array_parents] => Array ( [0] => field_image_cache ) [#processed] => [#defaults_loaded] => 1 ) [base] => Array ( [#type] => fieldset [#title] => Информация об РП [#collapsible] => 1 [#collapsed] => [#weight] => -1 [#attributes] => Array ( [class] => product-field ) [model] => Array ( [#type] => textfield [#title] => SKU [#required] => 1 [#default_value] => [#description] => Артикул (модель) РП. [#weight] => 0 [#size] => 32 [#post] => Array ( ) [#programmed] => [#tree] => [#parents] => Array ( [0] => model ) [#array_parents] => Array ( [0] => base [1] => model ) [#processed] => 1 [#attributes] => Array ( ) [#input] => 1 [#maxlength] => 128 [#autocomplete_path] => [#process] => Array ( [0] => form_expand_ahah ) [#name] => model [#id] => edit-model [#value] => [#defaults_loaded] => 1 [#sorted] => 1 ) [prices] => Array ( [#weight] => 5 [#theme] => uc_product_form_prices [list_price] => Array ( [#type] => textfield [#title] => List price

List price - слово, которое надо изменить.

['prices']['list_price']['#title'] - не работает. Мне дальше вверх идти? До чего? Там много переменных и массивов еще...

И еще. Я написал так:
$form['title']['#required'] = FALSE;
Звездочка обязательности снялась, а все равно: поле обязательно для заполнения, почему-то...

Аватар пользователя digital_sword digital_sword 30 сентября 2009 в 11:49

"Ромка" wrote:
Попробуй использовать $form['base']['prices']['list_price']['#title'].

Спасибо, так работает.

Я написал $form['base']['model']['#title'] = t('Другое название'); и слово SKU сменилось. Также после $form['base']['model']['#required'] = FALSE; убралась звездочка обязательности заполнения. Но в чем проблема: все равно выскакивает ошибка:

"Поле SKU обязательно для заполнения". Что за? Как его вообще убрать или убрать обязательность именно через темизацию, не трогая модуль.