web-dev-qa-db-ja.com

カスタム関数でビュー出力を変更する最良の方法?

ユーザープロファイル情報とユーザーのポイント(ユーザーポイントモジュールから)を表示するブロック表示付きのビューがあります。ユーザーが持っているポイント数に基づく文字列である「ポイントレベル」を表示したい。

それをブロックに追加するにはどうすればよいですか?

ポイントの数に基づいてテキスト文字列を返すカスタム関数をすでに持っています。

ブロックのキャッシュを防ぐため、views_PHPはもう使いたくありません。

hook_block_view_alter() を使用する必要がありますか?

5
uwe

私はビューがあなたが望むテキストを直接レンダリングできるようにする解決策をずっと望んでいるので、技術的には、ここではあなたの質問に答えません。

私の提案は、ユーザーポイントをテキスト文字列として直接レンダリングするために使用する新しいフォーマッターを追加することです。これにより、特定の1つのブロックだけでなく、すべてのコアでレベルを正しく機能させることができます。次に、異なるフォーマッターを使用して、ビューにユーザーポイントを2回追加するだけです。

ユーザーポイントはどこにも使用しないため、適切なテストの下に特定のコードを指定していませんが、使用しているライブプロジェクトからコピーしてクリーンアップしているため、同様に機能します。

_/**
 * Implements hook_field_formatter_info().
 */
function user_level_field_formatter_info() {
  return array(
  'user_level' => array (
      'label' => t('User level'),
      'field types' => array('user_points'),
    ),
  );
}

/**
 * Implements hook_field_formatter_view().
 */
function user_level_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
  $user_level = 'green';

  switch ($items[0]) {
    case > 5000:
      $user_level = 'veteran';
    case > 2500:
      $user_level = 'experienced';
  }

  return array(0 => array('#markup' => $user_level));
}
_

上記のコードは、ユーザーポイントがユーザーの実際のフィールドであることを前提としています。そうでない場合は、ユーザーに新しいテキストフィールドを追加して、代わりに_'field types'_をarray('text')に設定し、フォーマッターでユーザーポイントからユーザーポイントの数を直接取得します。私のように_$items[0]_からではなく、user_load($uid)と言いますまた、テキストフィールドを_user_edit_で_hook_form_alter_から非表示にすることもできます。

5
Letharion