84 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			84 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
class ResolutionLimit extends Extension
 | 
						|
{
 | 
						|
    public function get_priority(): int
 | 
						|
    {
 | 
						|
        return 40;
 | 
						|
    } // early, to veto ImageUploadEvent
 | 
						|
 | 
						|
    public function onImageAddition(ImageAdditionEvent $event)
 | 
						|
    {
 | 
						|
        global $config;
 | 
						|
        $min_w = $config->get_int("upload_min_width", -1);
 | 
						|
        $min_h = $config->get_int("upload_min_height", -1);
 | 
						|
        $max_w = $config->get_int("upload_max_width", -1);
 | 
						|
        $max_h = $config->get_int("upload_max_height", -1);
 | 
						|
        $ratios = explode(" ", $config->get_string("upload_ratios", ""));
 | 
						|
 | 
						|
        $image = $event->image;
 | 
						|
 | 
						|
        if ($min_w > 0 && $image->width < $min_w) {
 | 
						|
            throw new UploadException("Image too small");
 | 
						|
        }
 | 
						|
        if ($min_h > 0 && $image->height < $min_h) {
 | 
						|
            throw new UploadException("Image too small");
 | 
						|
        }
 | 
						|
        if ($max_w > 0 && $image->width > $max_w) {
 | 
						|
            throw new UploadException("Image too large");
 | 
						|
        }
 | 
						|
        if ($max_h > 0 && $image->height > $max_h) {
 | 
						|
            throw new UploadException("Image too large");
 | 
						|
        }
 | 
						|
 | 
						|
        if (count($ratios) > 0) {
 | 
						|
            $ok = false;
 | 
						|
            $valids = 0;
 | 
						|
            foreach ($ratios as $ratio) {
 | 
						|
                $parts = explode(":", $ratio);
 | 
						|
                if (count($parts) < 2) {
 | 
						|
                    continue;
 | 
						|
                }
 | 
						|
                $valids++;
 | 
						|
                $width = $parts[0];
 | 
						|
                $height = $parts[1];
 | 
						|
                if ($image->width / $width == $image->height / $height) {
 | 
						|
                    $ok = true;
 | 
						|
                    break;
 | 
						|
                }
 | 
						|
            }
 | 
						|
            if ($valids > 0 && !$ok) {
 | 
						|
                throw new UploadException(
 | 
						|
                    "Image needs to be in one of these ratios: ".
 | 
						|
                    html_escape($config->get_string("upload_ratios", ""))
 | 
						|
                );
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    public function onSetupBuilding(SetupBuildingEvent $event)
 | 
						|
    {
 | 
						|
        $sb = new SetupBlock("Resolution Limits");
 | 
						|
 | 
						|
        $sb->add_label("Min ");
 | 
						|
        $sb->add_int_option("upload_min_width");
 | 
						|
        $sb->add_label(" x ");
 | 
						|
        $sb->add_int_option("upload_min_height");
 | 
						|
        $sb->add_label(" px");
 | 
						|
 | 
						|
        $sb->add_label("<br>Max ");
 | 
						|
        $sb->add_int_option("upload_max_width");
 | 
						|
        $sb->add_label(" x ");
 | 
						|
        $sb->add_int_option("upload_max_height");
 | 
						|
        $sb->add_label(" px");
 | 
						|
 | 
						|
        $sb->add_label("<br>(-1 for no limit)");
 | 
						|
 | 
						|
        $sb->add_label("<br>Ratios ");
 | 
						|
        $sb->add_text_option("upload_ratios");
 | 
						|
        $sb->add_label("<br>(eg. '4:3 16:9', blank for no limit)");
 | 
						|
 | 
						|
        $event->panel->add_block($sb);
 | 
						|
    }
 | 
						|
}
 |