Chcę programowo dodać obraz z zewnętrznego adresu URL, aby moduł przechowywał i wyświetlał lokalną kopię obrazu. Jak mogę to zrobić? Zwykle klikałbym przycisk „wybierz media” podczas tworzenia nowego węzła, ale chcę to zrobić za pomocą kodu.
To jest częściowa odpowiedź na twoje pytanie, ponieważ próbuję zrobić coś podobnego, ale z materiałem wideo.
Możesz utworzyć węzeł jako typ zawartości, zapisać potrzebny typ multimediów (przejrzyj kod multimediów dla odpowiedniego MIME / typu i funkcji, które musisz wywołać). Prawdopodobnie będziesz musiał ustawić pole zasobu multimedialnego i użyć selektora plików multimedialnych w polu typu.
Problem z tym, że przeglądarka pokazuje go w utworzonym węźle, nad którym obecnie pracuję.
Mając trochę dalej. Po zapisaniu pliku multimedialnego (za pomocą interfejsu API mediów) powiąż identyfikator pliku z identyfikatorem węzła za pomocą file_usage_add () . Prawdopodobnie konieczne będzie również powiązanie pliku w polu dodanym podczas tworzenia pola zasobu multimedialnego.
Upewnij się, że twój php.ini pozwala allow_url_fopen. Następnie możesz użyć czegoś takiego w swoim module:
Użyj funkcji file_get_contents () php
http://www.php.net/manual/en/function.file-get-contents.php
a następnie użyj funkcji file_save_data () interfejsu API Drupala
http://api.drupal.org/api/drupal/includes--file.inc/function/file_save_data/7
Powinieneś być w stanie wywołać go za pomocą i zapisać go w węźle itp.
Edytować:
Jak wskazano w komentarzach, możesz użyć funkcji system_retrieve_file Patrz: https://api.drupal.org/api/drupal/modules!system!system.module/function/system_retrieve_file/7
źródło
$file = system_retrieve_file('http://drupal.org/files/issues/druplicon_2.png', NULL, TRUE, FILE_EXISTS_RENAME);
Oto mój działający przykład.
źródło
system_retrieve_file()
a następnie zapisujesz go jako plik stałyFILE_STATUS_PERMANENT
? Nie widzę sensu twojej niestandardowej funkcji?To nie jest bezpośrednia odpowiedź, ale upewnij się, że wiesz już o module Filefield Sources , który robi to ogólnie dla obrazów. Może samodzielnie spełniać twoje potrzeby; Nie wiem, czy przydaje się to w Media.
źródło
Jako dodatek do @tecjam odpowiedź: powinieneś użyć drupal_http_request () zamiast file_get_contents () , daje to większą kontrolę nad procesem. Ale w sumie ta metoda działa zgodnie z oczekiwaniami.
źródło
źródło
system_retrieve_file()
(co to wszystko dla Ciebie i pozwala uniknąć problemów z serwerami, którefile_get_contents()
nie są dostępne)?