Wie erhalte ich den Datei-URI von einem EntityMetadataWrapper-Objekt?

11

Das Abrufen von Dateiobjekten, die sich auf Knoten beziehen, über ein Feld ist einfach mit EntityMetadataWrapper:

$wrapper = entity_metadata_wrapper('node', $node);
$images = $wrapper->field_images;

Das ist großartig. Ich möchte jedoch einige der Eigenschaften des Standarddateiobjekts verwenden, die jedoch nicht verfügbar sind. Wenn ich mir die Eigenschaften ansehe, die bei $images[0]->fileVerwendung des obigen Codes verfügbar sind, sehe ich Folgendes:

  • fid
  • Name
  • Mime
  • Größe
  • URL
  • Zeitstempel
  • Inhaber

Vor allem urifehlt, und an seiner Stelle gibt es eine urlEigenschaft, die die vollständige externe URL zur Bilddatei ist. Ich möchte diese Bilder über ihre URI bearbeiten (Daumen erstellen usw.), also mache ich Folgendes:

$fid = $images[0]->file->fid->value();
$uri = file_load($fid)->uri;

Das scheint den ganzen Sinn der Verwendung von a EntityMetadataWrapperin erster Linie zu negieren .

Was vermisse ich? Wo befindet sich der URI für das umschlossene Dateiobjekt? Wenn es nicht verfügbar ist, aus Liebe zu allen guten und reinen Dingen, warum nicht?!

Ich bin mir bewusst, dass ich die URL wieder in eine URI dekonstruieren könnte, aber das fühlt sich auch sehr unnötig an.

Clive
quelle
1
Verwenden Sie file_entity?
mpdonadio
@MPD Ahhhh, toller Anruf, nein, ich bin nicht ... Vielleicht sollte ich nicht erwarten zu sehen, was ich als "Eigenschaften" betrachten würde, wenn sich das Objekt nicht wie eine Entität verhält. Die URL scheint jedoch eine seltsame Wahl anstelle der URI zu sein, die die Entity-Modul-Leute gewählt haben. Wenn die Antwort lautet "Sie müssen implementieren hook_entity_property_info_alter()", dann ist das in Ordnung, wollte nur wissen
Clive
Ich bin mir eigentlich nicht sicher, ob das einen Unterschied machen wird, aber wenn dieses Modul aktiviert ist, kommt es hier und da zu subtilen Unterschieden. Ich habe festgestellt, dass die Dateiintegration mit EMW an anderen Stellen etwas mangelhaft ist, habe mich aber nicht genug darum gekümmert, einen Patch einzureichen.
mpdonadio
@MPD Ich denke, es wird - ich habe gerade herausgefunden, dass der "Täter" ist entity_metadata_system_entity_property_info(), wo eine Reihe neuer Eigenschaften angeheftet werden $info['file']['properties']. Ich bin bereit zu wetten, wenn file_entity dort wäre, dass das Array bereits die Entitätseigenschaften selbst darin hätte. Ich werde versuchen, später oder morgen eine Antwort zu schreiben, wenn es noch niemand getan hat
Clive
1
Habe einen kurzen Test gemacht und uriist dort mit file_entity.
mpdonadio

Antworten:

9

Vielen Dank an MPD, dass sie mich in die richtige Richtung gelenkt haben. Kurz gesagt, ohne das Dateieinheitsmodul sind Dateien keine Entitäten, daher haben sie natürlich nicht die 'Eigenschaften', die ich erwartet hatte.

Das Entitätsmodul stellt einige für sie bereit, aber URI gehört nicht dazu. Glücklicherweise ist es sehr einfach, es mithilfe hook_entity_property_info_alter()eines benutzerdefinierten Eigenschaftsrückrufs verfügbar zu machen :

function MYMODULE_entity_property_info_alter(&$info) {
  $info['file']['properties']['uri'] = array(
    'label' => t("URI"),
    'description' => t("The URI of the file."),
    'getter callback' => 'MYMODULE_entity_get_file_properties',
    'schema field' => 'uri',
  );
}

function MYMODULE_entity_get_file_properties($file, array $options, $name) {
  switch ($name) {
    case 'uri':
      return $file->uri;
      break;
  }
}

Danach $images[0]->file->uri->value()ist wie erwartet verfügbar.

Clive
quelle
8

Unten funktioniert ohne den Hack:

 $node_wrapper->field_media[0]->value()['uri'];
duru
quelle
2
Es ist gut darauf hinzuweisen, dass dies ab PHP 5.4 unterstützt wird.
Ales Rebec
3

Dies ist, was für mich funktioniert, um den vollständigen Pfad eines einzelnen Bildes zu erhalten ...

// wrap it
$wrapper = entity_metadata_wrapper('node', node_load(16));
// get the value
$image = $wrapper->field_image->value();
// check it
if ($image) {
   // get the full path
   $path = file_create_url($image['uri']);
}
print_r($path);

Alternative...

  $image = $wrapper->field_image->value();
  $image_path = $image ? file_create_url($image['uri']) : '';
chim
quelle