Version: current

      1 <?php
      2
      3 /**
      4  * Расширение для наложения на изображение Водяных знаков
      5  *
      6  * @author inxo, menedem
      7  */
      8 class WatermarkImage extends Extension {
      9
     10     function extraStatics() {}
     11     /**
     12      * Возвращающает изображение с водяным знаком
     13      * Требует загруженного водяного знака и указание его положения в настройках сайта
     14      * Изображение можно подвергать последующим модификациям
     15      *
     16      * @return Image_Cached
     17      */
     18     public function Watermark() {
     19         $original = $this->owner;
     20
     21         $path = $this->getWatermarkedPath();
     22
     23         if (!file_exists(Director::baseFolder() . '/' .$path)) {
     24             $sc = SiteConfig::current_site_config();
     25             $watermark = $sc->WatermarkImage();
     26             $watermarkPosition = $sc->WatermarkPosition;
     27             if (!$watermark || !$watermark->ID || !$watermarkPosition) {
     28                 user_error(_t('Watermark.CheckWatermarkSets','Check Watermark Settings'));
     29             }
     30
     31             $watermarkGD = new GD($watermark->FullPath);
     32             $watermarkWidth = $watermarkGD->getWidth();
     33             $watermarkHeight = $watermarkGD->getHeight();
     34
     35             $image = new GD($original->FullPath);
     36
     37             $imageWidth = $image->getWidth();
     38             $imageHeight = $image->getHeight();
     39
     40             switch($watermarkPosition) {
     41                 case 'center':
     42                     $destX = ((int)($imageWidth / 2)) - (int)($watermarkWidth / 2)  - 0;
     43                     $destY = ((int)($imageHeight / 2)) - (int)($watermarkHeight / 2) - 0;
     44                     break;
     45                 case 'upperleft':
     46                     $destX = 0;
     47                     $destY = 0;
     48                     break;
     49                 case 'upperright':
     50                     $destX = $imageWidth - $watermarkWidth - 0;
     51                     $destY = 0;
     52                     break;
     53                 case 'lowerleft':
     54                     $destX = 0;
     55                     $destY = $imageHeight - $watermarkHeight - 0;
     56                     break;
     57                 case 'lowerright':
     58                     $destX = $imageWidth - $watermarkWidth - 0;
     59                     $destY = $imageHeight - $watermarkHeight - 0;
     60                     break;
     61             }
     62 <<<<<<< .mine
     63             $output = $image->mergeAlpha($watermarkGD, $destX, $destY, 100);
     64 =======
     65             $output = $image->mergeAlpha($watermarkGD, $destX, $destY);
     66 >>>>>>> .r4040
     67             if ($output) {
     68                 $output->writeTo(Director::getAbsFile($path));
     69             }
     70             else {
     71                 return false;
     72             }
     73         }
     74
     75         $img = new Image_Cached($path);
     76         $img->ID = $original->ID;
     77         $img->ParentID = $original->ParentID;
     78         return $img;
     79     }
     80
     81     /**
     82      * Возвращает путь к картинке с водяным знаком относительно корня сайта
     83      *
     84      * @return string
     85      */
     86     protected function getWatermarkedPath() {
     87         if ($this->owner->ParentID == 0) {
     88             $baseDir = ASSETS_PATH . '/';
     89         } else {
     90             $baseDir = $this->owner->Parent()->getFilename();
     91         }
     92         return $baseDir . '_resampled/' . md5($this->owner->getFilename()) . '-watermarked.png';
     93 //      return $baseDir . '_resampled/' . $this->owner->ID . '-watermarked.png';
     94     }
     95
     96     /**
     97      * Расширение действия Image::deleteFormattedImages() - удаляет картинку с водяным знаком и все ее производные
     98      *
     99      * @param int $numDeleted - счетчик удаленных файлов
    100      */
    101     function deleteFormattedImages(& $numDeleted) {
    102         $watemarkFileName = Director::getAbsFile($this->getWatermarkedPath());
    103         if (is_file($watemarkFileName)) {
    104             $numDeleted++;
    105             unlink($watemarkFileName);
    106         }
    107
    108         //Удаляем ресайзы файлов с watermark
    109         $cacheDir = dirname($watemarkFileName);
    110
    111         if(is_dir($cacheDir) && $handle = opendir($cacheDir)) {
    112             $mask = basename($watemarkFileName);
    113             $maskLength = strlen($mask);
    114             while(($file = readdir($handle)) !== false) {
    115                 if(substr($file, 0, 1) != '.' && substr_compare($file, $mask, -$maskLength, $maskLength) == 0 && is_file($cacheDir . $file)) {
    116                     unlink($cacheDir . $file);
    117                     $numDeleted++;
    118                 }
    119             }
    120             closedir($handle);
    121         }
    122     }
    123 }
    124

[Raise a SilverStripe Framework issue/bug](https://github.com/silverstripe/silverstripe-framework/issues/new)
- [Raise a SilverStripe CMS issue/bug](https://github.com/silverstripe/silverstripe-cms/issues/new)
- Please use the Silverstripe Forums to ask development related questions. -