ホーム   ユーザガイド   開発者ガイド   モジュール情報   翻訳ファイル   当サイトについて   フォーラム  
コンテンツの一括編集について

初めまして、Drupal2週間程度の初心者です。
現在、6.14にてサイト構築を行っているのですが、コンテンツを任意にフィルタリングして、あるフィールドについて一括で編集できるようなモジュールはありますでしょうか?

例えば、CCKにて、あるコンテンツに「表示順」というフィールドを追加したとして、そのコンテンツを一覧表示させたまま編集を行い、更新ボタンか何かで一括変更したいのです。

Viewモジュールにて一覧を抽出して、ノードの編集フィールドを追加すれば個別での編集は出来るのですが、一括となるとやり方がわかりません。

ご経験のある方は是非ご教授下さい。
以上、よろしくお願い致します。

Editview

情報ありがとうございます。元記事投稿者です。

2009年末時点で、Editviewというモジュールにて実現しました。
Viewsで一覧表示したフィールドに対して編集可能とさせるモジュールです。

その他ご教授頂きましたソース(勉強中です...abebiさんありがとう)、multi_node_editについてもちょっと調べてみたいと思います。

ありがとうございました!

Multi Node Edit

http://drupal.org/project/multi_node_edit
ですね。
dokumoriさん、情報ありがとうございました。

a_c_m

a_c_m (http://drupal.org/user/195063 )が一括編集を可能にするモジュールを開発したと教えてくれました。このコメント投稿を時点するではまだコミットされていないので試していませんが、ご参考までに。
http://drupal.org/project/multi_node_edit

どうでしょうか

toyofukuさん

Drupal初心者のabebiと申します。
私も以前より、記事の一括編集できないかなーと思っていましたが、なかなかそのような要件に遭遇しなかったので得には調べていなかったのですが、今回いい機会なのでモジュール作ってみました。
(先人様、このような要件のモジュールってあるんですかね?少し調べましたが見つけられませんでした^^;)

まだまだ改良の余地ありまくりですが、これを元にカスタマイズすれば如何でしょうか。私ももう少し改良する予定です。

以下の3ファイルをutf-8で保存し、sites/all/modules/custom/alltermedit
フォルダに保存して下さい。
モジュールを有効にし、「サイトの環境設定」→「All term edit settings」をクリック。
編集したいcckテーブル名、カラム名を入力し設定の保存を押して下さい。
あとは「admin/alltermedit」にアクセスすると一覧画面が表示されます。
※テキストフィールドでしかテスト検証していないので、それ以外だと動かないかも・・・

alltermedit.info

; $ID$
name = Alltermedit
description = All term edit.
core = 6.x
package = Drupal Development

alltermedit.module

<?php
// $Id$

/**
* @file
* 指定したcckカラムを一括編集
*
*/

/**
* hook_menu()
*/

function alltermedit_menu(){

  $items['admin/settings/alltermedit'] = array(
      'title' => 'All term edit settings',
      'description' => '全ての記事を編集する事が出来ます',
      'page callback' => 'drupal_get_form',
      'page arguments' => array('alltermedit_admin_settings'),
      'access arguments' => array('administer site configuration'),
      'type' => MENU_NORMAL_ITEM,
      'file' => 'alltermedit.admin.inc',
);

  $items['admin/alltermedit'] = array(
      'title' => '全ての記事を一括編集',
      'description' => '全ての記事を編集する事が出来ます',
      'page callback' => 'drupal_get_form',
      'page arguments' => array('alltermedit_toppage'),
      'access callback' => TRUE,
      'type' => MENU_CALLBACK,
      'file' => 'alltermedit.admin.inc',
);

return $items;
}

alltermedit.admin.inc

<?php
// $Id$

/**
* 一括編集画面表示
*/

//フォームをコンテンツ項目として追加する
function alltermedit_toppage(){
global $table;
$table = variable_get('alltermedit_table_name','content_type_page');
$column1 = variable_get('alltermedit_column_name1','');
$column2 = variable_get('alltermedit_column_name2','');
global $ar_column ;
if($column1):
$ar_column[] = $column1;
endif;
if($column2):
$ar_column[] = $column2;
endif;

$result = db_query("select * from {$table}");

//ネストツリーにする場合必須
$form['#tree'] = TRUE;

while ($data = db_fetch_object($result)) {

if($tmp[$data->nid]){
//自身のリビジョンデータが最新の場合は過去のデータを消す
if($data->vid > $tmp[$data->nid]){
unset($form['alltermedit'][$data->nid]['title']);
unset($form['alltermedit'][$data->nid]['body']);
}
}
$tmp[$data->nid] = $data->vid;

$form['alltermedit'][$data->nid] = array(
'#title' => '記事番号'.$data->nid,
'#type' => 'fieldset',
);

foreach ($ar_column as $tmp){

$form['alltermedit'][$data->nid][$tmp] = array(
'#type' => 'textfield',
'#title' => t($tmp),
'#default_value' => isset($data->$tmp) ? $data->$tmp:'',
);
}


//フィールドセット内にテキストエリアを定義する
//$form['alltermedit'][$data->nid]['body'] = array(
// '#type' => 'textarea',
// '#title' => t('本文'),
// '#default_value' => isset($data->body) ? $data->body:'',
//);

//vidを定義
$form['alltermedit'][$data->nid]['vid'] = array(
'#type' => 'hidden',
'#default_value' => isset($data->vid) ? $data->vid:'',
);

}

//サブミット機能を定義する
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('All Term Update'),
);

return $form;
}

//上記フォームから受け取ったデータを処理する
function alltermedit_toppage_submit($form, &$form_state){

$table = variable_get('alltermedit_table_name','content_type_page');
$column1 = variable_get('alltermedit_column_name1','');
$column2 = variable_get('alltermedit_column_name2','');

if($column1):
$ar_column[] = $column1;
endif;
if($column2):
$ar_column[] = $column2;
endif;

//  $data = $form_state['values']['alltermedit']['1']['title'];

  foreach ($form_state['values']['alltermedit'] as $key => $val){

foreach ($ar_column as $tmp){
db_query("UPDATE {$table} SET $tmp='%s' where vid = %d", $form_state['values']['alltermedit'][$key][$tmp] , $form_state['values']['alltermedit'][$key]['vid']);
}
  }

  drupal_set_message(t($table.'の記事を更新しました。'));

}


/**
* 一覧編集の設定
* @ingroupフォーム
* @see system_settings_form().
*/

function alltermedit_admin_settings(){

  $form['alltermedit_table_name'] = array(
    '#type' => 'textfield',
    '#title' => t('編集したいcckのテーブル名を入力して下さい。'),
    '#default_value' => variable_get('alltermedit_table_name','content_type_page'),
  );

  $form['alltermedit_column_name1'] = array(
    '#type' => 'textfield',
    '#title' => t('カラム名を入力して下さい'),
    '#default_value' => variable_get('alltermedit_column_name1',''),
  );

  $form['alltermedit_column_name2'] = array(
    '#type' => 'textfield',
    '#title' => t('カラム名を入力して下さい'),
    '#default_value' => variable_get('alltermedit_column_name2',''),
  );

  return system_settings_form($form);
}

今後の改良点:
・カラムを2つまでしか入力出来ない。(実用性ゼロ)
・cckのフィールドがtextareaだろうが、textfieldだろうがなんでもtextfieldで入力が出力される。(不便)
・検索がない(不便)
・ページャーがない(大量のページだと死亡する)

暇なときに改良しましたら、またアップします。

コメント表示オプション
----------
お好みのコメントを表示方法を選択してください「設定の保存」をクリックすると変更が有効になります。