私は foresight.js を使用して Retina デバイス用の高解像度画像をロードしています。Foresight は、低解像度画像を 2x ピクセル密度の画像に置き換えようとします。Foresight はページがレンダリングされる前に低解像度の画像を置き換えようとするため、サイズ変更された画像のテンプレートで GD 画像サイズ変更メソッドを使用することはできません。そのため、SS 3.1 cms ユーザーが 1 つの大きな画像をアップロードできるようにし、アップロード後にシステムがサイズを変更できるようにしています。
私の質問は、cms ユーザーが十分な大きさの画像をアップロードしない場合、カスタム検証エラー メッセージを設定するにはどうすればよいですか?
アップロード時に画像のサイズを変更するコードを次に示します。
class ResampledImage extends Image {
static $default_lores_x = 250;
static $default_lores_y = 250;
static $default_hires_x = 500;
static $default_hires_y = 500;
static $default_assets_dir = 'Uploads';
static $hires_flag = '2x';
function getLoResX() {
return ( static::$lores_x ) ? static::$lores_x : self::$default_lores_x;
}
function getLoResY() {
return ( static::$lores_y ) ? static::$lores_y : self::$default_lores_y;
}
function getHiResX() {
return ( static::$hires_x ) ? static::$hires_x : self::$default_hires_x;
}
function getHiResY() {
return ( static::$hires_y ) ? static::$hires_y : self::$default_hires_y;
}
function getAssetsDir() {
return ( static::$assets_dir ) ? static::$assets_dir : self::$default_assets_dir;
}
function onAfterUpload() {
$this->createResampledImages();
}
function onAfterWrite() {
$this->createResampledImages();
}
function createResampledImages() {
$extension = strtolower($this->getExtension());
if( $this->getHeight() >= $this->getHiResX() || $this->getWidth() >= $this->getHiResY() ) {
$original = $this->getFullPath();
$resampled = $original. '.tmp.'. $extension;
$orig_title = $this->getTitle();
$path_to_hires = Director::baseFolder() . '/' . ASSETS_DIR . '/' . $this->getAssetsDir();
$hires = $path_to_hires . '/' . $orig_title . self::$hires_flag . '.' . $extension;
$gd_lg = new GD($original);
$gd_sm = new GD($original);
if ( $gd_lg->hasImageResource() ) {
$gd_lg = $gd_lg->resizeRatio($this->getHiResX(), $this->getHiResY());
if ( $gd_lg )
$gd_lg->writeTo($hires);
}
if($gd_sm->hasImageResource()) {
$gd_sm = $gd_sm->resizeRatio($this->getLoResX(), $this->getLoResY());
if($gd_sm) {
$gd_sm->writeTo($resampled);
unlink($original);
rename($resampled, $original);
}
}
}
}
UploadField::setFileEditValidator() を見ると、拡張 Image クラスのメソッドを Validator として使用するように指定できるように見えるので、$this->getWidth() と $this->getHeight() をチェックして、十分な大きさでない場合はエラー。
これは可能ですか?
ResampledImage に次のメソッドを追加しようとしましたが、これは失敗しました。
function MyValidator() {
$valid = true;
if ( $this->getHeight() < $this->getHiResX() || $this->getWidth() < $this->getHiResY() ) {
$this->validationError("Thumbnail",'Please upload a larger image');
$valid = false;
}
return $valid;
}