Explorar el Código

#120 - custom images sizes support

Alex Trofimov hace 11 años
padre
commit
96a6e2de0b

+ 16 - 3
inc/classes/BxDolTranscoder.php

@@ -616,7 +616,7 @@ class BxDolTranscoder extends BxDol implements iBxDolFactoryObject
             $oStorageOriginal = BxDolStorage::getObjectInstance($this->_aObject['source_params']['object']);
             if ($oStorageOriginal) {
                 $aFileOriginal = $oStorageOriginal->getFile($mixedHandlerOrig);
-                if (!$aFileOriginal || $aFileOriginal['modified'] > $aFile['modified'] || $this->_aObject['ts'] > $aFile['modified']) { // if original file was changed OR we changed transcoder object params
+                if (!$aFileOriginal || $aFileOriginal['modified'] > $aFile['modified'] || $this->_aObject['ts'] >= $aFile['modified']) { // if original file was changed OR we changed transcoder object params
                     // delete file, so it will be recreated next time
                     if ($this->_oStorage->deleteFile($aFile['id']))
                         return false;
@@ -745,8 +745,7 @@ class BxDolTranscoder extends BxDol implements iBxDolFactoryObject
         $aFilters = $this->_oDb->getTranscoderFilters();
         $this->_aObject['filters'] = array();
         foreach ($aFilters as $aFilter) {
-            if ($aFilter['filter_params'])
-                $aFilter['filter_params'] = unserialize($aFilter['filter_params']);
+            $aFilter['filter_params'] = $aFilter['filter_params'] ? unserialize($aFilter['filter_params']) : array();
             $this->_aObject['filters'][] = $aFilter;
         }
 
@@ -781,6 +780,20 @@ class BxDolTranscoder extends BxDol implements iBxDolFactoryObject
                 $oTranscoder->$sFunc();
         }
     }
+
+    /**
+     * Get filter params
+     * @param $sName filter name
+     * @return array of filter params if filter was found, or false if given filter isn't enabled for the transcoder
+     */
+    protected function getFilterParams ($sName)
+    {
+        $this->initFilters ();
+        foreach ($this->_aObject['filters'] as $aParams)
+            if ($sName == $aParams['filter'])
+                return $aParams['filter_params'];
+        return false;
+    }
 }
 
 /** @} */

+ 55 - 0
inc/classes/BxDolTranscoderImage.php

@@ -99,6 +99,50 @@ class BxDolTranscoderImage extends BxDolTranscoder implements iBxDolFactoryObjec
         return BX_DOL_URL_ROOT . 'image_transcoder.php?o=' . $this->_aObject['object'] . '&h=' . $mixedHandler . '&dpx=' . $this->getDevicePixelRatio() . '&t=' . time();
     }
 
+    public function isFileReady ($mixedHandler, $isCheckOutdated = true)
+    {
+        if (false !== $this->getFilterParams('ResizeVar')) {
+            $aTranscodedFileData = $this->_oDb->getTranscodedFileData ($mixedHandler);
+            $x = $this->getCustomResizeDimension ('x');
+            $y = $this->getCustomResizeDimension ('y');
+
+            // if new sizes are provided - delete old image, so new one will be created
+            if (($x && (!isset($aTranscodedFileData['x']) || $x != $aTranscodedFileData['x'])) || ($y && (!isset($aTranscodedFileData['y']) || $y != $aTranscodedFileData['y']))) {                
+                if (!($iFileId = $this->_oDb->getFileIdByHandler($mixedHandler)))
+                    return false;
+
+                if (!($aFile = $this->_oStorage->getFile($iFileId)))
+                    return false;
+
+                if (!$this->_oStorage->deleteFile($aFile['id']))
+                    return false;
+            }
+        }
+        return parent::isFileReady ($mixedHandler, $isCheckOutdated);
+    }
+
+    protected function getCustomResizeDimension ($sName)
+    {
+        $i = (int)bx_get($sName);
+        if ($i > 2048) $i = 2048;
+        if ($i && $i < 16) $i = 16;
+        return $i;
+    }
+
+    public function transcode ($mixedHandler, $iProfileId = 0)
+    {
+        if (!($bRet = parent::transcode ($mixedHandler, $iProfileId)))
+            return $bRet;
+
+        $x = $this->getCustomResizeDimension ('x');
+        $y = $this->getCustomResizeDimension ('y');
+
+        if ($x || $y)
+            $this->_oDb->updateTranscodedFileData($mixedHandler, array('x' => $x, 'y' => $y));
+
+        return $bRet;
+    }
+
     protected function applyFilter_Grayscale ($sFile, $aParams)
     {
         bx_import ('BxDolImageResize');
@@ -113,6 +157,17 @@ class BxDolTranscoderImage extends BxDolTranscoder implements iBxDolFactoryObjec
         return false;
     }
 
+    protected function applyFilter_ResizeVar ($sFile, $aParams)
+    {
+        $aParams['w'] = $this->getCustomResizeDimension ('x');
+        $aParams['h'] = $this->getCustomResizeDimension ('y');
+
+        if (!$aParams['w'] && !$aParams['h'])
+            return true;
+
+        return $this->applyFilter_Resize ($sFile, $aParams);
+    }
+
     protected function applyFilter_Resize ($sFile, $aParams)
     {
         bx_import ('BxDolImageResize');

+ 23 - 0
inc/classes/BxDolTranscoderQuery.php

@@ -73,6 +73,12 @@ class BxDolTranscoderQuery extends BxDolDb
         return $this->getOne($sQuery);
     }
 
+    public function updateObjectModificationTime($iTime = 0)
+    {
+        $sQuery = $this->prepare("UPDATE `sys_objects_transcoder` SET `ts` = ? WHERE `object` = ?", $iTime ? $iTime : time(), $this->_aObject['object']);
+        return $this->res($sQuery);
+    }
+
     public function updateAccessTime($mixedHandler)
     {
         $iTime = time();
@@ -252,6 +258,23 @@ class BxDolTranscoderQuery extends BxDolDb
         $sQuery = $this->prepare("SELECT `id` FROM `sys_alerts_handlers` WHERE `name` = ?", $sHandlerName);
         return $this->getOne($sQuery);
     }
+
+    public function getTranscodedFileData($mixedHandler)
+    {
+        $sQuery = $this->prepare("SELECT `data` FROM {$this->_sTableFiles} WHERE `transcoder_object` = ? AND `handler` = ?", $this->_aObject['object'], $mixedHandler);
+        $s = $this->getOne($sQuery);
+        if (!$s)
+            return false;
+        return unserialize($s);
+    }
+
+    public function updateTranscodedFileData($mixedHandler, $mixedData)
+    {
+        $sData = $mixedData ? serialize($mixedData) : '';
+        $sQuery = $this->prepare("UPDATE {$this->_sTableFiles} SET `data` = ? WHERE `transcoder_object` = ? AND `handler` = ?", $sData, $this->_aObject['object'], $mixedHandler);
+
+        return $this->res($sQuery);
+    }
 }
 
 /** @} */

+ 1 - 13
inc/classes/BxDolTranscoderVideo.php

@@ -98,7 +98,7 @@ class BxDolTranscoderVideo extends BxDolTranscoder implements iBxDolFactoryObjec
      */
     public function getFileUrlNotReady($mixedHandler)
     {
-        return $this->_isPosterFilter() ? BxDolTemplate::getInstance()->getImageUrl('video-na.png') : '';
+        return false === $this->getFilterParams('Poster') ? '' : BxDolTemplate::getInstance()->getImageUrl('video-na.png');
     }
 
     /**
@@ -273,18 +273,6 @@ class BxDolTranscoderVideo extends BxDolTranscoder implements iBxDolFactoryObjec
 
         return '640x360'; // should never happen
     }
-
-    /**
-     * Checks if 'Poster' filter is enabled for curent transcoder
-     */
-    protected function _isPosterFilter ()
-    {
-        $this->initFilters ();
-        foreach ($this->_aObject['filters'] as $aParams)
-            if ('Poster' == $aParams['filter'])
-                return true;
-        return false;
-    }
 }
 
 /** @} */

+ 23 - 8
install/sql/system.sql

@@ -5,7 +5,7 @@
 -- --------------------------------------------------------
 
 SET NAMES 'utf8';
-DROP TABLE IF EXISTS `sys_keys`, `sys_objects_editor`, `sys_objects_captcha`, `sys_objects_social_sharing`, `sys_objects_cmts`, `sys_cmts_images`, `sys_cmts_images_preview`, `sys_cmts_images2entries`, `sys_cmts_ids`, `sys_cmts_meta_keywords`, `sys_email_templates`, `sys_options`, sys_options_types, `sys_options_categories`, `sys_localization_categories`, `sys_localization_keys`, `sys_localization_languages`, `sys_localization_strings`, `sys_acl_actions`, `sys_acl_actions_track`, `sys_acl_matrix`, `sys_acl_levels`, `sys_sessions`, `sys_acl_levels_members`, `sys_objects_rss`, `sys_objects_search`, `sys_stat_site`, `sys_alerts`, `sys_alerts_handlers`, `sys_injections`, `sys_injections_admin`, `sys_modules`, `sys_modules_file_tracks`, `sys_modules_relations`, `sys_permalinks`, `sys_objects_privacy`, `sys_privacy_defaults`, `sys_privacy_groups`, `sys_objects_auths`, `sys_objects_vote`, `sys_objects_view`, `sys_cron_jobs`, `sys_objects_storage`, `sys_objects_uploader`, `sys_storage_user_quotas`, `sys_storage_tokens`, `sys_storage_ghosts`, `sys_storage_deletions`, `sys_storage_mime_types`, `sys_objects_transcoder`, `sys_transcoder_images_files`, `sys_transcoder_videos_files`, `sys_transcoder_filters`, `sys_transcoder_queue`, `sys_transcoder_queue_files`, `sys_accounts`, `sys_profiles`, `sys_objects_form`, `sys_form_displays`, `sys_form_inputs`, `sys_form_display_inputs`, `sys_form_pre_lists`, `sys_form_pre_values`, `sys_menu_templates`, `sys_objects_menu`, `sys_menu_sets`, `sys_menu_items`, `sys_objects_grid`, `sys_grid_fields`, `sys_grid_actions`, `sys_objects_connection`, `sys_profiles_conn_subscriptions`, `sys_profiles_conn_friends`, `sys_objects_page`, `sys_pages_layouts`, `sys_pages_design_boxes`, `sys_pages_blocks`, `sys_objects_metatags`, `sys_objects_live_updates`, `sys_images`, `sys_std_pages`, `sys_std_widgets`, `sys_std_pages_widgets`;
+DROP TABLE IF EXISTS `sys_keys`, `sys_objects_editor`, `sys_objects_captcha`, `sys_objects_social_sharing`, `sys_objects_cmts`, `sys_cmts_images`, `sys_cmts_images_preview`, `sys_cmts_images2entries`, `sys_cmts_ids`, `sys_cmts_meta_keywords`, `sys_email_templates`, `sys_options`, sys_options_types, `sys_options_categories`, `sys_localization_categories`, `sys_localization_keys`, `sys_localization_languages`, `sys_localization_strings`, `sys_acl_actions`, `sys_acl_actions_track`, `sys_acl_matrix`, `sys_acl_levels`, `sys_sessions`, `sys_acl_levels_members`, `sys_objects_rss`, `sys_objects_search`, `sys_stat_site`, `sys_alerts`, `sys_alerts_handlers`, `sys_injections`, `sys_injections_admin`, `sys_modules`, `sys_modules_file_tracks`, `sys_modules_relations`, `sys_permalinks`, `sys_objects_privacy`, `sys_privacy_defaults`, `sys_privacy_groups`, `sys_objects_auths`, `sys_objects_vote`, `sys_objects_view`, `sys_cron_jobs`, `sys_objects_storage`, `sys_objects_uploader`, `sys_storage_user_quotas`, `sys_storage_tokens`, `sys_storage_ghosts`, `sys_storage_deletions`, `sys_storage_mime_types`, `sys_objects_transcoder`, `sys_transcoder_images_files`, `sys_transcoder_videos_files`, `sys_transcoder_filters`, `sys_transcoder_queue`, `sys_transcoder_queue_files`, `sys_accounts`, `sys_profiles`, `sys_objects_form`, `sys_form_displays`, `sys_form_inputs`, `sys_form_display_inputs`, `sys_form_pre_lists`, `sys_form_pre_values`, `sys_menu_templates`, `sys_objects_menu`, `sys_menu_sets`, `sys_menu_items`, `sys_objects_grid`, `sys_grid_fields`, `sys_grid_actions`, `sys_objects_connection`, `sys_profiles_conn_subscriptions`, `sys_profiles_conn_friends`, `sys_objects_page`, `sys_pages_layouts`, `sys_pages_design_boxes`, `sys_pages_blocks`, `sys_objects_metatags`, `sys_objects_live_updates`, `sys_images`, `sys_images_custom`, `sys_std_pages`, `sys_std_widgets`, `sys_std_pages_widgets`;
 ALTER DATABASE DEFAULT CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci';
 
 
@@ -785,9 +785,6 @@ CREATE TABLE `sys_modules_relations` (
 
 -- --------------------------------------------------------
 
---
--- Table structure for table `sys_images`
---
 CREATE TABLE `sys_images` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `profile_id` int(10) unsigned NOT NULL,
@@ -804,6 +801,21 @@ CREATE TABLE `sys_images` (
   UNIQUE KEY `remote_id` (`remote_id`)
 );
 
+CREATE TABLE `sys_images_custom` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `profile_id` int(10) unsigned NOT NULL,
+  `remote_id` varchar(255) NOT NULL,
+  `path` varchar(255) NOT NULL,
+  `file_name` varchar(255) NOT NULL,
+  `mime_type` varchar(128) NOT NULL,
+  `ext` varchar(32) NOT NULL,
+  `size` int(11) NOT NULL,
+  `added` int(11) NOT NULL,
+  `modified` int(11) NOT NULL,
+  `private` int(11) NOT NULL,
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `remote_id` (`remote_id`)
+);
 
 -- --------------------------------------------------------
 
@@ -1047,6 +1059,7 @@ CREATE TABLE IF NOT EXISTS `sys_objects_storage` (
 
 INSERT INTO `sys_objects_storage` (`object`, `engine`, `params`, `token_life`, `cache_control`, `levels`, `table_files`, `ext_mode`, `ext_allow`, `ext_deny`, `quota_size`, `current_size`, `quota_number`, `current_number`, `max_file_size`, `ts`) VALUES
 ('sys_images', 'Local', '', 360, 2592000, 0, 'sys_images', 'allow-deny', 'jpg,jpeg,jpe,gif,png', '', 0, 0, 0, 0, 0, 0),
+('sys_images_custom', 'Local', '', 360, 2592000, 0, 'sys_images_custom', 'allow-deny', 'jpg,jpeg,jpe,gif,png', '', 0, 0, 0, 0, 0, 0),
 ('sys_cmts_images', 'Local', '', 360, 2592000, 3, 'sys_cmts_images', 'allow-deny', 'jpg,jpeg,jpe,gif,png', '', 0, 0, 0, 0, 0, 0),
 ('sys_cmts_images_preview', 'Local', '', 360, 2592000, 3, 'sys_cmts_images_preview', 'allow-deny', 'jpg,jpeg,jpe,gif,png', '', 0, 0, 0, 0, 0, 0),
 ('sys_transcoder_queue_files', 'Local', '', 3600, 2592000, 0, 'sys_transcoder_queue_files', 'allow-deny', 'avi,flv,mpg,mpeg,wmv,mp4,m4v,mov,divx,xvid,3gp,webm,jpg', '', 0, 0, 0, 0, 0, 0);
@@ -2616,7 +2629,7 @@ INSERT INTO `sys_objects_menu` (`object`, `title`, `set_name`, `module`, `templa
 ('sys_toolbar_member', '_sys_menu_title_toolbar_member', 'sys_toolbar_member', 'system', 5, 0, 1, 'BxTemplMenuToolbar', ''),
 ('sys_account', '_sys_menu_title_account', 'sys_account_links', 'system', 7, 0, 1, '', ''),
 ('sys_add_content', '_sys_menu_title_add_content', 'sys_add_content_links', 'system', 14, 0, 1, 'BxTemplMenuSite', ''),
-('sys_add_profile', '_sys_menu_title_add_profile', 'sys_add_profile_links', 'system', 4, 0, 1, '', ''),
+('sys_add_profile', '_sys_menu_title_add_profile', 'sys_add_profile_links', 'system', 6, 0, 1, '', ''),
 ('sys_account_dashboard_manage_tools', '_sys_menu_title_account_dashboard_manage_tools', 'sys_account_dashboard_manage_tools', 'system', 4, 0, 1, '', ''),
 ('sys_account_settings_submenu', '_sys_menu_title_account_settings', 'sys_account_settings', 'system', 8, 0, 1, '', ''),
 ('sys_account_settings_more', '_sys_menu_title_account_settings_more', 'sys_account_settings_more', 'system', 4, 0, 1, '', ''),
@@ -2992,7 +3005,8 @@ INSERT INTO `sys_objects_transcoder` (`object`, `storage_object`, `source_type`,
 ('sys_icon_apple', 'sys_images', 'Storage', 'a:2:{s:6:"object";s:10:"sys_images";s:14:"disable_retina";b:1;}', 'no', '0', '0', '0', '', ''),
 ('sys_icon_facebook', 'sys_images', 'Storage', 'a:2:{s:6:"object";s:10:"sys_images";s:14:"disable_retina";b:1;}', 'no', '0', '0', '0', '', ''),
 ('sys_icon_favicon', 'sys_images', 'Storage', 'a:2:{s:6:"object";s:10:"sys_images";s:14:"disable_retina";b:1;}', 'no', '0', '0', '0', '', ''),
-('sys_cmts_images_preview', 'sys_cmts_images_preview', 'Storage', 'a:1:{s:6:"object";s:15:"sys_cmts_images";}', 'no', '1', '2592000', '0', '', '');
+('sys_cmts_images_preview', 'sys_cmts_images_preview', 'Storage', 'a:1:{s:6:"object";s:15:"sys_cmts_images";}', 'no', '1', '2592000', '0', '', ''),
+('sys_custom_images', 'sys_images', 'Storage', 'a:1:{s:6:"object";s:17:"sys_images_custom";}', 'no', '1', '2592000', '0', '', '');
 
 
 CREATE TABLE IF NOT EXISTS `sys_transcoder_images_files` (
@@ -3000,6 +3014,7 @@ CREATE TABLE IF NOT EXISTS `sys_transcoder_images_files` (
   `file_id` int(11) NOT NULL,
   `handler` varchar(255) NOT NULL,
   `atime` int(11) NOT NULL,
+  `data` text NOT NULL,
   UNIQUE KEY `transcoder_object` (`transcoder_object`,`handler`),
   KEY `atime` (`atime`),
   KEY `file_id` (`file_id`)
@@ -3029,8 +3044,8 @@ INSERT INTO `sys_transcoder_filters` (`transcoder_object`, `filter`, `filter_par
 ('sys_icon_apple', 'Resize', 'a:4:{s:1:"w";s:3:"152";s:1:"h";s:3:"152";s:13:"square_resize";s:1:"1";s:10:"force_type";s:3:"png";}', '0'),
 ('sys_icon_facebook', 'Resize', 'a:4:{s:1:"w";s:3:"100";s:1:"h";s:3:"100";s:13:"square_resize";s:1:"1";s:10:"force_type";s:3:"png";}', '0'),
 ('sys_icon_favicon', 'Resize', 'a:4:{s:1:"w";s:2:"16";s:1:"h";s:2:"16";s:13:"square_resize";s:1:"1";s:10:"force_type";s:3:"png";}', '0'),
-('sys_cmts_images_preview', 'Resize', 'a:4:{s:1:"w";s:3:"100";s:1:"h";s:3:"100";s:13:"square_resize";s:1:"1";s:10:"force_type";s:3:"jpg";}', '0');
-
+('sys_cmts_images_preview', 'Resize', 'a:4:{s:1:"w";s:3:"100";s:1:"h";s:3:"100";s:13:"square_resize";s:1:"1";s:10:"force_type";s:3:"jpg";}', '0'),
+('sys_custom_images', 'ResizeVar', '', '0');
 
 CREATE TABLE IF NOT EXISTS `sys_transcoder_queue` (
   `id` int(11) NOT NULL AUTO_INCREMENT,

+ 154 - 0
samples/transcoder_custom.php

@@ -0,0 +1,154 @@
+<?php
+/**
+ * Copyright (c) BoonEx Pty Limited - http://www.boonex.com/
+ * CC-BY License - http://creativecommons.org/licenses/by/3.0/
+ *
+ * @defgroup    TridentCore Trident Core
+ * @{
+ */
+
+/**
+ * @page samples
+ * @section transcoder_images_custom Custom Images Transcoder
+ */
+
+require_once('./../inc/header.inc.php');
+require_once(BX_DIRECTORY_PATH_INC . "design.inc.php");
+
+bx_import('BxDolLanguages');
+bx_import('BxDolTemplate');
+bx_import('BxTemplFunctions');
+
+$oTemplate = BxDolTemplate::getInstance();
+$oTemplate->setPageNameIndex (BX_PAGE_DEFAULT);
+$oTemplate->setPageHeader ("Custom images transcoder");
+$oTemplate->setPageContent ('page_main_code', PageCompMainCode());
+$oTemplate->getPageCode();
+
+/**
+ * page code function
+ */
+function PageCompMainCode()
+{
+    ob_start();
+
+    $sTranscoderObject = 'sys_custom_images';
+    $sStorageObjectOrig = 'sys_images_custom';
+    $iProfileId = bx_get_logged_profile_id();
+
+    if (!isAdmin()) {
+        echo "You aren't operator.";
+        exit;
+    }
+
+    bx_import('BxDolTranscoderImage');
+    $iPrunedFiles = BxDolTranscoder::pruning();
+    if ($iPrunedFiles) {
+        echo "iPrunedFiles: $iPrunedFiles";
+        exit;
+    }
+    $oTranscoderObject = BxDolTranscoderImage::getObjectInstance($sTranscoderObject);
+    if (!$oTranscoderObject) {
+        echo "Transcoder object is not available: " . $sTranscoderObject;
+        exit;
+    }
+    //echo "registerHandlers: [" . $oTranscoderObject->registerHandlers() . "] <br />\n";
+
+
+    bx_import('BxDolStorage');
+    $oStorageOrig = BxDolStorage::getObjectInstance($sStorageObjectOrig);
+    if (!$oStorageOrig) {
+        echo "Storage object is not available: " . $sStorageObjectOrig;
+        exit;
+    }
+
+    if (isset($_POST['upload'])) {
+    
+        $iId = $oStorageOrig->storeFileFromForm($_FILES['file'], true, $iProfileId);
+        if ($iId) {
+            $iCount = $oStorageOrig->afterUploadCleanup($iId, $iProfileId);
+            echo "<h2>Uploaded file id: " . $iId . "(deleted ghosts:" . $iCount . ") </h2>";
+        } else {
+            echo "<h2>Error uploading file: " . $oStorage->getErrorString() . '</h2><hr class="bx-def-hr" />';
+        }
+
+    }
+    elseif (isset($_POST['delete'])) {
+
+        foreach ($_POST['file_id'] as $iFileId) {
+            $bRet = $oStorageOrig->deleteFile($iFileId, $iProfileId);
+            if ($bRet)
+                echo "<h2>Deleted file id: " . $iFileId . '</h2><hr class="bx-def-hr" />';
+            else
+                echo "<h2>File deleting error: " . $oStorageOrig->getErrorString() . '</h2><hr class="bx-def-hr" />';
+        }
+
+    } 
+    else {
+
+        $a = $oStorageOrig->getFilesAll();
+        foreach ($a as $r) {
+            $sUrlImage = $oTranscoderObject->getFileUrl($r['id']);
+?>
+            <div class="bx-def-font-h2 bx-def-margin-sec-topbottom"><?=$r['file_name']; ?></div>
+            Size: <input id="size-<?=$r['id']; ?>" type="text" class="bx-def-font-inputs bx-form-input-text bx-def-margin-sec-bottom bx-transcoder-custom-images-size" placeholder="320x240" />
+            Copy&amp;paste URL: <input id="input-<?=$r['id']; ?>" type="text" value="<?=$oTranscoderObject->getFileUrlNotReady($r['id']); ?>" class="bx-def-font-inputs bx-form-input-text bx-def-margin-sec-bottom" /> <br />
+            <img src="<?=$sUrlImage; ?>" style="height:200px; width:auto;" />
+            <hr class="bx-def-hr" />
+<?php
+        }
+    }
+
+
+    $a = $oStorageOrig->getFilesAll();
+?>
+    <h2>Files List</h2>
+    <form method="POST">
+        <?php foreach ($a as $r): ?>
+            <input type="checkbox" name="file_id[]" value="<?=$r['id'] ?>" />
+            <?=$r['file_name'] ?>
+            <br />
+        <?php endforeach; ?>
+        <input type="submit" name="delete" value="Delete" class="bx-btn bx-btn-small bx-def-margin-sec-top" style="float:none;" />
+    </form>
+    <hr class="bx-def-hr" /> 
+
+
+    <h2>Upload</h2>
+    <form enctype="multipart/form-data" method="POST">
+        <input type="file" name="file" />
+        <br />
+        <input type="submit" name="upload" value="Upload" class="bx-btn bx-btn-small bx-def-margin-sec-top" style="float:none;" />
+    </form>
+
+    <script>
+        $(document).ready(function () {
+            $('.bx-transcoder-custom-images-size').on('change input', function () {
+                var sId = $(this).attr('id').replace('size-', '');
+                var a = $('#input-' + sId).val().split('&');
+                var aSize = this.value.split('x');
+                var s = '';
+                for (var i in a) {
+                    if (-1 == a[i].indexOf('t=') && -1 == a[i].indexOf('x=') && -1 == a[i].indexOf('y='))
+                        s += a[i] + '&';
+                }
+
+                s = s.replace(/&$/, '');
+                
+                if (parseInt(aSize[0]) > 0)
+                    s = bx_append_url_params(s, 'x=' + aSize[0]);
+                if (parseInt(aSize[1]) > 0)
+                    s = bx_append_url_params(s, 'y=' + aSize[1]);
+
+                $('#input-' + sId).val(s);
+            });
+        });
+    </script>
+<?php
+
+    $s = ob_get_clean();
+    return DesignBoxContent("Custom images transcoder", $s, BX_DB_PADDING_DEF);
+
+}
+
+/** @} */