Silverstripe - 覆盖Image.php - 可能性?

时间:2018-01-24 15:09:10

标签: php silverstripe

每当Silverstripe从图像创建调整大小的版本时,系统也会生成此图像的webp版本。 通过.htaccess我可以使用Chrome浏览器将用户转发给此webp image

到目前为止,我的想法是扩展image.php类,问题是,扩展无法覆盖现有方法。

当我从模板中调用$Image.setWidth(200)时,有什么方法可以做某些事情,以便我可以执行此操作,我的函数将会运行吗?

我的目标仍然是防止更改所有可行的方法名称。 $Image.webpSetWidth(200)可以使用正常的图片扩展功能。但如果可能的话,我会避免这种情况。

检查了Image.php(和GD.php)是否有可能扩展它,但至少在Silverstripe 3.6中是不可能的。

非常欢迎任何提示。

更新

感谢布雷特的暗示,我指出了正确的方向。

`

class WebPGDBackend extends GDBackend
{
    public function writeTo($filename)
    {
        parent::writeTo($filename);

        if (function_exists('imagewebp')) {
            $picname = pathinfo($filename, PATHINFO_FILENAME);
            $directory = pathinfo($filename, PATHINFO_DIRNAME);

            list($width, $height, $type, $attr) = getimagesize($filename);
            switch ($type) {
                        case 2:
                            if (function_exists('imagecreatefromjpeg')) {
                                $img = imagecreatefromjpeg($filename);
                                $webp = imagewebp($img, $directory.'/'.$picname.'.webp');
                                $gif = imagegif($img, $directory.'/'.$picname.'.gif');
                            }
                            break;
                        case 3:
                            if (function_exists('imagecreatefrompng')) {
                                $img = imagecreatefrompng($filename);
                                imagesavealpha($img, true); // save alphablending setting (important)
                                $webp = imagewebp($img, $directory.'/'.$picname.'.webp');
                            }
            }
        }
    }
}

`

每当保存已调整大小的图像(以jp(e)g / png格式)时,这将创建一个webp副本。 为了使其正常工作,必须使用适当的标志编译gdlib。 此外,您必须通过以下方法将类添加到config.php中 Image::set_backend("WebPGDBackend");

请记住,这将立即适用于新调整大小的图形。

通过上述内容,可以将.htaccess配置为向了解webp新浏览器的浏览器转发jpeg / png请求。

我通过以下代码段意识到了这一点:

<IfModule mod_rewrite.c>
RewriteEngine On

# Check if browser support WebP images
RewriteCond %{HTTP_ACCEPT} image/webp

# Check if WebP replacement image exists
RewriteCond %{DOCUMENT_ROOT}/$1.webp -f

# Serve WebP image instead
RewriteRule (assets.+)\.(jpe?g|png)$ $1.webp [T=image/webp,E=accept:1]
</IfModule>

<IfModule mod_headers.c>
Header append Vary Accept env=REDIRECT_accept
</IfModule>

<IfModule mod_mime.c>
AddType image/webp .webp
</IfModule>

1 个答案:

答案 0 :(得分:0)

我不确定SS 3.6是否具有生成此功能的开箱即用功能,但您可以使用ImagickBackend并通过扩展来修改它。

E.g。

<?php

if(class_exists('Imagick')) { 
class MyImagickBackend extends ImagickBackend {

    // default format to use
    private static $format = 'webp';

    public function __construct($filename = null) {
        parent::__construct($filename);
        $this->setImageFormat( Config::inst()->get('MyImagickBackend','format') );
    }
}

然后在_config.php中,您只需将后端设置为用于图像

Image::set_backend("MyImagickBackend");

注意:这需要安装ImageMagick并启用PHP模块。

注意:这尚未直接测试,因此您可能需要为webp设置其他ImageMagick参数

<强>参考文献:

Imagemagick Specific webp calls in PHP

http://php.net/manual/en/book.imagick.php

https://github.com/silverstripe/silverstripe-framework/blob/3.6/filesystem/ImagickBackend.php