更新:在上传

时间:2016-03-18 20:23:47

标签: caching silverstripe cache-manifest

我正在努力尝试将新图像文件动态附加到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管理员上传的新图像文件附加到$ static变量。我需要以某种方式构建图像标签,因为图像是从Youtube缩略图中提取的。我有一个名为VideoLinkIDs的管理模型,它有一个名为VideoID的字段,它接受Youtube视频ID。我需要以某种方式找到一种方法来建立一个图像列表与这种图像标签设置:

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

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

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

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

每次添加新的视频ID时,我想用updateCache做的是将VersionNumber增加1(使用SilverStripe语法,我对如何做这部分感到有点困惑)。我每次上传视频时都不想在CacheManifest表中添加新条目 - 我只想继续更新第一个条目。

编辑:CMS和youtube视频ID之间的关系如下:页面模板类型有一个名为“视频ID”的标签,内容管理员可以粘贴任意数量的YouTube视频ID。然后使用这些ID来获取youtube视频预览缩略图。这些缩略图以图库弹出模式显示,供用户查看和点击查看全长视频。

此网站需要一个缓存清单文件,以确保用户在查看图库时仍能查看youtube预览缩略图。看看维护缓存清单的标准方法是如何手动更新它,这不是理想的,因为开发人员需要不断更新网站的缓存清单,因为内容管理器在youtube视频ID中添加(不知道如何许多youtube视频ID将始终存在)

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

这不是我的想法,它是由另一位开发人员制定的,这似乎是我必须要做的。说实话,我宁愿找到一个更好的方法,但我没有找到任何已被批准的东西,也没有其他人知道的。这一切都很新,绝对不是常态。

1 个答案:

答案 0 :(得分: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' );
    }
}

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