【问题标题】:Drupal form being rendered before submit action在提交操作之前呈现 Drupal 表单
【发布时间】:2009-01-22 17:28:29
【问题描述】:

我有一个 Drupal 模块页面,我在其中填充了一个下拉列表,其中包含用户可以上传的一组文件的可用部分列表。一旦用户上传了特定类型的文件,它就会从列表中删除该选项,并且当所有可用文件都上传后,表单将不会被呈现。

问题在于 Drupal 在执行提交操作之前正在绘制表单,因此在用户看来该操作在重新加载页面之前不起作用。

解决这个问题的常用方法是什么?设置 form_state['redirect'] 转到页面似乎不起作用。

【问题讨论】:

    标签: php drupal drupal-6 drupal-fapi


    【解决方案1】:

    您修改表单,以便保存有关表单状态的一些信息。然后在提交函数的开头添加一个新案例,如果您没有完成所有文件的上传,该函数会立即返回,并且它将重新绘制表单。

    function modulename_uploader_form(&$form_stuff=null) {
    //the function that sets your form array
    $stuff = (isset($form_stuff['values'])) ? 
        $form_stuff['storage']['done_uploading'] : 
        false; //if values isnt set, this is the first visit. 
    $form_stuff['storage']['done_uploading'] = done_uploading();
    .... the rest of your form creation function.
    
    
    function modulename_uploader_submit($form, &$form_stuff) {
        if($form_stuff['storage']['done_uploading']) {
    return;
    }
    ... rest of the function
    

    确保在处理完表单后取消设置存储变量。您还可以在 drupal 中搜索多页表单。

    【讨论】:

      【解决方案2】:

      在提交处理程序中设置 $form_state['redirect'] 只会导致表单重新加载,新鲜,没有旧数据。这是一种清除表单的方法,这样旧值就不会作为默认值存在。

      您可能想要使用 $form_state['rebuild'],它使您的表单构建函数有机会在表单提交处理程序运行后重新构建表单的实际结构、添加更多字段或从其他字段中删除选项。

      This blog post 有一个关于在 D6 中执行多阶段表单的粗略教程,Drupal.org 上的 Drupal 5 to 6 upgrade docs 包含对 $form_state 工作原理及其各种标志的有用概述。

      【讨论】:

        【解决方案3】:

        问题在于 Drupal 在执行提交操作之前正在绘制表单,因此在用户看来该操作在重新加载页面之前不起作用。

        我不敢相信。确定吗?

        【讨论】:

        • 是的,基本流程如下图:flickr.com/photos/thecancerus/2394730671/sizes/o
        • 您所指的插图与您刚才所说的相矛盾——在提交功能运行之前,表单不会呈现为 HTML。您将构建表单的过程(即定义其中的字段)与呈现为 HTML 的过程混淆了。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多