チェックボックスをクリックすると、ajaxでサーバーと交信する
function ajax_add_to_my_vocabulary($form,&$form_state, $entity){
global $user ;
// データがすでに存在するか否かのチェック
$my_voca_result = db_query("SELECT entity_id FROM my_ch_vocabulary WHERE vid=".$entity->vid . " AND uid=".$user->uid)->fetchAll();
// ajaxコールバック時に使用するパラメーター
$form_state['has_my_voca_result'] = count($my_voca_result)>0 ? true:false ;
$form_state['ch_vocabulary'] = $entity ;
// ajaxのチェックボックスフォーム定義
$form['ch_voca_form']=array(
'#type' => 'checkbox',
'#disabled' => $user->uid == 0 ? true : false ,
'#title' => count($my_voca_result)>0 ? t('<span id="ch-voca-check-op-'.$vid.'">Remove</span>') : t('<span id="ch-voca-check-op-'.$entity->vid.'">Add</span>'),
'#default_value' => count($my_voca_result)>0 ? 1 : 0,
'#ajax' => array(
'callback' => 'add_to_my_vocabulary_callback',
'wrapper' => 'ch-voca-check-op-'.$entity->vid,
'method' => 'replace',
'effect' => 'fade',
),
);
return $form ;
}
// ajaxのコールバック関数
function add_to_my_vocabulary_in_views($form, $form_state){
global $user;
$entity = $form_state['ch_vocabulary'] ;
// DBにデータがある場合に削除処理
if( $form_state['has_my_voca_result'] ) {
db_delete( 'my_ch_vocabulary' )->condition( 'vid', $entity->vid )->condition('uid', $user->uid )->execute();
// チェックボックスのラベルを「Add」に変更
return t('<span id="ch-voca-check-op-'.$vid.'">Add</span>');
}
// データがなければ、ch_vocabuaryをmy_vocabuaryにコピー
$my_voca = entity_create('my_ch_vocabulary', array('vid'=>$entity->vid));
$my_voca_wrapper = entity_metadata_wrapper( 'my_ch_vocabulary', $my_voca );
$my_voca_wrapper->vocabulary->set( $ch_voca->vocabulary ) ;
.... //各種フィールド、プロパティのセット
$my_voca_wrapper->save(); // コピーされたデータの保存
// チェックボックスのラベルを「Remove」に変更
return t('<span id="ch-voca-check-op-'.$vid.'">Remove</span>');
}