Как с помощью Forms API создать два поля на одной линии

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

Комментарии

Аватар пользователя sadmin sadmin 27 февраля 2010 в 22:24

"xxandeadxx" wrote:
С учётом того что тема гарланд, и в css лезть нельзя

не ради занудства, скажите, почему нельзя использовать CSS?

Аватар пользователя xxandeadxx xxandeadxx 27 февраля 2010 в 22:30

да можно, просто думал есть возможность сделать это средствами Forms API, какой-нибудь хитрый параметр убирающий div враппер

Аватар пользователя xxandeadxx xxandeadxx 28 февраля 2010 в 1:29

вообщем получилось задуманное:

форма:

<?php
    $form
['size'] = array(
        
'#type' => 'markup',
        
'#theme' => 'mymodule_size',
    );
    
    
$form['size']['mymodule_width'] = array(
        
'#type' => 'textfield',
        
'#default_value' => variable_get('mymodule_width'0),
    );
    
    
$form['size']['mymodule_height'] = array(
        
'#type' => 'textfield',
        
'#default_value' => variable_get('mymodule_height'0),
    );
?>

функции темизации:

<?php
function mymodule_theme()
{
    return array(
'mymodule_size' => array('arguments' => array('form' => NULL)));
}

function 

theme_mymodule_size($form)
{
    
_form_set_class($form['mymodule_width'], array());
    
_form_set_class($form['mymodule_height'], array());

    

$output  '<input type="text" name="'$form['mymodule_width']['#name']  . '" id="'$form['mymodule_width']['#id']  .'" value="'check_plain($form['mymodule_width']['#value'])  . '" /> × ';
    
$output .= '<input type="text" name="'$form['mymodule_height']['#name'] . '" id="'$form['mymodule_height']['#id'] .'" value="'check_plain($form['mymodule_height']['#value']) . '" />';
    
    return 
$output;
}
?>
Аватар пользователя xxandeadxx xxandeadxx 27 февраля 2010 в 23:38

на самом деле форма сложнее чем на картинке, и одним css-ом не обойтись

з.ы: кому геморой, а кому экспа
з.ы.ы: популярный модуль data использует такой подход для вывода селектов день/месяц/год

Аватар пользователя sadmin sadmin 28 февраля 2010 в 1:14

"cosmos" wrote:
не раз такое делал с помощью css

тоже реализовывал css, но приведенный способ интересен) xxandeadxx, пригодится)

Аватар пользователя olk olk 29 марта 2010 в 16:22

"xxandeadxx" wrote:
вообщем получилось задуманное:

форма:


Только непонятно зачем так сложно Wink
Достаточно было

<?php
    $form
['size'] = array(
        
'#type' => 'markup',
//        '#theme' => 'mymodule_size',
        
'#prefix' => '<div class="container-inline">',
        
'#suffix' => '</div>',
    );

 ...
    

?>

ax да еще

<?php
   $form
['size']['mymodule_width'] = array(
        
'#type' => 'textfield',
        
'#default_value' => variable_get('mymodule_width'0),
        
'#suffix' => '&nbsp;x&nbsp;'
    
);
?>
Аватар пользователя olk olk 29 марта 2010 в 16:32

"sadmin" wrote:
Добавить div с классом, как в этом примере, или рендер формы?

Достаточно в саму форму, тогда функция темизации вообще не нужна, и отрендеренная стандартным обработчиком (drupal_get_form),
он получит нужные вид ...

Аватар пользователя olk olk 10 ноября 2015 в 11:46

"xxandeadxx" wrote:
"olk" написал(а):

Достаточно было

сами то пробовали?


Конечно Smile иначе не писал бы.
Код номер 1: (вставляем прямо в тело ноды, формат ввода PHP)

<?php
  $form
['size'] = array(
        
'#type' => 'markup',
//        '#prefix' => '<div class="container-inline">',
//        '#suffix' => '</div>',

    

);
    
$form['size']['mymodule_width'] = array(
        
'#type' => 'textfield',
        
'#default_value' => '',
        
'#suffix' => ' x ',
        
'#size' => 8,
        
'#weight' => -10,

    );
    

$form['size']['mymodule_height'] = array(
        
'#type' => 'textfield',
        
'#size' => 8,
        
'#weight' => -9,
        
'#default_value' => '',
    );
   print 
drupal_render($form);
?>

Получаем

Добавляем закомментированные строки

Получаем

Аватар пользователя sadmin sadmin 29 марта 2010 в 17:26

"xxandeadxx" wrote:
нет названия, нет описания, нет название полей во время ошибок валидации

Не, нормальный вариант, можно использовать. Хороший топик получился)

Аватар пользователя olk olk 29 марта 2010 в 17:54

"xxandeadxx" wrote:
нет названия, нет описания, нет название полей во время ошибок валидации

Да божешь мой Smile я ведь вам не навязываю решение. Ваше решении тоже вполне жизнеспособно ...
Просто показал еще один способ, как можно манипулировать данными ...

PS. Для добавления наименования полей есть атрибут #title
для описания #description
для валидации и указания поля в form_set_error - служит атрибут name -
который по умолчанию равен наименованию элемента массива формы (например mymodule_width).

Аватар пользователя xxandeadxx xxandeadxx 29 марта 2010 в 17:59

"olk" wrote:
я ведь вам не навязываю решение

да всё нормально Smile

"olk" wrote:
Для добавления наименования полей есть атрибут #title
для описания #description

только ни #title ни #description у полей типа markup нет Smile