Kombinieren von zwei Spalten in der Views-Tabelle

7

Ich habe immer wieder andere Anforderungen und stecke immer in Ansichten fest. Diesmal müssen die beiden Spalten / Felder einer Ansichtstabelle kombiniert, aber in verschiedenen Zeilen angezeigt werden.

Die zB: Felder, die ich derzeit habe: (Unten ist das hinzugefügte Bild)

Geben Sie hier die Bildbeschreibung ein

Die Ausgabe der Ansicht in Tabelle (Spitzname Mehrwert durch Komma getrennt)

Geben Sie hier die Bildbeschreibung ein

Beim Einfügen des Felds Mehrere Werte in verschiedene Zeilen

Geben Sie hier die Bildbeschreibung ein

In den Tabelleneinstellungen habe ich zwei Felder wie kombiniert

Geben Sie hier die Bildbeschreibung ein

dh Name und Spitzname, aber das gibt nur Ergebnisse wie:

(Hier wird Nick Name nach Name angezeigt)

Geben Sie hier die Bildbeschreibung ein

Aber die Anforderungen, die ich anzeigen muss, sind: (Name und Spitzname in separater Zeile, aber in derselben Spalte). Die Spalte muss wie die normale Funktion zum Sortieren von Ansichtstabellen sortierbar sein.

Geben Sie hier die Bildbeschreibung ein

Gibt es Einstellungen in Ansichten, mit denen ich dies ausführen kann? Oder wie kann ich das erreichen?

Bearbeiten: Wenn dies nicht möglich ist und mich jemand anleiten könnte, eine benutzerdefinierte Abfrage dafür zu erstellen, wäre ich sehr dankbar.

Bearbeiten 2 : SQL-Abfrage aus Ansichten Das Protokoll lautet: (Diese Abfrage gibt das 2. Bild von oben aus.)

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
kiamlaluno
quelle
Entschuldigung für das Missverständnis. Meine Antwort löst Ihr Problem nicht. Und ich habe es entfernt.
Milkovsky
Versuchen Sie zunächst zu überlegen, welche SQL-Abfrage Ihnen ein solches Ergebnis liefert. Ich habe nachgedacht, aber nicht die entsprechende Abfrage erstellt. Wenn Sie mir eine SQL-Abfrage zeigen könnten, die Sie möchten, kann ich Ihnen dabei helfen, dies mit Ansichten zu tun.
Milkovsky
Vielen Dank für Ihre Mühe. Ich konnte die Abfrage hier nicht schreiben, ich werde die Frage bearbeiten.
Sind Sie sicher, dass diese Abfrage genau das tut, was Sie wollen?
Milkovsky
1
@neok, sei nicht schüchtern, wer mag keine Mädchen? Manchmal ist Off-Topic das, was Entwickler brauchen, um die Stimmung in Schwung zu bringen.

Antworten:

4

Sie haben Ihre Daten so strukturiert, dass dies nicht mit einer einzigen SQL-Abfrage möglich ist. Sie werden die Datenbank immer nach zwei getrennten Dingen fragen: (1) einer Liste von Personen, die auf ihren tatsächlichen Namen basieren, und (2) einer Liste, die auf ihren Spitznamen basiert.

Aber das muss nicht so sein.

Der mit Abstand einfachste Weg, um Bild 4 zu erreichen, besteht darin, den "Namen" einer Person immer als zusätzlichen "Spitznamen" darzustellen.

"Daina" sollte also 4 Spitznamen haben: "Kristi", "Rita", "Sweetie" und "Daina". Dann müssen Sie die Datenbank nur noch nach einer Liste mit Spitznamen fragen.

Dies ist wahrscheinlich nicht die Antwort, die Sie suchen. Aber ich würde argumentieren, dass es eine korrektere Art ist, Ihre Daten zu speichern. Stellen Sie sich das Feld "Spitzname" nicht als Liste alternativer Namen vor, sondern als Liste aller Namen, unter denen die Person bekannt ist. Basierend auf den Anforderungen Ihrer Situation klingt es sowieso so, als ob Sie wirklich danach suchen. Es ist ein vollständigeres Modell für Ihre Namensdaten.

Les Lim
quelle
Ich gebe Ihnen das Kopfgeld, da Ihre Meinung aus architektonischer Sicht richtig ist, aber meine Anforderungen immer noch nicht erfüllt.
1

Dies könnte durch Überschreiben der Ansichtsvorlagendatei erreicht werden : views-view-table.tpl.php.

Zuerst müssen Sie mehrere Werte in verschiedene Zeilen einfügen.

Dann sollten Sie in der Vorlagendatei für jede Zeile prüfen, ob der Name mit der vorherigen Zeile identisch ist. Wenn nicht, drucken Sie den Namen und das Alter aus und fügen Sie dem Code eine neue Zeile hinzu, die den Spitznamen und das Alter enthält. Wenn der Name mit dem vorherigen identisch ist, drucken Sie nur den Spitznamen und das Alter.

Ich habe versucht, es theoretisch zu erklären, aber ich kann bei der Implementierung helfen, wenn Sie Schwierigkeiten haben.

Schritte:

  1. Überschreiben der Ansichtsvorlage: Sie müssen die views-view-table.tpl.phpDatei unter Ihren Themenordner kopieren . Diese Datei befindet sich unter dem Modul Ansichten views/theme/views-view-table.tpl.php.
  2. Benennen Sie die Vorlagendatei so um, dass sie nur für diese bestimmte Ansicht gilt : views-view-table--YOUR-VIEW.tpl.php. Sie sollten den Computernamen Ihrer Ansicht durch 2 Striche getrennt platzieren.
  3. Sie müssen den folgenden Codeblock in dieser Vorlagendatei ändern:

Code

<?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; ?>
Елин Й.
quelle
Vielen Dank für Ihre Antwort. Ich bin immer noch ein Neuling in Drupal und Views sind meine größten Kopfschmerzen bis jetzt. Vor 2 Tagen habe ich das gekauft Views Cookbookund versucht zu verstehen, wie es richtig funktioniert, aber es erklärt nichts in meinem Fall. Eine Beispielimplementierung wäre also sehr, sehr hilfreich.
Ich habe meine Antwort aktualisiert. Ich empfehle Ihnen, das Devel- Modul zu installieren . Verwenden Sie die dpm()Funktion, um die Variablen / Arrays benutzerfreundlich auszudrucken.
Елин Й.
Vielen Dank für den Hinweis, es war hilfreich. Das Ergebnis ist jedoch nicht das, nach dem ich gesucht habe. Ich habe eine Idee, wie ich mit viewsVorlagendateien arbeiten soll. Ich werde sehen , ob ich kann hinzufügen , Namen und Nickname in derselben Spalte , aber verschiedene Reihen mit diesem Ansatz
Der Code, den ich gepostet habe, ist keine Implementierung. Sie sollten eine Logik machen, so wie ich es beschrieben habe : if ($content == $content_previous){}. Dies ist nur ein Hinweis.
Елин Й.
0

OK, es sieht so aus, als würden die drei Spalten zu einer zusammengefasst und dann in die beiden Spalten aufgeteilt, die Sie benötigen, und als solche werden beliebige Daten abgerufen. Versuchen Sie, mit den jetzt verfügbaren Optionen zu "Stileinstellungen" zu wechseln, ändern Sie das Format in "unformatiert" und speichern Sie es. Gehen Sie jetzt zurück und setzen Sie es auf Tabelle zurück. Es sollte die Möglichkeit geben, Spalten zu kombinieren und einfach die beiden gewünschten auszuwählen.

Ich hoffe das hilft.

KyleM
quelle
Nein, es sind nur zwei Spalten, die zu einer zusammengefasst sind. Ich habe bereits die von Ihnen angegebenen Einstellungen vorgenommen. Es gibt eine Option zum Kombinieren von Spalten (die ich bereits in der Frage ausprobiert und erklärt habe), und ich habe auch die Ergebnisse veröffentlicht, wenn diese kombiniert werden. Fehlt mir hier etwas?
Ah, tut mir leid, ich war nicht mehr Hilfe. Versuchen Sie, die Spalte mit den Spitznamen auszublenden, und versuchen Sie dann erneut, die verbleibenden beiden zu kombinieren.
KyleM
Es tut mir leid, wenn Sie die Frage richtig verstanden haben. Ich möchte das Spitznamenfeld in der Namenszeile anzeigen ... Ich habe die Frage auch bearbeitet, bitte schauen Sie sie sich an.
0

Klicken Sie unter Struktur -> Ansichten -> Einstellungen -> auf "SQL-Abfrage anzeigen". Gehen Sie zu Ihrer Ansicht, es wird eine Abfrage angezeigt.

FORMAT - Show: -Felder und verwenden Sie dann "Global: PHP" zum Schreiben einer benutzerdefinierten Abfrage. Wenn Sie nicht installiert haben, verwenden Sie diesen Link, https://drupal.org/project/views_php .

Nach Auswahl von Global: PHP - Sie können die bereits angezeigte Abfrage verwenden und dann können wir tun, was wir wollen. Alle oben genannten Felder sollten mit "Von Anzeige ausschließen" (dh Name, Alter usw.) markiert sein.

J Sinha
quelle
Ich bin mit diesem Schritt festgefahren, den Sie bereitgestellt haben. Ich habe versucht, globales PHP als Feld hinzuzufügen, aber ich kann nur den Ort sehen, an dem PHP verwendet werden value codekann output code, usw. Wo genau verwende ich diese Abfragen? Können Sie mir einen Hinweis geben, wie man es benutzt?
Sie müssen Code in den Ausgabecode <? Php ...?> Schreiben. Klicken Sie auf Verfügbare Variablen Link .. zum Beispiel <? Php echo $ row-> name; ?> Überprüfen Sie die Ausgabe der verfügbaren Variablen.
J Sinha
Ich habe meine Frage mit Bildern bearbeitet. Wenn Sie mir ein Beispiel geben könnten, wie ich das tun könnte, wäre ich Ihnen sehr dankbar.
0

Es tut mir leid, dass ich kein Drupal 7-Testfeld zur Hand habe, aber wenn es Ihnen nichts ausmacht, dass das Alter in Gruppen zusammengefasst wird, können Sie so etwas tun (Screenshots hier in Drupal 6), von dem ich annehme, dass es in Drupal 7 ziemlich gleich ist .

Zuerst weg, die Felder greifen Sie müssen in diesem Fall habe ich einen Inhaltstyp namens name_nick_agezusammen mit drei Feldern nna_name, nna_nickund nna_agedann eine Ansicht erstellt:

Geben Sie hier die Bildbeschreibung ein

In den Stileinstellungen für die Tabelle haben Sie standardmäßig Folgendes:

Geben Sie hier die Bildbeschreibung ein

Dass ich das geändert habe:

Geben Sie hier die Bildbeschreibung ein

Die einzige Änderung besteht darin, den Namen in die Spalte Nick zu setzen. Dies erstellte dann diese Tabelle:

Geben Sie hier die Bildbeschreibung ein

Sie erhalten Zugriff auf die Stileinstellungen, indem Sie auf das kleine Zahnrad rechts neben Stil: Tabelle klicken. Die Screenshots für Drupal 7 sind zwar unterschiedlich, aber ich wette, dass die Funktionalität dafür vorhanden ist.

Jimajamma
quelle
Hallo, danke für visuelle Infos. Ich habe diese Schritte bereits ausprobiert, wie Sie sagten, und das Ergebnis ist im 3. Bild. Ich habe erreicht, wie Sie sagten, aber meine Anforderung ist genau wie in Bild 4 (ich habe das Foto mit dem Editor erstellt), weil die Zeile sortierbar sein soll.
AH! Neue Informationen! Sie müssen in der Lage sein, die Kombination von Namen und Spitznamen in einer großen alphabetischen Liste zu sortieren? (Ich nehme an, Sie meinen Spalte nicht Zeile re: sort. Wenn falsch, lassen Sie mich wissen, was Sie meinen.)
Jimajamma
Ja, ich meine Spalte (wurde verwechselt). Ich meine, die Spalte, die sowohl Namen als auch Spitznamen in separaten Zeilen enthält, sollte sortierbar sein (wie die normale Spaltensortierung in Ansichten).
Bitte fügen Sie diese neuen Informationen zu Ihrer Frage hinzu, da dies die Komplexität erheblich erhöht, da es sich jetzt nicht mehr nur um ein Anzeigeproblem handelt.
Jimajamma
Ja, ich fühlte mich so, ich stecke seit letzter Woche wirklich darin fest.
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;
?>

Überprüfen Sie, ob die Ergebnisse angezeigt werden oder nicht.

J Sinha
quelle