Warning: Undefined array key "HTTPS" in include() (line 29 of /opt/www/fdv2/drupal.stage/web/sites/default/settings.local.php).
include('/opt/www/fdv2/drupal.stage/web/sites/default/settings.local.php') (Line: 4)
require('/opt/www/fdv2/drupal.stage/web/sites/drupal001.net/settings.php') (Line: 145)
Drupal\Core\Site\Settings::initialize('/opt/www/fdv2/drupal.stage/web', 'sites/drupal001.net', Object) (Line: 1099)
Drupal\Core\DrupalKernel->initializeSettings(Object) (Line: 701)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
请问D6下使用vbo的批量操作时,在action代码里如何获取当前执行的进度? - Drupal大学 - Drupal问答论坛
首页 / 帖子
请问D6下使用vbo的批量操作时,在action代码里如何获取当前执行的进度?

D7下的action里的$context参数里有进度信息,但是D6的$context里没有。

然后我尝试在action代码里用cookie去记录一个标识,也没用!

整个批量执行过程,记录的cookie值始终是批量执行之前的值,执行过程中,cookie被action修改后的新值,不会在action代码里被获取到。

就是说执行过程好像是一个闭合环境,在这个环境下,全局变量不会随着每次执行action而改变。


我的具体需求是:每次批量执行时,我要动态生成一个目录名用来存储每个action去生成的一个文件,生成文件的代码写到了action函数里,那么每执行一个action,就会有一个动态目录名生成,这是我不想要的,我只要生成一个固定的目录就可以了,这些文件都放到这个目录里。那么我就得想办法记下这个目录名,然后在代码里判断,如果目录名已经生成了,就不要再生成了。


请问我要如何记录下这目录名,然后能让action获取到每次更新的值呢?


我的action代码:(cookie:generate_zip_file_dir_name获取不到更新后的值)

function batch_generate_pdf_action(&$node, $context = array()) {
  module_load_include('inc', 'print_pdf', 'print_pdf.pages');

  // pdf文件名
  $pdf_filename = variable_get('print_pdf_filename', PRINT_PDF_FILENAME_DEFAULT);
  $pdf_filename = token_replace($pdf_filename, 'node', $node, TOKEN_PREFIX, TOKEN_SUFFIX, array('clear' => TRUE));
  $pdf_filename = transliteration_clean_filename($pdf_filename, language_default('language'));

  // 目录名
  date_default_timezone_set('Asia/Shanghai');
  $dir_name = date('Y-m-d_h_i_s', time());

  setcookie('generate_zip_file_dir_name', $dir_name);

  drupal_set_message(l('生成压缩文件包', 'generate_zip_file'));

  // 目录路径
  $dir_path = file_directory_path() . '/' . $dir_name;
  file_check_directory($dir_path, FILE_CREATE_DIRECTORY);
  $dir_path = realpath($dir_path);

  // 带目录路径的pdf文件名
  $pdf_filename = $dir_path . '/' . $pdf_filename . '.pdf';

  // 生成pdf文件
  print_pdf_generate_path($node->nid, NULL, $pdf_filename);

  sleep(1); // 由于两次执行时间一般小于1s,所以为了验证区别上下文环境信息,调大执行时间间隔
}


1个答案
赵高欣
发布于:2014-08-06 14:41

去看了下D6的vbo源码,如果要传进度参数,需要对hack模块源码,可以通过patch补丁来修改,以后模块升级也好维护。大体就是修改 _views_bulk_operations_batch_process 函数(还有其他两个process可能也要改)

function _views_bulk_operations_batch_process($oid, $row, &$context) {
  module_load_include('inc', 'node', 'node.admin');
  $operation = $_SESSION['vbo_options']['operation'];
  //修改此处,将$context加入$params中,$params即是action里的context参数
  //$params = $_SESSION['vbo_options']['params'];
  $params = $_SESSION['vbo_options']['params'] + $context;
  $object_info = $_SESSION['vbo_options']['object_info'];


另外题主的具体需求,我参考vbo的源码想到了一种解决方式,就是在action执行开始前生成本次保存文件的目录名,并作为action的执行参数,实验了下应该可行

思路如下:

function batch_generate_pdf_action_form($context){
  // 定义一些选项,或只返回提交按钮
}
function batch_generate_pdf_action_submit($form, $form_state){
  return array(
    'zip_file_dir_name' => date('Y-m-d_h_i_s', time()),
  );
}

然后在action里就可以通过$context['zip_file_dir_name']取得目录名

具体可以参考vbo模块内taxonomy.action.inc的代码

这种方式就不用hack模块源码了