2016-03-18 7 views
2

Я работаю над попыткой динамического добавления новых файлов изображений в файл манифеста кэша для сайта SilverStripe. У меня есть начало функции, которая в настоящее время проводит все текущие файлы мне нужно кэшированные:ОБНОВЛЕНИЕ: Обновление версии кеша манифеста и даты в SilverStripe при загрузке

class HomePage_Controller extends ContentController { 

private static $allowed_actions = array (
    "UpdateManifest" 
); 

public function UpdateManifest() { 

     $static = <<<EOT 
CACHE MANIFEST 
#$ManifestDate $ManifestVersion 
#all javascript/jquery files currently added 

#css files currently added 

#image files currently added 
EOT; 

     $static = $static . "\n" . "/test.html"; 
     $this->response->addHeader("Content-type", "text/cache-manifest"); 
     return $static; 
    } 
} 

Я хочу, чтобы добавить новые файлы изображений, загруженных в админ SilverStripe к статической переменной $. Мне нужно создать теги изображений определенным образом, хотя, поскольку изображения вытягиваются из миниатюр Youtube. У меня есть модель администратора под названием VideoLinkID, у которой есть поле под названием VideoID, которое принимает идентификатор видео Youtube. Мне нужно каким-то образом найти способ, чтобы построить из списка изображений с такого рода установки изображения метки:

<img class='vidThumb' src='http://img.youtube.com/vi/".VideoID."/0.jpg /> 

мне удалось добиться определенного прогресса с этим (в конце концов), и вот что у меня есть: я создал класс CacheManifest, который будет удерживать текущую дату и переменные номера версии (они будут использоваться для обновления версии и даты внутри переменной $static в функции UpdateManifest сверху).

<?php 

class CacheManifest extends DataObject { 

    private static $db = array(
     'CurrentDate' => 'Date', 
     'VersionNumber' => 'int' 
    ); 

    private static $summary_fields = array(
     'ID' => 'ID', 
     'CurrentDate' => 'Current Date', 
     'VersionNumber' => 'Version Number' 
    ); 

    public function updateCache(){ 
     $currentDate = SS_Datetime::now(); 
     $versionNumber = 1; 

     $this->CurrentDate = $currentDate; 
     $this->VersionNumber = //increment the value currently stored in the database 

     $this->write(); 
    } 
} 

Эта updateCache функция затем вызывается в файле класса для onAfterWrite() метода VideoLinkID, так что база данных обновляется каждый раз, когда новый идентификатор видео сохраняется в админ:

public function onAfterWrite(){ 
    $updateGallery = parent::getCMSFields(); 

    //get the entry from the CacheManifest database 
    CacheManifest::get()->(get VersionNumber and CurrentDate from database?) 
    return $updateGallery; 
} 

Что я хочу делать с updateCache - увеличивать VersionNumber на 1 каждый раз, когда добавляется новый идентификатор видео (с синтаксисом SilverStripe, я немного запутался в том, как сделать эту часть). Я не хочу добавлять новую запись в таблицу CacheManifest каждый раз, когда я загружаю видео - я просто хочу обновить первую запись.

EDIT: Связь между CMS и идентификаторами видеоизображений в YouTube: Тип шаблона страницы содержит вкладку «Идентификаторы видео», в которой менеджер содержимого может вставлять любое количество идентификаторов видео YouTube. Эти идентификаторы затем используются, чтобы захватить миниатюры предварительного просмотра видео в YouTube. Эти миниатюры отображаются во всплывающем окне галереи, чтобы пользователи могли видеть и нажимать, чтобы просмотреть полноразмерные видеоролики.

На этом сайте понадобится файл манифеста кэша, чтобы гарантировать, что пользователи, по крайней мере, смогут просматривать миниатюры предварительного просмотра youtube при просмотре галереи. Поскольку стандартным методом поддержки манифеста кэша является его обновление вручную, это было бы нецелесообразно, так как разработчику необходимо было постоянно обновлять манифест кэша сайта, поскольку контент-менеджер добавляет в YouTube идентификаторы видео (не знаю, как многие идентификаторы видео на YouTube будут всегда)

Файл манифеста динамического кэша был бы очень полезен в этом случае, что бы обновить дату и номер версии с каждым идентификатором видео, добавленным в шаблон страницы в CMS. Следовательно, существование класса объектов данных CacheManifest. Этот класс хранит текущую дату и int внутри функции updateCache(). Эта функция должна каким-то образом вызываться в onAfterWrite() в классе VideoLinkID.

Ничто из этого не было моей идеей, оно было сформулировано другим разработчиком, и, похоже, это то, с чем мне нужно идти. Честно говоря, я предпочел бы найти лучший способ, но я не нашел ничего, что было одобрено, и никто другой, кого я знаю, тоже. Все это совершенно новое и определенно не норма.

+0

Родственные? http://stackoverflow.com/questions/36084893/dynamically-update-manifest-file-based-on-image-uploads-in-silverstripe-admin –

+0

Связанный, но немного более углубленный –

+0

другой связанный с ним вопрос: http: /stackoverflow.com/questions/36186948/calling-to-data-object-function-on-upload-silverstripe –

ответ

2

Вот пример того, как вы можете реализовать нечто подобное.

Video объекта, который хранит видео хэш

class GalleryVideo extends DataObject { 
    private static $db = array(
     'Name' => 'Varchar(255)', 
     'VideoHash' => 'Varchar(16)' 
    ); 

    public function getThumbLink() { 
     return 'http://img.youtube.com/vi/' . $this->VideoHash . '/0.jpg'; 
    } 
} 

шаблона, который использует кэш-манифест, /themes/simples/templates/GalleryPage.ss

<html manifest="gallery-appcache"> 
... 
</html> 

Cache манифест страница

class GalleryCacheManifest extends SiteTree { 
    private static $db = array(
     'Version' => 'Int', 
    ); 

    private static $has_many = array(
     'Videos' => 'GalleryVideo', 
    ); 

    public functon getCMSFields() { 
     $fields = parent::getCMSFields(); 
     $fields->addFieldToTab('Root.Main', NumericField::create('Version')); 
     $fields->addFieldToTab('Root.Main', TextField::create('Content', 'Cached files')->setRows(20)); 
     $fields->addFieldToTab('Root.Videos', GridField::create('Videos')); 
     return $fields; 
    } 

    // Override actions to Save & Publish always. 
    public function getCMSActions() { 
     $actions = parent::getCMSActions(); 
     $actions->removeByName('action_save'); 
     return $actions; 
    } 

    public functon requireDefaultRecord() { 
     if (0 < Versioned::get_by_stage('GalleryCacheManifest', 'Stage')->count()) { 
      return; 
     } 

     $page = new GalleryCacheManifest(); 
     $page->Title = 'gallery-appcache'; 
     // URL in the http request is split into segments, and extension does not count, so gallery.appcache is wrong 
     $page->URLSegment = 'gallery-appcache'; 
     $page->ShowInMenus = false; 
     $page->ShowInSearch = false; 
     $page->AuthorID = 1; // Default Admin 
     $page->write(); 

     $page->publish('Stage', 'Live'); 
     $page->flushCache(); 
     DB::alteration_message('GalleryCacheManifest created', 'created'); 

    } 

    public functon canCreate($member = null) { 
     return 0 === Versioned::get_by_stage('GalleryCacheManifest', 'Stage')->count(); 
    } 

    public function canDelete($member = null) { 
     return false; 
    } 
} 

class GalleryCacheManifest_Controller extends ContentController { 
    public functon index(SS_HTTPRequest $request) { 
     $this->getResponse()->addHeader('Content-Type', 'text/cache-manifest'); 
    } 
} 

Файл шаблона: темы/простые/шаблоны/GalleryCacheManifest.ss:

CACHE MANIFEST 
# $LastEdited.Format('Y-m-d'):$Version 

CACHE: 
$Content 
<% if $Videos.Count %> 
<% loop $Videos %> 
$ThumbLink 
<% end_loop %> 
<% end_if %> 

NETWORK: 
*