【问题标题】:Drupal module function theming with ahahDrupal 模块功能主题化 ahah
【发布时间】:2010-11-05 22:00:50
【问题描述】:

我的主要问题是:

每当通过 ahah (ahah_helper) 重建表单时,是否会调用 theme_hook() 函数?

我正在尝试显示一个带有一些过滤选项的选择框,当用户更改它时,它下面的表格也会发生变化。

我现在有这个:

function veiculos_listar_form($form_state)
{
    $form = array();
    ahah_helper_register($form, $form_state);

    //biulds $options

    $form['listar_veics'] = array(
        '#type'   => 'fieldset',
        '#prefix' => '<div id="listar-veics-wrapper">', 
        '#suffix' => '</div>',
        '#tree'   => TRUE,
        );


    if (!isset($form_state['values']['listar_veics']['filial']))
        $form['#filial_veic'] = 1;
    else 
        $form['#filial_veic'] = $form_state['values']['listar_veics']['filial'];

    $form['listar_veics']['filial'] = array(
        '#type' => 'select', 
        '#title' => "Listar veículos da filial", 
        '#options' => $filiais,
        '#default_value' => $form['#filial_veic'],
        '#ahah' => array(
            'event'     => 'change',
            'path'      => ahah_helper_path(array('listar_veics')),
            'wrapper'   => 'listar-veics-wrapper',
            'method'    => 'replace',
            ),
    );


    return $form;
} 

function veiculos_listar_form_submit($form, &$form_state)
{

}


function _listar_veiculos_tabela($filial)
{
    //builds $header and $data

    $table = theme_table($header, $data);
    return $table;
}


function theme_veiculos_listar_form($form) 
{
    $output = drupal_render($form);
    $filial = $form['#filial_veic'];
    $output .= '<br>' . $filial . '<br>';
    $output .= _listar_veiculos_tabela($filial);
    return $output;
}

function veiculos_theme() {
    return array(
        'veiculos_listar_form' => array(
            'arguments' => array('form' => NULL),),
    );
}

在我纯真的小世界里,如果在每个 ahah 事件(更改)上调用 theme_hook,它应该可以工作。

问题是,打印的变量总是相同的,就像用户选择的内容没有被存储一样。如果用户选择了不同的选项,它会显示新选项,但在主题打印时 $filial 变量总是相同的。

像这样:

http://img230.imageshack.us/img230/9646/62144334.jpg

关于我可以做些什么来完成这项工作的任何建议?我正在开发我们自己的模块,所以使用视图模块不是一个好主意。

谢谢。

【问题讨论】:

    标签: drupal drupal-themes ahah


    【解决方案1】:

    您应该以这种方式重做代码。 啊啊回调我没写,我想你不会有问题的。 查看 drupal.org 上的一些示例

    function veiculos_listar_form($form_state)
    {
        $form = array();
        ahah_helper_register($form, $form_state);
    
        //biulds $options
    
     // remove divs because we do not want to reload selector with ahah
        $form['listar_veics'] = array(
            '#type'   => 'fieldset',
            '#tree'   => TRUE,
        );
    
    
        if (!isset($form_state['values']['listar_veics']['filial']))
            $form['#filial_veic'] = 1;
        else 
            $form['#filial_veic'] = $form_state['values']['listar_veics']['filial'];
    
      // add cover div here, because we will reload table
        $form['table'] = array(
            '#prefix' => '<div id="listar-veics-wrapper">', 
            '#suffix' => '</div>',
            '#type' => 'markup',
            '#value' => _listar_veiculos_tabela($form['#filial_veic']),
        );
    
        $form['listar_veics']['filial'] = array(
            '#type' => 'select', 
            '#title' => "Listar veículos da filial", 
            '#options' => $filiais,
            '#default_value' => $form['#filial_veic'],
            '#ahah' => array(
                'event'     => 'change',
                'path'      => ahah_helper_path(array('listar_veics')),
                'wrapper'   => 'listar-veics-wrapper',
                'method'    => 'replace',
                ),
        );
    
    
        return $form;
    } 
    
    function veiculos_listar_form_submit($form, &$form_state)
    {
    
    }
    
    
    function _listar_veiculos_tabela($filial)
    {
        //builds $header and $data
    
        $table = theme_table($header, $data);
        return $table;
    }
    
    
    function theme_veiculos_listar_form($form) 
    {
        $output = drupal_render($form);
        return $output;
    }
    
    function veiculos_theme() {
        return array(
            'veiculos_listar_form' => array(
                'arguments' => array('form' => NULL),),
        );
    }
    

    【讨论】:

    • 这几乎是正确的。如果我完全按照你说的做,页面会呈现两个选择。我必须做的是把那个 div 放在字段集中,像以前一样从表中删除它,然后将表和插入插入到这个字段集中。如果不是这样设置,则会呈现两个选择,并且表格不会对任何选择做出反应。现在可以了。我没有意识到表单 API 有这种标记类型,它很棒。 Gona 将此作为正确答案,但需要进行一些编辑。谢谢:D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多