2

私は 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;
}
4

1 に答える 1

4

fileEditValidatorは実際に画像がアップロードされた後に使用され、EditForm表示/編集されたときに使用されると思います。

あなたが探しているのは検証であるようUploadです。でカスタムUpload_Validatorを設定できsetValidator($validator)ますUploadField

したがって、私が試みることは、拡張するカスタムバリデータークラス (おそらく CustomUploadValidator という名前) を作成することですUpload_Validator(ソースはフレームワークの Upload.php ファイルにあります)。だから、それらの線に沿って何か:

$myValidator = new CustomUploadValidator();
$uploadField->setValidator($myValidator);

カスタムバリデータークラスisImageLargeEnough()で、メソッドで呼び出すメソッドを作成する場合がありますvalidate()

public function validate() {

    if(!$this->isImageLargeEnough()) {
        $this->errors[] = 'Image size is not large enough';
        return false;
    }

    return parent::validate();
}

ではisImageLargeEnough()、アップロードされた画像に からアクセスできます$this->tmpFile。だから多分次のようなことをしてください:

public function isImageLargeEnough()
{
    $imageSize = getimagesize( $this->tmpFile["tmp_name"] );
    if ($imageSize !== false)
    {
        if ( $imageSize[0] < 500 || $imageSize[1] < 500 )
        {
            return false;
        }
    }       
    return true;
}

setMinImageSizesここでは、最小の幅/高さが 500 にハード コードされていますが、カスタム バリデータ クラスの変数にそれらを格納するメソッドを実装できる可能性があります。次のように呼び出すことができます$uploadField->getValidator()->setMinImageSize(543, 876);

これは実際にはテストされていませんが、何を探すべきかについてのいくつかの指針を与えることができれば幸いです.

于 2013-08-15T09:14:47.857 に答える