caching - 更新: Updating manifest cache version and date in SilverStripe on upload

标签 caching silverstripe cache-manifest

我正在尝试将新图像文件动态附加到 SilverStripe 站点的缓存 list 文件中。我有一个函数的开头,该函数当前保存我需要缓存的所有当前文件:

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 管理中心上传的新图像文件附加到 $static 变量。不过,我需要以某种方式构建图像标签,因为图像是从 YouTube 缩略图中提取的。我有一个名为 VideoLinkIDs 的管理模型,其中有一个名为 VideoID 的字段,它采用 Youtube 视频 ID。我需要以某种方式找到一种方法来使用这种图像标签设置构建图像列表:

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

我已经成功地在这方面取得了一些进展(最终),这就是我所取得的:我创建了一个 CacheManifest 类,它将保存当前日期和版本号变量(这些变量将用于更新版本)以及上面 UpdateManifest 函数中 $static 变量内的日期)。

<?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();
    }
}

然后,在 VideoLinkID 的 onAfterWrite() 方法的类文件中调用此 updateCache 函数,以便每次将新的视频 ID 保存在该方法中时都会更新数据库。管理员:

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

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

我想要对 updateCache 执行的操作是,每次添加新的视频 ID 时,将 VersionNumber 加 1(使用 SilverStripe 语法,我对如何执行该部分感到有点困惑) 。我不想每次上传视频时都向 CacheManifest 表添加新条目 - 我只想不断更新第一个条目。

编辑:CMS 和 YouTube 视频 ID 之间的关系是这样的:页面模板类型有一个名为“视频 ID”的选项卡,内容管理员可以在其中粘贴任意数量的 YouTube 视频 ID。然后使用这些 ID 来获取 YouTube 视频预览缩略图。这些缩略图显示在图库弹出模式中,供用户查看并单击以查看完整长度的视频。

该网站将需要一个缓存 list 文件,以确保用户在查看图库时至少仍然能够查看 YouTube 预览缩略图。维护缓存 list 的标准方法是手动更新它,这并不理想,因为开发人员需要不断更新网站的缓存 list ,因为内容管理器会在 YouTube 视频 ID 中添加内容(不知道如何任何时候都会有很多 YouTube 视频 ID)

在这种情况下,动态缓存 list 文件将非常有用,它可以使用添加到 CMS 中页面模板的每个视频 ID 来更新日期和版本号。因此存在 CacheManifest 数据对象类。此类在 updateCache() 函数中存储当前日期和一个 int 值。应以某种方式在 VideoLinkID 类的 onAfterWrite() 中调用此函数。

这都不是我的想法,它是由另一位开发人员制定的,这似乎是我必须遵循的。老实说,我宁愿找到一种更好的方法,但我还没有找到任何被认可的方法,而且我认识的其他人也没有找到任何被认可的方法。这都是全新的,绝对不是常态。

最佳答案

以下是如何实现类似功能的示例。

存储视频哈希值的视频对象

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

使用缓存 list 的模板,/themes/simples/templates/GalleryPage.ss

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

缓存 list 页面

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

模板文件: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:
*

关于caching - 更新: Updating manifest cache version and date in SilverStripe on upload,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36093607/

相关文章:

python - 将 'object' 添加到带有到期计时器的堆栈中,并在到期时收到通知

c# - 根据在数据库中找到的日期修改输出缓存

php - CSS <link> href 丢失前导斜杠,利用 SilverStripe

php - 银条3.1 : Link to page of data object from inside loop

manifest - 我的 HTML5 应用程序缓存 list 正在缓存所有内容

c# - HTML 5 list 无法通过 iFrame 正常工作

caching - 为什么MESI协议(protocol)需要Exclusive状态

SilverStripe 网格字段扩展重新排序后的 JavaScript 回调?

html - 如何在 HTML5 应用程序缓存中缓存多个包含页面特定图像和共享资源的 HTML 页面?

c# - 全局缓存对象不断添加项目