web-dev-qa-db-ja.com

ノードが投稿されるグループを選択するフィールドにフォーム選択フィールドを使用する

Organic Groupsモジュールのコンテンツタイプとして設定されているコンテンツタイプのノードを作成するためのフォームには、ノードが投稿されるグループを選択するためのチェックボックスがあります。チェックボックスの代わりに選択フォームフィールドを使用したい。

フォームフィールドを変更するにはどうすればよいですか?

Drupal.orgのパッチをいくつか試しましたが、正しく動作しません。

次のコードを使用しました。

/**
 * Helper function; Make the groups audience accept only a single group.
 */
function og_single_group_form_alter(&$form, $form_state, $form_id) {
  if (module_exists('og_access')) {
    $path = drupal_get_path('module', 'og_single_group');
    drupal_add_js($path . '/og_single_group_hideoption.js');
  }

  if (!empty($form['og_nodeapi']['visible']['og_groups']) && ($form['og_nodeapi']['visible']['og_groups']['#type'] != 'value')) {
    $options = array();
    $options = array(t('Personal blog')) + $form['og_nodeapi']['visible']['og_groups']['#options'];
    $form['og_nodeapi']['visible']['og_groups']['#type'] = 'select';
    $form['og_nodeapi']['visible']['og_groups']['#multiple'] = FALSE;
    $form['og_nodeapi']['visible']['og_groups']['#options'] = $options;
    // Add own submit handler so we can cast the groups back to an array.
    $form['#submit'][] = 'og_single_group_submit';
  }
}

 /**
  * Submit handler; Since we permit only a single group per content, we need to
  * case to groups into an array
  */
function og_single_group_submit($form, &$form_state) {
   if (!empty($form_state['values']['og_groups']) && !is_array($form_state['values']['og_groups'])) {
     $form_state['values']['og_groups'] = drupal_map_assoc((array)$form_state['values']['og_groups']);
   } 
  else if (empty($form_state['values']['og_groups'])) {
    $form_state['values']['og_groups'] = array();
  }
}

このコードにより、次のエラーが発生します。

警告:array_filter()[function.array-filter]:最初の引数は、1303行の/var/www/mysite/sites/all/modules/contrib/og/og.moduleの配列である必要があります。

1
Stan79

あなたの質問へのコメントであなたが書いたものに基づいて返信します。

Organic Groupsは、「Audience」フォームフィールドにリストされているグループの数に基づいて、チェックボックスまたは選択フィールドを表示します。グループの数が20未満の場合、モジュールはチェックボックスを使用します。それ以外の場合は、選択ボックスを使用します。

Organic Groupsによって追加されたフォームフィールドを変更するモジュールを使用する以外は、使用されるフォームフィールドを変更する方法はありません。 og.moduleに含まれる次のコードは、オーディエンスフォームフィールドをノード編集フォームに追加するコードです。

_// show multi-select. if less than 20 choices, use checkboxes.
$type = $cnt >= 20 || $is_optgroup ? 'select' : 'checkboxes';
$max_groups = variable_get('og_max_groups_'.$node->type,'');
$description_max_groups = ($max_groups && !user_access('administer nodes')) ? format_plural($max_groups," Limited to !max_groups choice."," Limited to !max_groups choices.", array('!max_groups' => $max_groups)):'';
$form['og_nodeapi']['visible']['og_groups'] = array(
  '#type' => $type,
  '#title' => t('Audience'),
  '#attributes' => array('class' => 'og-audience'),
  '#options' => $type == 'checkboxes' ? array_map('filter_xss', $options) : $options,
  '#required' => $required,
  '#description' =>  format_plural(count($options), 'Show this post in this group.', 'Show this post in these groups.') . $description_max_groups,
  '#default_value' => $groups ? $groups : array(),
  '#required' => $required,
  '#multiple' => TRUE);
_

次の行を実行するモジュールがあれば十分です。フォームフィールドは常に選択ボックスを使用して、投稿を関連付けるグループのリストを表示します。

_$form['og_nodeapi']['visible']['og_groups']['#type'] = 'select';
_

コードは、hook_form_alter()またはhook_form_FORM_ID_alter()の実装内で実行する必要があります。

2
kiamlaluno

Spaces モジュール内にはSpaces OGモジュールがあります。これにより「オーディエンス」フィールドが削除され、1つのグループにのみ投稿できる場所に表示されます。

0
gmclelland