2016-03-18 15 views
2

SilverStripeサイトのキャッシュマニフェストファイルに新しい画像ファイルを動的に追加しようとしています。私は$静的変数にSilverStripe adminにアップロードされた新しいイメージファイルを追加したい更新:アップロード時に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; 
    } 
} 

:私は現在、私はキャッシュさを必要とする現在のすべてのファイルを保持している機能の始まりを持っています。私は画像がYoutubeサムネイルから引き出されているので、特定の方法で画像タグを構築する必要があります。 VideoLinkIDsという管理者モデルがあります.YouTubeのビデオIDを取得するVideoIDというフィールドがあります。私は何とか画像タグのセットアップのこの種で、画像のリストを構築するための方法を見つける必要があります:私は(最終的に)これでいくつかの進歩を遂げるために管理している

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

を、ここで私が持っているものです。私は現在の日付とバージョン番号の変数を保持するCacheManifestクラスを作成しました(これは、上記のUpdateManifest関数の変数$static内のバージョンと日付を更新するために使用されます)。

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

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

は、私が欲しいもの:データベースが新しい動画IDはadminに保存されるたびに更新されるように

<?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機能は、その後VideoLinkIDのonAfterWrite()メソッドのクラスファイルで呼び出されますupdateCacheは、新しいビデオIDが追加されるたびに、VersionNumberを1ずつインクリメントします(SilverStripe構文では、その部分を行う方法が少し分かりません)。ビデオをアップロードするたびにCacheManifestテーブルに新しいエントリを追加する必要はありません。最初のエントリを更新しておきたいだけです。

編集:CMSとYouTube動画IDの関係は次のとおりです。ページテンプレートタイプには「動画ID」というタブがあり、コンテンツマネージャーで任意の数のYouTube動画IDを貼り付けることができます。これらのIDは、YouTubeのビデオプレビューサムネイルを取得するために使用されます。これらのサムネイルは、ギャラリーのポップアップモーダルで表示され、ユーザーが見ることができ、全編のビデオを見ることができます。

このサイトでは、最低でもギャラリーを表示してもYouTubeプレビューサムネイルを表示できるようにするため、キャッシュマニフェストファイルが必要になります。キャッシュマニフェストを管理する標準的な方法を手動で更新する方法を見てみると、コンテンツマネージャがYouTubeのビデオIDを追加するときに、開発者がサイトのキャッシュマニフェストを常に更新し続ける必要があるため、これは理想的ではありません。

ダイナミックキャッシュマニフェストファイルは、この場合、CMSのページテンプレートに追加された各ビデオIDで日付とバージョン番号を更新するものとして非常に便利です。したがって、CacheManifestデータ・オブジェクト・クラスの存在。このクラスは、現在の日付とintをupdateCache()関数内に格納します。この関数は、VideoLinkIDクラスのonAfterWrite()で何とか呼び出される必要があります。

これは私の考えではなく、別の開発者によって策定されたもので、これは私が行なわなければならないものです。正直言って、私はむしろより良い方法を見つけるだろうが、私は承認されたものは見つけられておらず、私が知っている人もいません。これは全く新しいものであり、間違いなく規範ではありません。

+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

ここでは、類似の方法を実装する方法の例を示します。ビデオは

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> 

キャッシュマニフェストページ

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'); 
    } 
} 

をハッシュ格納

Videoオブジェクトテンプレートファイル:themes/simple/templates/GalleryCacheManifest.ss:

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

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

NETWORK: 
* 
関連する問題