/**
  * Initialize the thumber class for use in thumbnail generation.
  */
 public static function init()
 {
     $options = DG_Thumber::getOptions();
     $active = $options['active'];
     if ($active['imagick']) {
         parent::init();
     }
 }
 /**
  * @param string $ID The attachment ID to retrieve thumbnail from.
  *
  * @return bool|string  False on failure, URL to thumb on success.
  */
 private static function getImageThumbnail($ID)
 {
     $options = DG_Thumber::getOptions();
     $ret = false;
     if ($icon = image_downsize($ID, array($options['width'], $options['height']))) {
         $ret = $icon[0];
     }
     return $ret;
 }
 /**
  * @param int $ID The attachment ID.
  * @param int $pg The page to thumbnail.
  *
  * @return bool Always false. Asynchronously set the thumbnail in webhook later.
  */
 public function getThumbnail($ID, $pg = 1)
 {
     global $dg_options;
     include_once DG_PATH . 'inc/thumbers/thumber-co/thumber-client/client.php';
     include_once DG_PATH . 'inc/thumbers/thumber-co/thumber-client/thumb-request.php';
     $options = DG_Thumber::getOptions();
     $url_or_path = get_attached_file($ID);
     if (!self::checkGeometry($options['width'], $options['height'])) {
         DG_Logger::writeLog(DG_LogLevel::Detail, "Skipping attachment #{$ID} as it exceeds Thumber.co subscription geometry limit.");
         return false;
     }
     if (!self::checkFileSize($url_or_path)) {
         DG_Logger::writeLog(DG_LogLevel::Detail, "Skipping attachment #{$ID} as it exceeds Thumber.co subscription file size limit.");
         return false;
     }
     $mime_type = get_post_mime_type($ID);
     if (!$dg_options['thumber-co']['direct_upload']) {
         $url_or_path = wp_get_attachment_url($ID);
     }
     if (!$url_or_path || !$mime_type) {
         return false;
     }
     $req = new ThumberThumbReq();
     $req->setCallback(self::$webhook);
     $req->setMimeType($mime_type);
     $req->setNonce($ID . self::NonceSeparator . md5(microtime()));
     $req->setPg($pg);
     $req->setGeometry($options['width'] . 'x' . $options['height']);
     if ($dg_options['thumber-co']['direct_upload']) {
         $req->setDecodedData(file_get_contents($url_or_path));
     } else {
         $req->setUrl($url_or_path);
     }
     $resp = self::$client->sendThumbRequest($req);
     if ($resp['http_code'] < 200 || $resp['http_code'] > 399) {
         DG_Logger::writeLog(DG_LogLevel::Error, 'Failed to transmit to server: ' . $resp['body']);
     }
     // always returns false -- we set the thumbnail later when webhook is hit
     return false;
 }
Ejemplo n.º 4
0
 /**
  * Runs when DG is uninstalled for an individual blog.
  */
 private static function _uninstall($blog)
 {
     $options = DG_Thumber::getOptions($blog);
     if (is_null($options)) {
         return;
     }
     foreach ($options['thumbs'] as $val) {
         if (isset($val['thumber'])) {
             @unlink($val['thumb_path']);
         }
     }
     DocumentGallery::deleteOptions($blog);
 }
Ejemplo n.º 5
0
    /**
     * Render the Thumbnail table.
     */
    public static function renderThumbnailSection()
    {
        include_once DG_PATH . 'inc/class-thumber.php';
        $options = DG_Thumber::getOptions();
        $URL_params = array('page' => DG_OPTION_NAME, 'tab' => 'Thumbnail');
        $att_ids = array();
        if (isset($_REQUEST['orderby']) && in_array(strtolower($_REQUEST['orderby']), array('title', 'date'))) {
            $orderby = strtolower($_REQUEST['orderby']);
            $URL_params['orderby'] = $orderby;
            switch ($orderby) {
                case 'date':
                    foreach ($options['thumbs'] as $key => $node) {
                        $keyArray[$key] = $node['timestamp'];
                        $options['thumbs'][$key]['thumb_id'] = $att_ids[] = $key;
                    }
                    break;
                case 'title':
                    foreach ($options['thumbs'] as $key => $node) {
                        $keyArray[$key] = basename($node['thumb_path']);
                        $options['thumbs'][$key]['thumb_id'] = $att_ids[] = $key;
                    }
                    break;
            }
            $order = strtolower($_REQUEST['order']);
            if (!isset($_REQUEST['order']) || !in_array($order, array('asc', 'desc'))) {
                $order = 'asc';
            }
            $URL_params['order'] = $order;
            if ($order == 'asc') {
                array_multisort($keyArray, SORT_ASC, $options['thumbs']);
            } else {
                array_multisort($keyArray, SORT_DESC, $options['thumbs']);
            }
        } else {
            $orderby = '';
            foreach ($options['thumbs'] as $key => $node) {
                $options['thumbs'][$key]['thumb_id'] = $att_ids[] = $key;
            }
        }
        static $limit_options = array(10, 25, 75);
        if (!isset($_REQUEST['limit']) || !in_array(intval($_REQUEST['limit']), $limit_options)) {
            $limit = $limit_options[0];
        } else {
            $limit = intval($_REQUEST['limit']);
        }
        $URL_params['limit'] = $limit;
        $select_limit = '';
        foreach ($limit_options as $l_o) {
            $select_limit .= '<option value="' . $l_o . '"' . selected($limit, $l_o, false) . '>' . $l_o . '</option>' . PHP_EOL;
        }
        $thumbs_number = count($options['thumbs']);
        $lastsheet = ceil($thumbs_number / $limit);
        $sheet = isset($_REQUEST['sheet']) ? intval($_REQUEST['sheet']) : 1;
        if ($sheet <= 0 || $sheet > $lastsheet) {
            $sheet = 1;
        }
        $offset = ($sheet - 1) * $limit;
        $att_ids = array_slice($att_ids, $offset, $limit);
        // https://core.trac.wordpress.org/ticket/12212
        $atts = array();
        if (!empty($att_ids)) {
            $atts = get_posts(array('post_type' => 'any', 'post_status' => 'any', 'numberposts' => -1, 'post__in' => $att_ids, 'orderby' => 'post__in'));
        }
        $titles = array();
        $contents = array();
        foreach ($atts as $att) {
            $path_parts = pathinfo($att->guid);
            $titles[$att->ID] = !empty($att->post_title) ? $att->post_title : $path_parts['filename'];
            $types[$att->ID] = $path_parts['extension'];
            $contents[$att->ID] = $att->post_content;
        }
        unset($atts);
        $thead = '<tr>' . '<th scope="col" class="manage-column column-cb check-column">' . '<label class="screen-reader-text" for="cb-select-all-%1$d">' . __('Select All', 'document-gallery') . '</label>' . '<input id="cb-select-all-%1$d" type="checkbox">' . '</th>' . '<th scope="col" class="manage-column column-icon">' . __('Thumbnail', 'document-gallery') . '</th>' . '<th scope="col" class="manage-column column-title ' . ($orderby != 'title' ? 'sortable desc' : 'sorted ' . $order) . '"><a href="?' . http_build_query(array_merge($URL_params, array('orderby' => 'title', 'order' => $orderby != 'title' ? 'asc' : ($order == 'asc' ? 'desc' : 'asc')))) . '"><span>' . __('File name', 'document-gallery') . '</span><span class="sorting-indicator"></span></th>' . '<th scope="col" class="manage-column column-description">' . __('Description', 'document-gallery') . '</th>' . '<th scope="col" class="manage-column column-thumbupload"></th>' . '<th scope="col" class="manage-column column-date ' . ($orderby != 'date' ? 'sortable asc' : 'sorted ' . $order) . '"><a href="?' . http_build_query(array_merge($URL_params, array('orderby' => 'date', 'order' => $orderby != 'date' ? 'desc' : ($order == 'asc' ? 'desc' : 'asc')))) . '"><span>' . __('Date', 'document-gallery') . '</span><span class="sorting-indicator"></span></th>' . '</tr>';
        $pagination = '<div class="alignleft bulkactions"><button class="button action deleteSelected">' . __('Delete Selected', 'document-gallery') . '</button></div><div class="tablenav-pages">' . '<span class="displaying-num">' . $thumbs_number . ' ' . _n('item', 'items', $thumbs_number) . '</span>' . ($lastsheet > 1 ? '<span class="pagination-links">' . '<a class="first-page' . ($sheet == 1 ? ' disabled' : '') . '" title="' . __('Go to the first page', 'document-gallery') . '"' . ($sheet == 1 ? '' : ' href="?' . http_build_query($URL_params) . '"') . '>«</a>' . '<a class="prev-page' . ($sheet == 1 ? ' disabled' : '') . '" title="' . __('Go to the previous page', 'document-gallery') . '"' . ($sheet == 1 ? '' : ' href="?' . http_build_query(array_merge($URL_params, array('sheet' => $sheet - 1))) . '"') . '>‹</a>' . '<span class="paging-input">' . '<input class="current-page" title="' . __('Current page', 'document-gallery') . '" type="text" name="paged" value="' . $sheet . '" size="' . strlen($sheet) . '" maxlength="' . strlen($sheet) . '"> ' . __('of', 'document-gallery') . ' <span class="total-pages">' . $lastsheet . '</span></span>' . '<a class="next-page' . ($sheet == $lastsheet ? ' disabled' : '') . '" title="' . __('Go to the next page', 'document-gallery') . '"' . ($sheet == $lastsheet ? '' : ' href="?' . http_build_query(array_merge($URL_params, array('sheet' => $sheet + 1))) . '"') . '>›</a>' . '<a class="last-page' . ($sheet == $lastsheet ? ' disabled' : '') . '" title="' . __('Go to the last page', 'document-gallery') . '"' . ($sheet == $lastsheet ? '' : ' href="?' . http_build_query(array_merge($URL_params, array('sheet' => $lastsheet))) . '"') . '>»</a>' . '</span>' : ' <b>|</b> ') . '<span class="displaying-num"><select dir="rtl" class="limit_per_page">' . $select_limit . '</select> ' . __('items per page', 'document-gallery') . '</span>' . '</div>' . '<br class="clear" />';
        ?>

		<script type="text/javascript">
			var URL_params = <?php 
        echo wp_json_encode($URL_params);
        ?>
;
		</script>
		<div class="thumbs-list-wrapper">
			<div>
				<div class="tablenav top"><?php 
        echo $pagination;
        ?>
</div>
				<table id="ThumbsTable" class="wp-list-table widefat fixed media"
				       cellpadding="0" cellspacing="0">
					<thead>
					<?php 
        printf($thead, 1);
        ?>
					</thead>
					<tfoot>
					<?php 
        printf($thead, 2);
        ?>
					</tfoot>
					<tbody><?php 
        $i = 0;
        foreach ($options['thumbs'] as $v) {
            if ($i < $offset) {
                $i++;
                continue;
            }
            if (++$i > $offset + $limit) {
                break;
            }
            $icon = isset($v['thumb_url']) ? $v['thumb_url'] : DG_Thumber::getDefaultThumbnail($v['thumb_id']);
            $title = isset($titles[$v['thumb_id']]) ? $titles[$v['thumb_id']] : '';
            $type = $types[$v['thumb_id']];
            $description = $contents[$v['thumb_id']];
            $date = DocumentGallery::localDateTimeFromTimestamp($v['timestamp']);
            ?>
						<tr data-entry="<?php 
            echo $v['thumb_id'];
            ?>
">
							<td scope="row" class="check-column">
								<input
									type="checkbox"
									class="cb-ids"
									name="<?php 
            echo DG_OPTION_NAME;
            ?>
[ids][]"
									value="<?php 
            echo $v['thumb_id'];
            ?>
">
							</td>
							<td class="column-icon media-icon"><img src="<?php 
            echo $icon;
            ?>
" /></td>
							<td class="title column-title">
								<strong>
									<a
										href="<?php 
            echo home_url('/?attachment_id=' . $v['thumb_id']);
            ?>
"
										target="_blank"
										title="<?php 
            sprintf(__("View '%s' attachment page", 'document-gallery'), $title);
            ?>
">
										<span class="editable-title"><?php 
            echo $title;
            ?>
</span>
										<sup><?php 
            echo $type;
            ?>
</sup>
									</a>
								</strong>
								<span class="dashicons dashicons-edit"></span>
								<span class="edit-controls">
									<span class="dashicons dashicons-yes"></span>
									<span class="dashicons dashicons-no"></span>
								</span>
							</td>
							<td class="column-description">
								<div class="editable-description"><?php 
            echo $description;
            ?>
</div>
								<span class="dashicons dashicons-edit"></span>
								<span class="edit-controls">
									<span class="dashicons dashicons-yes"></span>
									<span class="dashicons dashicons-no"></span>
									<span class="dashicons dashicons-update"></span>
								</span>
							</td>
							<td class="column-thumbupload">
								<span class="manual-download">
									<span class="dashicons dashicons-upload"></span>
									<span class="html5dndmarker">Drop file here<span> or </span></span>
									<span class="buttons-area">
										<input id="upload-button<?php 
            echo $v['thumb_id'];
            ?>
" type="file" />
										<input id="trigger-button<?php 
            echo $v['thumb_id'];
            ?>
" type="button" value="Select File" class="button" />
									</span>
								</span>
								<div class="progress animate invis">
									<span><span></span></span>
								</div>
							</td>
							<td class="date column-date"><?php 
            echo $date;
            ?>
</td>
						</tr>
						<?php 
        }
        ?>
					</tbody>
				</table>
				<div class="tablenav bottom"><?php 
        echo $pagination;
        ?>
</div>
			</div>
		</div>
	<?php 
    }
 /**
  * Render a Meta Box.
  * @param $post WP_Post The post.
  */
 public static function renderMetaBox($post)
 {
     // Disabling scripts that have nothing to do with Edit Media pages
     wp_dequeue_script('dg-media-manager');
     remove_filter('mce_external_plugins', array(__CLASS__, 'mce_external_plugins'));
     remove_filter('mce_css', array(__CLASS__, 'dg_plugin_mce_css'));
     wp_nonce_field(DG_OPTION_NAME . '_meta_box', DG_OPTION_NAME . '_meta_box_nonce');
     $ID = $post->ID;
     $options = DG_Thumber::getOptions();
     $thumb = DG_Thumb::getThumb($ID, $options['width'] . 'x' . $options['height']);
     $icon = !is_null($thumb) && $thumb->isSuccess() ? $thumb->getUrl() : DG_DefaultThumber::getInstance()->getThumbnail($ID);
     echo '<table id="ThumbsTable" class="wp-list-table widefat fixed media" cellpadding="0" cellspacing="0">' . '<tbody><tr data-entry="' . $ID . '"><td class="column-icon media-icon"><img src="' . $icon . '" />' . '</td><td class="column-thumbupload">' . '<span class="manual-download">' . '<span class="dashicons dashicons-upload"></span>' . '<span class="html5dndmarker">Drop file here<span> or </span></span>' . '<span class="buttons-area">' . '<input id="upload-button' . $ID . '" type="file" />' . '<input id="trigger-button' . $ID . '" type="button" value="Select File" class="button" />' . '</span>' . '</span>' . '</td></tr></tbody></table>' . (is_null($thumb) ? '<span class="dashicons dashicons-info"></span><span class="">Please note this attachment hasn&#39;t been used in any Document Gallery instance and so there is no autogenerated thumbnail, in the meantime default one is used instead.</span>' : '') . PHP_EOL;
 }
/**
 * Render the Thumbnail table.
 */
function dg_render_thumbnail_section()
{
    global $dg_url_params;
    include_once DG_PATH . 'inc/class-thumber.php';
    static $limit_options = array(10, 25, 75);
    static $order_options = array('asc', 'desc');
    static $orderby_options = array('date', 'title');
    $options = DG_Thumber::getOptions();
    // find subset of thumbs to be included
    $orderby = $dg_url_params['orderby'] = dg_get_orderby_param($orderby_options);
    $order = $dg_url_params['order'] = dg_get_order_param($order_options);
    $limit = $dg_url_params['limit'] = dg_get_limit_param();
    /** @var DG_Thumb[] $thumbs */
    $thumbs = DG_Thumb::getThumbs($options['width'] . 'x' . $options['height']);
    uasort($thumbs, 'dg_cmp_thumb');
    $thumbs_number = count($thumbs);
    $lastsheet = ceil($thumbs_number / $limit);
    $sheet = isset($_REQUEST['sheet']) ? absint($_REQUEST['sheet']) : 1;
    if ($sheet === 0 || $sheet > $lastsheet) {
        $sheet = 1;
    }
    $offset = ($sheet - 1) * $limit;
    $thumbs = array_slice($thumbs, $offset, $limit, true);
    // https://core.trac.wordpress.org/ticket/12212
    $posts = array();
    if (!empty($thumbs)) {
        $posts = get_posts(array('post_type' => 'any', 'post_status' => 'any', 'numberposts' => -1, 'post__in' => array_keys($thumbs), 'orderby' => 'post__in'));
    }
    foreach ($posts as $post) {
        $path_parts = pathinfo($post->guid);
        $thumb = $thumbs[$post->ID];
        $thumbs[$post->ID] = array();
        $t =& $thumbs[$post->ID];
        $t['timestamp'] = $thumb->getTimestamp();
        $t['title'] = dg_get_thumb_title($post);
        $t['ext'] = isset($path_parts['extension']) ? $path_parts['extension'] : '';
        $t['description'] = $post->post_content;
        $t['icon'] = $thumb->isSuccess() ? $thumb->getUrl() : DG_DefaultThumber::getInstance()->getThumbnail($post->ID);
    }
    unset($posts);
    $select_limit = '';
    foreach ($limit_options as $l_o) {
        $select_limit .= '<option value="' . $l_o . '"' . selected($limit, $l_o, false) . '>' . $l_o . '</option>' . PHP_EOL;
    }
    $thead = '<tr>' . '<th scope="col" class="manage-column column-cb check-column">' . '<label class="screen-reader-text" for="cb-select-all-%1$d">' . __('Select All', 'document-gallery') . '</label>' . '<input id="cb-select-all-%1$d" type="checkbox">' . '</th>' . '<th scope="col" class="manage-column column-icon">' . __('Thumbnail', 'document-gallery') . '</th>' . '<th scope="col" class="manage-column column-title ' . ($orderby != 'title' ? 'sortable desc' : 'sorted ' . $order) . '"><a href="?' . http_build_query(array_merge($dg_url_params, array('orderby' => 'title', 'order' => $orderby != 'title' ? 'asc' : ($order == 'asc' ? 'desc' : 'asc')))) . '"><span>' . __('File name', 'document-gallery') . '</span><span class="sorting-indicator"></span></th>' . '<th scope="col" class="manage-column column-description">' . __('Description', 'document-gallery') . '</th>' . '<th scope="col" class="manage-column column-thumbupload"></th>' . '<th scope="col" class="manage-column column-date ' . ($orderby != 'date' ? 'sortable asc' : 'sorted ' . $order) . '"><a href="?' . http_build_query(array_merge($dg_url_params, array('orderby' => 'date', 'order' => $orderby != 'date' ? 'desc' : ($order == 'asc' ? 'desc' : 'asc')))) . '"><span>' . __('Date', 'document-gallery') . '</span><span class="sorting-indicator"></span></th>' . '</tr>';
    $pagination = '<div class="alignleft bulkactions"><button class="button action deleteSelected">' . __('Delete Selected', 'document-gallery') . '</button></div><div class="tablenav-pages">' . '<span class="displaying-num">' . $thumbs_number . ' ' . _n('item', 'items', $thumbs_number, 'document-gallery') . '</span>' . ($lastsheet > 1 ? '<span class="pagination-links">' . '<a class="first-page' . ($sheet == 1 ? ' disabled' : '') . '" title="' . __('Go to the first page', 'document-gallery') . '"' . ($sheet == 1 ? '' : ' href="?' . http_build_query($dg_url_params) . '"') . '>«</a>' . '<a class="prev-page' . ($sheet == 1 ? ' disabled' : '') . '" title="' . __('Go to the previous page', 'document-gallery') . '"' . ($sheet == 1 ? '' : ' href="?' . http_build_query(array_merge($dg_url_params, array('sheet' => $sheet - 1))) . '"') . '>‹</a>' . '<span class="paging-input">' . '<input class="current-page" title="' . __('Current page', 'document-gallery') . '" type="text" name="paged" value="' . $sheet . '" size="' . strlen($sheet) . '" maxlength="' . strlen($sheet) . '"> ' . __('of', 'document-gallery') . ' <span class="total-pages">' . $lastsheet . '</span></span>' . '<a class="next-page' . ($sheet == $lastsheet ? ' disabled' : '') . '" title="' . __('Go to the next page', 'document-gallery') . '"' . ($sheet == $lastsheet ? '' : ' href="?' . http_build_query(array_merge($dg_url_params, array('sheet' => $sheet + 1))) . '"') . '>›</a>' . '<a class="last-page' . ($sheet == $lastsheet ? ' disabled' : '') . '" title="' . __('Go to the last page', 'document-gallery') . '"' . ($sheet == $lastsheet ? '' : ' href="?' . http_build_query(array_merge($dg_url_params, array('sheet' => $lastsheet))) . '"') . '>»</a>' . '</span>' : ' <b>|</b> ') . '<span class="displaying-num"><select dir="rtl" class="limit_per_page">' . $select_limit . '</select> ' . __('items per page', 'document-gallery') . '</span>' . '</div>' . '<br class="clear" />';
    ?>

    <script type="text/javascript">
        var URL_params = <?php 
    echo wp_json_encode($dg_url_params);
    ?>
;
    </script>
    <div class="thumbs-list-wrapper">
        <div>
            <div class="tablenav top"><?php 
    echo $pagination;
    ?>
</div>
            <table id="ThumbsTable" class="wp-list-table widefat fixed media"
                   cellpadding="0" cellspacing="0">
                <thead>
                <?php 
    printf($thead, 1);
    ?>
                </thead>
                <tfoot>
                <?php 
    printf($thead, 2);
    ?>
                </tfoot>
                <tbody><?php 
    foreach ($thumbs as $tid => $thumb) {
        $icon = $thumb['icon'];
        $title = $thumb['title'];
        $ext = $thumb['ext'];
        $description = $thumb['description'];
        $date = DocumentGallery::localDateTimeFromTimestamp($thumb['timestamp']);
        ?>
                    <tr data-entry="<?php 
        echo $tid;
        ?>
">
                        <td scope="row" class="check-column">
                            <input
                                type="checkbox"
                                class="cb-ids"
                                name="<?php 
        echo DG_OPTION_NAME;
        ?>
[ids][]"
                                value="<?php 
        echo $tid;
        ?>
">
                        </td>
                        <td class="column-icon media-icon"><img src="<?php 
        echo $icon;
        ?>
" /></td>
                        <td class="title column-title">
                            <strong>
                                <a
                                    href="<?php 
        echo home_url('/?attachment_id=' . $tid);
        ?>
"
                                    target="_blank"
                                    title="<?php 
        sprintf(__("View '%s' attachment page", 'document-gallery'), $title);
        ?>
">
                                    <span class="editable-title"><?php 
        echo $title;
        ?>
</span>
                                    <sup><?php 
        echo $ext;
        ?>
</sup>
                                </a>
                            </strong>
                            <span class="dashicons dashicons-edit"></span>
								<span class="edit-controls">
									<span class="dashicons dashicons-yes"></span>
									<span class="dashicons dashicons-no"></span>
								</span>
                        </td>
                        <td class="column-description">
                            <div class="editable-description"><?php 
        echo $description;
        ?>
</div>
                            <span class="dashicons dashicons-edit"></span>
								<span class="edit-controls">
									<span class="dashicons dashicons-yes"></span>
									<span class="dashicons dashicons-no"></span>
									<span class="dashicons dashicons-update"></span>
								</span>
                        </td>
                        <td class="column-thumbupload">
								<span class="manual-download">
									<span class="dashicons dashicons-upload"></span>
									<span class="html5dndmarker">Drop file here<span> or </span></span>
									<span class="buttons-area">
										<input id="upload-button<?php 
        echo $tid;
        ?>
" type="file" />
										<input id="trigger-button<?php 
        echo $tid;
        ?>
" type="button" value="Select File" class="button" />
									</span>
								</span>
                            <div class="progress animate invis">
                                <span><span></span></span>
                            </div>
                        </td>
                        <td class="date column-date"><?php 
        echo $date;
        ?>
</td>
                    </tr>
                    <?php 
    }
    ?>
                </tbody>
            </table>
            <div class="tablenav bottom"><?php 
    echo $pagination;
    ?>
</div>
        </div>
    </div>
<?php 
}
 /**
  * @return bool Whether we can use the GS executable.
  */
 public static function isGhostscriptAvailable()
 {
     static $ret = null;
     if (is_null($ret)) {
         $options = DG_Thumber::getOptions();
         $ret = $options['gs'] && self::isExecAvailable();
     }
     return $ret;
 }