web-dev-qa-db-ja.com

エンティティ参照の順序付けを無効にする(ユーザー)

ウィジェットtype = autocompleteエンティティ参照があります。複数のユーザーを追加できるユーザーの集まりです。

ここで、ユーザーの順序付けを無効にします。したがって、ユーザーを並べ替えることはできず、Show row heightsというテキストは表示されません。ここでは、現在の状態を確認できます。

enter image description here

私は this のチュートリアルを実行しようとしましたが、最後のステップで行き詰まり、element['#field_name'] = 'myfield'が見つかりません。

これは私がチュートリアルからこれまで持ってきたものです:(私はotherという名前のカスタムモジュールを使用しています)

function other_theme_registry_alter(&$theme_registry) {
    if (isset($theme_registry['field_multiple_value_form'])) {
        $theme_registry['field_multiple_value_form']['type'] = 'module';
        $theme_registry['field_multiple_value_form']['theme path'] = drupal_get_path('module', 'other');
        $theme_registry['field_multiple_value_form']['function'] = 'other_theme_field_multiple_value_form';
    } 
}


/**
 * Theme function override for multiple-value form widgets.
 *
 * @see theme_field_multiple_value_form()
 */
function other_theme_field_multiple_value_form($variables) {
  $element = $variables['element'];
  $output = '';

  // The first condition is the override.
  if (($element['#cardinality'] > 1 || $element['#cardinality'] == FIELD_CARDINALITY_UNLIMITED) && isset($element[0]['#nodrag'])) {
    die;
    $table_id = drupal_html_id($element['#field_name'] . '_values');
    $required = !empty($element['#required']) ? theme('form_required_marker', $variables) : '';

    $header = array(
      array(
        'data' => '<label>' . t('!title !required', array('!title' => $element['#title'], '!required' => $required)) . "</label>",
        'class' => array('field-label'),
      ),
    );
    $rows = array();

    // Sort items according to weight
    $items = array();
    foreach (element_children($element) as $key) {
      if ($key === 'add_more') {
        $add_more_button = &$element[$key];
      }
      else {
        $items[] = &$element[$key];
      }
    }
    usort($items, '_field_sort_items_value_helper');

    // Add the items as table rows.
    foreach ($items as $key => $item) {
      // We don't want the weight to render.
      unset($item['_weight']);
      $cells = array(
        drupal_render($item),
      );
      $rows[] = array(
        'data' => $cells,
      );
    }

    $output = '<div class="form-item">';
    $output .= theme('table', array(
      'header' => $header,
      'rows' => $rows,
      'attributes' => array(
        'id' => $table_id,
        'class' => array('field-multiple-table'),
      ),
    ));
    $output .= $element['#description'] ? '<div class="description">' . $element['#description'] . '</div>' : '';
    $output .= '<div class="clearfix">' . drupal_render($add_more_button) . '</div>';
    $output .= '</div>';
  }
  elseif ($element['#cardinality'] > 1 || $element['#cardinality'] == FIELD_CARDINALITY_UNLIMITED) {
    $table_id = drupal_html_id($element['#field_name'] . '_values');
    $order_class = $element['#field_name'] . '-delta-order';
    $required = !empty($element['#required']) ? theme('form_required_marker', $variables) : '';

    $header = array(
      array(
        'data' => '<label>' . t('!title !required', array('!title' => $element['#title'], '!required' => $required)) . "</label>",
        'colspan' => 2,
        'class' => array('field-label'),
      ),
      t('Order'),
    );
    $rows = array();

    // Sort items according to '_weight' (needed when the form comes back after
    // preview or failed validation).
    $items = array();
    foreach (element_children($element) as $key) {
      if ($key === 'add_more') {
        $add_more_button = &$element[$key];
      }
      else {
        $items[] = &$element[$key];
      }
    }
    usort($items, '_field_sort_items_value_helper');

    // Add the items as table rows.
    foreach ($items as $key => $item) {
      $item['_weight']['#attributes']['class'] = array($order_class);
      $delta_element = drupal_render($item['_weight']);
      $cells = array(
        array(
          'data' => '',
          'class' => array('field-multiple-drag'),
        ),
        drupal_render($item),
        array(
          'data' => $delta_element,
          'class' => array('delta-order'),
        ),
      );
      $rows[] = array(
        'data' => $cells,
        'class' => array('draggable'),
      );
    }

    $output = '<div class="form-item">';
    $output .= theme('table', array(
      'header' => $header,
      'rows' => $rows,
      'attributes' => array(
        'id' => $table_id,
        'class' => array('field-multiple-table'),
      ),
    ));
    $output .= $element['#description'] ? '<div class="description">' . $element['#description'] . '</div>' : '';
    $output .= '<div class="clearfix">' . drupal_render($add_more_button) . '</div>';
    $output .= '</div>';

    drupal_add_tabledrag($table_id, 'order', 'sibling', $order_class);
  }
  else {
    foreach (element_children($element) as $key) {
      $output .= drupal_render($element[$key]);
    }
  }

  return $output;
}


function other_field_widget_form_alter(&$element, &$form_state, $context) {
  if (isset($element['#field_name'])) {
    var_dump($element['#field_name']);
    switch ($element['#field_name']) {
      case 'field_co_authors': die;
        $element['#nodrag'] = TRUE;
      default:
        break;
    }
  }
}

ご覧のとおり、スイッチがありますが、テキストがfield_co_authorsと等しくなることはありません。エンティティ参照であり、複数の値を持つことができる2つのフィールドは表示されません..。

私は何か間違ったことをしていますか、これを行う別の方法はありますか?

2
nielsv

$element['#field_name']はエンティティ参照フィールドに設定されていないようです。これは私にとってはうまくいきました:

function other_field_widget_form_alter(&$element, &$form_state, $context) {
  if ($context['instance']['field_name'] == 'field_co_authors') {
    $element['#nodrag'] = TRUE;
  }
}

これは私がテーマの機能を変更した方法です:

function other_field_multiple_value_form($variables) {

  $element = $variables['element'];
  $output = '';

  if ($element['#cardinality'] > 1 || $element['#cardinality'] == FIELD_CARDINALITY_UNLIMITED) {
    $table_id = drupal_html_id($element['#field_name'] . '_values');
    $order_class = $element['#field_name'] . '-delta-order';
    $required = !empty($element['#required']) ? theme('form_required_marker', $variables) : '';

    $header = array(
      array(
        'data' => '<label>' . t('!title !required', array('!title' => $element['#title'], '!required' => $required)) . "</label>",
        'colspan' => 2,
        'class' => array('field-label'),
      ),
    );
    $rows = array();

    if (!isset($element[0]['#nodrag'])) {
      $header[] = t('Order');
    }

    // Sort items according to '_weight' (needed when the form comes back after
    // preview or failed validation)
    $items = array();
    foreach (element_children($element) as $key) {
      if ($key === 'add_more') {
        $add_more_button = &$element[$key];
      }
      else {
        $items[] = &$element[$key];
      }
    }
    usort($items, '_field_sort_items_value_helper');

    // Add the items as table rows.
    foreach ($items as $key => $item) {
      $item['_weight']['#attributes']['class'] = array($order_class);
      $delta_element = drupal_render($item['_weight']);
      $cells = array(
        array('data' => '', 'class' => array('field-multiple-drag')),
        drupal_render($item),
      );
      if (!isset($element[0]['#nodrag'])) {
        $cells[] = array('data' => $delta_element, 'class' => array('delta-order'));
      }
      $rows[] = array(
        'data' => $cells,
        'class' => array('draggable'),
      );
    }

    $output = '<div class="form-item">';
    $output .= theme('table', array('header' => $header, 'rows' => $rows, 'attributes' => array('id' => $table_id, 'class' => array('field-multiple-table'))));
    $output .= $element['#description'] ? '<div class="description">' . $element['#description'] . '</div>' : '';
    $output .= '<div class="clearfix">' . drupal_render($add_more_button) . '</div>';
    $output .= '</div>';

    if (!isset($element[0]['#nodrag'])) {
      drupal_add_tabledrag($table_id, 'order', 'sibling', $order_class);
    }
  }
  else {
    foreach (element_children($element) as $key) {
      $output .= drupal_render($element[$key]);
    }
  }

  return $output;
}

更新:

「別のアイテムを追加」のテキストを変更するには、フォームの変更を実装する必要があると思います。ノードタイプがページであるとすると、次のようになります。

function other_form_page_node_form_alter(&$form, &$form_state, $form_id) {
  $language = $form['field_co_authors']['#language'];
  $form['field_co_authors'][$language]['add_more']['#value'] = t('Add another user');
}

または、複数のコンテンツタイプで必要な場合は、一般的なhook_form_alterを使用できます。

drupalここにコアを追加する適切な変更機能を追加することについてdrupal.orgでいくつかの議論があります: field_multiple_value_form() をオーバーライドするためにフック変更を追加します

2
Peter

CSSを使用して、ドラッグハンドルと「行の太さを表示」テキストを非表示にすることができます。また、hook_form_alter()を使用すると、独自の検証関数を追加して、重みフィールドを0にリセットできます(誰かがfirebug /インスペクターを使用して値を変更した場合に備えて)

0
Marius Ilie

Jqueryを使用して、簡単かつ迅速に実行できることをお勧めします。 drupal_add_jsによってこのページにのみ読み込まれるjsを追加します

その後ワート

  $('.field-multiple-drag').remove();

coustomモジュールのhook_form_alter内

if($form_id=='your_form_name'){
drupal_add_js(drupal_get_path('module', 'yourmodule') . '/removesortable.js');
}

次にjsファイルに

//removesortable.js
(function($) {
    Drupal.behaviors.yourmodule = {
        attach: function(context) {
        $('.field-multiple-drag').remove();
    }
  }
})(jQuery);

とお楽しみください:)

0
Yusef