it-swarm.com.de

Übergeben eines Arguments von der URL im Bedienfeld an das Ansichtsfenster oder den Block

Ich habe eine Seite, auf der ich alle Ressourcen für einen Kurs anzeigen möchte, der nach Taxonomiebegriff gruppiert ist. Die Kurse sind organische Gruppen und die Ressourcen sind Materialien, die zu diesen Gruppen gehören. Ich verwende Panels, um den Inhalt anzuzeigen, und überschreibe dafür view_node. Ich habe bereits einen Ansichtsbereich erstellt, in dem alle verschiedenen Ressourcenkategorien aufgelistet sind, und ich versuche jetzt, alle Ressourcen für eine Kategorie aufzulisten.

Das Panel verwendet die folgende URL-Struktur:

kurs/Kursname/Ressourcen/Ressourcentaxonomie-Begriff

So habe ich zum Beispiel eine URL

/ kurs/testkurs/ressourcen/transport

Ich möchte dann alle Ressourcen anzeigen, die zum Taxonomiebegriff "Transport" gehören. Ich denke also, das URL-Argument, das ich übergeben möchte, ist% 4.

Ich habe seit über einem Tag versucht, verschiedene Methoden zu verwenden, um das URL-Argument ohne Erfolg an die Ansicht zu übergeben. Ich habe versucht, die Ergebnisse in einem Ansichtsbereich sowie einen Ansichtsblock anzuzeigen, und verschiedene Methoden untersucht, um das Argument ohne Erfolg weiterzugeben. Es funktioniert gut in der Ansicht selbst, aber wenn ich es in das Panel lege, funktioniert es nicht. Kann mir jemand zeigen, wie ich das machen kann?

Ich verwende D7.18, ctools 7.x-1.0-rc1, Panels 7.x-3.0 und Ansichten 7.x-3.7.

5
Ben

Ich habe es geschafft, dieses Problem zu lösen. Die Lösung ist nicht genau das, was ich mir erhofft hatte, aber sie funktioniert.

Zuerst habe ich das URL-Argument geändert, um die Begriffs-ID anstelle des Begriffsnamens im Bedienfeld zu verwenden. Dann habe ich im Ansichtsbereich anstelle von "Taxonomiebegriff-ID von URL" im Abschnitt "Standardargument bereitstellen" der Kontexteinstellungen "Rohwert von URL" verwendet und die Pfadkomponente angegeben. Ich musste auch eine grundlegende Validierung einrichten, um den Begriff ID zu verwenden.

Es würde mich immer noch interessieren zu hören, ob es eine bessere Möglichkeit gibt, dies zu tun, bei der es möglich wäre, den Begriff Name in der URL anstelle der ID zu verwenden.

2
Ben

Beispielszenario:

Es gibt ein Fenster mit dem Inhaltsbereich anzeigen.

Panel-URL:/panel_url

Beispiel mit Argument:/panel_url/term_name

Mit BEF :/panel_url? Category = 123

So richten Sie ein (vorhandenes Bedienfeld und hinzugefügter Inhaltsbereich):

  1. Fügen Sie der Ansicht einen Kontextfilter hinzu. Zum Beispiel: Zeigt den Namen der Kontextfilter-Taxonomie an
  2. Ändern Sie die Einstellungen unter "Ansicht -> Fenstereinstellungen -> Argumenteingabe", um das Argument "Vom Bedienfeldargument" zu laden (z. B. Erste).

Erledigt.


Wenn Sie Better Exposed Filters verwenden, können Sie außerdem die folgenden Verbesserungen vornehmen.

So legen Sie den aktuell aktiven Link basierend auf dem Argument fest (wenn Sie select_as_links verwenden):

/**
 * Implements hook_preprocess_[themeFunctionName]().
 */
function foo_preprocess_select_as_links(&$variables) {
  $options = isset($variables['element']['#options']) ? array_change_key_case(array_flip($variables['element']['#options']), CASE_LOWER) : array();
  $selected = end((arg()));
  if (array_key_exists($selected, $options)) {
    $variables['element']['#value'] = $options[$selected];
  }
}

So legen Sie den aktuell aktiven Link basierend auf dem Argument fest (wenn Sie select verwenden):

/**
 * Implements hook_preprocess_[themeFunctionName]().
 */
function foo_preprocess_select(&$variables) {
  switch (arg(0)) {
    case 'panel_url':
      if (@$variables['element']['#name'] == 'category') {
        $options = isset($variables['element']['#options']) ? array_change_key_case(array_flip($variables['element']['#options']), CASE_LOWER) : array();
        $selected = end((arg()));
        if (array_key_exists($selected, $options)) {
          if ($variables['element']['#value'] <> $options[$selected]) {
            $variables['element']['#value'] = $options[$selected];
          } else {
            // drupal_goto('panel_url');
          }
        }
      }
    break;
  }
}

Um die Links SEO-freundlich zu gestalten, können Sie Folgendes ausprobieren:

/**
 * Implements hook_url_inbound_alter().
 */
function foo_url_outbound_alter(&$path, &$options, $original_path){
  if (arg(0) == 'panel_url') {
    // Convert URL like: /panel_url?category=29 into /panel_url/term_name (SEO friendly)
    $path_info = parse_url($path);
    switch (@$path_info['path']) {
      case 'panel_url/term_name':
      case 'panel_url/term_name2':
        $path = 'panel_url/all'; // Convert loopy urls into base url
    }
    if (strpos($path, '?category=') !== FALSE) { // Convert term id into human name
      list(, $tid) = explode('=', current(explode('&', $path_info['query']))); // get tid from URL
      $term_name = strtolower(taxonomy_term_load((int)$tid)->name);
      $path = '/panel_url' . '/' . $term_name; // See also: $path_info['path']
    }
  }
}
3
kenorb

Mein Problem damit, das Argument zu bestehen, war darauf zurückzuführen, dass ich Panels/Seiten nicht genug verstanden habe. Ich habe fälschlicherweise einen Knoten (aus dem grundlegenden Seiteninhaltstyp) erstellt, in der Erwartung, dass ich ihn in Panels bearbeiten könnte, um das Argument zu senden. Das Hinzufügen eines Arguments im URL-Pfad führte immer dazu, dass die Seite nicht gefunden wurde.

Später wurde mir klar, dass ich zu Struktur> Seiten> Benutzerdefinierte Seite hinzufügen und dann zur Ansicht des Inhaltsbereichs hinzufügen musste, um das Argument effektiv zu übergeben. Außerdem muss sichergestellt werden, dass in der Ansicht des Inhaltsbereichs die Argumenteingabe korrekt festgelegt wurde, bevor sie auf der benutzerdefinierten Seite gefunden werden konnte.

Ich habe beim Lesen dieses Tutorials festgestellt, wo ich falsch gelaufen bin: http://www.metaltoad.com/blog/passing-page-arguments-view-panes

0
vrwired

Erstellen Sie in Ihrem Ansichtsbereich eine Beziehung zum Taxonomiebegriff. Sobald Sie dies getan haben, erstellen Sie einen Kontextfilter basierend auf dieser Beziehung, um den Begriffsnamen zu übergeben. Stellen Sie den Filter so ein, dass er das rohe URL-Argument akzeptiert, legen Sie die Artikelnummer im Pfad fest und das tut es.

0
user140