ビューテーブルで2つの列を組み合わせる


7

私はさまざまな要件を抱え続けており、常にビューに行き詰まっています。今回の要件は、ビューテーブルの2つの列/フィールドを組み合わせるが、異なる行に表示することです。

eg:私が現在持っているフィールド:(下は追加された画像です)

ここに画像の説明を入力してください

テーブル内のビューの出力(コンマで区切られたニックネームの複数値)

ここに画像の説明を入力してください

複数の値フィールドを別の行に配置するとき

ここに画像の説明を入力してください

テーブル設定では、次のような2つのフィールドを組み合わせました

ここに画像の説明を入力してください

つまり、名前ニックネームです が、次のような結果しか得られません。

(ここでは、名前の後にニックネームが表示されます)

ここに画像の説明を入力してください

しかし、表示する必要がある要件は次のとおりです(名前とニックネームは別々の行にありますが、同じ列にあります)。列は、通常のビューテーブルソート機能のようにソート可能である必要があります。

ここに画像の説明を入力してください

これを実行できるようにするビューの設定はありますか?またはどうすればこれを達成できますか?

編集:これが不可能であり、誰もが私にこれのためのカスタムクエリを構築するように導くことができるなら、私は非常に感謝します。

編集2:ビューログからのSQLクエリは次のとおりです(このクエリは上から2番目の画像を出力します)

SELECT node.title AS node_title, node.nid AS nid, field_data_field_nick_names.delta AS field_data_field_nick_names_delta, field_data_field_nick_names.language AS field_data_field_nick_names_language, field_data_field_nick_names.bundle AS field_data_field_nick_names_bundle, field_data_field_nick_names.field_nick_names_value AS field_data_field_nick_names_field_nick_names_value, field_data_field_nick_names.field_nick_names_format AS field_data_field_nick_names_field_nick_names_format, node.created AS node_created, 'node' AS field_data_field_nick_names_node_entity_type, 'node' AS field_data_field_ages_node_entity_type, 'girls:page' AS view_name
FROM 
{node} node
LEFT JOIN {field_data_field_nick_names} field_data_field_nick_names ON node.nid = field_data_field_nick_names.entity_id AND (field_data_field_nick_names.entity_type = 'node' AND field_data_field_nick_names.deleted = '0')
WHERE (( (node.status = '1') AND (node.type IN  ('girlss')) ))
ORDER BY node_created DESC

誤解して申し訳ありません。私の答えはあなたの問題を解決しません。そしてそれを削除しました。
milkovsky 2013年

最初に、どのSQLクエリがこのような結果をもたらすかを考えてみてください。私は思い込みましたが、適切なクエリを作成しませんでした。必要なSQLクエリを見せていただければ、ビューを使用してそれを実行できます。
milkovsky 2013年

あなたの努力に感謝。ここにクエリを記述できませんでした。質問を編集します。

このクエリがあなたが望んでいることを正確に実行しているか?
milkovsky 2013年

1
@neok、恥ずかしがらないで、女の子が嫌いな人は?時々話題から外れていることは、開発者が気分を動かすために必要なものです。乾杯、その金曜日:)

回答:


4

単一のSQLクエリでは実行できないような方法でデータを構造化しました。(1)本名に基づく人のリストと、(2)ニックネームに基づくリストの2つの別々のことを常にデータベースに要求します。

しかし、それはこの方法である必要はありません。

図4を達成する最も簡単な方法は、人の「名前」を常に追加の「ニックネーム」として表すことです。

したがって、「Daina」には「Kristi」、「Rita」、「Sweetie」、「Daina」の4つのニックネームが必要です。次に、データベースに要求する必要があるのはニックネームのリストだけです。

これはおそらくあなたが探している答えではありません。しかし、私はそれがあなたのデータを保存するためのより正しい方法であると主張します。「ニックネーム」フィールドは、別名のリストではなく、その人が知られているすべての名前のリストと考えてください。とにかく、あなたの状況の要件に基づいて、それはあなたが本当に望んでいるように聞こえるものです。名前データのより完全なモデルです。


あなたの意見は建築の観点から正しいので、私はあなたに賞金を与えますが、それでも私の要件を満たしていません。

1

これは、ビューテンプレートファイルを上書きすることで実現できますviews-view-table.tpl.php

最初に、異なる行に複数の値を配置する必要があります。

次に、テンプレートファイルで、名前が前の行と同じであるかどうか各行を確認する必要があります。そうでない場合は、名前と年齢を印刷し、ニックネームと年齢を含むコードに新しい行を追加します。名前が前の名前と同じ場合は、ニックネームと年齢のみを印刷します。

理論的には説明を試みましたが、難しい場合は実装をお手伝いします。

手順:

  1. ビューテンプレートを上書きする:views-view-table.tpl.phpテーマフォルダーの下にファイルをコピーする必要があります。このファイルは、ビューモジュールの下にありますviews/theme/views-view-table.tpl.php
  2. テンプレートファイルの名前を変更して、その特定のビューにのみ適用されるようにしますviews-view-table--YOUR-VIEW.tpl.php。ビューのマシン名を2つのダッシュで区切って配置する必要があります。
  3. このテンプレートファイルの次のコードブロックを変更する必要があります。

コード

<?php foreach ($rows as $row_count => $row): ?>
  <?php // dpm($row) // You can use dpm() function to print out the contents of $row array. ?>
  <tr <?php if ($row_classes[$row_count]) { print 'class="' . implode(' ', $row_classes[$row_count]) .'"';  } ?>>
    <?php foreach ($row as $field => $content): ?>
      <td <?php if ($field_classes[$field][$row_count]) { print 'class="'. $field_classes[$field][$row_count] . '" '; } ?><?php print drupal_attributes($field_attributes[$field][$row_count]); ?>>
        <?php print $content; ?>
      </td>
    <?php endforeach; ?>
  </tr>
<?php endforeach; ?>

お返事ありがとうございます。私はまだDrupalの初心者で、Viewsは今までの私の最大の頭痛の種です。2日前に私はを購入し、Views Cookbookそれがどのように適切に機能するかを把握しようとしましたが、私の場合は何も説明していません。したがって、サンプル実装は非常に役立ちます。

回答を更新しました。Develモジュールをインストールすることをお勧めします。そして、dpm()関数を使用して、変数/配列をユーザーフレンドリーな方法で出力します。
ЕлинЙ.

ヒントを与えてくれてありがとう、それは役に立ちました。しかし、結果は私が探していたものではなく、viewsテンプレートファイルを操作する方法がわかりました。私は追加することができた場合になります名前ニックネームをこのアプローチに同じ列ではなく、異なる行

私が投稿したコードは実装ではありません。私が説明したようなロジックを実行する必要がありますif ($content == $content_previous){}。これは単なるヒントです。
ЕлинЙ.

0

OK、3つの列を1つに結合してから、必要な2つの列に分割しているように見え、任意のデータを取得しています。現在のオプションを使用して「スタイル設定」に移動し、フォーマットを「未フォーマット」に変更して保存してみてください。次に戻って、テーブルにリセットします。列を組み合わせるオプションがあり、必要な2つを選択するだけです。

これがお役に立てば幸いです。


いいえ、2つの列が1つに結合されています。あなたが言った設定はすでに行っています。列を結合するオプションがあります(これは既に試して質問で説明しました)。また、これらの結合が発生したときに結果を投稿しました。ここで見逃しているものはありますか?

ああ、申し訳ありませんでした。ニックネームの列を非表示にしてから、残りの2つを結合してみますか?
KyleM 2013年

質問が正しく理解できてすみません。名前の行にニックネーム欄を表示したい…質問も編集しましたので、ご覧ください。

0

構造->ビュー->設定->「SQLクエリを表示する」にチェックを入れます。ビューに移動すると、クエリが表示されます。

FORMAT-Show:fields、次に「Global:PHP」を使用してカスタムクエリを記述します。インストールしていない場合は、このリンクhttps://drupal.org/project/views_phpを使用してください

[グローバル:PHP]を選択した後、すでに表示されているクエリを使用して、好きなように実行できます。上記のすべてのフィールドは、「表示から除外」(つまり、名前、年齢など)でチェックする必要があります。


私はあなたが提供したこのステップで立ち往生しています。私はフィールドとして、グローバルPHPを追加しようとしましたが、私は唯一の場所は次のようにPHPを使用するように見ることができるvalue codeoutput codeなどはどこまさに私がこれらのクエリを使用していますか?使い方のヒントを教えてもらえますか?

出力コード<?php ...?>でコードを記述する必要があります。利用可能な変数のリンクをクリックします。たとえば、<?php echo $ row-> name; ?>利用可能な変数の出力を確認します。
J Sinha 2013年

私は質問を写真で編集しましたが、サンプルを提供していただければ、どうすればそれを実行できるでしょうか。とても感謝しています。

0

申し訳ありませんが、便利なDrupal 7テストベッドはありませんが、年齢をグループ化してもかまわない場合は、次のようなことができます(スクリーンショットはDrupal 6にあります)。Drupal7でもほとんど同じだと思います。 。

まず、オフ、あなたが必要なフィールドをつかむ、この場合には、私はと呼ばれるコンテンツタイプを作成name_nick_age三つのフィールドと一緒にnna_namenna_nickそしてnna_age、その後、ビューを作成しました:

ここに画像の説明を入力してください

そして、テーブルのスタイル設定内では、デフォルトで次のようになります。

ここに画像の説明を入力してください

私がこれに変更したこと:

ここに画像の説明を入力してください

唯一の変更は、ニックネーム列に名前を配置することです。これにより、次のテーブルが作成されました。

ここに画像の説明を入力してください

Style:Tableの右側にある小さな歯車をクリックしてスタイル設定にアクセスします。Drupal7のスクリーンショットは異なりますが、そのための機能があると思います。


こんにちは、視覚情報をありがとう。私はあなたが言ったようにそれらのステップをすでに試しました、そして結果は3番目の絵にあります。私はあなたが言ったように達成しましたが、行が並べ替え可能であることを望んでいるため、私の要件は画像4 (エディターでその写真を作成しました)とまったく同じです。

ああ!新情報!名前とニックネームの組み合わせを1つの大きなアルファベット順のリストにソートできる必要がありますか?(私はあなたが列ではなく列を意味していると思います:並べ替え。間違っている場合は、どういう意味か教えてください。)
Jimajamma

はい、私はカラムを意味します(取り違えました)。名前とニックネームの両方を別々の行に含む列は、(ビューの通常の列の並べ替えと同様に)並べ替え可能にする必要があります。

この新しい情報は表示の問題だけではなくなったため、複雑さを大幅に増しているので、質問追加してください。
ジマジャマ2013年

はい、私はそう感じました、私は本当に先週以来これで立ち往生しています。

0
   <?php $result = db_query("SELECT node.title AS node_title, node.nid AS nid, field_data_field_nick_names.delta AS field_data_field_nick_names_delta, field_data_field_nick_names.language AS field_data_field_nick_names_language, field_data_field_nick_names.bundle AS field_data_field_nick_names_bundle, field_data_field_nick_names.field_nick_names_value AS field_data_field_nick_names_field_nick_names_value, field_data_field_nick_names.field_nick_names_format AS field_data_field_nick_names_field_nick_names_format, node.created AS node_created, 'node' AS field_data_field_nick_names_node_entity_type, 'node' AS field_data_field_ages_node_entity_type, 'girls:page' AS view_name
    FROM 
    {node} node
    LEFT JOIN {field_data_field_nick_names} field_data_field_nick_names ON node.nid = field_data_field_nick_names.entity_id AND (field_data_field_nick_names.entity_type = 'node' AND field_data_field_nick_names.deleted = '0')
    WHERE (( (node.status = '1') AND (node.type IN  ('girlss')) ))
    ORDER BY node_created DESC");

    $fullname = "";
    $nickname = "";
    foreach($result as $rec)
    {   
        $fullname .= $rec->node_title.",";
        $nickname .= $rec->field_data_field_nick_names_delta.",";
    }
    echo $fullname;
    echo "<br>";
    echo $nickname;
?>

結果が表示されているかどうかを確認しますか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.