Umschließen einer gerenderten Datei von Media mit einem Link

7

Dies ist eine Frage im Zusammenhang mit dem Festlegen von Medienstilen in Media 7.1.2 / Media 7.2.X. .

Ich verwende Media 1.2 auf einer Drupal 7-Site, um Bilder mit einigen Feldern zu versehen (Bildunterschrift, Gutschrift usw.).

Wenn ich ein Bildfeld eingerichtet habe, das als gerenderte Datei mit einem bestimmten Ansichtsmodus angezeigt wird , z

Geben Sie hier die Bildbeschreibung ein

Ich habe mein Display so eingerichtet, dass ich die richtigen Felder für diesen Ansichtsmodus anzeigen möchte. In der Dateianzeige, z

Geben Sie hier die Bildbeschreibung ein

Gibt es eine Möglichkeit, das Bild in einen Link zur Medien- / FID-Seite zu verpacken? Ich sehe nicht, wie das über die Benutzeroberfläche gemacht wird, und Theme Developer gibt mir keine nützlichen Informationen darüber, welche Theme-Funktionen und Vorverarbeitungs- / Prozessfunktionen zwischen denen für das gesamte Bildfeld (in Bezug auf den Inhaltstyp) aufgerufen werden betroffen ist) und das Bild selbst (das eigentliche <img /> -Element).

An dieser Stelle möchte ich nicht zu Field Collection wechseln, würde aber den Wechsel zu Media 2.x in Betracht ziehen, wenn dies meine einzige Option ist.

mpdonadio
quelle
1
Hast du darüber nachgedacht zu verwenden hook_field_attach_view_alter()?
Kiamlaluno
Ich bin nicht besonders vertraut mit diesem Haken, aber ich habe nicht gesehen, wie das funktionieren würde.
mpdonadio
Der Zweck besteht darin, die Art und Weise zu ändern, in der ein Feld gerendert wird. Es wird aufgerufen, wenn field_attach_view () oder field_view_field () aufgerufen wird. Mit diesem Hook sollten Sie in der Lage sein, die Darstellung des Bildfelds zu ändern.
Kiamlaluno
Was passiert, wenn Sie in den Anzeigen Aktiviert auch Gerenderte Datei auswählen ?
Kiamlaluno
Dieser Anzeigemodus ist ein Symbol + Link zur Originaldatei. Das Problem besteht darin, herauszufinden, wer das Thema ('image_style') für die von mir skizzierten Optionen aufruft, aber ich kann dies nicht herausfinden. Meine nächste Option ist, einen MYTHEME_image_style zu erstellen, damit ich anfangen kann, Call Stacks zu betrachten. Freude.
mpdonadio

Antworten:

1

Wie bereits erwähnt, rendert Media Felder über den Formatierungsmechanismus für die Feldanzeige von Drupal. Ihr benutzerdefiniertes Modul wird funktionieren, aber es gibt eines dafür: Verknüpftes Feld

Mohammad Ali Akbari
quelle
1
Dies scheint eine bessere Option zu sein, aber es explodiert immer wieder auf dieser bestimmten Site. Ich muss dies in eine meiner Testseiten einarbeiten und sehen, wie es geht.
mpdonadio
4

OK, hier ist der Arbeitscode.

Das Medienmodul implementiert hook_file_formatter_info()das Einrichten eines Rückrufs zum Rendern von Bildern.

Wie bei Drupal gibt es eine Möglichkeit hook_file_formatter_info_alter(), das Standardverhalten zu ändern. Also habe ich den Standardrückruf von file_entity.module übernommen und in ein benutzerdefiniertes Modul geklont. Ich habe das dann mit dem Altar verkabelt. Mein benutzerdefinierter Rückruf verfügt über eine zusätzliche Logik, um nach einem Bildstil zu suchen und das Element dann mit einem Link zu versehen.

Die einzige wirkliche Besonderheit ist, dass die Standardimplementierung von theme_link()davon ausgeht, dass es sich um ein Blattelement handelt. Sie müssen also zuerst das Bildelement rendern.

Nebenbei bemerkt, auf diese Weise erhalten Sie auch Alt- / Titeltext auf die Bilder, der standardmäßig fehlt.

function MYMODULE_file_formatter_info_alter(&$info) {
  if (!empty($info['file_image'])) {
    $info['file_image']['view callback'] = 'MYMODULE_file_formatter_file_image_view';
  }
}

function MYMODULE_file_formatter_file_image_view($file, $display, $langcode) {
  // Prevent PHP notices when trying to read empty files.
  // @see http://drupal.org/node/681042
  if (!$file->filesize) {
    return;
  }

  // Do not bother proceeding if this file does not have an image mime type.
  if (strpos($file->filemime, 'image/') !== 0) {
    return;
  }

  if (file_entity_file_is_local($file) && $image = image_load($file->uri)) {
    if (!empty($display['settings']['image_style'])) {
      $element = array(
        '#theme' => 'image_style',
        '#style_name' => $display['settings']['image_style'],
        '#path' => $file->uri,
        '#width' => $image->info['width'],
        '#height' => $image->info['height'],
      );
      if ($display['settings']['image_style'] == 'MYSTYLE') {
        $element = array(
          '#theme' => 'link',
          '#text' => drupal_render($element),
          '#path' => 'media/' . $file->fid,
          '#options' => array(
            'attributes' => array(),
            'html' => TRUE,
          ),
        );
      }
      else {
      }
    }
    else {
      $element = array(
        '#theme' => 'image',
        '#path' => $file->uri,
        '#width' => $image->info['width'],
        '#height' => $image->info['height'],
      );
    }
    return $element;
  }
}
mpdonadio
quelle
In dem Projekt arbeite ich daran, Bilder bei jedem Aufruf zu laden, was image_loadzu großen Leistungsproblemen führt. Wenn Sie sich die Standardimplementierung von ansehen file_entity_file_formatter_file_image_view, werden Sie feststellen, dass Sie Bildgrößen mit $file->image_dimensionsArray by widthund heightSchlüsseln erhalten können.
iamweird