hook_menuで定義したページへのアクセス権限設定は「access callback」と「access arguments」で行います。特定なユーザーロール、特定なユーザーのみなどの制御が可能となります。特に、ユーザーのアクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)で各ページのアクセス権限管理が一般的で、よく利用されます。hook_menuがこのアクセス権限管理の実装方法を纏めます。
/**
 * Implements hook_permission().
 */
function [my-module-name]_permission() {
  return array(
      'authorize fbauth_connect' => array(
          'title' => t('Connect Facebook account and store access token'),
      ),
  );
}
		
/**
 * Implements hook_entity_info().
 */
function drills_ch_vocabulary_entity_info()
{
    return array(
        'my_vocabulary' => array(
            'label' => t('My Vocabulary'),
            'entity class' => 'MyVocabularyEntity',
            'controller class' => 'MyVocabulryController',
            'base table' => 'my_vocabulary',
            'fieldable' => TRUE,
            'entity keys' => array(
                'id' => 'entity_id',
                'label' => 'vocabulary',
            ),
            'bundles' => array(
                'my_vocabulary' => array(
                    'label'=>'My Vocabulary',
                    'admin' => array(
                        'path' => 'admin/structure/my-vocabulary/manage',
                        'access arguments' => array('administer my vocabulary'),
                        'controller class' => 'EntityDefaultUIController',
                    ),
                ),
            ),
            'view modes' => array(
                'full' => array(
                    'label' => t('Default'),
                    'custom settings' => FALSE,
                ),
            ),
            'module' => 'my_vocabulary',
            'access callback' => 'my_vocabulary_access',
        ),
    );
}
	
// entity/entity.module の659行あたり
function entity_access($op, $entity_type, $entity = NULL, $account = NULL) {
  if (($info = entity_get_info()) && isset($info[$entity_type]['access callback'])) {
    return $info[$entity_type]['access callback']($op, $entity, $account, $entity_type);
  }
}
	hook_menuで定義したページへのアクセス権限設定は「access callback」と「access arguments」で行います。特定なユーザーロール、特定なユーザーのみなどの制御が可能となります。特に、ユーザーのアクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)で各ページのアクセス権限管理が一般的で、よく利用されます。hook_menuがこのアクセス権限管理の実装方法を纏めます。
/**
 * Implements hook_permission().
 */
function [my-module-name]_permission() {
  return array(
      'authorize fbauth_connect' => array(
          'title' => t('Connect Facebook account and store access token'),
      ),
  );
}
		
/**
 * Implements hook_entity_info().
 */
function drills_ch_vocabulary_entity_info()
{
    return array(
        'my_vocabulary' => array(
            'label' => t('My Vocabulary'),
            'entity class' => 'MyVocabularyEntity',
            'controller class' => 'MyVocabulryController',
            'base table' => 'my_vocabulary',
            'fieldable' => TRUE,
            'entity keys' => array(
                'id' => 'entity_id',
                'label' => 'vocabulary',
            ),
            'bundles' => array(
                'my_vocabulary' => array(
                    'label'=>'My Vocabulary',
                    'admin' => array(
                        'path' => 'admin/structure/my-vocabulary/manage',
                        'access arguments' => array('administer my vocabulary'),
                        'controller class' => 'EntityDefaultUIController',
                    ),
                ),
            ),
            'view modes' => array(
                'full' => array(
                    'label' => t('Default'),
                    'custom settings' => FALSE,
                ),
            ),
            'module' => 'my_vocabulary',
            'access callback' => 'my_vocabulary_access',
        ),
    );
}
	
// entity/entity.module の659行あたり
function entity_access($op, $entity_type, $entity = NULL, $account = NULL) {
  if (($info = entity_get_info()) && isset($info[$entity_type]['access callback'])) {
    return $info[$entity_type]['access callback']($op, $entity, $account, $entity_type);
  }
}
	hook_menuで定義したページへのアクセス権限設定は「access callback」と「access arguments」で行います。特定なユーザーロール、特定なユーザーのみなどの制御が可能となります。特に、ユーザーのアクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)で各ページのアクセス権限管理が一般的で、よく利用されます。hook_menuがこのアクセス権限管理の実装方法を纏めます。
/**
 * Implements hook_permission().
 */
function [my-module-name]_permission() {
  return array(
      'authorize fbauth_connect' => array(
          'title' => t('Connect Facebook account and store access token'),
      ),
  );
}
		
/**
 * Implements hook_entity_info().
 */
function drills_ch_vocabulary_entity_info()
{
    return array(
        'my_vocabulary' => array(
            'label' => t('My Vocabulary'),
            'entity class' => 'MyVocabularyEntity',
            'controller class' => 'MyVocabulryController',
            'base table' => 'my_vocabulary',
            'fieldable' => TRUE,
            'entity keys' => array(
                'id' => 'entity_id',
                'label' => 'vocabulary',
            ),
            'bundles' => array(
                'my_vocabulary' => array(
                    'label'=>'My Vocabulary',
                    'admin' => array(
                        'path' => 'admin/structure/my-vocabulary/manage',
                        'access arguments' => array('administer my vocabulary'),
                        'controller class' => 'EntityDefaultUIController',
                    ),
                ),
            ),
            'view modes' => array(
                'full' => array(
                    'label' => t('Default'),
                    'custom settings' => FALSE,
                ),
            ),
            'module' => 'my_vocabulary',
            'access callback' => 'my_vocabulary_access',
        ),
    );
}
	
// entity/entity.module の659行あたり
function entity_access($op, $entity_type, $entity = NULL, $account = NULL) {
  if (($info = entity_get_info()) && isset($info[$entity_type]['access callback'])) {
    return $info[$entity_type]['access callback']($op, $entity, $account, $entity_type);
  }
}
	hook_menuで定義したページへのアクセス権限設定は「access callback」と「access arguments」で行います。特定なユーザーロール、特定なユーザーのみなどの制御が可能となります。特に、ユーザーのアクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)で各ページのアクセス権限管理が一般的で、よく利用されます。hook_menuがこのアクセス権限管理の実装方法を纏めます。
/**
 * Implements hook_permission().
 */
function [my-module-name]_permission() {
  return array(
      'authorize fbauth_connect' => array(
          'title' => t('Connect Facebook account and store access token'),
      ),
  );
}
		
/**
 * Implements hook_entity_info().
 */
function drills_ch_vocabulary_entity_info()
{
    return array(
        'my_vocabulary' => array(
            'label' => t('My Vocabulary'),
            'entity class' => 'MyVocabularyEntity',
            'controller class' => 'MyVocabulryController',
            'base table' => 'my_vocabulary',
            'fieldable' => TRUE,
            'entity keys' => array(
                'id' => 'entity_id',
                'label' => 'vocabulary',
            ),
            'bundles' => array(
                'my_vocabulary' => array(
                    'label'=>'My Vocabulary',
                    'admin' => array(
                        'path' => 'admin/structure/my-vocabulary/manage',
                        'access arguments' => array('administer my vocabulary'),
                        'controller class' => 'EntityDefaultUIController',
                    ),
                ),
            ),
            'view modes' => array(
                'full' => array(
                    'label' => t('Default'),
                    'custom settings' => FALSE,
                ),
            ),
            'module' => 'my_vocabulary',
            'access callback' => 'my_vocabulary_access',
        ),
    );
}
	
// entity/entity.module の659行あたり
function entity_access($op, $entity_type, $entity = NULL, $account = NULL) {
  if (($info = entity_get_info()) && isset($info[$entity_type]['access callback'])) {
    return $info[$entity_type]['access callback']($op, $entity, $account, $entity_type);
  }
}
	hook_menuで定義したページへのアクセス権限設定は「access callback」と「access arguments」で行います。特定なユーザーロール、特定なユーザーのみなどの制御が可能となります。特に、ユーザーのアクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)で各ページのアクセス権限管理が一般的で、よく利用されます。hook_menuがこのアクセス権限管理の実装方法を纏めます。
/**
 * Implements hook_permission().
 */
function [my-module-name]_permission() {
  return array(
      'authorize fbauth_connect' => array(
          'title' => t('Connect Facebook account and store access token'),
      ),
  );
}
		
/**
 * Implements hook_entity_info().
 */
function drills_ch_vocabulary_entity_info()
{
    return array(
        'my_vocabulary' => array(
            'label' => t('My Vocabulary'),
            'entity class' => 'MyVocabularyEntity',
            'controller class' => 'MyVocabulryController',
            'base table' => 'my_vocabulary',
            'fieldable' => TRUE,
            'entity keys' => array(
                'id' => 'entity_id',
                'label' => 'vocabulary',
            ),
            'bundles' => array(
                'my_vocabulary' => array(
                    'label'=>'My Vocabulary',
                    'admin' => array(
                        'path' => 'admin/structure/my-vocabulary/manage',
                        'access arguments' => array('administer my vocabulary'),
                        'controller class' => 'EntityDefaultUIController',
                    ),
                ),
            ),
            'view modes' => array(
                'full' => array(
                    'label' => t('Default'),
                    'custom settings' => FALSE,
                ),
            ),
            'module' => 'my_vocabulary',
            'access callback' => 'my_vocabulary_access',
        ),
    );
}
	
// entity/entity.module の659行あたり
function entity_access($op, $entity_type, $entity = NULL, $account = NULL) {
  if (($info = entity_get_info()) && isset($info[$entity_type]['access callback'])) {
    return $info[$entity_type]['access callback']($op, $entity, $account, $entity_type);
  }
}
	hook_menuで定義したページへのアクセス権限設定は「access callback」と「access arguments」で行います。特定なユーザーロール、特定なユーザーのみなどの制御が可能となります。特に、ユーザーのアクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)で各ページのアクセス権限管理が一般的で、よく利用されます。hook_menuがこのアクセス権限管理の実装方法を纏めます。
/**
 * Implements hook_permission().
 */
function [my-module-name]_permission() {
  return array(
      'authorize fbauth_connect' => array(
          'title' => t('Connect Facebook account and store access token'),
      ),
  );
}
		
/**
 * Implements hook_entity_info().
 */
function drills_ch_vocabulary_entity_info()
{
    return array(
        'my_vocabulary' => array(
            'label' => t('My Vocabulary'),
            'entity class' => 'MyVocabularyEntity',
            'controller class' => 'MyVocabulryController',
            'base table' => 'my_vocabulary',
            'fieldable' => TRUE,
            'entity keys' => array(
                'id' => 'entity_id',
                'label' => 'vocabulary',
            ),
            'bundles' => array(
                'my_vocabulary' => array(
                    'label'=>'My Vocabulary',
                    'admin' => array(
                        'path' => 'admin/structure/my-vocabulary/manage',
                        'access arguments' => array('administer my vocabulary'),
                        'controller class' => 'EntityDefaultUIController',
                    ),
                ),
            ),
            'view modes' => array(
                'full' => array(
                    'label' => t('Default'),
                    'custom settings' => FALSE,
                ),
            ),
            'module' => 'my_vocabulary',
            'access callback' => 'my_vocabulary_access',
        ),
    );
}
	
// entity/entity.module の659行あたり
function entity_access($op, $entity_type, $entity = NULL, $account = NULL) {
  if (($info = entity_get_info()) && isset($info[$entity_type]['access callback'])) {
    return $info[$entity_type]['access callback']($op, $entity, $account, $entity_type);
  }
}
	hook_menuで定義したページへのアクセス権限設定は「access callback」と「access arguments」で行います。特定なユーザーロール、特定なユーザーのみなどの制御が可能となります。特に、ユーザーのアクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)で各ページのアクセス権限管理が一般的で、よく利用されます。hook_menuがこのアクセス権限管理の実装方法を纏めます。
/**
 * Implements hook_permission().
 */
function [my-module-name]_permission() {
  return array(
      'authorize fbauth_connect' => array(
          'title' => t('Connect Facebook account and store access token'),
      ),
  );
}
		
/**
 * Implements hook_entity_info().
 */
function drills_ch_vocabulary_entity_info()
{
    return array(
        'my_vocabulary' => array(
            'label' => t('My Vocabulary'),
            'entity class' => 'MyVocabularyEntity',
            'controller class' => 'MyVocabulryController',
            'base table' => 'my_vocabulary',
            'fieldable' => TRUE,
            'entity keys' => array(
                'id' => 'entity_id',
                'label' => 'vocabulary',
            ),
            'bundles' => array(
                'my_vocabulary' => array(
                    'label'=>'My Vocabulary',
                    'admin' => array(
                        'path' => 'admin/structure/my-vocabulary/manage',
                        'access arguments' => array('administer my vocabulary'),
                        'controller class' => 'EntityDefaultUIController',
                    ),
                ),
            ),
            'view modes' => array(
                'full' => array(
                    'label' => t('Default'),
                    'custom settings' => FALSE,
                ),
            ),
            'module' => 'my_vocabulary',
            'access callback' => 'my_vocabulary_access',
        ),
    );
}
	
// entity/entity.module の659行あたり
function entity_access($op, $entity_type, $entity = NULL, $account = NULL) {
  if (($info = entity_get_info()) && isset($info[$entity_type]['access callback'])) {
    return $info[$entity_type]['access callback']($op, $entity, $account, $entity_type);
  }
}
	hook_menuで定義したページへのアクセス権限設定は「access callback」と「access arguments」で行います。特定なユーザーロール、特定なユーザーのみなどの制御が可能となります。特に、ユーザーのアクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)で各ページのアクセス権限管理が一般的で、よく利用されます。hook_menuがこのアクセス権限管理の実装方法を纏めます。
/**
 * Implements hook_permission().
 */
function [my-module-name]_permission() {
  return array(
      'authorize fbauth_connect' => array(
          'title' => t('Connect Facebook account and store access token'),
      ),
  );
}
		
/**
 * Implements hook_entity_info().
 */
function drills_ch_vocabulary_entity_info()
{
    return array(
        'my_vocabulary' => array(
            'label' => t('My Vocabulary'),
            'entity class' => 'MyVocabularyEntity',
            'controller class' => 'MyVocabulryController',
            'base table' => 'my_vocabulary',
            'fieldable' => TRUE,
            'entity keys' => array(
                'id' => 'entity_id',
                'label' => 'vocabulary',
            ),
            'bundles' => array(
                'my_vocabulary' => array(
                    'label'=>'My Vocabulary',
                    'admin' => array(
                        'path' => 'admin/structure/my-vocabulary/manage',
                        'access arguments' => array('administer my vocabulary'),
                        'controller class' => 'EntityDefaultUIController',
                    ),
                ),
            ),
            'view modes' => array(
                'full' => array(
                    'label' => t('Default'),
                    'custom settings' => FALSE,
                ),
            ),
            'module' => 'my_vocabulary',
            'access callback' => 'my_vocabulary_access',
        ),
    );
}
	
// entity/entity.module の659行あたり
function entity_access($op, $entity_type, $entity = NULL, $account = NULL) {
  if (($info = entity_get_info()) && isset($info[$entity_type]['access callback'])) {
    return $info[$entity_type]['access callback']($op, $entity, $account, $entity_type);
  }
}
	hook_menuで定義したページへのアクセス権限設定は「access callback」と「access arguments」で行います。特定なユーザーロール、特定なユーザーのみなどの制御が可能となります。特に、ユーザーのアクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)で各ページのアクセス権限管理が一般的で、よく利用されます。hook_menuがこのアクセス権限管理の実装方法を纏めます。
/**
 * Implements hook_permission().
 */
function [my-module-name]_permission() {
  return array(
      'authorize fbauth_connect' => array(
          'title' => t('Connect Facebook account and store access token'),
      ),
  );
}
		
/**
 * Implements hook_entity_info().
 */
function drills_ch_vocabulary_entity_info()
{
    return array(
        'my_vocabulary' => array(
            'label' => t('My Vocabulary'),
            'entity class' => 'MyVocabularyEntity',
            'controller class' => 'MyVocabulryController',
            'base table' => 'my_vocabulary',
            'fieldable' => TRUE,
            'entity keys' => array(
                'id' => 'entity_id',
                'label' => 'vocabulary',
            ),
            'bundles' => array(
                'my_vocabulary' => array(
                    'label'=>'My Vocabulary',
                    'admin' => array(
                        'path' => 'admin/structure/my-vocabulary/manage',
                        'access arguments' => array('administer my vocabulary'),
                        'controller class' => 'EntityDefaultUIController',
                    ),
                ),
            ),
            'view modes' => array(
                'full' => array(
                    'label' => t('Default'),
                    'custom settings' => FALSE,
                ),
            ),
            'module' => 'my_vocabulary',
            'access callback' => 'my_vocabulary_access',
        ),
    );
}
	
// entity/entity.module の659行あたり
function entity_access($op, $entity_type, $entity = NULL, $account = NULL) {
  if (($info = entity_get_info()) && isset($info[$entity_type]['access callback'])) {
    return $info[$entity_type]['access callback']($op, $entity, $account, $entity_type);
  }
}
	hook_menuで定義したページへのアクセス権限設定は「access callback」と「access arguments」で行います。特定なユーザーロール、特定なユーザーのみなどの制御が可能となります。特に、ユーザーのアクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)で各ページのアクセス権限管理が一般的で、よく利用されます。hook_menuがこのアクセス権限管理の実装方法を纏めます。
/**
 * Implements hook_permission().
 */
function [my-module-name]_permission() {
  return array(
      'authorize fbauth_connect' => array(
          'title' => t('Connect Facebook account and store access token'),
      ),
  );
}
		
/**
 * Implements hook_entity_info().
 */
function drills_ch_vocabulary_entity_info()
{
    return array(
        'my_vocabulary' => array(
            'label' => t('My Vocabulary'),
            'entity class' => 'MyVocabularyEntity',
            'controller class' => 'MyVocabulryController',
            'base table' => 'my_vocabulary',
            'fieldable' => TRUE,
            'entity keys' => array(
                'id' => 'entity_id',
                'label' => 'vocabulary',
            ),
            'bundles' => array(
                'my_vocabulary' => array(
                    'label'=>'My Vocabulary',
                    'admin' => array(
                        'path' => 'admin/structure/my-vocabulary/manage',
                        'access arguments' => array('administer my vocabulary'),
                        'controller class' => 'EntityDefaultUIController',
                    ),
                ),
            ),
            'view modes' => array(
                'full' => array(
                    'label' => t('Default'),
                    'custom settings' => FALSE,
                ),
            ),
            'module' => 'my_vocabulary',
            'access callback' => 'my_vocabulary_access',
        ),
    );
}
	
// entity/entity.module の659行あたり
function entity_access($op, $entity_type, $entity = NULL, $account = NULL) {
  if (($info = entity_get_info()) && isset($info[$entity_type]['access callback'])) {
    return $info[$entity_type]['access callback']($op, $entity, $account, $entity_type);
  }
}
	hook_menuで定義したページへのアクセス権限設定は「access callback」と「access arguments」で行います。特定なユーザーロール、特定なユーザーのみなどの制御が可能となります。特に、ユーザーのアクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)で各ページのアクセス権限管理が一般的で、よく利用されます。hook_menuがこのアクセス権限管理の実装方法を纏めます。
/**
 * Implements hook_permission().
 */
function [my-module-name]_permission() {
  return array(
      'authorize fbauth_connect' => array(
          'title' => t('Connect Facebook account and store access token'),
      ),
  );
}
		
/**
 * Implements hook_entity_info().
 */
function drills_ch_vocabulary_entity_info()
{
    return array(
        'my_vocabulary' => array(
            'label' => t('My Vocabulary'),
            'entity class' => 'MyVocabularyEntity',
            'controller class' => 'MyVocabulryController',
            'base table' => 'my_vocabulary',
            'fieldable' => TRUE,
            'entity keys' => array(
                'id' => 'entity_id',
                'label' => 'vocabulary',
            ),
            'bundles' => array(
                'my_vocabulary' => array(
                    'label'=>'My Vocabulary',
                    'admin' => array(
                        'path' => 'admin/structure/my-vocabulary/manage',
                        'access arguments' => array('administer my vocabulary'),
                        'controller class' => 'EntityDefaultUIController',
                    ),
                ),
            ),
            'view modes' => array(
                'full' => array(
                    'label' => t('Default'),
                    'custom settings' => FALSE,
                ),
            ),
            'module' => 'my_vocabulary',
            'access callback' => 'my_vocabulary_access',
        ),
    );
}
	
// entity/entity.module の659行あたり
function entity_access($op, $entity_type, $entity = NULL, $account = NULL) {
  if (($info = entity_get_info()) && isset($info[$entity_type]['access callback'])) {
    return $info[$entity_type]['access callback']($op, $entity, $account, $entity_type);
  }
}
	hook_menuで定義したページへのアクセス権限設定は「access callback」と「access arguments」で行います。特定なユーザーロール、特定なユーザーのみなどの制御が可能となります。特に、ユーザーのアクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)で各ページのアクセス権限管理が一般的で、よく利用されます。hook_menuがこのアクセス権限管理の実装方法を纏めます。
/**
 * Implements hook_permission().
 */
function [my-module-name]_permission() {
  return array(
      'authorize fbauth_connect' => array(
          'title' => t('Connect Facebook account and store access token'),
      ),
  );
}
		
/**
 * Implements hook_entity_info().
 */
function drills_ch_vocabulary_entity_info()
{
    return array(
        'my_vocabulary' => array(
            'label' => t('My Vocabulary'),
            'entity class' => 'MyVocabularyEntity',
            'controller class' => 'MyVocabulryController',
            'base table' => 'my_vocabulary',
            'fieldable' => TRUE,
            'entity keys' => array(
                'id' => 'entity_id',
                'label' => 'vocabulary',
            ),
            'bundles' => array(
                'my_vocabulary' => array(
                    'label'=>'My Vocabulary',
                    'admin' => array(
                        'path' => 'admin/structure/my-vocabulary/manage',
                        'access arguments' => array('administer my vocabulary'),
                        'controller class' => 'EntityDefaultUIController',
                    ),
                ),
            ),
            'view modes' => array(
                'full' => array(
                    'label' => t('Default'),
                    'custom settings' => FALSE,
                ),
            ),
            'module' => 'my_vocabulary',
            'access callback' => 'my_vocabulary_access',
        ),
    );
}
	
// entity/entity.module の659行あたり
function entity_access($op, $entity_type, $entity = NULL, $account = NULL) {
  if (($info = entity_get_info()) && isset($info[$entity_type]['access callback'])) {
    return $info[$entity_type]['access callback']($op, $entity, $account, $entity_type);
  }
}
	hook_menuで定義したページへのアクセス権限設定は「access callback」と「access arguments」で行います。特定なユーザーロール、特定なユーザーのみなどの制御が可能となります。特に、ユーザーのアクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)で各ページのアクセス権限管理が一般的で、よく利用されます。hook_menuがこのアクセス権限管理の実装方法を纏めます。
/**
 * Implements hook_permission().
 */
function [my-module-name]_permission() {
  return array(
      'authorize fbauth_connect' => array(
          'title' => t('Connect Facebook account and store access token'),
      ),
  );
}
		
/**
 * Implements hook_entity_info().
 */
function drills_ch_vocabulary_entity_info()
{
    return array(
        'my_vocabulary' => array(
            'label' => t('My Vocabulary'),
            'entity class' => 'MyVocabularyEntity',
            'controller class' => 'MyVocabulryController',
            'base table' => 'my_vocabulary',
            'fieldable' => TRUE,
            'entity keys' => array(
                'id' => 'entity_id',
                'label' => 'vocabulary',
            ),
            'bundles' => array(
                'my_vocabulary' => array(
                    'label'=>'My Vocabulary',
                    'admin' => array(
                        'path' => 'admin/structure/my-vocabulary/manage',
                        'access arguments' => array('administer my vocabulary'),
                        'controller class' => 'EntityDefaultUIController',
                    ),
                ),
            ),
            'view modes' => array(
                'full' => array(
                    'label' => t('Default'),
                    'custom settings' => FALSE,
                ),
            ),
            'module' => 'my_vocabulary',
            'access callback' => 'my_vocabulary_access',
        ),
    );
}
	
// entity/entity.module の659行あたり
function entity_access($op, $entity_type, $entity = NULL, $account = NULL) {
  if (($info = entity_get_info()) && isset($info[$entity_type]['access callback'])) {
    return $info[$entity_type]['access callback']($op, $entity, $account, $entity_type);
  }
}
	hook_menuで定義したページへのアクセス権限設定は「access callback」と「access arguments」で行います。特定なユーザーロール、特定なユーザーのみなどの制御が可能となります。特に、ユーザーのアクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)で各ページのアクセス権限管理が一般的で、よく利用されます。hook_menuがこのアクセス権限管理の実装方法を纏めます。
/**
 * Implements hook_permission().
 */
function [my-module-name]_permission() {
  return array(
      'authorize fbauth_connect' => array(
          'title' => t('Connect Facebook account and store access token'),
      ),
  );
}
		
/**
 * Implements hook_entity_info().
 */
function drills_ch_vocabulary_entity_info()
{
    return array(
        'my_vocabulary' => array(
            'label' => t('My Vocabulary'),
            'entity class' => 'MyVocabularyEntity',
            'controller class' => 'MyVocabulryController',
            'base table' => 'my_vocabulary',
            'fieldable' => TRUE,
            'entity keys' => array(
                'id' => 'entity_id',
                'label' => 'vocabulary',
            ),
            'bundles' => array(
                'my_vocabulary' => array(
                    'label'=>'My Vocabulary',
                    'admin' => array(
                        'path' => 'admin/structure/my-vocabulary/manage',
                        'access arguments' => array('administer my vocabulary'),
                        'controller class' => 'EntityDefaultUIController',
                    ),
                ),
            ),
            'view modes' => array(
                'full' => array(
                    'label' => t('Default'),
                    'custom settings' => FALSE,
                ),
            ),
            'module' => 'my_vocabulary',
            'access callback' => 'my_vocabulary_access',
        ),
    );
}
	
// entity/entity.module の659行あたり
function entity_access($op, $entity_type, $entity = NULL, $account = NULL) {
  if (($info = entity_get_info()) && isset($info[$entity_type]['access callback'])) {
    return $info[$entity_type]['access callback']($op, $entity, $account, $entity_type);
  }
}
	hook_menuで定義したページへのアクセス権限設定は「access callback」と「access arguments」で行います。特定なユーザーロール、特定なユーザーのみなどの制御が可能となります。特に、ユーザーのアクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)で各ページのアクセス権限管理が一般的で、よく利用されます。hook_menuがこのアクセス権限管理の実装方法を纏めます。
/**
 * Implements hook_permission().
 */
function [my-module-name]_permission() {
  return array(
      'authorize fbauth_connect' => array(
          'title' => t('Connect Facebook account and store access token'),
      ),
  );
}
		
/**
 * Implements hook_entity_info().
 */
function drills_ch_vocabulary_entity_info()
{
    return array(
        'my_vocabulary' => array(
            'label' => t('My Vocabulary'),
            'entity class' => 'MyVocabularyEntity',
            'controller class' => 'MyVocabulryController',
            'base table' => 'my_vocabulary',
            'fieldable' => TRUE,
            'entity keys' => array(
                'id' => 'entity_id',
                'label' => 'vocabulary',
            ),
            'bundles' => array(
                'my_vocabulary' => array(
                    'label'=>'My Vocabulary',
                    'admin' => array(
                        'path' => 'admin/structure/my-vocabulary/manage',
                        'access arguments' => array('administer my vocabulary'),
                        'controller class' => 'EntityDefaultUIController',
                    ),
                ),
            ),
            'view modes' => array(
                'full' => array(
                    'label' => t('Default'),
                    'custom settings' => FALSE,
                ),
            ),
            'module' => 'my_vocabulary',
            'access callback' => 'my_vocabulary_access',
        ),
    );
}
	
// entity/entity.module の659行あたり
function entity_access($op, $entity_type, $entity = NULL, $account = NULL) {
  if (($info = entity_get_info()) && isset($info[$entity_type]['access callback'])) {
    return $info[$entity_type]['access callback']($op, $entity, $account, $entity_type);
  }
}
	hook_menuで定義したページへのアクセス権限設定は「access callback」と「access arguments」で行います。特定なユーザーロール、特定なユーザーのみなどの制御が可能となります。特に、ユーザーのアクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)で各ページのアクセス権限管理が一般的で、よく利用されます。hook_menuがこのアクセス権限管理の実装方法を纏めます。
/**
 * Implements hook_permission().
 */
function [my-module-name]_permission() {
  return array(
      'authorize fbauth_connect' => array(
          'title' => t('Connect Facebook account and store access token'),
      ),
  );
}
		
/**
 * Implements hook_entity_info().
 */
function drills_ch_vocabulary_entity_info()
{
    return array(
        'my_vocabulary' => array(
            'label' => t('My Vocabulary'),
            'entity class' => 'MyVocabularyEntity',
            'controller class' => 'MyVocabulryController',
            'base table' => 'my_vocabulary',
            'fieldable' => TRUE,
            'entity keys' => array(
                'id' => 'entity_id',
                'label' => 'vocabulary',
            ),
            'bundles' => array(
                'my_vocabulary' => array(
                    'label'=>'My Vocabulary',
                    'admin' => array(
                        'path' => 'admin/structure/my-vocabulary/manage',
                        'access arguments' => array('administer my vocabulary'),
                        'controller class' => 'EntityDefaultUIController',
                    ),
                ),
            ),
            'view modes' => array(
                'full' => array(
                    'label' => t('Default'),
                    'custom settings' => FALSE,
                ),
            ),
            'module' => 'my_vocabulary',
            'access callback' => 'my_vocabulary_access',
        ),
    );
}
	
// entity/entity.module の659行あたり
function entity_access($op, $entity_type, $entity = NULL, $account = NULL) {
  if (($info = entity_get_info()) && isset($info[$entity_type]['access callback'])) {
    return $info[$entity_type]['access callback']($op, $entity, $account, $entity_type);
  }
}
	hook_menuで定義したページへのアクセス権限設定は「access callback」と「access arguments」で行います。特定なユーザーロール、特定なユーザーのみなどの制御が可能となります。特に、ユーザーのアクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)で各ページのアクセス権限管理が一般的で、よく利用されます。hook_menuがこのアクセス権限管理の実装方法を纏めます。
/**
 * Implements hook_permission().
 */
function [my-module-name]_permission() {
  return array(
      'authorize fbauth_connect' => array(
          'title' => t('Connect Facebook account and store access token'),
      ),
  );
}
		
/**
 * Implements hook_entity_info().
 */
function drills_ch_vocabulary_entity_info()
{
    return array(
        'my_vocabulary' => array(
            'label' => t('My Vocabulary'),
            'entity class' => 'MyVocabularyEntity',
            'controller class' => 'MyVocabulryController',
            'base table' => 'my_vocabulary',
            'fieldable' => TRUE,
            'entity keys' => array(
                'id' => 'entity_id',
                'label' => 'vocabulary',
            ),
            'bundles' => array(
                'my_vocabulary' => array(
                    'label'=>'My Vocabulary',
                    'admin' => array(
                        'path' => 'admin/structure/my-vocabulary/manage',
                        'access arguments' => array('administer my vocabulary'),
                        'controller class' => 'EntityDefaultUIController',
                    ),
                ),
            ),
            'view modes' => array(
                'full' => array(
                    'label' => t('Default'),
                    'custom settings' => FALSE,
                ),
            ),
            'module' => 'my_vocabulary',
            'access callback' => 'my_vocabulary_access',
        ),
    );
}
	
// entity/entity.module の659行あたり
function entity_access($op, $entity_type, $entity = NULL, $account = NULL) {
  if (($info = entity_get_info()) && isset($info[$entity_type]['access callback'])) {
    return $info[$entity_type]['access callback']($op, $entity, $account, $entity_type);
  }
}
	hook_menuで定義したページへのアクセス権限設定は「access callback」と「access arguments」で行います。特定なユーザーロール、特定なユーザーのみなどの制御が可能となります。特に、ユーザーのアクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)で各ページのアクセス権限管理が一般的で、よく利用されます。hook_menuがこのアクセス権限管理の実装方法を纏めます。
/**
 * Implements hook_permission().
 */
function [my-module-name]_permission() {
  return array(
      'authorize fbauth_connect' => array(
          'title' => t('Connect Facebook account and store access token'),
      ),
  );
}
		
/**
 * Implements hook_entity_info().
 */
function drills_ch_vocabulary_entity_info()
{
    return array(
        'my_vocabulary' => array(
            'label' => t('My Vocabulary'),
            'entity class' => 'MyVocabularyEntity',
            'controller class' => 'MyVocabulryController',
            'base table' => 'my_vocabulary',
            'fieldable' => TRUE,
            'entity keys' => array(
                'id' => 'entity_id',
                'label' => 'vocabulary',
            ),
            'bundles' => array(
                'my_vocabulary' => array(
                    'label'=>'My Vocabulary',
                    'admin' => array(
                        'path' => 'admin/structure/my-vocabulary/manage',
                        'access arguments' => array('administer my vocabulary'),
                        'controller class' => 'EntityDefaultUIController',
                    ),
                ),
            ),
            'view modes' => array(
                'full' => array(
                    'label' => t('Default'),
                    'custom settings' => FALSE,
                ),
            ),
            'module' => 'my_vocabulary',
            'access callback' => 'my_vocabulary_access',
        ),
    );
}
	
// entity/entity.module の659行あたり
function entity_access($op, $entity_type, $entity = NULL, $account = NULL) {
  if (($info = entity_get_info()) && isset($info[$entity_type]['access callback'])) {
    return $info[$entity_type]['access callback']($op, $entity, $account, $entity_type);
  }
}
	hook_menuで定義したページへのアクセス権限設定は「access callback」と「access arguments」で行います。特定なユーザーロール、特定なユーザーのみなどの制御が可能となります。特に、ユーザーのアクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)で各ページのアクセス権限管理が一般的で、よく利用されます。hook_menuがこのアクセス権限管理の実装方法を纏めます。
/**
 * Implements hook_permission().
 */
function [my-module-name]_permission() {
  return array(
      'authorize fbauth_connect' => array(
          'title' => t('Connect Facebook account and store access token'),
      ),
  );
}
		
/**
 * Implements hook_entity_info().
 */
function drills_ch_vocabulary_entity_info()
{
    return array(
        'my_vocabulary' => array(
            'label' => t('My Vocabulary'),
            'entity class' => 'MyVocabularyEntity',
            'controller class' => 'MyVocabulryController',
            'base table' => 'my_vocabulary',
            'fieldable' => TRUE,
            'entity keys' => array(
                'id' => 'entity_id',
                'label' => 'vocabulary',
            ),
            'bundles' => array(
                'my_vocabulary' => array(
                    'label'=>'My Vocabulary',
                    'admin' => array(
                        'path' => 'admin/structure/my-vocabulary/manage',
                        'access arguments' => array('administer my vocabulary'),
                        'controller class' => 'EntityDefaultUIController',
                    ),
                ),
            ),
            'view modes' => array(
                'full' => array(
                    'label' => t('Default'),
                    'custom settings' => FALSE,
                ),
            ),
            'module' => 'my_vocabulary',
            'access callback' => 'my_vocabulary_access',
        ),
    );
}
	
// entity/entity.module の659行あたり
function entity_access($op, $entity_type, $entity = NULL, $account = NULL) {
  if (($info = entity_get_info()) && isset($info[$entity_type]['access callback'])) {
    return $info[$entity_type]['access callback']($op, $entity, $account, $entity_type);
  }
}
	hook_menuで定義したページへのアクセス権限設定は「access callback」と「access arguments」で行います。特定なユーザーロール、特定なユーザーのみなどの制御が可能となります。特に、ユーザーのアクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)で各ページのアクセス権限管理が一般的で、よく利用されます。hook_menuがこのアクセス権限管理の実装方法を纏めます。
/**
 * Implements hook_permission().
 */
function [my-module-name]_permission() {
  return array(
      'authorize fbauth_connect' => array(
          'title' => t('Connect Facebook account and store access token'),
      ),
  );
}
		
/**
 * Implements hook_entity_info().
 */
function drills_ch_vocabulary_entity_info()
{
    return array(
        'my_vocabulary' => array(
            'label' => t('My Vocabulary'),
            'entity class' => 'MyVocabularyEntity',
            'controller class' => 'MyVocabulryController',
            'base table' => 'my_vocabulary',
            'fieldable' => TRUE,
            'entity keys' => array(
                'id' => 'entity_id',
                'label' => 'vocabulary',
            ),
            'bundles' => array(
                'my_vocabulary' => array(
                    'label'=>'My Vocabulary',
                    'admin' => array(
                        'path' => 'admin/structure/my-vocabulary/manage',
                        'access arguments' => array('administer my vocabulary'),
                        'controller class' => 'EntityDefaultUIController',
                    ),
                ),
            ),
            'view modes' => array(
                'full' => array(
                    'label' => t('Default'),
                    'custom settings' => FALSE,
                ),
            ),
            'module' => 'my_vocabulary',
            'access callback' => 'my_vocabulary_access',
        ),
    );
}
	
// entity/entity.module の659行あたり
function entity_access($op, $entity_type, $entity = NULL, $account = NULL) {
  if (($info = entity_get_info()) && isset($info[$entity_type]['access callback'])) {
    return $info[$entity_type]['access callback']($op, $entity, $account, $entity_type);
  }
}
	hook_menuで定義したページへのアクセス権限設定は「access callback」と「access arguments」で行います。特定なユーザーロール、特定なユーザーのみなどの制御が可能となります。特に、ユーザーのアクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)で各ページのアクセス権限管理が一般的で、よく利用されます。hook_menuがこのアクセス権限管理の実装方法を纏めます。
/**
 * Implements hook_permission().
 */
function [my-module-name]_permission() {
  return array(
      'authorize fbauth_connect' => array(
          'title' => t('Connect Facebook account and store access token'),
      ),
  );
}
		
/**
 * Access callback for endity
 */
function vocabulary_access($op, $entity, $account = NULL, $entity_type = NULL) {
    global $user;
    if (!isset($account)) {
        $account = $user;
    }
    switch ($op) {
        case 'create':
            return user_access('administer vocabulary', $account)
            || user_access('create vocabulary', $account);
        case 'view':
            return user_access('administer vocabulary', $account)
            || user_access('view vocabulary', $account);
        case 'edit':
        case 'save':    // save permission created by  entity_rule.inc
            return user_access('administer vocabulary')
            || user_access('edit any vocabulary')
            || (user_access('edit my own vocabulary') && ($entity->uid == $account->uid));
        case 'delete':
            return user_access('administer vocabulary')
            || user_access('delete any vocabulary')
            || (user_access('edit my own vocabulary') && ($entity->uid == $account->uid));
    }
}
	
/**
 * Implements hook_entity_info().
 */
function drills_ch_vocabulary_entity_info()
{
    return array(
        'my_vocabulary' => array(
            'label' => t('My Vocabulary'),
            'entity class' => 'MyVocabularyEntity',
            'controller class' => 'MyVocabulryController',
            'base table' => 'my_vocabulary',
            'fieldable' => TRUE,
            'entity keys' => array(
                'id' => 'entity_id',
                'label' => 'vocabulary',
            ),
            'bundles' => array(
                'my_vocabulary' => array(
                    'label'=>'My Vocabulary',
                    'admin' => array(
                        'path' => 'admin/structure/my-vocabulary/manage',
                        'access arguments' => array('administer my vocabulary'),
                        'controller class' => 'EntityDefaultUIController',
                    ),
                ),
            ),
            'view modes' => array(
                'full' => array(
                    'label' => t('Default'),
                    'custom settings' => FALSE,
                ),
            ),
            'module' => 'my_vocabulary',
            'access callback' => 'my_vocabulary_access',
        ),
    );
}
	
// entity/entity.module の659行あたり
function entity_access($op, $entity_type, $entity = NULL, $account = NULL) {
  if (($info = entity_get_info()) && isset($info[$entity_type]['access callback'])) {
    return $info[$entity_type]['access callback']($op, $entity, $account, $entity_type);
  }
}
	
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>');
}
		
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
        'title' => 'Copy and Remove',
        'page callback' => 'ajax_add_to_my_vocabulary',
        'page arguments' => array(array(), array(), 2) ,
        'access arguments' => array('create my vocabulary'),
  );
}
	
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
   'title' => 'Copy and Remove', 
   'page callback' => 'drupal_get_form', 
   'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
   'access arguments' => array('create my vocabulary'), 
  ); 
}
	
/**
 * Access callback for endity
 */
function vocabulary_access($op, $entity, $account = NULL, $entity_type = NULL) {
    global $user;
    if (!isset($account)) {
        $account = $user;
    }
    switch ($op) {
        case 'create':
            return user_access('administer vocabulary', $account)
            || user_access('create vocabulary', $account);
        case 'view':
            return user_access('administer vocabulary', $account)
            || user_access('view vocabulary', $account);
        case 'edit':
        case 'save':    // save permission created by  entity_rule.inc
            return user_access('administer vocabulary')
            || user_access('edit any vocabulary')
            || (user_access('edit my own vocabulary') && ($entity->uid == $account->uid));
        case 'delete':
            return user_access('administer vocabulary')
            || user_access('delete any vocabulary')
            || (user_access('edit my own vocabulary') && ($entity->uid == $account->uid));
    }
}
	
/**
 * Implements hook_entity_info().
 */
function drills_ch_vocabulary_entity_info()
{
    return array(
        'my_vocabulary' => array(
            'label' => t('My Vocabulary'),
            'entity class' => 'MyVocabularyEntity',
            'controller class' => 'MyVocabulryController',
            'base table' => 'my_vocabulary',
            'fieldable' => TRUE,
            'entity keys' => array(
                'id' => 'entity_id',
                'label' => 'vocabulary',
            ),
            'bundles' => array(
                'my_vocabulary' => array(
                    'label'=>'My Vocabulary',
                    'admin' => array(
                        'path' => 'admin/structure/my-vocabulary/manage',
                        'access arguments' => array('administer my vocabulary'),
                        'controller class' => 'EntityDefaultUIController',
                    ),
                ),
            ),
            'view modes' => array(
                'full' => array(
                    'label' => t('Default'),
                    'custom settings' => FALSE,
                ),
            ),
            'module' => 'my_vocabulary',
            'access callback' => 'my_vocabulary_access',
        ),
    );
}
	
// entity/entity.module の659行あたり
function entity_access($op, $entity_type, $entity = NULL, $account = NULL) {
  if (($info = entity_get_info()) && isset($info[$entity_type]['access callback'])) {
    return $info[$entity_type]['access callback']($op, $entity, $account, $entity_type);
  }
}
	
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>');
}
		
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
        'title' => 'Copy and Remove',
        'page callback' => 'ajax_add_to_my_vocabulary',
        'page arguments' => array(array(), array(), 2) ,
        'access arguments' => array('create my vocabulary'),
  );
}
	
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
   'title' => 'Copy and Remove', 
   'page callback' => 'drupal_get_form', 
   'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
   'access arguments' => array('create my vocabulary'), 
  ); 
}
	
/**
 * Access callback for endity
 */
function vocabulary_access($op, $entity, $account = NULL, $entity_type = NULL) {
    global $user;
    if (!isset($account)) {
        $account = $user;
    }
    switch ($op) {
        case 'create':
            return user_access('administer vocabulary', $account)
            || user_access('create vocabulary', $account);
        case 'view':
            return user_access('administer vocabulary', $account)
            || user_access('view vocabulary', $account);
        case 'edit':
        case 'save':    // save permission created by  entity_rule.inc
            return user_access('administer vocabulary')
            || user_access('edit any vocabulary')
            || (user_access('edit my own vocabulary') && ($entity->uid == $account->uid));
        case 'delete':
            return user_access('administer vocabulary')
            || user_access('delete any vocabulary')
            || (user_access('edit my own vocabulary') && ($entity->uid == $account->uid));
    }
}
	
/**
 * Implements hook_entity_info().
 */
function drills_ch_vocabulary_entity_info()
{
    return array(
        'my_vocabulary' => array(
            'label' => t('My Vocabulary'),
            'entity class' => 'MyVocabularyEntity',
            'controller class' => 'MyVocabulryController',
            'base table' => 'my_vocabulary',
            'fieldable' => TRUE,
            'entity keys' => array(
                'id' => 'entity_id',
                'label' => 'vocabulary',
            ),
            'bundles' => array(
                'my_vocabulary' => array(
                    'label'=>'My Vocabulary',
                    'admin' => array(
                        'path' => 'admin/structure/my-vocabulary/manage',
                        'access arguments' => array('administer my vocabulary'),
                        'controller class' => 'EntityDefaultUIController',
                    ),
                ),
            ),
            'view modes' => array(
                'full' => array(
                    'label' => t('Default'),
                    'custom settings' => FALSE,
                ),
            ),
            'module' => 'my_vocabulary',
            'access callback' => 'my_vocabulary_access',
        ),
    );
}
	
// entity/entity.module の659行あたり
function entity_access($op, $entity_type, $entity = NULL, $account = NULL) {
  if (($info = entity_get_info()) && isset($info[$entity_type]['access callback'])) {
    return $info[$entity_type]['access callback']($op, $entity, $account, $entity_type);
  }
}
	
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>');
}
		
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
        'title' => 'Copy and Remove',
        'page callback' => 'ajax_add_to_my_vocabulary',
        'page arguments' => array(array(), array(), 2) ,
        'access arguments' => array('create my vocabulary'),
  );
}
	
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
   'title' => 'Copy and Remove', 
   'page callback' => 'drupal_get_form', 
   'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
   'access arguments' => array('create my vocabulary'), 
  ); 
}
	
/**
 * Access callback for endity
 */
function vocabulary_access($op, $entity, $account = NULL, $entity_type = NULL) {
    global $user;
    if (!isset($account)) {
        $account = $user;
    }
    switch ($op) {
        case 'create':
            return user_access('administer vocabulary', $account)
            || user_access('create vocabulary', $account);
        case 'view':
            return user_access('administer vocabulary', $account)
            || user_access('view vocabulary', $account);
        case 'edit':
        case 'save':    // save permission created by  entity_rule.inc
            return user_access('administer vocabulary')
            || user_access('edit any vocabulary')
            || (user_access('edit my own vocabulary') && ($entity->uid == $account->uid));
        case 'delete':
            return user_access('administer vocabulary')
            || user_access('delete any vocabulary')
            || (user_access('edit my own vocabulary') && ($entity->uid == $account->uid));
    }
}
	
/**
 * Implements hook_entity_info().
 */
function drills_ch_vocabulary_entity_info()
{
    return array(
        'my_vocabulary' => array(
            'label' => t('My Vocabulary'),
            'entity class' => 'MyVocabularyEntity',
            'controller class' => 'MyVocabulryController',
            'base table' => 'my_vocabulary',
            'fieldable' => TRUE,
            'entity keys' => array(
                'id' => 'entity_id',
                'label' => 'vocabulary',
            ),
            'bundles' => array(
                'my_vocabulary' => array(
                    'label'=>'My Vocabulary',
                    'admin' => array(
                        'path' => 'admin/structure/my-vocabulary/manage',
                        'access arguments' => array('administer my vocabulary'),
                        'controller class' => 'EntityDefaultUIController',
                    ),
                ),
            ),
            'view modes' => array(
                'full' => array(
                    'label' => t('Default'),
                    'custom settings' => FALSE,
                ),
            ),
            'module' => 'my_vocabulary',
            'access callback' => 'my_vocabulary_access',
        ),
    );
}
	
// entity/entity.module の659行あたり
function entity_access($op, $entity_type, $entity = NULL, $account = NULL) {
  if (($info = entity_get_info()) && isset($info[$entity_type]['access callback'])) {
    return $info[$entity_type]['access callback']($op, $entity, $account, $entity_type);
  }
}
	
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>');
}
		
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
        'title' => 'Copy and Remove',
        'page callback' => 'ajax_add_to_my_vocabulary',
        'page arguments' => array(array(), array(), 2) ,
        'access arguments' => array('create my vocabulary'),
  );
}
	
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
   'title' => 'Copy and Remove', 
   'page callback' => 'drupal_get_form', 
   'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
   'access arguments' => array('create my vocabulary'), 
  ); 
}
	
/**
 * Access callback for endity
 */
function vocabulary_access($op, $entity, $account = NULL, $entity_type = NULL) {
    global $user;
    if (!isset($account)) {
        $account = $user;
    }
    switch ($op) {
        case 'create':
            return user_access('administer vocabulary', $account)
            || user_access('create vocabulary', $account);
        case 'view':
            return user_access('administer vocabulary', $account)
            || user_access('view vocabulary', $account);
        case 'edit':
        case 'save':    // save permission created by  entity_rule.inc
            return user_access('administer vocabulary')
            || user_access('edit any vocabulary')
            || (user_access('edit my own vocabulary') && ($entity->uid == $account->uid));
        case 'delete':
            return user_access('administer vocabulary')
            || user_access('delete any vocabulary')
            || (user_access('edit my own vocabulary') && ($entity->uid == $account->uid));
    }
}
	
/**
 * Implements hook_entity_info().
 */
function drills_ch_vocabulary_entity_info()
{
    return array(
        'my_vocabulary' => array(
            'label' => t('My Vocabulary'),
            'entity class' => 'MyVocabularyEntity',
            'controller class' => 'MyVocabulryController',
            'base table' => 'my_vocabulary',
            'fieldable' => TRUE,
            'entity keys' => array(
                'id' => 'entity_id',
                'label' => 'vocabulary',
            ),
            'bundles' => array(
                'my_vocabulary' => array(
                    'label'=>'My Vocabulary',
                    'admin' => array(
                        'path' => 'admin/structure/my-vocabulary/manage',
                        'access arguments' => array('administer my vocabulary'),
                        'controller class' => 'EntityDefaultUIController',
                    ),
                ),
            ),
            'view modes' => array(
                'full' => array(
                    'label' => t('Default'),
                    'custom settings' => FALSE,
                ),
            ),
            'module' => 'my_vocabulary',
            'access callback' => 'my_vocabulary_access',
        ),
    );
}
	
// entity/entity.module の659行あたり
function entity_access($op, $entity_type, $entity = NULL, $account = NULL) {
  if (($info = entity_get_info()) && isset($info[$entity_type]['access callback'])) {
    return $info[$entity_type]['access callback']($op, $entity, $account, $entity_type);
  }
}
	
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>');
}
		
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
        'title' => 'Copy and Remove',
        'page callback' => 'ajax_add_to_my_vocabulary',
        'page arguments' => array(array(), array(), 2) ,
        'access arguments' => array('create my vocabulary'),
  );
}
	
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
   'title' => 'Copy and Remove', 
   'page callback' => 'drupal_get_form', 
   'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
   'access arguments' => array('create my vocabulary'), 
  ); 
}
	
/**
 * Access callback for endity
 */
function vocabulary_access($op, $entity, $account = NULL, $entity_type = NULL) {
    global $user;
    if (!isset($account)) {
        $account = $user;
    }
    switch ($op) {
        case 'create':
            return user_access('administer vocabulary', $account)
            || user_access('create vocabulary', $account);
        case 'view':
            return user_access('administer vocabulary', $account)
            || user_access('view vocabulary', $account);
        case 'edit':
        case 'save':    // save permission created by  entity_rule.inc
            return user_access('administer vocabulary')
            || user_access('edit any vocabulary')
            || (user_access('edit my own vocabulary') && ($entity->uid == $account->uid));
        case 'delete':
            return user_access('administer vocabulary')
            || user_access('delete any vocabulary')
            || (user_access('edit my own vocabulary') && ($entity->uid == $account->uid));
    }
}
	
/**
 * Implements hook_entity_info().
 */
function drills_ch_vocabulary_entity_info()
{
    return array(
        'my_vocabulary' => array(
            'label' => t('My Vocabulary'),
            'entity class' => 'MyVocabularyEntity',
            'controller class' => 'MyVocabulryController',
            'base table' => 'my_vocabulary',
            'fieldable' => TRUE,
            'entity keys' => array(
                'id' => 'entity_id',
                'label' => 'vocabulary',
            ),
            'bundles' => array(
                'my_vocabulary' => array(
                    'label'=>'My Vocabulary',
                    'admin' => array(
                        'path' => 'admin/structure/my-vocabulary/manage',
                        'access arguments' => array('administer my vocabulary'),
                        'controller class' => 'EntityDefaultUIController',
                    ),
                ),
            ),
            'view modes' => array(
                'full' => array(
                    'label' => t('Default'),
                    'custom settings' => FALSE,
                ),
            ),
            'module' => 'my_vocabulary',
            'access callback' => 'my_vocabulary_access',
        ),
    );
}
	
// entity/entity.module の659行あたり
function entity_access($op, $entity_type, $entity = NULL, $account = NULL) {
  if (($info = entity_get_info()) && isset($info[$entity_type]['access callback'])) {
    return $info[$entity_type]['access callback']($op, $entity, $account, $entity_type);
  }
}
	
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>');
}
		
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
        'title' => 'Copy and Remove',
        'page callback' => 'ajax_add_to_my_vocabulary',
        'page arguments' => array(array(), array(), 2) ,
        'access arguments' => array('create my vocabulary'),
  );
}
	
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
   'title' => 'Copy and Remove', 
   'page callback' => 'drupal_get_form', 
   'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
   'access arguments' => array('create my vocabulary'), 
  ); 
}
	
/**
 * Access callback for endity
 */
function vocabulary_access($op, $entity, $account = NULL, $entity_type = NULL) {
    global $user;
    if (!isset($account)) {
        $account = $user;
    }
    switch ($op) {
        case 'create':
            return user_access('administer vocabulary', $account)
            || user_access('create vocabulary', $account);
        case 'view':
            return user_access('administer vocabulary', $account)
            || user_access('view vocabulary', $account);
        case 'edit':
        case 'save':    // save permission created by  entity_rule.inc
            return user_access('administer vocabulary')
            || user_access('edit any vocabulary')
            || (user_access('edit my own vocabulary') && ($entity->uid == $account->uid));
        case 'delete':
            return user_access('administer vocabulary')
            || user_access('delete any vocabulary')
            || (user_access('edit my own vocabulary') && ($entity->uid == $account->uid));
    }
}
	
/**
 * Implements hook_entity_info().
 */
function drills_ch_vocabulary_entity_info()
{
    return array(
        'my_vocabulary' => array(
            'label' => t('My Vocabulary'),
            'entity class' => 'MyVocabularyEntity',
            'controller class' => 'MyVocabulryController',
            'base table' => 'my_vocabulary',
            'fieldable' => TRUE,
            'entity keys' => array(
                'id' => 'entity_id',
                'label' => 'vocabulary',
            ),
            'bundles' => array(
                'my_vocabulary' => array(
                    'label'=>'My Vocabulary',
                    'admin' => array(
                        'path' => 'admin/structure/my-vocabulary/manage',
                        'access arguments' => array('administer my vocabulary'),
                        'controller class' => 'EntityDefaultUIController',
                    ),
                ),
            ),
            'view modes' => array(
                'full' => array(
                    'label' => t('Default'),
                    'custom settings' => FALSE,
                ),
            ),
            'module' => 'my_vocabulary',
            'access callback' => 'my_vocabulary_access',
        ),
    );
}
	
// entity/entity.module の659行あたり
function entity_access($op, $entity_type, $entity = NULL, $account = NULL) {
  if (($info = entity_get_info()) && isset($info[$entity_type]['access callback'])) {
    return $info[$entity_type]['access callback']($op, $entity, $account, $entity_type);
  }
}
	
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>');
}
		
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
        'title' => 'Copy and Remove',
        'page callback' => 'ajax_add_to_my_vocabulary',
        'page arguments' => array(array(), array(), 2) ,
        'access arguments' => array('create my vocabulary'),
  );
}
	
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
   'title' => 'Copy and Remove', 
   'page callback' => 'drupal_get_form', 
   'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
   'access arguments' => array('create my vocabulary'), 
  ); 
}
	
/**
 * Access callback for endity
 */
function vocabulary_access($op, $entity, $account = NULL, $entity_type = NULL) {
    global $user;
    if (!isset($account)) {
        $account = $user;
    }
    switch ($op) {
        case 'create':
            return user_access('administer vocabulary', $account)
            || user_access('create vocabulary', $account);
        case 'view':
            return user_access('administer vocabulary', $account)
            || user_access('view vocabulary', $account);
        case 'edit':
        case 'save':    // save permission created by  entity_rule.inc
            return user_access('administer vocabulary')
            || user_access('edit any vocabulary')
            || (user_access('edit my own vocabulary') && ($entity->uid == $account->uid));
        case 'delete':
            return user_access('administer vocabulary')
            || user_access('delete any vocabulary')
            || (user_access('edit my own vocabulary') && ($entity->uid == $account->uid));
    }
}
	
/**
 * Implements hook_entity_info().
 */
function drills_ch_vocabulary_entity_info()
{
    return array(
        'my_vocabulary' => array(
            'label' => t('My Vocabulary'),
            'entity class' => 'MyVocabularyEntity',
            'controller class' => 'MyVocabulryController',
            'base table' => 'my_vocabulary',
            'fieldable' => TRUE,
            'entity keys' => array(
                'id' => 'entity_id',
                'label' => 'vocabulary',
            ),
            'bundles' => array(
                'my_vocabulary' => array(
                    'label'=>'My Vocabulary',
                    'admin' => array(
                        'path' => 'admin/structure/my-vocabulary/manage',
                        'access arguments' => array('administer my vocabulary'),
                        'controller class' => 'EntityDefaultUIController',
                    ),
                ),
            ),
            'view modes' => array(
                'full' => array(
                    'label' => t('Default'),
                    'custom settings' => FALSE,
                ),
            ),
            'module' => 'my_vocabulary',
            'access callback' => 'my_vocabulary_access',
        ),
    );
}
	
// entity/entity.module の659行あたり
function entity_access($op, $entity_type, $entity = NULL, $account = NULL) {
  if (($info = entity_get_info()) && isset($info[$entity_type]['access callback'])) {
    return $info[$entity_type]['access callback']($op, $entity, $account, $entity_type);
  }
}
	
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>');
}
		
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
        'title' => 'Copy and Remove',
        'page callback' => 'ajax_add_to_my_vocabulary',
        'page arguments' => array(array(), array(), 2) ,
        'access arguments' => array('create my vocabulary'),
  );
}
	
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
   'title' => 'Copy and Remove', 
   'page callback' => 'drupal_get_form', 
   'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
   'access arguments' => array('create my vocabulary'), 
  ); 
}
	
/**
 * Access callback for endity
 */
function vocabulary_access($op, $entity, $account = NULL, $entity_type = NULL) {
    global $user;
    if (!isset($account)) {
        $account = $user;
    }
    switch ($op) {
        case 'create':
            return user_access('administer vocabulary', $account)
            || user_access('create vocabulary', $account);
        case 'view':
            return user_access('administer vocabulary', $account)
            || user_access('view vocabulary', $account);
        case 'edit':
        case 'save':    // save permission created by  entity_rule.inc
            return user_access('administer vocabulary')
            || user_access('edit any vocabulary')
            || (user_access('edit my own vocabulary') && ($entity->uid == $account->uid));
        case 'delete':
            return user_access('administer vocabulary')
            || user_access('delete any vocabulary')
            || (user_access('edit my own vocabulary') && ($entity->uid == $account->uid));
    }
}
	
/**
 * Implements hook_entity_info().
 */
function drills_ch_vocabulary_entity_info()
{
    return array(
        'my_vocabulary' => array(
            'label' => t('My Vocabulary'),
            'entity class' => 'MyVocabularyEntity',
            'controller class' => 'MyVocabulryController',
            'base table' => 'my_vocabulary',
            'fieldable' => TRUE,
            'entity keys' => array(
                'id' => 'entity_id',
                'label' => 'vocabulary',
            ),
            'bundles' => array(
                'my_vocabulary' => array(
                    'label'=>'My Vocabulary',
                    'admin' => array(
                        'path' => 'admin/structure/my-vocabulary/manage',
                        'access arguments' => array('administer my vocabulary'),
                        'controller class' => 'EntityDefaultUIController',
                    ),
                ),
            ),
            'view modes' => array(
                'full' => array(
                    'label' => t('Default'),
                    'custom settings' => FALSE,
                ),
            ),
            'module' => 'my_vocabulary',
            'access callback' => 'my_vocabulary_access',
        ),
    );
}
	
// entity/entity.module の659行あたり
function entity_access($op, $entity_type, $entity = NULL, $account = NULL) {
  if (($info = entity_get_info()) && isset($info[$entity_type]['access callback'])) {
    return $info[$entity_type]['access callback']($op, $entity, $account, $entity_type);
  }
}
	
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>');
}
		
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
        'title' => 'Copy and Remove',
        'page callback' => 'ajax_add_to_my_vocabulary',
        'page arguments' => array(array(), array(), 2) ,
        'access arguments' => array('create my vocabulary'),
  );
}
	
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
   'title' => 'Copy and Remove', 
   'page callback' => 'drupal_get_form', 
   'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
   'access arguments' => array('create my vocabulary'), 
  ); 
}
	
/**
 * Access callback for endity
 */
function vocabulary_access($op, $entity, $account = NULL, $entity_type = NULL) {
    global $user;
    if (!isset($account)) {
        $account = $user;
    }
    switch ($op) {
        case 'create':
            return user_access('administer vocabulary', $account)
            || user_access('create vocabulary', $account);
        case 'view':
            return user_access('administer vocabulary', $account)
            || user_access('view vocabulary', $account);
        case 'edit':
        case 'save':    // save permission created by  entity_rule.inc
            return user_access('administer vocabulary')
            || user_access('edit any vocabulary')
            || (user_access('edit my own vocabulary') && ($entity->uid == $account->uid));
        case 'delete':
            return user_access('administer vocabulary')
            || user_access('delete any vocabulary')
            || (user_access('edit my own vocabulary') && ($entity->uid == $account->uid));
    }
}
	
/**
 * Implements hook_entity_info().
 */
function drills_ch_vocabulary_entity_info()
{
    return array(
        'my_vocabulary' => array(
            'label' => t('My Vocabulary'),
            'entity class' => 'MyVocabularyEntity',
            'controller class' => 'MyVocabulryController',
            'base table' => 'my_vocabulary',
            'fieldable' => TRUE,
            'entity keys' => array(
                'id' => 'entity_id',
                'label' => 'vocabulary',
            ),
            'bundles' => array(
                'my_vocabulary' => array(
                    'label'=>'My Vocabulary',
                    'admin' => array(
                        'path' => 'admin/structure/my-vocabulary/manage',
                        'access arguments' => array('administer my vocabulary'),
                        'controller class' => 'EntityDefaultUIController',
                    ),
                ),
            ),
            'view modes' => array(
                'full' => array(
                    'label' => t('Default'),
                    'custom settings' => FALSE,
                ),
            ),
            'module' => 'my_vocabulary',
            'access callback' => 'my_vocabulary_access',
        ),
    );
}
	
// entity/entity.module の659行あたり
function entity_access($op, $entity_type, $entity = NULL, $account = NULL) {
  if (($info = entity_get_info()) && isset($info[$entity_type]['access callback'])) {
    return $info[$entity_type]['access callback']($op, $entity, $account, $entity_type);
  }
}
	
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>');
}
		
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
        'title' => 'Copy and Remove',
        'page callback' => 'ajax_add_to_my_vocabulary',
        'page arguments' => array(array(), array(), 2) ,
        'access arguments' => array('create my vocabulary'),
  );
}
	
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
   'title' => 'Copy and Remove', 
   'page callback' => 'drupal_get_form', 
   'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
   'access arguments' => array('create my vocabulary'), 
  ); 
}
	
/**
 * Access callback for endity
 */
function vocabulary_access($op, $entity, $account = NULL, $entity_type = NULL) {
    global $user;
    if (!isset($account)) {
        $account = $user;
    }
    switch ($op) {
        case 'create':
            return user_access('administer vocabulary', $account)
            || user_access('create vocabulary', $account);
        case 'view':
            return user_access('administer vocabulary', $account)
            || user_access('view vocabulary', $account);
        case 'edit':
        case 'save':    // save permission created by  entity_rule.inc
            return user_access('administer vocabulary')
            || user_access('edit any vocabulary')
            || (user_access('edit my own vocabulary') && ($entity->uid == $account->uid));
        case 'delete':
            return user_access('administer vocabulary')
            || user_access('delete any vocabulary')
            || (user_access('edit my own vocabulary') && ($entity->uid == $account->uid));
    }
}
	
/**
 * Implements hook_entity_info().
 */
function drills_ch_vocabulary_entity_info()
{
    return array(
        'my_vocabulary' => array(
            'label' => t('My Vocabulary'),
            'entity class' => 'MyVocabularyEntity',
            'controller class' => 'MyVocabulryController',
            'base table' => 'my_vocabulary',
            'fieldable' => TRUE,
            'entity keys' => array(
                'id' => 'entity_id',
                'label' => 'vocabulary',
            ),
            'bundles' => array(
                'my_vocabulary' => array(
                    'label'=>'My Vocabulary',
                    'admin' => array(
                        'path' => 'admin/structure/my-vocabulary/manage',
                        'access arguments' => array('administer my vocabulary'),
                        'controller class' => 'EntityDefaultUIController',
                    ),
                ),
            ),
            'view modes' => array(
                'full' => array(
                    'label' => t('Default'),
                    'custom settings' => FALSE,
                ),
            ),
            'module' => 'my_vocabulary',
            'access callback' => 'my_vocabulary_access',
        ),
    );
}
	
// entity/entity.module の659行あたり
function entity_access($op, $entity_type, $entity = NULL, $account = NULL) {
  if (($info = entity_get_info()) && isset($info[$entity_type]['access callback'])) {
    return $info[$entity_type]['access callback']($op, $entity, $account, $entity_type);
  }
}
	
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>');
}
		
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
        'title' => 'Copy and Remove',
        'page callback' => 'ajax_add_to_my_vocabulary',
        'page arguments' => array(array(), array(), 2) ,
        'access arguments' => array('create my vocabulary'),
  );
}
	
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
   'title' => 'Copy and Remove', 
   'page callback' => 'drupal_get_form', 
   'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
   'access arguments' => array('create my vocabulary'), 
  ); 
}
	
/**
 * Access callback for endity
 */
function vocabulary_access($op, $entity, $account = NULL, $entity_type = NULL) {
    global $user;
    if (!isset($account)) {
        $account = $user;
    }
    switch ($op) {
        case 'create':
            return user_access('administer vocabulary', $account)
            || user_access('create vocabulary', $account);
        case 'view':
            return user_access('administer vocabulary', $account)
            || user_access('view vocabulary', $account);
        case 'edit':
        case 'save':    // save permission created by  entity_rule.inc
            return user_access('administer vocabulary')
            || user_access('edit any vocabulary')
            || (user_access('edit my own vocabulary') && ($entity->uid == $account->uid));
        case 'delete':
            return user_access('administer vocabulary')
            || user_access('delete any vocabulary')
            || (user_access('edit my own vocabulary') && ($entity->uid == $account->uid));
    }
}
	
/**
 * Implements hook_entity_info().
 */
function drills_ch_vocabulary_entity_info()
{
    return array(
        'my_vocabulary' => array(
            'label' => t('My Vocabulary'),
            'entity class' => 'MyVocabularyEntity',
            'controller class' => 'MyVocabulryController',
            'base table' => 'my_vocabulary',
            'fieldable' => TRUE,
            'entity keys' => array(
                'id' => 'entity_id',
                'label' => 'vocabulary',
            ),
            'bundles' => array(
                'my_vocabulary' => array(
                    'label'=>'My Vocabulary',
                    'admin' => array(
                        'path' => 'admin/structure/my-vocabulary/manage',
                        'access arguments' => array('administer my vocabulary'),
                        'controller class' => 'EntityDefaultUIController',
                    ),
                ),
            ),
            'view modes' => array(
                'full' => array(
                    'label' => t('Default'),
                    'custom settings' => FALSE,
                ),
            ),
            'module' => 'my_vocabulary',
            'access callback' => 'my_vocabulary_access',
        ),
    );
}
	
// entity/entity.module の659行あたり
function entity_access($op, $entity_type, $entity = NULL, $account = NULL) {
  if (($info = entity_get_info()) && isset($info[$entity_type]['access callback'])) {
    return $info[$entity_type]['access callback']($op, $entity, $account, $entity_type);
  }
}
	
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>');
}
		
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
        'title' => 'Copy and Remove',
        'page callback' => 'ajax_add_to_my_vocabulary',
        'page arguments' => array(array(), array(), 2) ,
        'access arguments' => array('create my vocabulary'),
  );
}
	
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
   'title' => 'Copy and Remove', 
   'page callback' => 'drupal_get_form', 
   'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
   'access arguments' => array('create my vocabulary'), 
  ); 
}
	
/**
 * Access callback for endity
 */
function vocabulary_access($op, $entity, $account = NULL, $entity_type = NULL) {
    global $user;
    if (!isset($account)) {
        $account = $user;
    }
    switch ($op) {
        case 'create':
            return user_access('administer vocabulary', $account)
            || user_access('create vocabulary', $account);
        case 'view':
            return user_access('administer vocabulary', $account)
            || user_access('view vocabulary', $account);
        case 'edit':
        case 'save':    // save permission created by  entity_rule.inc
            return user_access('administer vocabulary')
            || user_access('edit any vocabulary')
            || (user_access('edit my own vocabulary') && ($entity->uid == $account->uid));
        case 'delete':
            return user_access('administer vocabulary')
            || user_access('delete any vocabulary')
            || (user_access('edit my own vocabulary') && ($entity->uid == $account->uid));
    }
}
	
/**
 * Implements hook_entity_info().
 */
function drills_ch_vocabulary_entity_info()
{
    return array(
        'my_vocabulary' => array(
            'label' => t('My Vocabulary'),
            'entity class' => 'MyVocabularyEntity',
            'controller class' => 'MyVocabulryController',
            'base table' => 'my_vocabulary',
            'fieldable' => TRUE,
            'entity keys' => array(
                'id' => 'entity_id',
                'label' => 'vocabulary',
            ),
            'bundles' => array(
                'my_vocabulary' => array(
                    'label'=>'My Vocabulary',
                    'admin' => array(
                        'path' => 'admin/structure/my-vocabulary/manage',
                        'access arguments' => array('administer my vocabulary'),
                        'controller class' => 'EntityDefaultUIController',
                    ),
                ),
            ),
            'view modes' => array(
                'full' => array(
                    'label' => t('Default'),
                    'custom settings' => FALSE,
                ),
            ),
            'module' => 'my_vocabulary',
            'access callback' => 'my_vocabulary_access',
        ),
    );
}
	
// entity/entity.module の659行あたり
function entity_access($op, $entity_type, $entity = NULL, $account = NULL) {
  if (($info = entity_get_info()) && isset($info[$entity_type]['access callback'])) {
    return $info[$entity_type]['access callback']($op, $entity, $account, $entity_type);
  }
}
	
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>');
}
		
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
        'title' => 'Copy and Remove',
        'page callback' => 'ajax_add_to_my_vocabulary',
        'page arguments' => array(array(), array(), 2) ,
        'access arguments' => array('create my vocabulary'),
  );
}
	
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
   'title' => 'Copy and Remove', 
   'page callback' => 'drupal_get_form', 
   'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
   'access arguments' => array('create my vocabulary'), 
  ); 
}
	
/**
 * Access callback for endity
 */
function vocabulary_access($op, $entity, $account = NULL, $entity_type = NULL) {
    global $user;
    if (!isset($account)) {
        $account = $user;
    }
    switch ($op) {
        case 'create':
            return user_access('administer vocabulary', $account)
            || user_access('create vocabulary', $account);
        case 'view':
            return user_access('administer vocabulary', $account)
            || user_access('view vocabulary', $account);
        case 'edit':
        case 'save':    // save permission created by  entity_rule.inc
            return user_access('administer vocabulary')
            || user_access('edit any vocabulary')
            || (user_access('edit my own vocabulary') && ($entity->uid == $account->uid));
        case 'delete':
            return user_access('administer vocabulary')
            || user_access('delete any vocabulary')
            || (user_access('edit my own vocabulary') && ($entity->uid == $account->uid));
    }
}
	
/**
 * Implements hook_entity_info().
 */
function drills_ch_vocabulary_entity_info()
{
    return array(
        'my_vocabulary' => array(
            'label' => t('My Vocabulary'),
            'entity class' => 'MyVocabularyEntity',
            'controller class' => 'MyVocabulryController',
            'base table' => 'my_vocabulary',
            'fieldable' => TRUE,
            'entity keys' => array(
                'id' => 'entity_id',
                'label' => 'vocabulary',
            ),
            'bundles' => array(
                'my_vocabulary' => array(
                    'label'=>'My Vocabulary',
                    'admin' => array(
                        'path' => 'admin/structure/my-vocabulary/manage',
                        'access arguments' => array('administer my vocabulary'),
                        'controller class' => 'EntityDefaultUIController',
                    ),
                ),
            ),
            'view modes' => array(
                'full' => array(
                    'label' => t('Default'),
                    'custom settings' => FALSE,
                ),
            ),
            'module' => 'my_vocabulary',
            'access callback' => 'my_vocabulary_access',
        ),
    );
}
	
// entity/entity.module の659行あたり
function entity_access($op, $entity_type, $entity = NULL, $account = NULL) {
  if (($info = entity_get_info()) && isset($info[$entity_type]['access callback'])) {
    return $info[$entity_type]['access callback']($op, $entity, $account, $entity_type);
  }
}
	
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>');
}
		
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
        'title' => 'Copy and Remove',
        'page callback' => 'ajax_add_to_my_vocabulary',
        'page arguments' => array(array(), array(), 2) ,
        'access arguments' => array('create my vocabulary'),
  );
}
	
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
   'title' => 'Copy and Remove', 
   'page callback' => 'drupal_get_form', 
   'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
   'access arguments' => array('create my vocabulary'), 
  ); 
}
	
/**
 * Access callback for endity
 */
function vocabulary_access($op, $entity, $account = NULL, $entity_type = NULL) {
    global $user;
    if (!isset($account)) {
        $account = $user;
    }
    switch ($op) {
        case 'create':
            return user_access('administer vocabulary', $account)
            || user_access('create vocabulary', $account);
        case 'view':
            return user_access('administer vocabulary', $account)
            || user_access('view vocabulary', $account);
        case 'edit':
        case 'save':    // save permission created by  entity_rule.inc
            return user_access('administer vocabulary')
            || user_access('edit any vocabulary')
            || (user_access('edit my own vocabulary') && ($entity->uid == $account->uid));
        case 'delete':
            return user_access('administer vocabulary')
            || user_access('delete any vocabulary')
            || (user_access('edit my own vocabulary') && ($entity->uid == $account->uid));
    }
}
	
/**
 * Implements hook_entity_info().
 */
function drills_ch_vocabulary_entity_info()
{
    return array(
        'my_vocabulary' => array(
            'label' => t('My Vocabulary'),
            'entity class' => 'MyVocabularyEntity',
            'controller class' => 'MyVocabulryController',
            'base table' => 'my_vocabulary',
            'fieldable' => TRUE,
            'entity keys' => array(
                'id' => 'entity_id',
                'label' => 'vocabulary',
            ),
            'bundles' => array(
                'my_vocabulary' => array(
                    'label'=>'My Vocabulary',
                    'admin' => array(
                        'path' => 'admin/structure/my-vocabulary/manage',
                        'access arguments' => array('administer my vocabulary'),
                        'controller class' => 'EntityDefaultUIController',
                    ),
                ),
            ),
            'view modes' => array(
                'full' => array(
                    'label' => t('Default'),
                    'custom settings' => FALSE,
                ),
            ),
            'module' => 'my_vocabulary',
            'access callback' => 'my_vocabulary_access',
        ),
    );
}
	
// entity/entity.module の659行あたり
function entity_access($op, $entity_type, $entity = NULL, $account = NULL) {
  if (($info = entity_get_info()) && isset($info[$entity_type]['access callback'])) {
    return $info[$entity_type]['access callback']($op, $entity, $account, $entity_type);
  }
}
	
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>');
}
		
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
        'title' => 'Copy and Remove',
        'page callback' => 'ajax_add_to_my_vocabulary',
        'page arguments' => array(array(), array(), 2) ,
        'access arguments' => array('create my vocabulary'),
  );
}
	
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
   'title' => 'Copy and Remove', 
   'page callback' => 'drupal_get_form', 
   'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
   'access arguments' => array('create my vocabulary'), 
  ); 
}
	
/**
 * Access callback for endity
 */
function vocabulary_access($op, $entity, $account = NULL, $entity_type = NULL) {
    global $user;
    if (!isset($account)) {
        $account = $user;
    }
    switch ($op) {
        case 'create':
            return user_access('administer vocabulary', $account)
            || user_access('create vocabulary', $account);
        case 'view':
            return user_access('administer vocabulary', $account)
            || user_access('view vocabulary', $account);
        case 'edit':
        case 'save':    // save permission created by  entity_rule.inc
            return user_access('administer vocabulary')
            || user_access('edit any vocabulary')
            || (user_access('edit my own vocabulary') && ($entity->uid == $account->uid));
        case 'delete':
            return user_access('administer vocabulary')
            || user_access('delete any vocabulary')
            || (user_access('edit my own vocabulary') && ($entity->uid == $account->uid));
    }
}
	
/**
 * Implements hook_entity_info().
 */
function drills_ch_vocabulary_entity_info()
{
    return array(
        'my_vocabulary' => array(
            'label' => t('My Vocabulary'),
            'entity class' => 'MyVocabularyEntity',
            'controller class' => 'MyVocabulryController',
            'base table' => 'my_vocabulary',
            'fieldable' => TRUE,
            'entity keys' => array(
                'id' => 'entity_id',
                'label' => 'vocabulary',
            ),
            'bundles' => array(
                'my_vocabulary' => array(
                    'label'=>'My Vocabulary',
                    'admin' => array(
                        'path' => 'admin/structure/my-vocabulary/manage',
                        'access arguments' => array('administer my vocabulary'),
                        'controller class' => 'EntityDefaultUIController',
                    ),
                ),
            ),
            'view modes' => array(
                'full' => array(
                    'label' => t('Default'),
                    'custom settings' => FALSE,
                ),
            ),
            'module' => 'my_vocabulary',
            'access callback' => 'my_vocabulary_access',
        ),
    );
}
	
// entity/entity.module の659行あたり
function entity_access($op, $entity_type, $entity = NULL, $account = NULL) {
  if (($info = entity_get_info()) && isset($info[$entity_type]['access callback'])) {
    return $info[$entity_type]['access callback']($op, $entity, $account, $entity_type);
  }
}
	
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>');
}
		
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
        'title' => 'Copy and Remove',
        'page callback' => 'ajax_add_to_my_vocabulary',
        'page arguments' => array(array(), array(), 2) ,
        'access arguments' => array('create my vocabulary'),
  );
}
	
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
   'title' => 'Copy and Remove', 
   'page callback' => 'drupal_get_form', 
   'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
   'access arguments' => array('create my vocabulary'), 
  ); 
}
	
/**
 * Access callback for endity
 */
function vocabulary_access($op, $entity, $account = NULL, $entity_type = NULL) {
    global $user;
    if (!isset($account)) {
        $account = $user;
    }
    switch ($op) {
        case 'create':
            return user_access('administer vocabulary', $account)
            || user_access('create vocabulary', $account);
        case 'view':
            return user_access('administer vocabulary', $account)
            || user_access('view vocabulary', $account);
        case 'edit':
        case 'save':    // save permission created by  entity_rule.inc
            return user_access('administer vocabulary')
            || user_access('edit any vocabulary')
            || (user_access('edit my own vocabulary') && ($entity->uid == $account->uid));
        case 'delete':
            return user_access('administer vocabulary')
            || user_access('delete any vocabulary')
            || (user_access('edit my own vocabulary') && ($entity->uid == $account->uid));
    }
}
	
/**
 * Implements hook_entity_info().
 */
function drills_ch_vocabulary_entity_info()
{
    return array(
        'my_vocabulary' => array(
            'label' => t('My Vocabulary'),
            'entity class' => 'MyVocabularyEntity',
            'controller class' => 'MyVocabulryController',
            'base table' => 'my_vocabulary',
            'fieldable' => TRUE,
            'entity keys' => array(
                'id' => 'entity_id',
                'label' => 'vocabulary',
            ),
            'bundles' => array(
                'my_vocabulary' => array(
                    'label'=>'My Vocabulary',
                    'admin' => array(
                        'path' => 'admin/structure/my-vocabulary/manage',
                        'access arguments' => array('administer my vocabulary'),
                        'controller class' => 'EntityDefaultUIController',
                    ),
                ),
            ),
            'view modes' => array(
                'full' => array(
                    'label' => t('Default'),
                    'custom settings' => FALSE,
                ),
            ),
            'module' => 'my_vocabulary',
            'access callback' => 'my_vocabulary_access',
        ),
    );
}
	
// entity/entity.module の659行あたり
function entity_access($op, $entity_type, $entity = NULL, $account = NULL) {
  if (($info = entity_get_info()) && isset($info[$entity_type]['access callback'])) {
    return $info[$entity_type]['access callback']($op, $entity, $account, $entity_type);
  }
}
	
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>');
}
		
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
        'title' => 'Copy and Remove',
        'page callback' => 'ajax_add_to_my_vocabulary',
        'page arguments' => array(array(), array(), 2) ,
        'access arguments' => array('create my vocabulary'),
  );
}
	
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
   'title' => 'Copy and Remove', 
   'page callback' => 'drupal_get_form', 
   'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
   'access arguments' => array('create my vocabulary'), 
  ); 
}
	
/**
 * Access callback for endity
 */
function vocabulary_access($op, $entity, $account = NULL, $entity_type = NULL) {
    global $user;
    if (!isset($account)) {
        $account = $user;
    }
    switch ($op) {
        case 'create':
            return user_access('administer vocabulary', $account)
            || user_access('create vocabulary', $account);
        case 'view':
            return user_access('administer vocabulary', $account)
            || user_access('view vocabulary', $account);
        case 'edit':
        case 'save':    // save permission created by  entity_rule.inc
            return user_access('administer vocabulary')
            || user_access('edit any vocabulary')
            || (user_access('edit my own vocabulary') && ($entity->uid == $account->uid));
        case 'delete':
            return user_access('administer vocabulary')
            || user_access('delete any vocabulary')
            || (user_access('edit my own vocabulary') && ($entity->uid == $account->uid));
    }
}
	
/**
 * Implements hook_entity_info().
 */
function drills_ch_vocabulary_entity_info()
{
    return array(
        'my_vocabulary' => array(
            'label' => t('My Vocabulary'),
            'entity class' => 'MyVocabularyEntity',
            'controller class' => 'MyVocabulryController',
            'base table' => 'my_vocabulary',
            'fieldable' => TRUE,
            'entity keys' => array(
                'id' => 'entity_id',
                'label' => 'vocabulary',
            ),
            'bundles' => array(
                'my_vocabulary' => array(
                    'label'=>'My Vocabulary',
                    'admin' => array(
                        'path' => 'admin/structure/my-vocabulary/manage',
                        'access arguments' => array('administer my vocabulary'),
                        'controller class' => 'EntityDefaultUIController',
                    ),
                ),
            ),
            'view modes' => array(
                'full' => array(
                    'label' => t('Default'),
                    'custom settings' => FALSE,
                ),
            ),
            'module' => 'my_vocabulary',
            'access callback' => 'my_vocabulary_access',
        ),
    );
}
	
// entity/entity.module の659行あたり
function entity_access($op, $entity_type, $entity = NULL, $account = NULL) {
  if (($info = entity_get_info()) && isset($info[$entity_type]['access callback'])) {
    return $info[$entity_type]['access callback']($op, $entity, $account, $entity_type);
  }
}
	
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>');
}
		
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
        'title' => 'Copy and Remove',
        'page callback' => 'ajax_add_to_my_vocabulary',
        'page arguments' => array(array(), array(), 2) ,
        'access arguments' => array('create my vocabulary'),
  );
}
	
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
   'title' => 'Copy and Remove', 
   'page callback' => 'drupal_get_form', 
   'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
   'access arguments' => array('create my vocabulary'), 
  ); 
}
	
/**
 * Access callback for endity
 */
function vocabulary_access($op, $entity, $account = NULL, $entity_type = NULL) {
    global $user;
    if (!isset($account)) {
        $account = $user;
    }
    switch ($op) {
        case 'create':
            return user_access('administer vocabulary', $account)
            || user_access('create vocabulary', $account);
        case 'view':
            return user_access('administer vocabulary', $account)
            || user_access('view vocabulary', $account);
        case 'edit':
        case 'save':    // save permission created by  entity_rule.inc
            return user_access('administer vocabulary')
            || user_access('edit any vocabulary')
            || (user_access('edit my own vocabulary') && ($entity->uid == $account->uid));
        case 'delete':
            return user_access('administer vocabulary')
            || user_access('delete any vocabulary')
            || (user_access('edit my own vocabulary') && ($entity->uid == $account->uid));
    }
}
	
/**
 * Implements hook_entity_info().
 */
function drills_ch_vocabulary_entity_info()
{
    return array(
        'my_vocabulary' => array(
            'label' => t('My Vocabulary'),
            'entity class' => 'MyVocabularyEntity',
            'controller class' => 'MyVocabulryController',
            'base table' => 'my_vocabulary',
            'fieldable' => TRUE,
            'entity keys' => array(
                'id' => 'entity_id',
                'label' => 'vocabulary',
            ),
            'bundles' => array(
                'my_vocabulary' => array(
                    'label'=>'My Vocabulary',
                    'admin' => array(
                        'path' => 'admin/structure/my-vocabulary/manage',
                        'access arguments' => array('administer my vocabulary'),
                        'controller class' => 'EntityDefaultUIController',
                    ),
                ),
            ),
            'view modes' => array(
                'full' => array(
                    'label' => t('Default'),
                    'custom settings' => FALSE,
                ),
            ),
            'module' => 'my_vocabulary',
            'access callback' => 'my_vocabulary_access',
        ),
    );
}
	
// entity/entity.module の659行あたり
function entity_access($op, $entity_type, $entity = NULL, $account = NULL) {
  if (($info = entity_get_info()) && isset($info[$entity_type]['access callback'])) {
    return $info[$entity_type]['access callback']($op, $entity, $account, $entity_type);
  }
}
	
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>');
}
		
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
        'title' => 'Copy and Remove',
        'page callback' => 'ajax_add_to_my_vocabulary',
        'page arguments' => array(array(), array(), 2) ,
        'access arguments' => array('create my vocabulary'),
  );
}
	
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
   'title' => 'Copy and Remove', 
   'page callback' => 'drupal_get_form', 
   'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
   'access arguments' => array('create my vocabulary'), 
  ); 
}
	
/**
 * Access callback for endity
 */
function vocabulary_access($op, $entity, $account = NULL, $entity_type = NULL) {
    global $user;
    if (!isset($account)) {
        $account = $user;
    }
    switch ($op) {
        case 'create':
            return user_access('administer vocabulary', $account)
            || user_access('create vocabulary', $account);
        case 'view':
            return user_access('administer vocabulary', $account)
            || user_access('view vocabulary', $account);
        case 'edit':
        case 'save':    // save permission created by  entity_rule.inc
            return user_access('administer vocabulary')
            || user_access('edit any vocabulary')
            || (user_access('edit my own vocabulary') && ($entity->uid == $account->uid));
        case 'delete':
            return user_access('administer vocabulary')
            || user_access('delete any vocabulary')
            || (user_access('edit my own vocabulary') && ($entity->uid == $account->uid));
    }
}
	
/**
 * Implements hook_entity_info().
 */
function drills_ch_vocabulary_entity_info()
{
    return array(
        'my_vocabulary' => array(
            'label' => t('My Vocabulary'),
            'entity class' => 'MyVocabularyEntity',
            'controller class' => 'MyVocabulryController',
            'base table' => 'my_vocabulary',
            'fieldable' => TRUE,
            'entity keys' => array(
                'id' => 'entity_id',
                'label' => 'vocabulary',
            ),
            'bundles' => array(
                'my_vocabulary' => array(
                    'label'=>'My Vocabulary',
                    'admin' => array(
                        'path' => 'admin/structure/my-vocabulary/manage',
                        'access arguments' => array('administer my vocabulary'),
                        'controller class' => 'EntityDefaultUIController',
                    ),
                ),
            ),
            'view modes' => array(
                'full' => array(
                    'label' => t('Default'),
                    'custom settings' => FALSE,
                ),
            ),
            'module' => 'my_vocabulary',
            'access callback' => 'my_vocabulary_access',
        ),
    );
}
	
// entity/entity.module の659行あたり
function entity_access($op, $entity_type, $entity = NULL, $account = NULL) {
  if (($info = entity_get_info()) && isset($info[$entity_type]['access callback'])) {
    return $info[$entity_type]['access callback']($op, $entity, $account, $entity_type);
  }
}
	
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>');
}
		
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
        'title' => 'Copy and Remove',
        'page callback' => 'ajax_add_to_my_vocabulary',
        'page arguments' => array(array(), array(), 2) ,
        'access arguments' => array('create my vocabulary'),
  );
}
	
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
   'title' => 'Copy and Remove', 
   'page callback' => 'drupal_get_form', 
   'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
   'access arguments' => array('create my vocabulary'), 
  ); 
}
	
function node_menu() {
  $items['admin/content'] = array(
    'title' => 'Content', 
    'description' => 'Find and manage content.', 
    'page callback' => 'drupal_get_form', 
    'page arguments' => array('node_admin_content'), 
    'access arguments' => array('access content overview'), 
    'weight' => -10, 
    'file' => 'node.admin.inc',
  );
  // …
  return $items;
}
	
hook_menuで定義したアクセスURLに、ワイドカード’%’(任意の文字、数字)の使用ができます。例えば、あるページのURI: 「/user/123/fbconnect」、このページにuid=123のユーザーのfbconnectを表示するページとなります。ユーザーにより、uidは変わります。
実際にhook_menuでは、連想配列のキー: $items['user/%/fbconnect'] で表現します。ここで、ワードカード’%’が使用されています。
ワイドカードが二つのパタン
function [my-module-name]_menu() {
  $items['user/%/fboauth'] = array(            //ワイドカード'%'の使用
    'title' => t('Facebook settings'),
    'page callback' => 'fboauth_user_form',  //ページ定義関数の呼び出し
    'page arguments' => array(1),               //パスの1番目(0から)を引数に
    ・・・・,
  );
function fboauth_user_form($uid){             //URIの1番目にあるワードカードを引数に
  $user = user_load($uid);
  ・・・
}
	
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>');
}
		
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
        'title' => 'Copy and Remove',
        'page callback' => 'ajax_add_to_my_vocabulary',
        'page arguments' => array(array(), array(), 2) ,
        'access arguments' => array('create my vocabulary'),
  );
}
	
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
   'title' => 'Copy and Remove', 
   'page callback' => 'drupal_get_form', 
   'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
   'access arguments' => array('create my vocabulary'), 
  ); 
}
	
function node_menu() {
  $items['admin/content'] = array(
    'title' => 'Content', 
    'description' => 'Find and manage content.', 
    'page callback' => 'drupal_get_form', 
    'page arguments' => array('node_admin_content'), 
    'access arguments' => array('access content overview'), 
    'weight' => -10, 
    'file' => 'node.admin.inc',
  );
  // …
  return $items;
}
	
hook_menuで定義したアクセスURLに、ワイドカード’%’(任意の文字、数字)の使用ができます。例えば、あるページのURI: 「/user/123/fbconnect」、このページにuid=123のユーザーのfbconnectを表示するページとなります。ユーザーにより、uidは変わります。
実際にhook_menuでは、連想配列のキー: $items['user/%/fbconnect'] で表現します。ここで、ワードカード’%’が使用されています。
ワイドカードが二つのパタン
function [my-module-name]_menu() {
  $items['user/%/fboauth'] = array(            //ワイドカード'%'の使用
    'title' => t('Facebook settings'),
    'page callback' => 'fboauth_user_form',  //ページ定義関数の呼び出し
    'page arguments' => array(1),               //パスの1番目(0から)を引数に
    ・・・・,
  );
function fboauth_user_form($uid){             //URIの1番目にあるワードカードを引数に
  $user = user_load($uid);
  ・・・
}
	
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>');
}
		
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
        'title' => 'Copy and Remove',
        'page callback' => 'ajax_add_to_my_vocabulary',
        'page arguments' => array(array(), array(), 2) ,
        'access arguments' => array('create my vocabulary'),
  );
}
	
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
   'title' => 'Copy and Remove', 
   'page callback' => 'drupal_get_form', 
   'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
   'access arguments' => array('create my vocabulary'), 
  ); 
}
	
function node_menu() {
  $items['admin/content'] = array(
    'title' => 'Content', 
    'description' => 'Find and manage content.', 
    'page callback' => 'drupal_get_form', 
    'page arguments' => array('node_admin_content'), 
    'access arguments' => array('access content overview'), 
    'weight' => -10, 
    'file' => 'node.admin.inc',
  );
  // …
  return $items;
}
	
hook_menuで定義したアクセスURLに、ワイドカード’%’(任意の文字、数字)の使用ができます。例えば、あるページのURI: 「/user/123/fbconnect」、このページにuid=123のユーザーのfbconnectを表示するページとなります。ユーザーにより、uidは変わります。
実際にhook_menuでは、連想配列のキー: $items['user/%/fbconnect'] で表現します。ここで、ワードカード’%’が使用されています。
ワイドカードが二つのパタン
function [my-module-name]_menu() {
  $items['user/%/fboauth'] = array(            //ワイドカード'%'の使用
    'title' => t('Facebook settings'),
    'page callback' => 'fboauth_user_form',  //ページ定義関数の呼び出し
    'page arguments' => array(1),               //パスの1番目(0から)を引数に
    ・・・・,
  );
function fboauth_user_form($uid){             //URIの1番目にあるワードカードを引数に
  $user = user_load($uid);
  ・・・
}
	
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>');
}
		
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
        'title' => 'Copy and Remove',
        'page callback' => 'ajax_add_to_my_vocabulary',
        'page arguments' => array(array(), array(), 2) ,
        'access arguments' => array('create my vocabulary'),
  );
}
	
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
   'title' => 'Copy and Remove', 
   'page callback' => 'drupal_get_form', 
   'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
   'access arguments' => array('create my vocabulary'), 
  ); 
}
	
function node_menu() {
  $items['admin/content'] = array(
    'title' => 'Content', 
    'description' => 'Find and manage content.', 
    'page callback' => 'drupal_get_form', 
    'page arguments' => array('node_admin_content'), 
    'access arguments' => array('access content overview'), 
    'weight' => -10, 
    'file' => 'node.admin.inc',
  );
  // …
  return $items;
}
	
hook_menuで定義したアクセスURLに、ワイドカード’%’(任意の文字、数字)の使用ができます。例えば、あるページのURI: 「/user/123/fbconnect」、このページにuid=123のユーザーのfbconnectを表示するページとなります。ユーザーにより、uidは変わります。
実際にhook_menuでは、連想配列のキー: $items['user/%/fbconnect'] で表現します。ここで、ワードカード’%’が使用されています。
ワイドカードが二つのパタン
function [my-module-name]_menu() {
  $items['user/%/fboauth'] = array(            //ワイドカード'%'の使用
    'title' => t('Facebook settings'),
    'page callback' => 'fboauth_user_form',  //ページ定義関数の呼び出し
    'page arguments' => array(1),               //パスの1番目(0から)を引数に
    ・・・・,
  );
function fboauth_user_form($uid){             //URIの1番目にあるワードカードを引数に
  $user = user_load($uid);
  ・・・
}
	
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>');
}
		
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
        'title' => 'Copy and Remove',
        'page callback' => 'ajax_add_to_my_vocabulary',
        'page arguments' => array(array(), array(), 2) ,
        'access arguments' => array('create my vocabulary'),
  );
}
	
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
   'title' => 'Copy and Remove', 
   'page callback' => 'drupal_get_form', 
   'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
   'access arguments' => array('create my vocabulary'), 
  ); 
}
	
function node_menu() {
  $items['admin/content'] = array(
    'title' => 'Content', 
    'description' => 'Find and manage content.', 
    'page callback' => 'drupal_get_form', 
    'page arguments' => array('node_admin_content'), 
    'access arguments' => array('access content overview'), 
    'weight' => -10, 
    'file' => 'node.admin.inc',
  );
  // …
  return $items;
}
	
hook_menuで定義したアクセスURLに、ワイドカード’%’(任意の文字、数字)の使用ができます。例えば、あるページのURI: 「/user/123/fbconnect」、このページにuid=123のユーザーのfbconnectを表示するページとなります。ユーザーにより、uidは変わります。
実際にhook_menuでは、連想配列のキー: $items['user/%/fbconnect'] で表現します。ここで、ワードカード’%’が使用されています。
ワイドカードが二つのパタン
function [my-module-name]_menu() {
  $items['user/%/fboauth'] = array(            //ワイドカード'%'の使用
    'title' => t('Facebook settings'),
    'page callback' => 'fboauth_user_form',  //ページ定義関数の呼び出し
    'page arguments' => array(1),               //パスの1番目(0から)を引数に
    ・・・・,
  );
function fboauth_user_form($uid){             //URIの1番目にあるワードカードを引数に
  $user = user_load($uid);
  ・・・
}
	
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>');
}
		
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
        'title' => 'Copy and Remove',
        'page callback' => 'ajax_add_to_my_vocabulary',
        'page arguments' => array(array(), array(), 2) ,
        'access arguments' => array('create my vocabulary'),
  );
}
	
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
   'title' => 'Copy and Remove', 
   'page callback' => 'drupal_get_form', 
   'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
   'access arguments' => array('create my vocabulary'), 
  ); 
}
	
function node_menu() {
  $items['admin/content'] = array(
    'title' => 'Content', 
    'description' => 'Find and manage content.', 
    'page callback' => 'drupal_get_form', 
    'page arguments' => array('node_admin_content'), 
    'access arguments' => array('access content overview'), 
    'weight' => -10, 
    'file' => 'node.admin.inc',
  );
  // …
  return $items;
}
	
hook_menuで定義したアクセスURLに、ワイドカード’%’(任意の文字、数字)の使用ができます。例えば、あるページのURI: 「/user/123/fbconnect」、このページにuid=123のユーザーのfbconnectを表示するページとなります。ユーザーにより、uidは変わります。
実際にhook_menuでは、連想配列のキー: $items['user/%/fbconnect'] で表現します。ここで、ワードカード’%’が使用されています。
ワイドカードが二つのパタン
function [my-module-name]_menu() {
  $items['user/%/fboauth'] = array(            //ワイドカード'%'の使用
    'title' => t('Facebook settings'),
    'page callback' => 'fboauth_user_form',  //ページ定義関数の呼び出し
    'page arguments' => array(1),               //パスの1番目(0から)を引数に
    ・・・・,
  );
function fboauth_user_form($uid){             //URIの1番目にあるワードカードを引数に
  $user = user_load($uid);
  ・・・
}
	
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>');
}
		
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
        'title' => 'Copy and Remove',
        'page callback' => 'ajax_add_to_my_vocabulary',
        'page arguments' => array(array(), array(), 2) ,
        'access arguments' => array('create my vocabulary'),
  );
}
	
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
   'title' => 'Copy and Remove', 
   'page callback' => 'drupal_get_form', 
   'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
   'access arguments' => array('create my vocabulary'), 
  ); 
}
	
function node_menu() {
  $items['admin/content'] = array(
    'title' => 'Content', 
    'description' => 'Find and manage content.', 
    'page callback' => 'drupal_get_form', 
    'page arguments' => array('node_admin_content'), 
    'access arguments' => array('access content overview'), 
    'weight' => -10, 
    'file' => 'node.admin.inc',
  );
  // …
  return $items;
}
	
hook_menuで定義したアクセスURLに、ワイドカード’%’(任意の文字、数字)の使用ができます。例えば、あるページのURI: 「/user/123/fbconnect」、このページにuid=123のユーザーのfbconnectを表示するページとなります。ユーザーにより、uidは変わります。
実際にhook_menuでは、連想配列のキー: $items['user/%/fbconnect'] で表現します。ここで、ワードカード’%’が使用されています。
ワイドカードが二つのパタン
function [my-module-name]_menu() {
  $items['user/%/fboauth'] = array(            //ワイドカード'%'の使用
    'title' => t('Facebook settings'),
    'page callback' => 'fboauth_user_form',  //ページ定義関数の呼び出し
    'page arguments' => array(1),               //パスの1番目(0から)を引数に
    ・・・・,
  );
function fboauth_user_form($uid){             //URIの1番目にあるワードカードを引数に
  $user = user_load($uid);
  ・・・
}
	
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>');
}
		
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
        'title' => 'Copy and Remove',
        'page callback' => 'ajax_add_to_my_vocabulary',
        'page arguments' => array(array(), array(), 2) ,
        'access arguments' => array('create my vocabulary'),
  );
}
	
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
   'title' => 'Copy and Remove', 
   'page callback' => 'drupal_get_form', 
   'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
   'access arguments' => array('create my vocabulary'), 
  ); 
}
	
function node_menu() {
  $items['admin/content'] = array(
    'title' => 'Content', 
    'description' => 'Find and manage content.', 
    'page callback' => 'drupal_get_form', 
    'page arguments' => array('node_admin_content'), 
    'access arguments' => array('access content overview'), 
    'weight' => -10, 
    'file' => 'node.admin.inc',
  );
  // …
  return $items;
}
	
hook_menuで定義したアクセスURLに、ワイドカード’%’(任意の文字、数字)の使用ができます。例えば、あるページのURI: 「/user/123/fbconnect」、このページにuid=123のユーザーのfbconnectを表示するページとなります。ユーザーにより、uidは変わります。
実際にhook_menuでは、連想配列のキー: $items['user/%/fbconnect'] で表現します。ここで、ワードカード’%’が使用されています。
ワイドカードが二つのパタン
function [my-module-name]_menu() {
  $items['user/%/fboauth'] = array(            //ワイドカード'%'の使用
    'title' => t('Facebook settings'),
    'page callback' => 'fboauth_user_form',  //ページ定義関数の呼び出し
    'page arguments' => array(1),               //パスの1番目(0から)を引数に
    ・・・・,
  );
function fboauth_user_form($uid){             //URIの1番目にあるワードカードを引数に
  $user = user_load($uid);
  ・・・
}
	
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>');
}
		
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
        'title' => 'Copy and Remove',
        'page callback' => 'ajax_add_to_my_vocabulary',
        'page arguments' => array(array(), array(), 2) ,
        'access arguments' => array('create my vocabulary'),
  );
}
	
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
   'title' => 'Copy and Remove', 
   'page callback' => 'drupal_get_form', 
   'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
   'access arguments' => array('create my vocabulary'), 
  ); 
}
	
function node_menu() {
  $items['admin/content'] = array(
    'title' => 'Content', 
    'description' => 'Find and manage content.', 
    'page callback' => 'drupal_get_form', 
    'page arguments' => array('node_admin_content'), 
    'access arguments' => array('access content overview'), 
    'weight' => -10, 
    'file' => 'node.admin.inc',
  );
  // …
  return $items;
}
	
hook_menuで定義したアクセスURLに、ワイドカード’%’(任意の文字、数字)の使用ができます。例えば、あるページのURI: 「/user/123/fbconnect」、このページにuid=123のユーザーのfbconnectを表示するページとなります。ユーザーにより、uidは変わります。
実際にhook_menuでは、連想配列のキー: $items['user/%/fbconnect'] で表現します。ここで、ワードカード’%’が使用されています。
ワイドカードが二つのパタン
function [my-module-name]_menu() {
  $items['user/%/fboauth'] = array(            //ワイドカード'%'の使用
    'title' => t('Facebook settings'),
    'page callback' => 'fboauth_user_form',  //ページ定義関数の呼び出し
    'page arguments' => array(1),               //パスの1番目(0から)を引数に
    ・・・・,
  );
function fboauth_user_form($uid){             //URIの1番目にあるワードカードを引数に
  $user = user_load($uid);
  ・・・
}
	
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>');
}
		
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
        'title' => 'Copy and Remove',
        'page callback' => 'ajax_add_to_my_vocabulary',
        'page arguments' => array(array(), array(), 2) ,
        'access arguments' => array('create my vocabulary'),
  );
}
	
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
   'title' => 'Copy and Remove', 
   'page callback' => 'drupal_get_form', 
   'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
   'access arguments' => array('create my vocabulary'), 
  ); 
}
	
function node_menu() {
  $items['admin/content'] = array(
    'title' => 'Content', 
    'description' => 'Find and manage content.', 
    'page callback' => 'drupal_get_form', 
    'page arguments' => array('node_admin_content'), 
    'access arguments' => array('access content overview'), 
    'weight' => -10, 
    'file' => 'node.admin.inc',
  );
  // …
  return $items;
}
	
hook_menuで定義したアクセスURLに、ワイドカード’%’(任意の文字、数字)の使用ができます。例えば、あるページのURI: 「/user/123/fbconnect」、このページにuid=123のユーザーのfbconnectを表示するページとなります。ユーザーにより、uidは変わります。
実際にhook_menuでは、連想配列のキー: $items['user/%/fbconnect'] で表現します。ここで、ワードカード’%’が使用されています。
ワイドカードが二つのパタン
function [my-module-name]_menu() {
  $items['user/%/fboauth'] = array(            //ワイドカード'%'の使用
    'title' => t('Facebook settings'),
    'page callback' => 'fboauth_user_form',  //ページ定義関数の呼び出し
    'page arguments' => array(1),               //パスの1番目(0から)を引数に
    ・・・・,
  );
function fboauth_user_form($uid){             //URIの1番目にあるワードカードを引数に
  $user = user_load($uid);
  ・・・
}
	
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>');
}
		
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
        'title' => 'Copy and Remove',
        'page callback' => 'ajax_add_to_my_vocabulary',
        'page arguments' => array(array(), array(), 2) ,
        'access arguments' => array('create my vocabulary'),
  );
}
	
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
   'title' => 'Copy and Remove', 
   'page callback' => 'drupal_get_form', 
   'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
   'access arguments' => array('create my vocabulary'), 
  ); 
}
	
function node_menu() {
  $items['admin/content'] = array(
    'title' => 'Content', 
    'description' => 'Find and manage content.', 
    'page callback' => 'drupal_get_form', 
    'page arguments' => array('node_admin_content'), 
    'access arguments' => array('access content overview'), 
    'weight' => -10, 
    'file' => 'node.admin.inc',
  );
  // …
  return $items;
}
	
hook_menuで定義したアクセスURLに、ワイドカード’%’(任意の文字、数字)の使用ができます。例えば、あるページのURI: 「/user/123/fbconnect」、このページにuid=123のユーザーのfbconnectを表示するページとなります。ユーザーにより、uidは変わります。
実際にhook_menuでは、連想配列のキー: $items['user/%/fbconnect'] で表現します。ここで、ワードカード’%’が使用されています。
ワイドカードが二つのパタン
function [my-module-name]_menu() {
  $items['user/%/fboauth'] = array(            //ワイドカード'%'の使用
    'title' => t('Facebook settings'),
    'page callback' => 'fboauth_user_form',  //ページ定義関数の呼び出し
    'page arguments' => array(1),               //パスの1番目(0から)を引数に
    ・・・・,
  );
function fboauth_user_form($uid){             //URIの1番目にあるワードカードを引数に
  $user = user_load($uid);
  ・・・
}
	
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>');
}
		
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
        'title' => 'Copy and Remove',
        'page callback' => 'ajax_add_to_my_vocabulary',
        'page arguments' => array(array(), array(), 2) ,
        'access arguments' => array('create my vocabulary'),
  );
}
	
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
   'title' => 'Copy and Remove', 
   'page callback' => 'drupal_get_form', 
   'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
   'access arguments' => array('create my vocabulary'), 
  ); 
}
	
function node_menu() {
  $items['admin/content'] = array(
    'title' => 'Content', 
    'description' => 'Find and manage content.', 
    'page callback' => 'drupal_get_form', 
    'page arguments' => array('node_admin_content'), 
    'access arguments' => array('access content overview'), 
    'weight' => -10, 
    'file' => 'node.admin.inc',
  );
  // …
  return $items;
}
	
hook_menuで定義したアクセスURLに、ワイドカード’%’(任意の文字、数字)の使用ができます。例えば、あるページのURI: 「/user/123/fbconnect」、このページにuid=123のユーザーのfbconnectを表示するページとなります。ユーザーにより、uidは変わります。
実際にhook_menuでは、連想配列のキー: $items['user/%/fbconnect'] で表現します。ここで、ワードカード’%’が使用されています。
ワイドカードが二つのパタン
function [my-module-name]_menu() {
  $items['user/%/fboauth'] = array(            //ワイドカード'%'の使用
    'title' => t('Facebook settings'),
    'page callback' => 'fboauth_user_form',  //ページ定義関数の呼び出し
    'page arguments' => array(1),               //パスの1番目(0から)を引数に
    ・・・・,
  );
function fboauth_user_form($uid){             //URIの1番目にあるワードカードを引数に
  $user = user_load($uid);
  ・・・
}
	
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>');
}
		
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
        'title' => 'Copy and Remove',
        'page callback' => 'ajax_add_to_my_vocabulary',
        'page arguments' => array(array(), array(), 2) ,
        'access arguments' => array('create my vocabulary'),
  );
}
	
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
   'title' => 'Copy and Remove', 
   'page callback' => 'drupal_get_form', 
   'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
   'access arguments' => array('create my vocabulary'), 
  ); 
}
	
function node_menu() {
  $items['admin/content'] = array(
    'title' => 'Content', 
    'description' => 'Find and manage content.', 
    'page callback' => 'drupal_get_form', 
    'page arguments' => array('node_admin_content'), 
    'access arguments' => array('access content overview'), 
    'weight' => -10, 
    'file' => 'node.admin.inc',
  );
  // …
  return $items;
}
	
hook_menuで定義したアクセスURLに、ワイドカード’%’(任意の文字、数字)の使用ができます。例えば、あるページのURI: 「/user/123/fbconnect」、このページにuid=123のユーザーのfbconnectを表示するページとなります。ユーザーにより、uidは変わります。
実際にhook_menuでは、連想配列のキー: $items['user/%/fbconnect'] で表現します。ここで、ワードカード’%’が使用されています。
ワイドカードが二つのパタン
function [my-module-name]_menu() {
  $items['user/%/fboauth'] = array(            //ワイドカード'%'の使用
    'title' => t('Facebook settings'),
    'page callback' => 'fboauth_user_form',  //ページ定義関数の呼び出し
    'page arguments' => array(1),               //パスの1番目(0から)を引数に
    ・・・・,
  );
function fboauth_user_form($uid){             //URIの1番目にあるワードカードを引数に
  $user = user_load($uid);
  ・・・
}
	
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>');
}
		
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
        'title' => 'Copy and Remove',
        'page callback' => 'ajax_add_to_my_vocabulary',
        'page arguments' => array(array(), array(), 2) ,
        'access arguments' => array('create my vocabulary'),
  );
}
	
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
   'title' => 'Copy and Remove', 
   'page callback' => 'drupal_get_form', 
   'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
   'access arguments' => array('create my vocabulary'), 
  ); 
}
	
function node_menu() {
  $items['admin/content'] = array(
    'title' => 'Content', 
    'description' => 'Find and manage content.', 
    'page callback' => 'drupal_get_form', 
    'page arguments' => array('node_admin_content'), 
    'access arguments' => array('access content overview'), 
    'weight' => -10, 
    'file' => 'node.admin.inc',
  );
  // …
  return $items;
}
	
hook_menuで定義したアクセスURLに、ワイドカード’%’(任意の文字、数字)の使用ができます。例えば、あるページのURI: 「/user/123/fbconnect」、このページにuid=123のユーザーのfbconnectを表示するページとなります。ユーザーにより、uidは変わります。
実際にhook_menuでは、連想配列のキー: $items['user/%/fbconnect'] で表現します。ここで、ワードカード’%’が使用されています。
ワイドカードが二つのパタン
function [my-module-name]_menu() {
  $items['user/%/fboauth'] = array(            //ワイドカード'%'の使用
    'title' => t('Facebook settings'),
    'page callback' => 'fboauth_user_form',  //ページ定義関数の呼び出し
    'page arguments' => array(1),               //パスの1番目(0から)を引数に
    ・・・・,
  );
function fboauth_user_form($uid){             //URIの1番目にあるワードカードを引数に
  $user = user_load($uid);
  ・・・
}
	
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>');
}
		
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
        'title' => 'Copy and Remove',
        'page callback' => 'ajax_add_to_my_vocabulary',
        'page arguments' => array(array(), array(), 2) ,
        'access arguments' => array('create my vocabulary'),
  );
}
	
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
   'title' => 'Copy and Remove', 
   'page callback' => 'drupal_get_form', 
   'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
   'access arguments' => array('create my vocabulary'), 
  ); 
}
	
function node_menu() {
  $items['admin/content'] = array(
    'title' => 'Content', 
    'description' => 'Find and manage content.', 
    'page callback' => 'drupal_get_form', 
    'page arguments' => array('node_admin_content'), 
    'access arguments' => array('access content overview'), 
    'weight' => -10, 
    'file' => 'node.admin.inc',
  );
  // …
  return $items;
}
	
hook_menuで定義したアクセスURLに、ワイドカード’%’(任意の文字、数字)の使用ができます。例えば、あるページのURI: 「/user/123/fbconnect」、このページにuid=123のユーザーのfbconnectを表示するページとなります。ユーザーにより、uidは変わります。
実際にhook_menuでは、連想配列のキー: $items['user/%/fbconnect'] で表現します。ここで、ワードカード’%’が使用されています。
ワイドカードが二つのパタン
function [my-module-name]_menu() {
  $items['user/%/fboauth'] = array(            //ワイドカード'%'の使用
    'title' => t('Facebook settings'),
    'page callback' => 'fboauth_user_form',  //ページ定義関数の呼び出し
    'page arguments' => array(1),               //パスの1番目(0から)を引数に
    ・・・・,
  );
function fboauth_user_form($uid){             //URIの1番目にあるワードカードを引数に
  $user = user_load($uid);
  ・・・
}
	
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>');
}
		
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
        'title' => 'Copy and Remove',
        'page callback' => 'ajax_add_to_my_vocabulary',
        'page arguments' => array(array(), array(), 2) ,
        'access arguments' => array('create my vocabulary'),
  );
}
	
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
   'title' => 'Copy and Remove', 
   'page callback' => 'drupal_get_form', 
   'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
   'access arguments' => array('create my vocabulary'), 
  ); 
}
	
function node_menu() {
  $items['admin/content'] = array(
    'title' => 'Content', 
    'description' => 'Find and manage content.', 
    'page callback' => 'drupal_get_form', 
    'page arguments' => array('node_admin_content'), 
    'access arguments' => array('access content overview'), 
    'weight' => -10, 
    'file' => 'node.admin.inc',
  );
  // …
  return $items;
}
	
hook_menuで定義したアクセスURLに、ワイドカード’%’(任意の文字、数字)の使用ができます。例えば、あるページのURI: 「/user/123/fbconnect」、このページにuid=123のユーザーのfbconnectを表示するページとなります。ユーザーにより、uidは変わります。
実際にhook_menuでは、連想配列のキー: $items['user/%/fbconnect'] で表現します。ここで、ワードカード’%’が使用されています。
ワイドカードが二つのパタン
function [my-module-name]_menu() {
  $items['user/%/fboauth'] = array(            //ワイドカード'%'の使用
    'title' => t('Facebook settings'),
    'page callback' => 'fboauth_user_form',  //ページ定義関数の呼び出し
    'page arguments' => array(1),               //パスの1番目(0から)を引数に
    ・・・・,
  );
function fboauth_user_form($uid){             //URIの1番目にあるワードカードを引数に
  $user = user_load($uid);
  ・・・
}
	
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>');
}
		
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
        'title' => 'Copy and Remove',
        'page callback' => 'ajax_add_to_my_vocabulary',
        'page arguments' => array(array(), array(), 2) ,
        'access arguments' => array('create my vocabulary'),
  );
}
	
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
   'title' => 'Copy and Remove', 
   'page callback' => 'drupal_get_form', 
   'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
   'access arguments' => array('create my vocabulary'), 
  ); 
}
	
function node_menu() {
  $items['admin/content'] = array(
    'title' => 'Content', 
    'description' => 'Find and manage content.', 
    'page callback' => 'drupal_get_form', 
    'page arguments' => array('node_admin_content'), 
    'access arguments' => array('access content overview'), 
    'weight' => -10, 
    'file' => 'node.admin.inc',
  );
  // …
  return $items;
}
	
hook_menuで定義したアクセスURLに、ワイドカード’%’(任意の文字、数字)の使用ができます。例えば、あるページのURI: 「/user/123/fbconnect」、このページにuid=123のユーザーのfbconnectを表示するページとなります。ユーザーにより、uidは変わります。
実際にhook_menuでは、連想配列のキー: $items['user/%/fbconnect'] で表現します。ここで、ワードカード’%’が使用されています。
ワイドカードが二つのパタン
function [my-module-name]_menu() {
  $items['user/%/fboauth'] = array(            //ワイドカード'%'の使用
    'title' => t('Facebook settings'),
    'page callback' => 'fboauth_user_form',  //ページ定義関数の呼び出し
    'page arguments' => array(1),               //パスの1番目(0から)を引数に
    ・・・・,
  );
function fboauth_user_form($uid){             //URIの1番目にあるワードカードを引数に
  $user = user_load($uid);
  ・・・
}
	
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>');
}
		
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
        'title' => 'Copy and Remove',
        'page callback' => 'ajax_add_to_my_vocabulary',
        'page arguments' => array(array(), array(), 2) ,
        'access arguments' => array('create my vocabulary'),
  );
}
	
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
   'title' => 'Copy and Remove', 
   'page callback' => 'drupal_get_form', 
   'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
   'access arguments' => array('create my vocabulary'), 
  ); 
}
	
function node_menu() {
  $items['admin/content'] = array(
    'title' => 'Content', 
    'description' => 'Find and manage content.', 
    'page callback' => 'drupal_get_form', 
    'page arguments' => array('node_admin_content'), 
    'access arguments' => array('access content overview'), 
    'weight' => -10, 
    'file' => 'node.admin.inc',
  );
  // …
  return $items;
}
	
hook_menuで定義したアクセスURLに、ワイドカード’%’(任意の文字、数字)の使用ができます。例えば、あるページのURI: 「/user/123/fbconnect」、このページにuid=123のユーザーのfbconnectを表示するページとなります。ユーザーにより、uidは変わります。
実際にhook_menuでは、連想配列のキー: $items['user/%/fbconnect'] で表現します。ここで、ワードカード’%’が使用されています。
ワイドカードが二つのパタン
function [my-module-name]_menu() {
  $items['user/%/fboauth'] = array(            //ワイドカード'%'の使用
    'title' => t('Facebook settings'),
    'page callback' => 'fboauth_user_form',  //ページ定義関数の呼び出し
    'page arguments' => array(1),               //パスの1番目(0から)を引数に
    ・・・・,
  );
function fboauth_user_form($uid){             //URIの1番目にあるワードカードを引数に
  $user = user_load($uid);
  ・・・
}
	
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>');
}
		
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
        'title' => 'Copy and Remove',
        'page callback' => 'ajax_add_to_my_vocabulary',
        'page arguments' => array(array(), array(), 2) ,
        'access arguments' => array('create my vocabulary'),
  );
}
	
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
   'title' => 'Copy and Remove', 
   'page callback' => 'drupal_get_form', 
   'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
   'access arguments' => array('create my vocabulary'), 
  ); 
}
	
function node_menu() {
  $items['admin/content'] = array(
    'title' => 'Content', 
    'description' => 'Find and manage content.', 
    'page callback' => 'drupal_get_form', 
    'page arguments' => array('node_admin_content'), 
    'access arguments' => array('access content overview'), 
    'weight' => -10, 
    'file' => 'node.admin.inc',
  );
  // …
  return $items;
}
	
hook_menuで定義したアクセスURLに、ワイドカード’%’(任意の文字、数字)の使用ができます。例えば、あるページのURI: 「/user/123/fbconnect」、このページにuid=123のユーザーのfbconnectを表示するページとなります。ユーザーにより、uidは変わります。
実際にhook_menuでは、連想配列のキー: $items['user/%/fbconnect'] で表現します。ここで、ワードカード’%’が使用されています。
ワイドカードが二つのパタン
function [my-module-name]_menu() {
  $items['user/%/fboauth'] = array(            //ワイドカード'%'の使用
    'title' => t('Facebook settings'),
    'page callback' => 'fboauth_user_form',  //ページ定義関数の呼び出し
    'page arguments' => array(1),               //パスの1番目(0から)を引数に
    ・・・・,
  );
function fboauth_user_form($uid){             //URIの1番目にあるワードカードを引数に
  $user = user_load($uid);
  ・・・
}
	
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>');
}
		
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
        'title' => 'Copy and Remove',
        'page callback' => 'ajax_add_to_my_vocabulary',
        'page arguments' => array(array(), array(), 2) ,
        'access arguments' => array('create my vocabulary'),
  );
}
	
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
   'title' => 'Copy and Remove', 
   'page callback' => 'drupal_get_form', 
   'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
   'access arguments' => array('create my vocabulary'), 
  ); 
}
	
function node_menu() {
  $items['admin/content'] = array(
    'title' => 'Content', 
    'description' => 'Find and manage content.', 
    'page callback' => 'drupal_get_form', 
    'page arguments' => array('node_admin_content'), 
    'access arguments' => array('access content overview'), 
    'weight' => -10, 
    'file' => 'node.admin.inc',
  );
  // …
  return $items;
}
	
hook_menuで定義したアクセスURLに、ワイドカード’%’(任意の文字、数字)の使用ができます。例えば、あるページのURI: 「/user/123/fbconnect」、このページにuid=123のユーザーのfbconnectを表示するページとなります。ユーザーにより、uidは変わります。
実際にhook_menuでは、連想配列のキー: $items['user/%/fbconnect'] で表現します。ここで、ワードカード’%’が使用されています。
ワイドカードが二つのパタン
function [my-module-name]_menu() {
  $items['user/%/fboauth'] = array(            //ワイドカード'%'の使用
    'title' => t('Facebook settings'),
    'page callback' => 'fboauth_user_form',  //ページ定義関数の呼び出し
    'page arguments' => array(1),               //パスの1番目(0から)を引数に
    ・・・・,
  );
function fboauth_user_form($uid){             //URIの1番目にあるワードカードを引数に
  $user = user_load($uid);
  ・・・
}
	
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>');
}
		
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
        'title' => 'Copy and Remove',
        'page callback' => 'ajax_add_to_my_vocabulary',
        'page arguments' => array(array(), array(), 2) ,
        'access arguments' => array('create my vocabulary'),
  );
}
	
YOUR_MODULE_NAME_menu(){
  $items['your/path/%entity'] = array(
   'title' => 'Copy and Remove', 
   'page callback' => 'drupal_get_form', 
   'page arguments' => array('ajax_add_to_my_vocabulary', 2) , 
   'access arguments' => array('create my vocabulary'), 
  ); 
}
	hook_menuで定義したページへのアクセス権限設定は「access callback」と「access arguments」で行います。特定なユーザーロール、特定なユーザーのみなどの制御が可能となります。特に、ユーザーのアクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)で各ページのアクセス権限管理が一般的で、よく利用されます。hook_menuがこのアクセス権限管理の実装方法を纏めます。
/**
 * Implements hook_permission().
 */
function [my-module-name]_permission() {
  return array(
      'authorize fbauth_connect' => array(
          'title' => t('Connect Facebook account and store access token'),
      ),
  );
}
		
/**
 * Implements hook_entity_info().
 */
function drills_ch_vocabulary_entity_info()
{
    return array(
        'my_vocabulary' => array(
            'label' => t('My Vocabulary'),
            'entity class' => 'MyVocabularyEntity',
            'controller class' => 'MyVocabulryController',
            'base table' => 'my_vocabulary',
            'fieldable' => TRUE,
            'entity keys' => array(
                'id' => 'entity_id',
                'label' => 'vocabulary',
            ),
            'bundles' => array(
                'my_vocabulary' => array(
                    'label'=>'My Vocabulary',
                    'admin' => array(
                        'path' => 'admin/structure/my-vocabulary/manage',
                        'access arguments' => array('administer my vocabulary'),
                        'controller class' => 'EntityDefaultUIController',
                    ),
                ),
            ),
            'view modes' => array(
                'full' => array(
                    'label' => t('Default'),
                    'custom settings' => FALSE,
                ),
            ),
            'module' => 'my_vocabulary',
            'access callback' => 'my_vocabulary_access',
        ),
    );
}
	
// entity/entity.module の659行あたり
function entity_access($op, $entity_type, $entity = NULL, $account = NULL) {
  if (($info = entity_get_info()) && isset($info[$entity_type]['access callback'])) {
    return $info[$entity_type]['access callback']($op, $entity, $account, $entity_type);
  }
}
	hook_menuで定義したページへのアクセス権限設定は「access callback」と「access arguments」で行います。特定なユーザーロール、特定なユーザーのみなどの制御が可能となります。特に、ユーザーのアクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)で各ページのアクセス権限管理が一般的で、よく利用されます。hook_menuがこのアクセス権限管理の実装方法を纏めます。
/**
 * Implements hook_permission().
 */
function [my-module-name]_permission() {
  return array(
      'authorize fbauth_connect' => array(
          'title' => t('Connect Facebook account and store access token'),
      ),
  );
}
		
/**
 * Implements hook_entity_info().
 */
function drills_ch_vocabulary_entity_info()
{
    return array(
        'my_vocabulary' => array(
            'label' => t('My Vocabulary'),
            'entity class' => 'MyVocabularyEntity',
            'controller class' => 'MyVocabulryController',
            'base table' => 'my_vocabulary',
            'fieldable' => TRUE,
            'entity keys' => array(
                'id' => 'entity_id',
                'label' => 'vocabulary',
            ),
            'bundles' => array(
                'my_vocabulary' => array(
                    'label'=>'My Vocabulary',
                    'admin' => array(
                        'path' => 'admin/structure/my-vocabulary/manage',
                        'access arguments' => array('administer my vocabulary'),
                        'controller class' => 'EntityDefaultUIController',
                    ),
                ),
            ),
            'view modes' => array(
                'full' => array(
                    'label' => t('Default'),
                    'custom settings' => FALSE,
                ),
            ),
            'module' => 'my_vocabulary',
            'access callback' => 'my_vocabulary_access',
        ),
    );
}
	
// entity/entity.module の659行あたり
function entity_access($op, $entity_type, $entity = NULL, $account = NULL) {
  if (($info = entity_get_info()) && isset($info[$entity_type]['access callback'])) {
    return $info[$entity_type]['access callback']($op, $entity, $account, $entity_type);
  }
}
	hook_menuで定義したページへのアクセス権限設定は「access callback」と「access arguments」で行います。特定なユーザーロール、特定なユーザーのみなどの制御が可能となります。特に、ユーザーのアクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)で各ページのアクセス権限管理が一般的で、よく利用されます。hook_menuがこのアクセス権限管理の実装方法を纏めます。
/**
 * Implements hook_permission().
 */
function [my-module-name]_permission() {
  return array(
      'authorize fbauth_connect' => array(
          'title' => t('Connect Facebook account and store access token'),
      ),
  );
}
		
/**
 * Implements hook_entity_info().
 */
function drills_ch_vocabulary_entity_info()
{
    return array(
        'my_vocabulary' => array(
            'label' => t('My Vocabulary'),
            'entity class' => 'MyVocabularyEntity',
            'controller class' => 'MyVocabulryController',
            'base table' => 'my_vocabulary',
            'fieldable' => TRUE,
            'entity keys' => array(
                'id' => 'entity_id',
                'label' => 'vocabulary',
            ),
            'bundles' => array(
                'my_vocabulary' => array(
                    'label'=>'My Vocabulary',
                    'admin' => array(
                        'path' => 'admin/structure/my-vocabulary/manage',
                        'access arguments' => array('administer my vocabulary'),
                        'controller class' => 'EntityDefaultUIController',
                    ),
                ),
            ),
            'view modes' => array(
                'full' => array(
                    'label' => t('Default'),
                    'custom settings' => FALSE,
                ),
            ),
            'module' => 'my_vocabulary',
            'access callback' => 'my_vocabulary_access',
        ),
    );
}
	
// entity/entity.module の659行あたり
function entity_access($op, $entity_type, $entity = NULL, $account = NULL) {
  if (($info = entity_get_info()) && isset($info[$entity_type]['access callback'])) {
    return $info[$entity_type]['access callback']($op, $entity, $account, $entity_type);
  }
}
	hook_menuで定義したページへのアクセス権限設定は「access callback」と「access arguments」で行います。特定なユーザーロール、特定なユーザーのみなどの制御が可能となります。特に、ユーザーのアクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)で各ページのアクセス権限管理が一般的で、よく利用されます。hook_menuがこのアクセス権限管理の実装方法を纏めます。
/**
 * Implements hook_permission().
 */
function [my-module-name]_permission() {
  return array(
      'authorize fbauth_connect' => array(
          'title' => t('Connect Facebook account and store access token'),
      ),
  );
}
		
/**
 * Implements hook_entity_info().
 */
function drills_ch_vocabulary_entity_info()
{
    return array(
        'my_vocabulary' => array(
            'label' => t('My Vocabulary'),
            'entity class' => 'MyVocabularyEntity',
            'controller class' => 'MyVocabulryController',
            'base table' => 'my_vocabulary',
            'fieldable' => TRUE,
            'entity keys' => array(
                'id' => 'entity_id',
                'label' => 'vocabulary',
            ),
            'bundles' => array(
                'my_vocabulary' => array(
                    'label'=>'My Vocabulary',
                    'admin' => array(
                        'path' => 'admin/structure/my-vocabulary/manage',
                        'access arguments' => array('administer my vocabulary'),
                        'controller class' => 'EntityDefaultUIController',
                    ),
                ),
            ),
            'view modes' => array(
                'full' => array(
                    'label' => t('Default'),
                    'custom settings' => FALSE,
                ),
            ),
            'module' => 'my_vocabulary',
            'access callback' => 'my_vocabulary_access',
        ),
    );
}
	
// entity/entity.module の659行あたり
function entity_access($op, $entity_type, $entity = NULL, $account = NULL) {
  if (($info = entity_get_info()) && isset($info[$entity_type]['access callback'])) {
    return $info[$entity_type]['access callback']($op, $entity, $account, $entity_type);
  }
}
	hook_menuで定義したページへのアクセス権限設定は「access callback」と「access arguments」で行います。特定なユーザーロール、特定なユーザーのみなどの制御が可能となります。特に、ユーザーのアクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)で各ページのアクセス権限管理が一般的で、よく利用されます。hook_menuがこのアクセス権限管理の実装方法を纏めます。
/**
 * Implements hook_permission().
 */
function [my-module-name]_permission() {
  return array(
      'authorize fbauth_connect' => array(
          'title' => t('Connect Facebook account and store access token'),
      ),
  );
}
		
/**
 * Implements hook_entity_info().
 */
function drills_ch_vocabulary_entity_info()
{
    return array(
        'my_vocabulary' => array(
            'label' => t('My Vocabulary'),
            'entity class' => 'MyVocabularyEntity',
            'controller class' => 'MyVocabulryController',
            'base table' => 'my_vocabulary',
            'fieldable' => TRUE,
            'entity keys' => array(
                'id' => 'entity_id',
                'label' => 'vocabulary',
            ),
            'bundles' => array(
                'my_vocabulary' => array(
                    'label'=>'My Vocabulary',
                    'admin' => array(
                        'path' => 'admin/structure/my-vocabulary/manage',
                        'access arguments' => array('administer my vocabulary'),
                        'controller class' => 'EntityDefaultUIController',
                    ),
                ),
            ),
            'view modes' => array(
                'full' => array(
                    'label' => t('Default'),
                    'custom settings' => FALSE,
                ),
            ),
            'module' => 'my_vocabulary',
            'access callback' => 'my_vocabulary_access',
        ),
    );
}
	
// entity/entity.module の659行あたり
function entity_access($op, $entity_type, $entity = NULL, $account = NULL) {
  if (($info = entity_get_info()) && isset($info[$entity_type]['access callback'])) {
    return $info[$entity_type]['access callback']($op, $entity, $account, $entity_type);
  }
}
	hook_menuで定義したページへのアクセス権限設定は「access callback」と「access arguments」で行います。特定なユーザーロール、特定なユーザーのみなどの制御が可能となります。特に、ユーザーのアクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)で各ページのアクセス権限管理が一般的で、よく利用されます。hook_menuがこのアクセス権限管理の実装方法を纏めます。
/**
 * Implements hook_permission().
 */
function [my-module-name]_permission() {
  return array(
      'authorize fbauth_connect' => array(
          'title' => t('Connect Facebook account and store access token'),
      ),
  );
}
		
/**
 * Implements hook_entity_info().
 */
function drills_ch_vocabulary_entity_info()
{
    return array(
        'my_vocabulary' => array(
            'label' => t('My Vocabulary'),
            'entity class' => 'MyVocabularyEntity',
            'controller class' => 'MyVocabulryController',
            'base table' => 'my_vocabulary',
            'fieldable' => TRUE,
            'entity keys' => array(
                'id' => 'entity_id',
                'label' => 'vocabulary',
            ),
            'bundles' => array(
                'my_vocabulary' => array(
                    'label'=>'My Vocabulary',
                    'admin' => array(
                        'path' => 'admin/structure/my-vocabulary/manage',
                        'access arguments' => array('administer my vocabulary'),
                        'controller class' => 'EntityDefaultUIController',
                    ),
                ),
            ),
            'view modes' => array(
                'full' => array(
                    'label' => t('Default'),
                    'custom settings' => FALSE,
                ),
            ),
            'module' => 'my_vocabulary',
            'access callback' => 'my_vocabulary_access',
        ),
    );
}
	
// entity/entity.module の659行あたり
function entity_access($op, $entity_type, $entity = NULL, $account = NULL) {
  if (($info = entity_get_info()) && isset($info[$entity_type]['access callback'])) {
    return $info[$entity_type]['access callback']($op, $entity, $account, $entity_type);
  }
}
	hook_menuで定義したページへのアクセス権限設定は「access callback」と「access arguments」で行います。特定なユーザーロール、特定なユーザーのみなどの制御が可能となります。特に、ユーザーのアクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)で各ページのアクセス権限管理が一般的で、よく利用されます。hook_menuがこのアクセス権限管理の実装方法を纏めます。
/**
 * Implements hook_permission().
 */
function [my-module-name]_permission() {
  return array(
      'authorize fbauth_connect' => array(
          'title' => t('Connect Facebook account and store access token'),
      ),
  );
}
		
/**
 * Implements hook_entity_info().
 */
function drills_ch_vocabulary_entity_info()
{
    return array(
        'my_vocabulary' => array(
            'label' => t('My Vocabulary'),
            'entity class' => 'MyVocabularyEntity',
            'controller class' => 'MyVocabulryController',
            'base table' => 'my_vocabulary',
            'fieldable' => TRUE,
            'entity keys' => array(
                'id' => 'entity_id',
                'label' => 'vocabulary',
            ),
            'bundles' => array(
                'my_vocabulary' => array(
                    'label'=>'My Vocabulary',
                    'admin' => array(
                        'path' => 'admin/structure/my-vocabulary/manage',
                        'access arguments' => array('administer my vocabulary'),
                        'controller class' => 'EntityDefaultUIController',
                    ),
                ),
            ),
            'view modes' => array(
                'full' => array(
                    'label' => t('Default'),
                    'custom settings' => FALSE,
                ),
            ),
            'module' => 'my_vocabulary',
            'access callback' => 'my_vocabulary_access',
        ),
    );
}
	
// entity/entity.module の659行あたり
function entity_access($op, $entity_type, $entity = NULL, $account = NULL) {
  if (($info = entity_get_info()) && isset($info[$entity_type]['access callback'])) {
    return $info[$entity_type]['access callback']($op, $entity, $account, $entity_type);
  }
}
	hook_menuで定義したページへのアクセス権限設定は「access callback」と「access arguments」で行います。特定なユーザーロール、特定なユーザーのみなどの制御が可能となります。特に、ユーザーのアクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)で各ページのアクセス権限管理が一般的で、よく利用されます。hook_menuがこのアクセス権限管理の実装方法を纏めます。
/**
 * Implements hook_permission().
 */
function [my-module-name]_permission() {
  return array(
      'authorize fbauth_connect' => array(
          'title' => t('Connect Facebook account and store access token'),
      ),
  );
}
		
/**
 * Implements hook_entity_info().
 */
function drills_ch_vocabulary_entity_info()
{
    return array(
        'my_vocabulary' => array(
            'label' => t('My Vocabulary'),
            'entity class' => 'MyVocabularyEntity',
            'controller class' => 'MyVocabulryController',
            'base table' => 'my_vocabulary',
            'fieldable' => TRUE,
            'entity keys' => array(
                'id' => 'entity_id',
                'label' => 'vocabulary',
            ),
            'bundles' => array(
                'my_vocabulary' => array(
                    'label'=>'My Vocabulary',
                    'admin' => array(
                        'path' => 'admin/structure/my-vocabulary/manage',
                        'access arguments' => array('administer my vocabulary'),
                        'controller class' => 'EntityDefaultUIController',
                    ),
                ),
            ),
            'view modes' => array(
                'full' => array(
                    'label' => t('Default'),
                    'custom settings' => FALSE,
                ),
            ),
            'module' => 'my_vocabulary',
            'access callback' => 'my_vocabulary_access',
        ),
    );
}
	
// entity/entity.module の659行あたり
function entity_access($op, $entity_type, $entity = NULL, $account = NULL) {
  if (($info = entity_get_info()) && isset($info[$entity_type]['access callback'])) {
    return $info[$entity_type]['access callback']($op, $entity, $account, $entity_type);
  }
}
	hook_menuで定義したページへのアクセス権限設定は「access callback」と「access arguments」で行います。特定なユーザーロール、特定なユーザーのみなどの制御が可能となります。特に、ユーザーのアクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)で各ページのアクセス権限管理が一般的で、よく利用されます。hook_menuがこのアクセス権限管理の実装方法を纏めます。
/**
 * Implements hook_permission().
 */
function [my-module-name]_permission() {
  return array(
      'authorize fbauth_connect' => array(
          'title' => t('Connect Facebook account and store access token'),
      ),
  );
}
		
/**
 * Implements hook_entity_info().
 */
function drills_ch_vocabulary_entity_info()
{
    return array(
        'my_vocabulary' => array(
            'label' => t('My Vocabulary'),
            'entity class' => 'MyVocabularyEntity',
            'controller class' => 'MyVocabulryController',
            'base table' => 'my_vocabulary',
            'fieldable' => TRUE,
            'entity keys' => array(
                'id' => 'entity_id',
                'label' => 'vocabulary',
            ),
            'bundles' => array(
                'my_vocabulary' => array(
                    'label'=>'My Vocabulary',
                    'admin' => array(
                        'path' => 'admin/structure/my-vocabulary/manage',
                        'access arguments' => array('administer my vocabulary'),
                        'controller class' => 'EntityDefaultUIController',
                    ),
                ),
            ),
            'view modes' => array(
                'full' => array(
                    'label' => t('Default'),
                    'custom settings' => FALSE,
                ),
            ),
            'module' => 'my_vocabulary',
            'access callback' => 'my_vocabulary_access',
        ),
    );
}
	
// entity/entity.module の659行あたり
function entity_access($op, $entity_type, $entity = NULL, $account = NULL) {
  if (($info = entity_get_info()) && isset($info[$entity_type]['access callback'])) {
    return $info[$entity_type]['access callback']($op, $entity, $account, $entity_type);
  }
}
	hook_menuで定義したページへのアクセス権限設定は「access callback」と「access arguments」で行います。特定なユーザーロール、特定なユーザーのみなどの制御が可能となります。特に、ユーザーのアクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)で各ページのアクセス権限管理が一般的で、よく利用されます。hook_menuがこのアクセス権限管理の実装方法を纏めます。
/**
 * Implements hook_permission().
 */
function [my-module-name]_permission() {
  return array(
      'authorize fbauth_connect' => array(
          'title' => t('Connect Facebook account and store access token'),
      ),
  );
}
		
/**
 * Implements hook_entity_info().
 */
function drills_ch_vocabulary_entity_info()
{
    return array(
        'my_vocabulary' => array(
            'label' => t('My Vocabulary'),
            'entity class' => 'MyVocabularyEntity',
            'controller class' => 'MyVocabulryController',
            'base table' => 'my_vocabulary',
            'fieldable' => TRUE,
            'entity keys' => array(
                'id' => 'entity_id',
                'label' => 'vocabulary',
            ),
            'bundles' => array(
                'my_vocabulary' => array(
                    'label'=>'My Vocabulary',
                    'admin' => array(
                        'path' => 'admin/structure/my-vocabulary/manage',
                        'access arguments' => array('administer my vocabulary'),
                        'controller class' => 'EntityDefaultUIController',
                    ),
                ),
            ),
            'view modes' => array(
                'full' => array(
                    'label' => t('Default'),
                    'custom settings' => FALSE,
                ),
            ),
            'module' => 'my_vocabulary',
            'access callback' => 'my_vocabulary_access',
        ),
    );
}
	
// entity/entity.module の659行あたり
function entity_access($op, $entity_type, $entity = NULL, $account = NULL) {
  if (($info = entity_get_info()) && isset($info[$entity_type]['access callback'])) {
    return $info[$entity_type]['access callback']($op, $entity, $account, $entity_type);
  }
}
	hook_menuで定義したページへのアクセス権限設定は「access callback」と「access arguments」で行います。特定なユーザーロール、特定なユーザーのみなどの制御が可能となります。特に、ユーザーのアクセス権限管理ページ(ホーム » 管理 » ユーザー » 権限)で各ページのアクセス権限管理が一般的で、よく利用されます。hook_menuがこのアクセス権限管理の実装方法を纏めます。