blog->getPosts(['post_id' => $post_id]); if ($post->isEmpty()) { $post_id = null; } $post_title = $post->post_title; unset($post); } // Attachement type if any $link_type = !empty($_REQUEST['link_type']) ? $_REQUEST['link_type'] : null; $file = null; $popup = (integer) !empty($_REQUEST['popup']); $select = !empty($_REQUEST['select']) ? (integer) $_REQUEST['select'] : 0; // 0 : none, 1 : single media, >1 : multiple medias $plugin_id = isset($_REQUEST['plugin_id']) ? html::sanitizeURL($_REQUEST['plugin_id']) : ''; $page_url_params = ['popup' => $popup, 'select' => $select, 'post_id' => $post_id]; $media_page_url_params = ['popup' => $popup, 'select' => $select, 'post_id' => $post_id, 'link_type' => $link_type]; if ($plugin_id != '') { $page_url_params['plugin_id'] = $plugin_id; $media_page_url_params['plugin_id'] = $plugin_id; } $id = !empty($_REQUEST['id']) ? (integer) $_REQUEST['id'] : ''; if ($id != '') { $page_url_params['id'] = $id; } if ($popup) { $open_f = ['dcPage', 'openPopup']; $close_f = ['dcPage', 'closePopup']; } else { $open_f = ['dcPage', 'open']; $close_f = function () { dcPage::helpBlock('core_media'); dcPage::close(); }; } $core_media_writable = false; try { $core->media = new dcMedia($core); if ($id) { $file = $core->media->getFile($id); } if ($file === null) { throw new Exception(__('Not a valid file')); } $core->media->chdir(dirname($file->relname)); $core_media_writable = $core->media->writable(); # Prepare directories combo box $dirs_combo = []; foreach ($core->media->getDBDirs() as $v) { $dirs_combo['/' . $v] = $v; } # Add parent and direct childs directories if any $core->media->getFSDir(); foreach ($core->media->dir['dirs'] as $k => $v) { $dirs_combo['/' . $v->relname] = $v->relname; } ksort($dirs_combo); } catch (Exception $e) { $core->error->add($e->getMessage()); } # Upload a new file if ($file && !empty($_FILES['upfile']) && $file->editable && $core_media_writable) { try { files::uploadStatus($_FILES['upfile']); $core->media->uploadFile($_FILES['upfile']['tmp_name'], $file->basename, null, false, true); dcPage::addSuccessNotice(__('File has been successfully updated.')); $core->adminurl->redirect('admin.media.item', $page_url_params); } catch (Exception $e) { $core->error->add($e->getMessage()); } } # Update file if ($file && !empty($_POST['media_file']) && $file->editable && $core_media_writable) { $newFile = clone $file; $newFile->basename = $_POST['media_file']; if ($_POST['media_path']) { $newFile->dir = $_POST['media_path']; $newFile->relname = $_POST['media_path'] . '/' . $newFile->basename; } else { $newFile->dir = ''; $newFile->relname = $newFile->basename; } $newFile->media_title = html::escapeHTML($_POST['media_title']); $newFile->media_dt = strtotime($_POST['media_dt']); $newFile->media_dtstr = $_POST['media_dt']; $newFile->media_priv = !empty($_POST['media_private']); try { $core->media->updateFile($file, $newFile); dcPage::addSuccessNotice(__('File has been successfully updated.')); $page_url_params['tab'] = 'media-details-tab'; $core->adminurl->redirect('admin.media.item', $page_url_params); } catch (Exception $e) { $core->error->add($e->getMessage()); } } # Update thumbnails if (!empty($_POST['thumbs']) && $file->media_type == 'image' && $file->editable && $core_media_writable) { try { $foo = null; $core->media->mediaFireRecreateEvent($file); dcPage::addSuccessNotice(__('Thumbnails have been successfully updated.')); $page_url_params['tab'] = 'media-details-tab'; $core->adminurl->redirect('admin.media.item', $page_url_params); } catch (Exception $e) { $core->error->add($e->getMessage()); } } # Unzip file if (!empty($_POST['unzip']) && $file->type == 'application/zip' && $file->editable && $core_media_writable) { try { $unzip_dir = $core->media->inflateZipFile($file, $_POST['inflate_mode'] == 'new'); dcPage::addSuccessNotice(__('Zip file has been successfully extracted.')); $media_page_url_params['d'] = $unzip_dir; $core->adminurl->redirect('admin.media', $media_page_url_params); } catch (Exception $e) { $core->error->add($e->getMessage()); } } # Save media insertion settings for the blog if (!empty($_POST['save_blog_prefs'])) { if (!empty($_POST['pref_src'])) { foreach (array_reverse($file->media_thumb) as $s => $v) { if ($v == $_POST['pref_src']) { $core->blog->settings->system->put('media_img_default_size', $s); break; } } } if (!empty($_POST['pref_alignment'])) { $core->blog->settings->system->put('media_img_default_alignment', $_POST['pref_alignment']); } if (!empty($_POST['pref_insertion'])) { $core->blog->settings->system->put('media_img_default_link', ($_POST['pref_insertion'] == 'link')); } if (!empty($_POST['pref_legend'])) { $core->blog->settings->system->put('media_img_default_legend', $_POST['pref_legend']); } dcPage::addSuccessNotice(__('Default media insertion settings have been successfully updated.')); $core->adminurl->redirect('admin.media.item', $page_url_params); } # Function to get image title based on meta $get_img_title = function ($file, $pattern, $dto_first = false, $no_date_alone = false) { $res = []; $pattern = preg_split('/\s*;;\s*/', $pattern); $sep = ', '; $dates = 0; $items = 0; foreach ($pattern as $v) { if ($v == 'Title') { if ($file->media_title != '') { $res[] = $file->media_title; } $items++; } elseif ($file->media_meta->{$v}) { if ((string) $file->media_meta->{$v} != '') { $res[] = (string) $file->media_meta->{$v}; } $items++; } elseif (preg_match('/^Date\((.+?)\)$/u', $v, $m)) { if ($dto_first && ($file->media_meta->DateTimeOriginal != 0)) { $res[] = dt::dt2str($m[1], (string) $file->media_meta->DateTimeOriginal); } else { $res[] = dt::str($m[1], $file->media_dt); } $items++; $dates++; } elseif (preg_match('/^DateTimeOriginal\((.+?)\)$/u', $v, $m) && $file->media_meta->DateTimeOriginal) { $res[] = dt::dt2str($m[1], (string) $file->media_meta->DateTimeOriginal); $items++; $dates++; } elseif (preg_match('/^separator\((.*?)\)$/u', $v, $m)) { $sep = $m[1]; } } if ($no_date_alone && $dates == count($res) && $dates < $items) { // On ne laisse pas les dates seules, sauf si ce sont les seuls items du pattern (hors séparateur) return ''; } return implode($sep, $res); }; /* DISPLAY Main page -------------------------------------------------------- */ $starting_scripts = '" . dcPage::jsModal() . dcPage::jsLoad('js/_media_item.js'); if ($popup && !empty($plugin_id)) { $starting_scripts .= $core->callBehavior('adminPopupMedia', $plugin_id); } $temp_params = $media_page_url_params; $temp_params['d'] = '%s'; $breadcrumb = $core->media->breadCrumb($core->adminurl->get('admin.media', $temp_params, '&', true)) . ($file === null ? '' : '' . $file->basename . ''); $temp_params['d'] = ''; $home_url = $core->adminurl->get('admin.media', $temp_params); call_user_func($open_f, __('Media manager'), $starting_scripts . dcPage::jsDatePicker() . ($popup ? dcPage::jsPageTabs($tab) : ''), dcPage::breadcrumb( [ html::escapeHTML($core->blog->name) => '', __('Media manager') => $home_url, $breadcrumb => '' ], [ 'home_link' => !$popup, 'hl' => false ] ) ); if ($popup) { // Display notices echo dcPage::notices(); } if ($file === null) { call_user_func($close_f); exit; } if (!empty($_GET['fupd']) || !empty($_GET['fupl'])) { dcPage::success(__('File has been successfully updated.')); } if (!empty($_GET['thumbupd'])) { dcPage::success(__('Thumbnails have been successfully updated.')); } if (!empty($_GET['blogprefupd'])) { dcPage::success(__('Default media insertion settings have been successfully updated.')); } # Get major file type (first part of mime type) $file_type = explode('/', $file->type); # Selection mode if ($select) { // Let user choose thumbnail size if image $media_desc = $file->media_title; echo '
' . '

' . __('Select media item') . '

' . '
'; $media_img_default_size = $core->blog->settings->system->media_img_default_size; if ($media_img_default_size == '') { $media_img_default_size = 'm'; } $media_img_default_alignment = $core->blog->settings->system->media_img_default_alignment; if ($media_img_default_alignment == '') { $media_img_default_alignment = 'none'; } $media_img_default_link = (boolean) $core->blog->settings->system->media_img_default_link; $media_img_default_legend = $core->blog->settings->system->media_img_default_legend; if ($media_img_default_legend == '') { $media_img_default_legend = 'legend'; } if ($file->media_type == 'image') { $media_type = 'image'; $media_desc = $get_img_title($file, $core->blog->settings->system->media_img_title_pattern, $core->blog->settings->system->media_img_use_dto_first, $core->blog->settings->system->media_img_no_date_alone); if ($media_desc == $file->basename) { $media_desc = ''; } echo '

' . __('Image size:') . '

'; $s_checked = false; echo '

'; foreach (array_reverse($file->media_thumb) as $s => $v) { $s_checked = ($s == $media_img_default_size); echo '
'; } $s_checked = (!isset($file->media_thumb[$media_img_default_size])); echo '
'; echo '

'; } elseif ($file_type[0] == 'audio') { $media_type = 'mp3'; } elseif ($file_type[0] == 'video') { $media_type = 'flv'; } else { $media_type = 'default'; } echo '

' . ' ' . '' . form::hidden(['type'], html::escapeHTML($media_type)) . form::hidden(['title'], html::escapeHTML($file->media_title)) . form::hidden(['description'], html::escapeHTML($media_desc)) . form::hidden(['url'], $file->file_url) . '

'; echo '
'; echo '
'; } # Insertion popup if ($popup && !$select) { $media_desc = $file->media_title; echo '
' . '

' . __('Insert media item') . '

' . '
'; $media_img_default_size = $core->blog->settings->system->media_img_default_size; if ($media_img_default_size == '') { $media_img_default_size = 'm'; } $media_img_default_alignment = $core->blog->settings->system->media_img_default_alignment; if ($media_img_default_alignment == '') { $media_img_default_alignment = 'none'; } $media_img_default_link = (boolean) $core->blog->settings->system->media_img_default_link; $media_img_default_legend = $core->blog->settings->system->media_img_default_legend; if ($media_img_default_legend == '') { $media_img_default_legend = 'legend'; } if ($file->media_type == 'image') { $media_type = 'image'; $media_desc = $get_img_title($file, $core->blog->settings->system->media_img_title_pattern, $core->blog->settings->system->media_img_use_dto_first, $core->blog->settings->system->media_img_no_date_alone); if ($media_desc == $file->basename) { $media_desc = ''; } echo '
' . '

' . __('Image size:') . '

'; $s_checked = false; echo '

'; foreach (array_reverse($file->media_thumb) as $s => $v) { $s_checked = ($s == $media_img_default_size); echo '
'; } $s_checked = (!isset($file->media_thumb[$media_img_default_size])); echo '
'; echo '

'; echo '
'; echo '
' . '

' . __('Image legend and title') . '

' . '

' . '
' . '
' . '' . '

' . '
'; echo '
' . '

' . __('Image alignment') . '

'; $i_align = [ 'none' => [__('None'), ($media_img_default_alignment == 'none' ? 1 : 0)], 'left' => [__('Left'), ($media_img_default_alignment == 'left' ? 1 : 0)], 'right' => [__('Right'), ($media_img_default_alignment == 'right' ? 1 : 0)], 'center' => [__('Center'), ($media_img_default_alignment == 'center' ? 1 : 0)] ]; echo '

'; foreach ($i_align as $k => $v) { echo '
'; } echo '

'; echo '
'; echo '
' . '

' . __('Image insertion') . '

' . '

' . '
' . '' . '

' . '
'; } elseif ($file_type[0] == 'audio') { $media_type = 'mp3'; echo '
' . '

' . __('MP3 disposition') . '

'; dcPage::message(__("Please note that you cannot insert mp3 files with visual editor."), false); $i_align = [ 'none' => [__('None'), ($media_img_default_alignment == 'none' ? 1 : 0)], 'left' => [__('Left'), ($media_img_default_alignment == 'left' ? 1 : 0)], 'right' => [__('Right'), ($media_img_default_alignment == 'right' ? 1 : 0)], 'center' => [__('Center'), ($media_img_default_alignment == 'center' ? 1 : 0)] ]; echo '

'; foreach ($i_align as $k => $v) { echo '
'; } $public_player_style = unserialize($core->blog->settings->themes->mp3player_style); $public_player = dcMedia::audioPlayer($file->type, $file->file_url, $core->blog->getQmarkURL() . 'pf=player_mp3.swf', $public_player_style, $core->blog->settings->system->media_flash_fallback); echo form::hidden('public_player', html::escapeHTML($public_player)); echo '

'; echo '
'; } elseif ($file_type[0] == 'video') { $media_type = 'flv'; dcPage::message(__("Please note that you cannot insert video files with visual editor."), false); echo '
' . '

' . __('Video size') . '

' . '

' . form::number('video_w', 0, 9999, $core->blog->settings->system->media_video_width) . ' ' . ' ' . form::number('video_h', 0, 9999, $core->blog->settings->system->media_video_height) . '

' . '
'; echo '
' . '

' . __('Video disposition') . '

'; $i_align = [ 'none' => [__('None'), ($media_img_default_alignment == 'none' ? 1 : 0)], 'left' => [__('Left'), ($media_img_default_alignment == 'left' ? 1 : 0)], 'right' => [__('Right'), ($media_img_default_alignment == 'right' ? 1 : 0)], 'center' => [__('Center'), ($media_img_default_alignment == 'center' ? 1 : 0)] ]; echo '

'; foreach ($i_align as $k => $v) { echo '
'; } $public_player_style = unserialize($core->blog->settings->themes->flvplayer_style); $public_player = dcMedia::videoPlayer($file->type, $file->file_url, $core->blog->getQmarkURL() . 'pf=player_flv.swf', $public_player_style, $core->blog->settings->system->media_flash_fallback); echo form::hidden('public_player', html::escapeHTML($public_player)); echo '

'; echo '
'; } else { $media_type = 'default'; echo '

' . __('Media item will be inserted as a link.') . '

'; } echo '

' . ' ' . '' . form::hidden(['type'], html::escapeHTML($media_type)) . form::hidden(['title'], html::escapeHTML($file->media_title)) . form::hidden(['description'], html::escapeHTML($media_desc)) . form::hidden(['url'], $file->file_url) . '

'; echo '
'; if ($media_type != 'default') { echo '
' . '
' . '

' . __('Make current settings as default') . ' ' . '' . form::hidden(['pref_src'], '') . form::hidden(['pref_alignment'], '') . form::hidden(['pref_insertion'], '') . form::hidden(['pref_legend'], '') . $core->adminurl->getHiddenFormFields('admin.media.item', $page_url_params) . $core->formNonce() . '

' . '
' . '
'; } echo '
'; } if ($popup || $select) { echo '
'; } else { echo '

' . __('Media details') . '

'; } echo '

'; echo '
' . '
'; if ($file->media_image) { $thumb_size = !empty($_GET['size']) ? $_GET['size'] : 's'; if (!isset($core->media->thumb_sizes[$thumb_size]) && $thumb_size != 'o') { $thumb_size = 's'; } if (isset($file->media_thumb[$thumb_size])) { echo '

' . '' . '

'; } elseif ($thumb_size == 'o') { $S = getimagesize($file->file); $class = ($S[1] > 500) ? ' class="overheight"' : ''; unset($S); echo '

' . '' . '

'; } echo '

' . __('Available sizes:') . ' '; foreach (array_reverse($file->media_thumb) as $s => $v) { $strong_link = ($s == $thumb_size) ? '%s' : '%s'; printf($strong_link, ' $s, 'tab' => 'media-details-tab'])) . '">' . $core->media->thumb_sizes[$s][2] . ' | '); } echo ' "o", "tab" => "media-details-tab"])) . '">' . __('original') . ''; echo '

'; if ($thumb_size != 'o' && isset($file->media_thumb[$thumb_size])) { $p = path::info($file->file); $alpha = ($p['extension'] == 'png') || ($p['extension'] == 'PNG'); $thumb = sprintf(($alpha ? $core->media->thumb_tp_alpha : $core->media->thumb_tp), $p['dirname'], $p['base'], '%s'); $thumb_file = sprintf($thumb, $thumb_size); $T = getimagesize($thumb_file); $stats = stat($thumb_file); echo '

' . __('Thumbnail details') . '

' . '
    ' . '
  • ' . __('Image width:') . ' ' . $T[0] . ' px
  • ' . '
  • ' . __('Image height:') . ' ' . $T[1] . ' px
  • ' . '
  • ' . __('File size:') . ' ' . files::size($stats[7]) . '
  • ' . '
  • ' . __('File URL:') . ' ' . $file->media_thumb[$thumb_size] . '
  • ' . '
'; } } // Show player if relevant if ($file_type[0] == 'audio') { echo dcMedia::audioPlayer($file->type, $file->file_url, $core->adminurl->get("admin.home", ['pf' => 'player_mp3.swf']), null, $core->blog->settings->system->media_flash_fallback); } if ($file_type[0] == 'video') { echo dcMedia::videoPlayer($file->type, $file->file_url, $core->adminurl->get("admin.home", ['pf' => 'player_flv.swf']), null, $core->blog->settings->system->media_flash_fallback); } echo '

' . __('Media details') . '

' . '
    ' . '
  • ' . __('File owner:') . ' ' . $file->media_user . '
  • ' . '
  • ' . __('File type:') . ' ' . $file->type . '
  • '; if ($file->media_image) { $S = getimagesize($file->file); echo '
  • ' . __('Image width:') . ' ' . $S[0] . ' px
  • ' . '
  • ' . __('Image height:') . ' ' . $S[1] . ' px
  • '; unset($S); } echo '
  • ' . __('File size:') . ' ' . files::size($file->size) . '
  • ' . '
  • ' . __('File URL:') . ' ' . $file->file_url . '
  • ' . '
'; if (empty($_GET['find_posts'])) { echo '

1, "tab" => "media-details-tab"])) . '">' . __('Show entries containing this media') . '

'; } else { echo '

' . __('Entries containing this media') . '

'; $params = [ 'post_type' => '', 'from' => 'LEFT OUTER JOIN ' . $core->prefix . 'post_media PM ON P.post_id = PM.post_id ', 'sql' => 'AND (' . 'PM.media_id = ' . (integer) $id . ' ' . "OR post_content_xhtml LIKE '%" . $core->con->escape($file->relname) . "%' " . "OR post_excerpt_xhtml LIKE '%" . $core->con->escape($file->relname) . "%' " ]; if ($file->media_image) { # We look for thumbnails too if (preg_match('#^http(s)?://#', $core->blog->settings->system->public_url)) { $media_root = $core->blog->settings->system->public_url; } else { $media_root = $core->blog->host . path::clean($core->blog->settings->system->public_url) . '/'; } foreach ($file->media_thumb as $v) { $v = preg_replace('/^' . preg_quote($media_root, '/') . '/', '', $v); $params['sql'] .= "OR post_content_xhtml LIKE '%" . $core->con->escape($v) . "%' "; $params['sql'] .= "OR post_excerpt_xhtml LIKE '%" . $core->con->escape($v) . "%' "; } } $params['sql'] .= ') '; $rs = $core->blog->getPosts($params); if ($rs->isEmpty()) { echo '

' . __('No entry seems contain this media.') . '

'; } else { echo '
    '; while ($rs->fetch()) { $img = '%1$s'; switch ($rs->post_status) { case 1: $img_status = sprintf($img, __('published'), 'check-on.png'); break; case 0: $img_status = sprintf($img, __('unpublished'), 'check-off.png'); break; case -1: $img_status = sprintf($img, __('scheduled'), 'scheduled.png'); break; case -2: $img_status = sprintf($img, __('pending'), 'check-wrn.png'); break; } echo '
  • ' . $img_status . ' ' . '' . $rs->post_title . '' . ($rs->post_type != 'post' ? ' (' . html::escapeHTML($rs->post_type) . ')' : '') . ' - ' . dt::dt2str(__('%Y-%m-%d %H:%M'), $rs->post_dt) . '
  • '; } echo '
'; } } if ($file->type == 'image/jpeg') { echo '

' . __('Image details') . '

'; $details = ''; if (count($file->media_meta) > 0) { foreach ($file->media_meta as $k => $v) { if ((string) $v) { $details .= '
  • ' . $k . ': ' . html::escapeHTML($v) . '
  • '; } } } if ($details) { echo '
      ' . $details . '
    '; } else { echo '

    ' . __('No detail') . '

    '; } } echo '
    '; echo '

    ' . __('Updates and modifications') . '

    '; if ($file->editable && $core_media_writable) { if ($file->media_type == 'image') { echo '
    ' . '

    ' . __('Update thumbnails') . '

    ' . '

    ' . __('This will create or update thumbnails for this image.') . '

    ' . '

    ' . $core->adminurl->getHiddenFormFields('admin.media', $page_url_params) . $core->formNonce() . '

    ' . '
    '; } if ($file->type == 'application/zip') { $inflate_combo = [ __('Extract in a new directory') => 'new', __('Extract in current directory') => 'current' ]; echo '
    ' . '

    ' . __('Extract archive') . '

    ' . '
      ' . '
    • ' . __('Extract in a new directory') . ' : ' . __('This will extract archive in a new directory that should not exist yet.') . '
    • ' . '
    • ' . __('Extract in current directory') . ' : ' . __('This will extract archive in current directory and will overwrite existing files or directory.') . '
    • ' . '
    ' . '

    ' . form::combo('inflate_mode', $inflate_combo, 'new') . '' . $core->adminurl->getHiddenFormFields('admin.media', $page_url_params) . $core->formNonce() . '

    ' . '
    '; } echo '
    ' . '

    ' . __('Change media properties') . '

    ' . '

    ' . form::field('media_file', 30, 255, html::escapeHTML($file->basename)) . '

    ' . '

    ' . form::field('media_title', 30, 255, [ 'default' => html::escapeHTML($file->media_title), 'extra_html' => 'lang="' . $core->auth->getInfo('user_lang') . '" spellcheck="true"' ]) . '

    ' . '

    ' . form::field('media_dt', 16, 16, html::escapeHTML($file->media_dtstr)) . /* Previous line will be replaced by this one as soon as every browser will support datetime-local input type Dont forget to remove call to datepicker in media_item.js form::datetime('media_dt', ['default' => html::escapeHTML(dt::str('%Y-%m-%dT%H:%M', $file->media_dt))]) . */ '

    ' . '

    ' . '

    ' . form::combo('media_path', $dirs_combo, dirname($file->relname)) . '

    ' . '

    ' . $core->adminurl->getHiddenFormFields('admin.media.item', $page_url_params) . $core->formNonce() . '

    ' . '
    '; echo '
    ' . '

    ' . __('Change file') . '

    ' . '
    ' . form::hidden(['MAX_FILE_SIZE'], DC_MAX_UPLOAD_SIZE) . '
    ' . '

    ' . '

    ' . $core->adminurl->getHiddenFormFields('admin.media', $page_url_params) . $core->formNonce() . '

    ' . '
    '; if ($file->del) { echo '
    ' . '

    ' . form::hidden('remove', rawurlencode($file->basename)) . form::hidden('rmyes', 1) . $core->adminurl->getHiddenFormFields('admin.media', $media_page_url_params) . $core->formNonce() . '

    ' . '
    '; } # --BEHAVIOR-- adminMediaItemForm $core->callBehavior('adminMediaItemForm', $file); } echo '
    '; if ($popup || $select) { echo '
    '; } call_user_func($close_f);