filter($_GET['tagid']); // eg. news, news-thumbnail if($_GET['search']) { $search = e107::getParser()->filter($_GET['search']); $bbcodeMode .= '&search=' .preg_replace('/[^a-z0-9]/i', '',$search); } $for = e107::getParser()->filter($_GET['for']); echo e107::getMedia()->mediaSelect($for,$tag,$bbcodeMode); // require_once(e_ADMIN."footer.php"); exit; } $e_sub_cat = 'image'; // $frm = new e_form(); //new form handler $mes = e107::getMessage(); class media_admin extends e_admin_dispatcher { protected $modes = array( 'main' => array( 'controller' => 'media_admin_ui', 'path' => null, 'ui' => 'media_form_ui', 'uipath' => null ), 'dialog' => array( 'controller' => 'media_admin_ui', 'path' => null, 'ui' => 'media_form_ui', 'uipath' => null ), 'cat' => array( 'controller' => 'media_cat_ui', 'path' => null, 'ui' => 'media_cat_form_ui', 'uipath' => null ) ); protected $adminMenu = array( 'main/grid' => array('caption'=> LAN_IMA_M_01, 'perm' => 'A'), // 'main/create' => array('caption'=> "Add New Media", 'perm' => 'A'), // Should be handled in Media-Import. 'main/import' => array('caption'=> LAN_IMA_M_02, 'perm' => 'A|A1'), 'divider/01' => array('divider'=>true), 'cat/list' => array('caption'=> LAN_IMA_M_03, 'perm' => 'A|A2'), 'cat/create' => array('caption'=> LAN_IMA_M_04, 'perm' => 'A|A2'), // is automatic. // 'main/settings' => array('caption'=> LAN_PREFS, 'perm' => 'A'), // legacy 'divider/02' => array('divider'=>true), 'main/prefs' => array('caption'=> LAN_PREFS, 'perm' => 'A'), 'main/avatar' => array('caption'=> LAN_IMA_M_05, 'perm' => 'A') ); protected $adminMenuIcon = 'e-images-24'; /* $var['main']['text'] = IMALAN_7; $var['main']['link'] = e_SELF; $var['avatars']['text'] = IMALAN_23; $var['avatars']['link'] = e_SELF."?avatars"; $var['editor']['text'] = "Image Manipulation (future release)"; $var['editor']['link'] = e_SELF."?editor";*/ protected $adminMenuAliases = array( 'main/edit' => 'main/grid', 'main/list' => 'main/grid' ); protected $menuTitle = LAN_MEDIAMANAGER; } class media_cat_ui extends e_admin_ui { protected $pluginTitle = LAN_IMA_M_03; protected $pluginName = 'core'; protected $table = 'core_media_cat'; protected $pid = 'media_cat_id'; protected $perPage = 0; //no limit protected $batchDelete = false; public $ownerCount = array(); // protected $listQry = "SELECT * FROM #core_media_cat"; // without any Order or Limit. protected $listOrder = 'media_cat_owner asc'; // protected $editQry = "SELECT * FROM #faq_info WHERE faq_info_id = {ID}"; protected $fields = array( //'checkboxes' => array('title'=> '', 'type' => null, 'width' =>'5%', 'forced'=> TRUE, 'thclass'=>'center', 'class'=>'center'), 'media_cat_id' => array('title'=> LAN_ID, 'type' => 'number', 'width' =>'5%', 'nolist'=>true, 'forced'=> TRUE, 'readonly'=>TRUE), 'media_cat_image' => array('title'=> LAN_IMAGE, 'type' => 'image', 'data' => 'str', 'width' => '100px', 'thclass' => 'center', 'class'=>'center', 'readParms'=>'thumb=60&thumb_urlraw=0&thumb_aw=60','readonly'=>FALSE, 'batch' => FALSE, 'filter'=>FALSE), 'media_cat_owner' => array('title'=> LAN_OWNER, 'type' => 'dropdown', 'width' => 'auto', 'thclass' => 'left', 'readonly'=>FALSE), 'media_cat_type' => array('title'=> LAN_TYPE, 'type' => 'radio', 'data'=>false, 'width' => 'auto', 'thclass' => 'left', 'validate' => true, 'nolist'=>true), 'media_cat_category' => array('title'=> LAN_CATEGORY, 'type' => 'text', 'data'=>'str', 'width' => 'auto', 'thclass' => 'left', 'readonly'=>TRUE), 'media_cat_title' => array('title'=> LAN_TITLE, 'type' => 'text', 'width' => 'auto', 'thclass' => 'left', 'readonly'=>FALSE, 'validate' => true,'writeParms'=>array('size'=>'xxlarge')), 'media_cat_sef' => array('title'=> LAN_SEFURL, 'type' => 'text', 'width' => 'auto', 'thclass' => 'left', 'readonly'=>FALSE, 'writeParms'=>array('size'=>'xxlarge','sef'=>'media_cat_title')), 'media_cat_diz' => array('title'=> LAN_DESCRIPTION, 'type' => 'bbarea', 'width' => '30%', 'readParms' => 'expand=...&truncate=150&bb=1','readonly'=>FALSE), // Display name 'media_cat_class' => array('title'=> LAN_VISIBILITY, 'type' => 'userclass', 'width' => 'auto', 'data' => 'int'), 'media_cat_order' => array('title'=> LAN_ORDER, 'type' => 'text', 'width' => '5%', 'thclass' => 'right', 'class'=> 'right' ), 'options' => array('title'=> LAN_OPTIONS, 'type' => 'method', 'noedit'=>true, 'width' => '10%', 'forced'=>TRUE, 'thclass' => 'center last', 'class' => 'center') ); private $restricted = array(); function init() { $this->restricted = array( '_common' => '_common', '_icon' => '_icon', 'news' => 'news', 'page' => 'page', 'download' => 'download' ); // FIXME LAN $this->fields['media_cat_type']['writeParms'] = array('image' => IMALAN_143, 'file' => IMALAN_144, 'video' => IMALAN_163); if($this->getAction() === 'list') { $this->fields['media_cat_owner']['writeParms'] = $this->restricted; } if($this->getAction() === 'create') { $this->fields['media_cat_category']['noedit'] = true; } elseif($this->getAction() === 'edit') { $this->fields['media_cat_type']['noedit'] = true; } $sql = e107::getDb(); if($sql->gen("SELECT media_cat_owner, MAX(CAST(SUBSTRING_INDEX(media_cat_category, '_', -1 ) AS UNSIGNED)) as maxnum, count(media_cat_id) as number FROM `#core_media_cat` GROUP BY media_cat_owner")) { while($row = $sql->fetch()) { $this->ownerCount[$row['media_cat_owner']] = $row['number']; $own = $row['media_cat_owner']; if(!in_array($own,$this->restricted)) { $this->fields['media_cat_owner']['writeParms'][$own] = $own; if($row['maxnum'] > 0) { $this->ownerCount[$row['media_cat_owner']] = $row['maxnum']; // $maxnum; } } } } e107::getMessage()->addDebug('Max value for category names: ' .print_a($this->ownerCount,true)); } public function createPage() { if(!count($this->fields['media_cat_owner']['writeParms'])) { e107::getMessage()->addInfo('Category creation not available.'); return null; } return $this->getUI()->getCreate(); } public function beforeCreate($new_data, $old_data) { // XXX temporary disable when there is no owners, discuss if(!$new_data['media_cat_owner']) { e107::getMessage()->addError(IMALAN_173); return false; } //$replace = array("_"," ","'",'"',"."); //FIXME Improve //$new_data['media_cat_category'] = str_replace($replace,"-",$new_data['media_cat_category']); $type = $this->getRequest()->getPosted('media_cat_type', 'image').'_'; $increment = ($this->ownerCount[$new_data['media_cat_owner']] +1); $new_data['media_cat_category'] = $new_data['media_cat_owner'].'_'.$type.$increment; if(empty($new_data['media_cat_sef'])) { $new_data['media_cat_sef'] = eHelper::title2sef($new_data['media_cat_title']); } return $new_data; } public function beforeUpdate($new_data, $old_data, $id) { $mes = e107::getMessage(); if(in_array($new_data['media_cat_owner'], $this->restricted)) { $mes->addError(LAN_IMA_001); return FALSE; } if(empty($new_data['media_cat_sef'])) { $new_data['media_cat_sef'] = eHelper::title2sef($new_data['media_cat_title']); } return $new_data; } } class media_cat_form_ui extends e_admin_form_ui { protected $restrictedOwners = array( '_common', 'news', 'page', 'download', '_icon' ); function options($parms, $value, $id) { if($_GET['action'] === 'create' || $_GET['action'] === 'edit') { return; } $owner = $this->getController()->getListModel()->get('media_cat_owner'); if(!in_array($owner,$this->restrictedOwners)) { return $this->renderValue('options',$value,null,$id); } // $save = ($_GET['bbcode']!='file') ? "e-dialog-save" : ""; // e-dialog-close } } class media_form_ui extends e_admin_form_ui { function init() { /*$sql = e107::getDb(); // $sql->gen("SELECT media_cat_title, media_title_nick FROM #core_media as m LEFT JOIN #core_media_cat as c ON m.media_category = c.media_cat_owner GROUP BY m.media_category"); $sql->gen("SELECT media_cat_title, media_cat_owner FROM #core_media_cat"); while($row = $sql->fetch()) { $cat = $row['media_cat_owner']; $this->cats[$cat] = $row['media_cat_title']; } asort($this->cats);*/ // require(e_HANDLER.'phpthumb/ThumbLib.inc.php'); // For resizing on import. /* if(!empty($_POST['multiselect']) && varset($_POST['e__execute_batch']) && (varset($_POST['etrigger_batch']) == 'options__rotate_cw' || varset($_POST['etrigger_batch']) == 'options__rotate_ccw')) { $type = str_replace('options__','',$_POST['etrigger_batch']); $ids = implode(",", e107::getParser()->filter($_POST['multiselect'],'int')); $this->rotateImages($ids,$type); } if(!empty($_POST['multiselect']) && varset($_POST['e__execute_batch']) && (varset($_POST['etrigger_batch']) == 'options__resize_2048' )) { $type = str_replace('options__','',$_POST['etrigger_batch']); $ids = implode(",", e107::getParser()->filter($_POST['multiselect'],'int')); $this->resizeImages($ids,$type); } if(!empty($_POST['multiselect']) && varset($_POST['e__execute_batch']) && (varset($_POST['etrigger_batch']) == 'options__convert_to_jpeg' )) { // $type = str_replace('options__','',$_POST['etrigger_batch']); $ids = implode(",", e107::getParser()->filter($_POST['multiselect'],'int')); $this->convertImagesToJpeg($ids); } if(!empty($_POST['multiselect']) && varset($_POST['e__execute_batch']) && (varset($_POST['etrigger_batch']) == 'options__convert_all_to_jpeg' )) { // $type = str_replace('options__','',$_POST['etrigger_batch']); $ids = implode(",", e107::getParser()->filter($_POST['multiselect'],'int')); $this->convertImagesToJpeg($ids,'all'); }*/ } function resize_method($curval) { $frm = e107::getForm(); $options = array( 'gd1' => 'gd1', 'gd2' => 'gd2', 'ImageMagick' => 'ImageMagick' ); return $frm->selectbox('resize_method',$options,$curval)."
".IMALAN_4. '
'; } public function rotateImages($ids,$type) { $sql = e107::getDb(); $tp = e107::getParser(); $mes = e107::getMessage(); ini_set('memory_limit', '150M'); ini_set('gd.jpeg_ignore_warning', 1); $degrees = ($type === 'rotate_cw') ? 270 : 90; // $mes->addDebug("Rotate Mode Set: ".$type); //TODO GIF and PNG rotation. if($sql->select('core_media', 'media_url', 'media_id IN (' .$ids.") AND media_type = 'image/jpeg' ")) { while($row = $sql->fetch()) { $original = $tp->replaceConstants($row['media_url']); $mes->addDebug("Attempting to rotate by {$degrees} degrees: ".basename($original)); $source = imagecreatefromjpeg($original); try { $rotate = imagerotate($source, $degrees, 0); } catch (Exception $e) { $mes->addError(LAN_IMA_002. ': ' .basename($original)); return null; } $srch = array('.jpg', '.jpeg'); $cacheFile = str_replace($srch, '',strtolower(basename($original)))."_(.*)\.cache\.bin"; try { imagejpeg($rotate,$original,80); $mes->addSuccess(LAN_IMA_002.": ".basename($original)); e107::getCache()->clearAll('image',$cacheFile); $mes->addDebug("Clearing Image cache with mask: ".$cacheFile); } catch (Exception $e) { $mes->addError(LAN_IMA_002. ': ' .basename($original)); } } } } /** * Resize a single image. * @param string $oldpath * @param int $w * @param int $h * @return bool|void */ public function resizeImage($oldpath,$w,$h) { if(e107::getMedia()->resizeImage($oldpath, $oldpath, compact('w', 'h'))) { return true; } } public function resizeImages($ids,$type) { $sql = e107::getDb(); $sql2 = e107::getDb('sql2'); $mes = e107::getMessage(); $tp = e107::getParser(); $fl = e107::getFile(); // Max size is 6 megapixel. $img_import_w = 2816; $img_import_h = 2112; if($sql->select('core_media', 'media_id,media_url', 'media_id IN (' .$ids.") AND media_type = 'image/jpeg' ")) { while($row = $sql->fetch()) { $path = $tp->replaceConstants($row['media_url']); $mes->addDebug('Attempting to resize: ' .basename($path)); if($this->resizeImage($path,$img_import_w,$img_import_h)) { $info = $fl->getFileInfo($path); $mes->addSuccess(LAN_IMA_004. ': ' .basename($path)); $mes->addSuccess(print_a($info,true)); $dim = (int) $info['img-width'] . ' x ' . (int) $info['img-height']; $sql2->update('core_media',"media_dimensions = '".$dim."', media_size = '". (int) $info['fsize'] ."' WHERE media_id = ". (int) $row['media_id'] . ''); } else { $mes->addError(LAN_IMA_004. ': ' .basename($path)); } } } } public function convertImagesToJpeg($ids,$mode=null) { $sql = e107::getDb(); $tp = e107::getParser(); $mm = e107::getMedia(); $insert = empty($mode) ? 'media_id IN (' .$ids. ') AND ' : ' media_size > 225000 AND '; $data = $sql->retrieve('core_media', 'media_id,media_url', $insert."(media_type = 'image/png' OR media_type = 'image/gif') ", true, true); if(empty($data)) { return null; } foreach($data as $row) { $path = $tp->replaceConstants($row['media_url']); if($jpegFile = $mm->convertImageToJpeg($path,true)) { $url = $tp->createConstants($jpegFile, 1); $size = filesize($jpegFile); $update = array ( 'media_size' => $size, 'media_url' => $url, 'media_type' => 'image/jpeg', 'WHERE' => 'media_id = '.$row['media_id'] ); $message = basename($path).SEP.basename($url); if($sql->update('core_media',$update)) { e107::getMessage()->addSuccess($message); } else { e107::getMessage()->addError($message); } } } } public function resize_dimensions($curval) // ie. never manually resize another image again! { $text = ''; $pref = e107::getPref(); // $options = array( // "news-image" => LAN_IMA_O_001, // "news-bbcode" => LAN_IMA_O_002, // "page-bbcode" => LAN_IMA_O_003, // "featurebox-image" => LAN_IMA_O_004, // "featurebox-bbcode" => LAN_IMA_O_005, // ); $options = $pref['resize_dimensions']; /* @deprecated */ if(!empty($pref['e_imageresize']) && is_array($pref['e_imageresize'])) { foreach($pref['e_imageresize'] as $k=>$val) { $options[$k] = ucfirst($k). ' ' .defset('LAN_IMA_O_006'); } } unset($options['news-image']); /* @deprecated */ $text = "\n"; foreach($options as $key=>$title) { $title = ucwords(str_replace('-', ' ',$key)); $valW = !empty($curval[$key]['w']) ? $curval[$key]['w'] : 400; $valH = !empty($curval[$key]['h']) ? $curval[$key]['h'] : 400; $text .= "'; } $text .= '
".LAN_TYPE." ".LAN_WIDTH." ".LAN_HEIGHT."
".$title.""; $text .= ""; $text .= ""; $text .= '
'; // $text .= "

Warning: This feature is experimental.
"; return $text; } function options($parms, $value, $id) { //return print_a($_GET,true); if($value === 'batch') { $arr = array( 'resize_2048' => 'Reduce Oversized Images', 'rotate_cw' => 'Rotate 90° cw', 'rotate_ccw' => 'Rotate 90° ccw', 'convert_to_jpeg' => 'Convert to jpeg format' ); if(deftrue('e_DEBUG')) { $arr['convert_all_to_jpeg'] = 'Convert All Oversized to jpeg format'; // rare situations. } return $arr; } if($_GET['action'] === 'edit') { return null; } $tagid = vartrue($_GET['tagid']); $tagid = e107::getParser()->filter($tagid); $model = $this->getController()->getListModel(); $path = $model->get('media_url'); $title = $model->get('media_name'); $id = $model->get('media_id'); $preview = basename($path); $bbcode = (vartrue($_GET['bbcode']) === 'file') ? 'file' : ''; // $save = ($_GET['bbcode']!='file') ? "e-dialog-save" : ""; // e-dialog-close $for = (string) $this->getController()->getQuery('for'); if(strpos($for, '_file') !==false ) { $type = 'file'; } else { $type = 'image'; } // File Picker. if($_GET['action'] === 'dialog' && ($type === 'file')) { $text = "'; } else { if($dimensions = $model->get('media_dimensions')) { $title .= " (".$dimensions.")"; } $type = $model->get('media_type'); $action = $this->getController()->getAction(); $att = ['query' => e_QUERY."&after=".$action]; $url = $this->media_sef('', 'read', ['url'=>1]); $modal = (strpos($type, 'application') === false) ? 'e-modal' : ''; if($action === 'grid') { $text = "".$this->tp->toGlyph('e-search-16').""; $att['icons'] = [ 'edit' => $this->tp->toGlyph('e-edit-16'), 'delete' => $this->tp->toGlyph('e-delete-16'), ]; $text .= $this->renderValue('options',$value,$att,$id); } else { // $text = "".$this->tp->toGlyph('e-search-32').""; $text = $this->renderValue('options',$value,$att,$id); } } return "
".$text. '
'; } private function getMediaType() { list($type,$extra) = explode('/',$this->getController()->getFieldVar('media_type')); $category = $this->getController()->getFieldVar('media_category'); if(strpos($category, '_icon') === 0) { $type = 'icon'; } return $type; } function media_preview($curVal, $mode, $attributes, $id=null) { if($mode === 'filter' || $mode === 'batch' || $mode === 'inline') { return null; } $attributes['type'] = 'image'; $value = $this->getController()->getFieldVar('media_url'); $type = $this->getMediaType(); if($this->getController()->getAction() === 'grid') { $size = 235; // min-height:".$size."px return "
".e107::getMedia()->previewTag($value, array('type'=>$type, 'w'=>$size, 'h'=>$size, 'crop'=>1)). '
'; } $size = ($mode === 'write') ? 400 : 180; return e107::getMedia()->previewTag($value, array('type'=>$type, 'w'=>$size, 'h'=>$size)); } function media_sef($curVal, $mode, $attributes, $id=null) { if($mode === 'filter' || $mode === 'batch') { return null; } $val = $this->getController()->getFieldVar('media_url'); $type = $this->getMediaType(); switch($type) { case 'application': case 'audio': case 'icon': case 'file': case 'video': $path = e107::getParser()->replaceConstants($val, 'abs'); break; default: $parm = array('w'=>800); $path = e107::getParser()->thumbUrl($val,$parm); // code to be executed if n is different from all labels; } $url = SITEURLBASE.$path; if(!empty($attributes['url'])) { return $url; } return "".$url. ''; } /* function media_category($curVal,$mode) // not really necessary since we can use 'dropdown' - but just an example of a custom function. { $curVal = explode(",",$curVal); if($mode == 'read') { return $this->getController()->getMediaCategory($curVal); //return $this->cats[$curVal]; } if($mode == 'batch') // Custom Batch List for release_type { return $this->getController()->getMediaCategory(); } if($mode == 'filter') // Custom Filter List for release_type { return $this->getController()->getMediaCategory(); } $text = ""; return $text; }*/ } class media_admin_ui extends e_admin_ui { protected $pluginTitle = LAN_MEDIAMANAGER; protected $pluginName = 'core'; protected $table = 'core_media'; protected $listQry = 'SELECT SQL_CALC_FOUND_ROWS m.*,u.user_id,u.user_name FROM #core_media AS m LEFT JOIN #user AS u ON m.media_author = u.user_id '; // without any Order or Limit. // //protected $editQry = "SELECT * FROM #comments WHERE comment_id = {ID}"; protected $pid = 'media_id'; protected $perPage = 10; protected $batchDelete = true; // protected $defaultOrder = 'desc'; protected $listOrder = 'm.media_id desc'; // show newest images first. public $deleteConfirmScreen = true; public $deleteConfirmMessage = IMALAN_129; protected $grid = array('id'=>'media_id', 'title'=>'media_name', 'image'=>'media_preview', 'body'=>'', 'class'=>'col-sm-6 col-md-4 col-lg-2', 'perPage'=>24, 'carousel'=>false); protected $preftabs = array(IMALAN_78,IMALAN_89, 'Youtube'); protected $fields = array( 'checkboxes' => array('title'=> '', 'type' => null, 'data'=> null, 'width' =>'5%', 'forced'=> TRUE, 'thclass'=>'center', 'class'=>'center'), 'media_id' => array('title'=> LAN_ID, 'type' => 'number', 'data'=> 'int', 'width' =>'5%', 'forced'=> TRUE, 'nolist'=>TRUE), 'media_preview' => array('title'=> LAN_PREVIEW, 'type' => 'method', 'data'=>false, 'forced'=>true, 'width' => '110px', 'thclass' => 'center', 'class'=>'center'), 'media_url' => array('title'=> IMALAN_110, 'type' => 'text', 'data'=> 'str', 'inline'=>false, 'thclass' => 'left', 'class'=>'left', 'width' => 'auto', 'writeParms'=>'size=xxlarge'), 'media_category' => array('title'=> LAN_CATEGORY, 'type' => 'comma', 'inline'=>false, 'data'=> 'str', 'width' => '10%', 'filter' => true, 'batch' => true, 'class'=>'left'), // Upload should be managed completely separately via upload-handler. // 'media_upload' => array('title'=> "Upload File", 'type' => 'upload', 'data'=> false, 'readParms' => 'hidden', 'writeParms' => 'disable_button=1', 'width' => '10%', 'nolist' => true), 'media_name' => array('title'=> LAN_TITLE, 'type' => 'text', 'data'=> 'str', 'inline'=>true, 'width' => 'auto', 'writeParms'=>array('size'=>'xxlarge')), 'media_caption' => array('title'=> LAN_CAPTION, 'type' => 'text', 'data'=> 'str', 'inline'=>true, 'width' => 'auto', 'writeParms'=>array('size'=>'xxlarge')), // media_description is type = textarea until bbarea can be reduced to not include youtube etc 'media_sef' => array('title'=> LAN_URL, 'readonly'=>1, 'type'=>'method', 'data'=>false), 'media_description' => array('title'=> LAN_DESCRIPTION, 'type' => 'textarea', 'data'=> 'str', 'width' => 'auto', 'thclass' => 'left first', 'readParms' => 'truncate=100', 'writeParms' => 'size=xxlarge&counter=0'), 'media_type' => array('title'=> IMALAN_118, 'type' => 'dropdown', 'data'=> 'str', 'filter'=>true, 'width' => 'auto', 'noedit'=>TRUE), 'media_author' => array('title'=> LAN_USER, 'type' => 'user', 'data'=> 'int', 'width' => 'auto', 'thclass' => 'center', 'class'=>'center','readParms' => 'link=1', 'filter' => true, 'batch' => true, 'noedit'=>TRUE ), 'media_datestamp' => array('title'=> LAN_DATESTAMP, 'type' => 'datestamp', 'data'=> 'int', 'width' => '10%', 'noedit'=>TRUE), // User date 'media_size' => array('title'=> LAN_SIZE, 'type' => 'number', 'data'=> 'int', 'width' => 'auto', 'readonly'=>2), 'media_dimensions' => array('title'=> IMALAN_120, 'type' => 'text', 'data'=> 'str', 'width' => '5%', 'readonly'=>TRUE, 'class'=>'nowrap','noedit'=>TRUE), 'media_userclass' => array('title'=> LAN_USERCLASS, 'type' => 'userclass', 'data'=> 'str', 'inline'=>true, 'width' => '10%', 'thclass' => 'center','filter'=>TRUE,'batch'=>TRUE ), 'media_tags' => array('title'=> IMALAN_132, 'type' => 'tags', 'inline'=>true, 'data'=> 'str', 'width' => '10%', 'filter'=>TRUE,'batch'=>TRUE ), 'media_usedby' => array('title'=> IMALAN_21, 'type' => 'hidden', 'data'=> 'text', 'width' => 'auto', 'thclass' => 'center', 'class'=>'center', 'nolist'=>true, 'readonly'=>TRUE ), 'options' => array('title'=> LAN_OPTIONS, 'type' => 'method', 'data'=> null, 'forced'=>TRUE, 'width' => '10%', 'thclass' => 'center last', 'class' => 'center', 'batch'=>true, 'noedit'=>true) ); protected $mimePaths = array( 'text' => e_MEDIA_FILE, 'multipart' => e_MEDIA_FILE, 'application' => e_MEDIA_FILE, 'audio' => e_MEDIA_FILE, 'image' => e_MEDIA_IMAGE, 'video' => e_MEDIA_VIDEO, 'other' => e_MEDIA_FILE ); protected $fieldpref = array( 'media_id', 'media_name', 'media_caption', 'media_category', 'media_datestamp','media_userclass', 'options'); protected $prefs = array( 'image_post' => array('title'=> IMALAN_1, 'tab'=>0, 'type'=>'boolean', 'data'=>'int', 'writeParms'=>'help=IMALAN_2'), 'image_post_class' => array('title'=> IMALAN_10, 'type' => 'userclass', 'data'=>'int', 'writeParms'=>'help=IMALAN_11&classlist=public,guest,nobody,member,admin,main,classes' ), 'image_post_disabled_method' => array('title'=> IMALAN_12, 'type' => 'boolean','writeParms'=>'enabled=IMALAN_15&disabled=IMALAN_14'), 'resize_method' => array('title'=> IMALAN_3, 'type'=>'method', 'data'=>'str'), // XXX TBD 'thumbnail_per_page' => array('title'=> "Thumbnails per page", 'type'=>'dropdown', 'data'=>'int', 'help'=>'Applies to the Media Library page', 'writeParms'=>['optArray'=> [8=>8, 12=>12, 16=>16, 24=>24, 36=>36, 48=>48]]), 'thumbnail_quality' => array('title'=> IMALAN_73, 'type'=>'number', 'data'=>'int', 'writeParms'=>'', 'help'=>IMALAN_74), // 'convert_to_jpeg' => array('title'=> IMALAN_182, 'type'=>'number', 'data'=>'int', 'writeParms'=> array('tdClassRight'=>'form-inline', 'post'=> CORE_LAN_KB), 'help'=>IMALAN_183), 'convert_to_jpeg' => array('title'=> IMALAN_182, 'type'=>'boolean', 'data'=>'int', 'writeParms'=>'', 'help'=>IMALAN_183), 'convert_to_webp' => array('title'=> IMALAN_187, 'type'=>'boolean', 'data'=>'int', 'writeParms'=>'', 'help'=>IMALAN_189), 'thumb_to_webp' => array('title'=> IMALAN_188, 'type'=>'boolean', 'data'=>'int', 'writeParms'=>'', 'help'=>IMALAN_189), 'im_width' => array('title'=> IMALAN_75, 'type'=>'number', 'data'=>'int', 'writeParms'=>'', 'help'=>IMALAN_76), 'im_height' => array('title'=> IMALAN_77, 'type'=>'number', 'data'=>'int', 'writeParms'=>'', 'help'=>IMALAN_76), 'resize_dimensions' => array('title'=> IMALAN_184, 'type'=>'method', 'data'=>'str'), 'watermark_activate' => array('title'=> IMALAN_80, 'tab'=>1, 'type' => 'number', 'data' => 'str', 'help'=>IMALAN_81), // 'validate' => 'regex', 'rule' => '#^[\d]+$#i', 'help' => 'allowed characters are a-zA-Z and underscore')), 'watermark_text' => array('title'=> IMALAN_82,'tab'=>1, 'type' => 'text', 'data' => 'str', 'help'=>IMALAN_83), // 'validate' => 'regex', 'rule' => '#^[\d]+$#i', 'help' => 'allowed characters are a-zA-Z and underscore')), 'watermark_font' => array('title'=> IMALAN_84,'tab'=>1, 'type' => 'dropdown', 'data' => 'str', 'help'=>IMALAN_85), // 'validate' => 'regex', 'rule' => '#^[\d]+$#i', 'help' => 'allowed characters are a-zA-Z and underscore')), 'watermark_size' => array('title'=> IMALAN_86, 'tab'=>1,'type' => 'number', 'data' => 'int', 'help'=>IMALAN_87), // 'validate' => 'regex', 'rule' => '#^[\d]+$#i', 'help' => 'allowed characters are a-zA-Z and underscore')), 'watermark_pos' => array('title'=> IMALAN_88,'tab'=>1, 'type' => 'dropdown', 'data' => 'str', 'help'=>IMALAN_88), // 'validate' => 'regex', 'rule' => '#^[\d]+$#i', 'help' => 'allowed characters are a-zA-Z and underscore')), 'watermark_margin' => array('title'=> IMALAN_90, 'tab'=>1,'type' => 'number', 'data' => 'int', 'help'=>IMALAN_91), // 'validate' => 'regex', 'rule' => '#^[\d]+$#i', 'help' => 'allowed characters are a-zA-Z and underscore')), 'watermark_color' => array('title'=> IMALAN_92, 'tab'=>1, 'type' => 'text', 'data' => 'str', 'help'=>IMALAN_93), // 'validate' => 'regex', 'rule' => '#^[\d]+$#i', 'help' => 'allowed characters are a-zA-Z and underscore')), 'watermark_shadowcolor' => array('title'=> IMALAN_94, 'tab'=>1,'type' => 'text', 'data' => 'str', 'help'=>IMALAN_95), // 'validate' => 'regex', 'rule' => '#^[\d]+$#i', 'help' => 'allowed characters are a-zA-Z and underscore')), 'watermark_opacity' => array('title'=> IMALAN_96, 'tab'=>1, 'type' => 'number', 'data' => 'int', 'help'=>IMALAN_97), // 'validate' => 'regex', 'rule' => '#^[\d]+$#i', 'help' => 'allowed characters are a-zA-Z and underscore')), // https://developers.google.com/youtube/player_parameters 'youtube_apikey' => array('title' => 'YouTube Public API key', 'tab' =>2, 'type' => 'text', 'data' =>'str', 'help' =>IMALAN_99, 'writeParms' =>array('size' =>'xxlarge', 'post' => '')), 'youtube_default_account' => array('title'=> IMALAN_98, 'tab'=>2, 'type' => 'text', 'data'=>'str', 'help'=>IMALAN_99, 'writeParms'=>array('size'=>'xxlarge','post'=> '')), 'youtube_rel' => array('title'=> IMALAN_100, 'tab'=>2, 'type' => 'boolean', 'data'=>'int', 'help'=>''), 'youtube_showinfo' => array('title'=> IMALAN_101, 'tab'=>2, 'type' => 'boolean', 'data'=>'int', 'help'=>''), 'youtube_cc_load_policy' => array('title'=> IMALAN_102, 'tab'=>2, 'type' => 'boolean', 'data'=>'int', 'help'=>''), 'youtube_modestbranding' => array('title'=> IMALAN_103, 'tab'=>2, 'type' => 'boolean', 'data'=>'int', 'help'=>''), 'youtube_bbcode_responsive' => array('title'=> IMALAN_104, 'tab'=>2, 'type' => 'boolean', 'data'=>'int', 'help'=>''), // ); protected $cats = array(); protected $owner = array(); protected $ownercats = array(); protected $fontawesome; // frontend loaded version from theme.xml. function init() { $this->fontawesome = (int) e107::getTheme()->getFontAwesome(); $this->prefs['youtube_apikey']['writeParms']['post'] = " ".LAN_MORE. ''; if(E107_DEBUG_LEVEL > 0) { $this->fields['media_url']['inline'] = true; } $sql = e107::getDb(); // $sql->gen("SELECT media_cat_title, media_title_nick FROM #core_media as m LEFT JOIN #core_media_cat as c ON m.media_category = c.media_cat_owner GROUP BY m.media_category"); $sql->gen('SELECT media_cat_title, media_cat_owner, media_cat_category FROM `#core_media_cat` WHERE media_cat_title !="" '); while($row = $sql->fetch()) { $cat = $row['media_cat_category']; $owner = $row['media_cat_owner']; $this->owner[$owner] = $owner; $this->ownercats[$owner.'|'.$cat] = $row['media_cat_title']; // $ownerLabel = (substr($owner,0,1) == '_') ? '' : $owner.": "; $this->cats[$cat] = $row['media_cat_title']; } asort($this->cats); $tmp = $sql->retrieve('core_media','media_type','media_type !="" GROUP BY media_type',true); $mimeTypes = array(); foreach($tmp as $val) { $id = $val['media_type']; $mimeTypes[$id] = $id; } $mimeTypes['image/%'] = 'image/*'; $mimeTypes['video/%'] = 'video/*'; $mimeTypes['audio/%'] = 'audio/*'; $mimeTypes['application/%'] = 'application/*'; asort($mimeTypes); $this->fields['media_category']['writeParms'] = $this->cats; $this->fields['media_type']['writeParms'] = $mimeTypes; $pref = e107::getPref(); $tp = e107::getParser(); $fl = e107::getFile(); $path = e_THEME.$pref['sitetheme']. '/fonts/'; $fDir = $fl->get_files(e_THEME.$pref['sitetheme']. '/fonts/', '.ttf','',2); $fonts = array(0=>LAN_NONE); foreach($fDir as $f) { $id = $tp->createConstants($f['path'].$f['fname'],'rel'); $fonts[$id] = $f['fname']; } $this->prefs['watermark_font']['writeParms'] = $fonts; $this->prefs['watermark_font']['readParms'] = $fonts; $wm_pos = array( 'BR' => IMALAN_133, 'BL' => IMALAN_134, 'TR' => IMALAN_135, 'TL' => IMALAN_136, 'C' => IMALAN_137, 'R' => IMALAN_138, 'L' => IMALAN_139, 'T' => IMALAN_140, 'B' => IMALAN_141, '*' => IMALAN_142 ); $this->prefs['watermark_pos']['writeParms'] = $wm_pos; $this->prefs['watermark_pos']['readParms'] = $wm_pos; e107::getCache()->clearAll('image'); if(e_AJAX_REQUEST && isset($_GET['search'])) { $parm = array('search' => $tp->filter($_GET['search'])); switch($this->getAction()) { case 'youtube': echo $this->youtubeTab($parm); break; case 'glyph': echo $this->glyphTab(null, $parm); break; case 'icon': echo $this->iconTab(null, $parm); break; case 'image2': $cat = $tp->filter($_GET['for']); echo $this->imageTab2($cat,$parm); break; case 'video': $cat = $tp->filter($_GET['for']); echo $this->videoTab($cat, $parm); break; case 'audio': $cat = $tp->filter($_GET['for']); echo $this->audioTab($cat, $parm); break; default: // code to be executed if n is different from all labels; } exit; } /* if($this->getAction() === 'youtube') { echo $this->youtubeTab($parm); exit; } if($this->getAction() === 'glyph') { $parm = array('search' => $tp->filter($_GET['search'])); echo $this->glyphTab($parm); exit; } if($this->getAction() === 'glyph') { $parm = array('search' => $tp->filter($_GET['search'])); echo $this->glyphTab($parm); exit; } if($this->getAction() === 'video') { $parm = array('search' => $tp->filter($_GET['search'])); $cat = $tp->filter($_GET['for']); echo $this->videoTab($cat, $parm); exit; } if($this->getAction() === 'audio') { $parm = array('search' => $tp->filter($_GET['search'])); $cat = $tp->filter($_GET['for']); echo $this->audioTab($cat, $parm); exit; } if($this->getAction() === 'image2') { $parm = array('search' => $tp->filter($_GET['search'])); $cat = $tp->filter($_GET['for']); echo $this->imageTab2($cat,$parm); exit; } */ /* if($this->getAction() == 'nav' ) { echo $this->navPage();\ $this->getResponse()->setIframeMod(); // disable header/footer menus etc. print_a($_GET); } */ if(varset($_POST['batch_import_selected'])) { $this->batchImport(); } if(varset($_POST['batch_import_delete'])) { $this->batchDelete(); } if(varset($_POST['update_options'])) { $this->updateSettings(); } // filepicker stuff. if($this->getQuery('mode') === 'dialog')//TODO Check this actually does something, as it was changed to 'action'. { if(!ADMIN){ exit; } } if($this->getQuery('iframe')) { // e107::js('tinymce4','plugins/compat3x/tiny_mce_popup.js'); $this->getResponse()->setIframeMod(); // disable header/footer menus etc. if(!$this->getQuery('for')) { $this->setPosted('media_category', '_common'); $this->getModel()->set('media_category', '_common'); } elseif($this->getMediaCategory($this->getQuery('for'))) { $this->setPosted('media_category', $this->getQuery('for')); if(!$this->getId()) { $this->getModel()->set('media_category', $this->getQuery('for')); } } } } /** Wildcard support for media-type filter */ function handleGridMediaTypeFilter($var) { if(strpos($var,'%') !== false) { return "m.media_type LIKE '".$var."'"; } return "m.media_type = '".$var."'"; } /** * Handle Batch options as defined in media_form_ui::options(); handle+action+field+Batch * @param $selected * @param $type */ function handleListOptionsBatch($selected, $type) { /** @var media_form_ui $frm */ $frm = $this->getUI(); $ids = implode(',', $selected); switch($type) { case 'resize_2048': $frm->resizeImages($ids,$type); break; case 'rotate_cw': case 'rotate_ccw': $frm->rotateImages($ids,$type); break; case 'convert_to_jpeg': $frm->convertImagesToJpeg($ids); break; case 'convert_all_to_jpeg': $frm->convertImagesToJpeg($ids,'all'); break; default: // code to be executed if n is different from all labels; } } function navPage() // no functioning correctly - see e_AJAX_REQUEST above. { $bbcodeMode = ($this->getQuery('bbcode') === 'img' ) ? 'bbcode=img' : FALSE; if($_GET['from']) { $bbcodeMode .= '&from=' . (int) $_GET['from']; } $bbcodeMode .= '&nav=1'; $tag = ($bbcodeMode) ? '' : $this->getQuery('tagid'); echo e107::getMedia()->mediaSelect($this->getQuery('for'),$this->getQuery('tagid'),$bbcodeMode); // eg. news, news-thumbnail return; } public function ListAjaxObserver() { $cat = $this->getQuery('for'); $file = (preg_match('/_file(_[\d]{1,2})?$/',$cat)) ? true : false; if($file === true) // Make sure dialog mode is used when ajax searches occur. { $this->setQuery('action','dialog'); $this->setFileListMode($cat); } $this->getTreeModel()->setParam('db_query', $this->_modifyListQry(false, false, 0, false, $this->listQry))->loadBatch(); } function EditObserver() { $mode = $this->getMode(); $this->afterSubmitOptions = ($mode === 'main' && ($this->getQuery('after')==='grid')) ? ['grid'=>LAN_UI_VIEW_GRID_LABEL] : true; parent::EditObserver(); } function CreateObserver() { $mode = $this->getMode(); // Return to the same 'view' based $this->afterSubmitOptions = ($mode === 'main' && ($this->getQuery('after')==='grid')) ? ['grid'=>LAN_UI_VIEW_GRID_LABEL] : true; parent::CreateObserver(); } function GridObserver() { $this->setGridObserver(); parent::GridObserver(); } function GridAjaxObserver() { $this->setGridObserver(); parent::GridAjaxObserver(); } private function setGridObserver() { /* $this->grid['perPage'] = e107::pref('core', 'thumbnail_per_page',24); // XXX TBD switch($this->grid['perPage']) { case 8: $cols = '1fr 1fr 1fr 1fr'; // 4 columns. break; case 12: $cols = '1fr 1fr 1fr 1fr 1fr 1fr'; // 6 columns. break; case 16: case 24: $cols = '1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr'; // 8 columns. break; case 36: case 48: $cols = '1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr'; // 12 columns. break; default: // code to be executed if n is different from all labels; } e107::css('inline', '#core-core-media-list-grid { grid-template-columns: '.$cols.';');*/ $this->grid['template'] = '
{IMAGE}

{TITLE}

{OPTIONS}

{CHECKBOX}

'; } function dialogPage() // Popup dialogPage for Image Selection. { $cat = $this->getQuery('for'); $file = (preg_match('/_file(_[\d]{1,2})?$/',$cat)) ? true : false; $mes = e107::getMessage(); $mes->addDebug('For:' .$cat); $mes->addDebug('Bbcode: ' .$this->getQuery('bbcode')); $video = $this->getQuery('video'); if($video == 2) { echo $this->mediaSelectUpload('video'); return; } $this->processUploadUrl(true, $cat); if($file) { // echo $this->fileTab($cat); // FIXME use this instead. $this->setFileListMode($cat); echo $this->mediaSelectUpload('file'); $tagid = e107::getParser()->filter($this->getQuery('tagid')); echo ''; } else { return $this->mediaManagerTabs(); // echo $this->mediaSelectUpload(); } } private function setFileListMode($cat) { $cat = e107::getParser()->toDB($cat); if(!isset($this->cats[$cat])) { return; } $this->listQry = "SELECT m.*,u.user_id,u.user_name FROM #core_media AS m LEFT JOIN #user AS u ON m.media_author = u.user_id WHERE FIND_IN_SET('".$cat."', m.media_category) "; // without any Order or Limit. unset($this->fields['checkboxes']); $this->fields['options']['type'] = 'method'; $this->fields['media_category']['nolist'] = true; $this->fields['media_userclass']['nolist'] = true; $this->fields['media_dimensions']['nolist'] = true; $this->fields['media_description']['nolist'] = true; $this->fields['media_type']['nolist'] = true; $this->fields['media_url']['nolist'] = true; $this->fields['media_sef']['nolist'] = true; foreach($this->fields as $k=>$v) { $this->fields[$k]['filter'] = false; } } private function uploadTab() { if(!ADMIN){ exit; } if(!getperms('A') && !getperms('A1')) { return ''; } // if 'for' has no value, files are placed in /temp and not added to the db. $maxFileSize = e107::pref('core', 'upload_maxfilesize'); if(empty($maxFileSize)) { $maxFileSize = '20M'; } $text = '

' .IMALAN_145. '

'; $text .= '

'.IMALAN_146.'

'; $text .= '
'; $frm = e107::getForm(); $text .= $frm->open('upload-url-form','post'); $text .= '
'; $text .= '

' .IMALAN_147. '

'; $text .= "
"; $text .= ""; $text .= "'; $text .= '"; $text .= '
".IMALAN_148.": ".$frm->admin_button('upload_remote_url',1,'create',IMALAN_149). '
' .LAN_CAPTION. ' (' .LAN_OPTIONAL."):
'; // $text .= ; $text .= '
'; $text .= "
\n\n"; $text .= $frm->close(); return $text; } /** * Media-Manager Tabs (new in v2.1.9) * Replacement for mediaSelectUpload() * @return string */ private function mediaManagerTabs() { $frm = e107::getForm(); $tp = e107::getParser(); $options = array(); $options['bbcode'] = ($this->getQuery('bbcode')) ?: false; if(isset($_GET['from'])) { $options['from'] .= (int) $_GET['from']; } $cat = $this->getQuery('for'); $cat = urldecode($cat); $tabOptions = array( 'core-media-icon' => array('caption'=> $tp->toGlyph('fa-file-photo-o').IMALAN_72, 'method' => 'iconTab' ), 'core-media-image' => array('caption'=> $tp->toGlyph('fa-file-photo-o').ADLAN_105, 'method' => 'imageTab2' ), 'core-media-video' => array('caption'=> $tp->toGlyph('fa-file-video-o').IMALAN_163, 'method' => 'videoTab'), 'core-media-file' => array('caption'=> $tp->toGlyph('fa-file').ADLAN_CL_5, 'method' => 'fileTab'), 'core-media-audio' => array('caption' => $tp->toGlyph('fa-file-audio-o'). 'Audio', 'method' => 'audioTab'), 'core-media-youtube' => array('caption' => $tp->toGlyph('fa-youtube-play'). 'Youtube', 'method' => 'youtubeTab' ), 'core-media-glyph' => array('caption' => $tp->toGlyph('fa-flag'). 'Glyphs', 'method' => 'glyphTab'), ); if(!empty($options['bbcode'])) { $tabOptions['core-media-img'] = $tabOptions['core-media-image']; } $tabs = array(); // check tab options against URL foreach($tabOptions as $key=>$val) { $id = str_replace('core-media-', '', $key); if($this->getQuery($id) == 1 || $this->getQuery('bbcode') == $id) { $tabMethod = $val['method']; $text = $this->$tabMethod($cat,$options); $tabs[$key] = array('caption'=>$val['caption'], 'text'=>$text); } } if($options['bbcode'] === 'img') { $tabs['core-media-attributes'] = array('caption'=> $tp->toGlyph('fa-image').IMALAN_152, 'text' => $this->imageAttributesTab()); } if(getperms('A|A1')) { $tabs['core-media-upload'] = array('caption'=> $tp->toGlyph('fa-upload').IMALAN_150, 'text' => $this->uploadTab()); } $text = $frm->tabs($tabs, array('id'=>'admin-ui-media-manager', 'class'=>'media-manager')); /* if($options['bbcode'] || E107_DEBUG_LEVEL > 0) { }*/ $text .= $this->mediaManagerSaveButtons($options); $text .= $this->mediaManagerPlaceholders(); return $text; } /** * @deprecated by mediaManagerTabs * @param string $type * @return string */ function mediaSelectUpload($type='image') { // return $this->mediaManagerTabs(); $frm = e107::getForm(); $tp = e107::getParser(); if($type === 'video') { $tabs = array( 'youtube' => array('caption'=>'Youtube', 'text' => $this->youtubeTab()) ); return $frm->tabs($tabs, array('class'=>'media-manager')); } $youtubeActive = 'inactive'; $options = array(); switch($this->getQuery('bbcode')) { case 'img': $options['bbcode'] = 'img'; break; case 'video': $options['bbcode'] = 'video'; break; case 'glyph': $options['bbcode'] = 'glyph'; break; default: $options['bbcode'] = false; } $text = "
"; if($bbcodeQuery !== 'video' && $bbcodeQuery !== 'glyph') { $text .= "
"; $text .= $this->imageTab($type,$options); $text .= '
'; } $text .= "
"; $this->fields['media_category']['readonly'] = TRUE; $this->fields['media_url']['noedit'] = TRUE; $this->fields['media_userclass']['noedit'] = TRUE; if(getperms('A|A1')) { $text .= $this->uploadTab(); // To test upload script with plupload } // $text .= $this->CreatePage(); // comment me out to test plupload $text .= '
'; /* In BBCODE-Mode this dialog rerturns an [img] bbcode to the 'tagid' container with the appropriate parms generated. * eg. [img style=float:left;margin-right:3px]{e_MEDIA_IMAGE}someimage.jpg[/img] * Then the dialog may be used as a bbcode img popup and within TinyMce also. * */ if($options['bbcode']) { $text .= "
".$this->imageAttributesTab(). '
'; } if($this->getQuery('video') || $this->getQuery('bbcode') === 'video') { $text .= "
"; $text .= $this->youtubeTab(); $text .= '
'; } /* if($this->getQuery('audio') || $this->getQuery('bbcode') == 'audio') { $text .= "
"; $text .= $this->audioTab(); $text .= "
"; }*/ if($this->getQuery('glyph') == 1 || $this->getQuery('bbcode') === 'glyph') { $text .= "
"; $text .= $this->glyphTab(); $text .= '
'; } $text .= '
'; // For BBCODE/TinyMce mode. // e-dialog-save if($options['bbcode'] || E107_DEBUG_LEVEL > 0) { $text .= $this->mediaManagerSaveButtons($options); } $text .= $this->mediaManagerPlaceholders(); return $text; } private function imageAttributesTab() { $frm = e107::getForm(); $text = "
".LAN_CAPTION.":
".IMALAN_120.": px   ❌   px
".IMALAN_157. ': ' .$frm->selectbox('float', array('default' =>LAN_DEFAULT, 'left' =>IMALAN_139, 'right' =>IMALAN_138)). '
' .IMALAN_158.": px
".IMALAN_159.": px
".IMALAN_160.": px
".IMALAN_161.": px
".LAN_PREVIEW."
"; return $text; } private function mediaManagerPlaceholders() { $type = (E107_DEBUG_LEVEL > 0) ? 'text' : 'hidden'; $valueHolders = [ 'bbcode_holder' => 'bbcode', 'html_holder' => 'html/wysiwyg', 'src' => '(preview) src', 'path' => 'path (save to db)' ]; $text = ''; foreach($valueHolders as $name => $label) { $text .= (E107_DEBUG_LEVEL > 0) ? "
".$label." " : ''; $text .= "\n"; } if(E107_DEBUG_LEVEL > 0) { $text .= "
FontAwesome".e107::getTheme()->getFontAwesome(); } return $text; } private function mediaManagerSaveButtons($options = array()) { if(empty($options['bbcode'])) // media picker mode. { $text = "'; return $text; } // bbcode/wysiwyg mode. // hidden from view but used by javascript to re-create the button in the modal-footer. // Tinymce will remove the 'display:none' when loaded. $text = "'; return $text; } /** * @deprecated to be replaced by imageTab2 * @param $type * @param $options * @return string */ function imageTab($type,$options) { $tag = ($options['bbcode']) ? '' : $this->getQuery('tagid'); if(varset($_GET['w'])) { $options['w'] = (int) $_GET['w']; } if($type === 'file') { $this->perPage = 0; $this->getTreeModel()->setParam('db_query', $this->_modifyListQry(false, false, false, false, $this->listQry))->loadBatch(); $text = $this->getUI()->getList(); } else { $text = e107::getMedia()->mediaSelect($this->getQuery('for'),$this->getQuery('tagid'), $options); // eg. news, news-thumbnail } return $text; } private function iconTab($cat, $option=array()) { $tp = e107::getParser(); $parms = array( 'width' => 64, 'height' => 64, 'type' =>'icon', // how should it be rendered? // 'category' => $category, 'tagid' => $this->getQuery('tagid'), 'action' =>'icon', // Used by AJAX to identify correct function. 'perPage' => 80, 'gridClass' => 'media-carousel-item-glyph pull-left', 'bbcode' => 'icon', 'close' => 'true' ); $items = array(); $frm = !empty($option['from']) ? $option['from'] : 0; $limit = !empty($option['limit']) ? $option['limit'] : 200; // $cat = ($category) ? $category."+" : ""; // the '+' loads category '_common' as well as the chosen category. $images = e107::getMedia()->getIcons('',$frm,$limit); foreach($images as $val) { $items[] = array( 'previewHtml' => $tp->toIcon($val['media_url']), 'previewUrl' => '', 'saveValue' => $val['media_url'], 'thumbUrl' => $val['media_url'], 'title' => $val['media_name'], 'tooltip' => basename($val['media_url']). ' (' .$val['media_dimensions']. ')', 'slideCaption' => '', 'slideCategory' => 'bootstrap', 'mime' => $val['media_type'] ); } if(!empty($option['search'])) { $filtered = array(); if(!empty($items)) { foreach($items as $v) { if(strpos($v['title'], $option['search'])!==false) { $filtered[] = $v; } } } $items = $filtered; } return e107::getMedia()->browserCarousel($items, $parms); } private function imageTab2($category,$option=array()) { $tp = e107::getParser(); $parms = array( 'width' => 340, // when inserting into wysiwyg 'height' => 220, 'type' =>'image', 'category' => $category, 'tagid' => $this->getQuery('tagid'), 'action' =>'image2', // Used by AJAX to identify correct function. 'perPage' => 8, 'gridClass' => 'col-xs-6 col-sm-3 media-carousel-item-image', 'bbcode' => 'img', // bbcode tag. ); $close = true; if(!empty($option['bbcode'])) { $close = false; e107::getBB()->setClass($category); $parms['width'] = (int) e107::getBB()->resizeWidth(); // resize the image according to prefs. $parms['height'] = (int) e107::getBB()->resizeHeight(); e107::getBB()->clearClass(); } $items = array(); $frm = !empty($option['from']) ? $option['from'] : 0; $limit = !empty($option['limit']) ? $option['limit'] : 200; // $newfrm = $frm + $limit; // $bbcode = varset($option['bbcode']) ? $option['bbcode'] : null; // $navMode = varset($option['nav']) ? TRUE : FALSE; $search = !empty($option['search']) ? $option['search'] : null; // $cat = ($category) ? $category."+" : ""; $images = e107::getMedia()->getImages($category,$frm,$limit,$search); foreach($images as $val) { $items[] = array( 'previewHtml' => $tp->toImage($val['media_url'], array('w'=>210, 'h'=>140)), 'previewUrl' => $tp->thumbUrl($val['media_url'], array('w'=>210, 'h'=>140)), 'saveValue' => $val['media_url'], 'thumbUrl' => $tp->thumbUrl($val['media_url'], array('w'=>340, 'h'=>220)), 'title' => $val['media_name'], 'tooltip' => basename($val['media_url']). ' (' .$val['media_dimensions']. ')', 'slideCaption' => '', 'slideCategory' => 'bootstrap', 'mime' => $val['media_type'], 'close' => $close ); } if(!empty($option['search'])) { $filtered = array(); if(!empty($items)) { foreach($items as $v) { if(strpos($v['title'], $option['search'])!==false) { $filtered[] = $v; } } } $items = $filtered; } return e107::getMedia()->browserCarousel($items, $parms); } private function fileTab($cat='', $parm=array()) { $this->perPage = 0; $this->getTreeModel()->setParam('db_query', $this->_modifyListQry(false, false, false, false, $this->listQry))->loadBatch(); $this->setFileListMode($cat); $text = $this->getUI()->getList(); $tagid = e107::getParser()->filter($this->getQuery('tagid')); // $text .= ''; return $text; } private function audioTab($cat='', $parm=array()) { $tp = e107::getParser(); $parms = array( 'width' => 340, 'height' => 220, 'type' =>'audio', 'tagid' => $this->getQuery('tagid'), 'action' =>'audio', // Used by AJAX to identify correct function. 'perPage' => 8, 'gridClass' => 'col-sm-3 media-carousel-item-audio', 'bbcode' => 'audio', 'close' => 'true' ); $items = array(); $audios = e107::getMedia()->getAudios($cat); foreach($audios as $val) { $items[] = array( 'previewHtml' => $tp->toAudio($val['media_url'], array('mime'=>$val['media_type'], 'w'=>210, 'h'=>140)), 'saveValue' => $val['media_url'], 'thumbUrl' => $val['media_url'], 'title' => $val['media_name'], 'slideCaption' => '', 'slideCategory' => 'bootstrap', 'mime' => $val['media_type'] ); } if(!empty($parm['search'])) { $filtered = array(); if(!empty($items)) { foreach($items as $v) { if(strpos($v['title'], $parm['search'])!==false) { $filtered[] = $v; } } } $items = $filtered; } return e107::getMedia()->browserCarousel($items, $parms); } private function videoTab($cat='', $parm=array()) { $tp = e107::getParser(); $parms = array( 'width' => 340, 'height' => 220, 'type' =>'video', 'tagid' => $this->getQuery('tagid'), 'action' =>'video', // Used by AJAX to identify correct function. 'perPage' => 8, 'gridClass' => 'col-xs-6 col-sm-3 admin-ui-grid media-carousel-item-video', 'bbcode' => 'video', ); $bbcode = $this->getQuery('bbcode'); $close = (!empty($bbcode)) ? false : true; // only close on 'select' when bbcodes are not in use. $items = array(); $videos = e107::getMedia()->getVideos($cat); foreach($videos as $val) { $size = e107::getFile()->file_size_encode($val['media_size']); $items[] = array( 'previewHtml' => $tp->toVideo($val['media_url'], array('w'=>210, 'h'=>140)), // e_IMAGE_ABS."generic/playlist_120.png", 'saveValue' => $val['media_url'], 'thumbUrl' => $val['media_url'], 'title' => $val['media_name'], 'tooltip' => basename($val['media_url']). ' (' .$size. ')', 'slideCaption' => '', 'slideCategory' => 'bootstrap', 'mime' => $val['media_type'], 'close' => $close ); } if(!empty($parm['search'])) { $filtered = array(); if(!empty($items)) { foreach($items as $v) { if(strpos($v['title'], $parm['search'])!==false) { $filtered[] = $v; } } } $items = $filtered; } return e107::getMedia()->browserCarousel($items, $parms); } private function glyphTab($cat='', $parm=array()) { $parms = array( 'width' => 32, 'height' => 32, 'type' =>'glyph', 'tagid' => $this->getQuery('tagid'), 'action' =>'glyph', // Used by AJAX to identify correct function. 'perPage' => 70, 'gridClass' => 'media-carousel-item-glyph pull-left icon-preview', 'bbcode' =>'glyph', 'close' => 'true' ); // -------------------------- $items = array(); $md = e107::getMedia(); if($this->fontawesome === 5) { // e107::getParser()->setFontAwesome(5); $fab = e107::getMedia()->getGlyphs('fab'); foreach($fab as $val) { $items[] = array( 'previewHtml' => $md->previewTag('fab-'.$val,array('type'=>'glyph')), 'previewUrl' => 'fab fa-'.$val, 'saveValue' => 'fab-'.$val.'.glyph', 'thumbUrl' => 'fab-'.$val, 'title' => 'FA5 fa-'.$val, 'slideCaption' => 'Font-Awesome 5 (brand)', 'slideCategory' => 'font-awesome' ); } $fas = e107::getMedia()->getGlyphs('fas'); foreach($fas as $val) { $items[] = array( 'previewHtml' => $md->previewTag('fas-'.$val, array('type'=>'glyph')), 'previewUrl' => 'fas fa-'.$val, 'saveValue' => 'fas-'.$val.'.glyph', 'thumbUrl' => 'fas-'.$val, 'title' => 'FA5 fa-'.$val, 'slideCaption' => 'Font-Awesome 5 (solid)', 'slideCategory' => 'font-awesome' ); } $far = e107::getMedia()->getGlyphs('far'); foreach($far as $val) { $items[] = array( 'previewHtml' => $md->previewTag('far-'.$val, array('type'=>'glyph')), 'previewUrl' => 'far fa-'.$val, 'saveValue' => 'far-'.$val.'.glyph', 'thumbUrl' => 'far-'.$val, 'title' => 'FA5 far-'.$val, 'slideCaption' => 'Font-Awesome 5 (regular)', 'slideCategory' => 'font-awesome' ); } } if($this->fontawesome === 4) { e107::getParser()->setFontAwesome(4);; $fa4 = e107::getMedia()->getGlyphs('fa4'); foreach($fa4 as $val) { $items[] = array( 'previewHtml' => $md->previewTag('fa-'.$val, array('type'=>'glyph')), 'previewUrl' => 'fa fa-'.$val, 'saveValue' => 'fa-'.$val.'.glyph', 'thumbUrl' => 'fa-'.$val, 'title' => 'FA4 '.$val, 'slideCaption' => 'Font-Awesome 4', 'slideCategory' => 'font-awesome' ); } } if($this->fontawesome === false || ($this->fontawesome < 4)) { $bs3 = e107::getMedia()->getGlyphs('bs3','glyphicon-'); foreach($bs3 as $val) { $items[] = array( 'previewHtml' => $md->previewTag($val, array('type'=>'glyph')), 'previewUrl' => 'glyphicon '.$val, 'saveValue' => $val.'.glyph', 'thumbUrl' => $val, 'title' => 'BS3 '.$val, 'slideCaption' => 'Bootstrap', 'slideCategory' => 'bootstrap' ); } } $custom = e107::getThemeGlyphs(); if(!empty($custom)) { foreach($custom as $glyphConfig) { $tmp = e107::getMedia()->getGlyphs($glyphConfig, $glyphConfig['prefix']); if(!empty($tmp)) { foreach($tmp as $val) { $items[] = array( 'previewHtml' => $md->previewTag($glyphConfig['class']. ' ' .$val,array('type' =>'glyph')), 'previewUrl' => $glyphConfig['class']. ' ' .$val, 'saveValue' => $val.'.glyph', 'thumbUrl' => $val, 'title' => $val, 'slideCaption' => ucfirst($glyphConfig['name']), 'slideCategory' => $glyphConfig['name'] ); } } } } if(!empty($parm['search'])) { $filtered = array(); if(!empty($items)) { foreach($items as $v) { if(strpos($v['title'], $parm['search'])!==false) { $v['slideCaption'] = ''; $filtered[] = $v; } } } $items = $filtered; } return e107::getMedia()->browserCarousel($items, $parms); } /** * Extract Video or Playlist code from a URL * Currently works with v=xxx or list=xxxx * @param $url * @return string */ function getYouTubeCode($url) { $url = str_replace('url:', 'http://',$url); list($tmp,$qry) = explode('?',$url); parse_str($qry,$opt); if(!empty($opt['list'])) { return 'playlist:'.$opt['list']; } if(!empty($opt['v'])) { return 'video:'.$opt['v']; } $pattern = '#^(?:https?://)?(?:www\.|m\.)?(?:youtu\.be/|youtube\.com(?:/embed/|/v/|/watch\?v=|/watch\?.+&v=))([\w-]{11})(?:.+)?$#x'; preg_match($pattern, $url, $matches); return isset($matches[1]) ? 'video:'.trim($matches[1]) : false; } /** * @param string $parm * @return string * @see https://www.googleapis.com/youtube/v3/search */ private function youtubeTab($parm='') { $apiKey = e107::pref('core','youtube_apikey'); $searchQry = $this->getQuery('search'); if(strpos($searchQry, 'url:') === 0) { $searchQry = $this->getYouTubeCode($searchQry); } if(!empty($searchQry)) // -- Search Active. { if(strpos($searchQry, 'video:') === 0 || strpos($searchQry, 'v=') === 0) // YouTube video code { $searchQry = (strpos($searchQry, 'v=') === 0) ? trim(substr($searchQry,2)) : trim(substr($searchQry,6)); $extension = 'youtube'; // $feed = "https://www.googleapis.com/youtube/v3/videos?part=snippet&id=".urlencode($searchQry)."&key=".$apiKey; $data = array(); $data['items'][0]['id']['videoId'] = $searchQry; $data['items'][0]['snippet']['thumbnails']['medium']['url'] = 'https://i.ytimg.com/vi/' .$searchQry. '/mqdefault.jpg'; $data['items'][0]['snippet']['title'] = 'Specified Video'; } elseif(strpos($searchQry, 'playlist:') === 0) // playlist { if(empty($apiKey)) { $playlistID = substr($searchQry,9); $data = array(); $data['items'][0]['id']['videoId'] = $playlistID; $data['items'][0]['snippet']['thumbnails']['medium']['url'] = e_IMAGE_ABS. 'generic/playlist_120.png'; // "http://i.ytimg.com/vi/".$playlistID."/mqdefault.jpg"; // not really possible, so it will show a generic grey image. $data['items'][0]['snippet']['title'] = 'Specified Playlist'; } else { $searchQry = trim(substr($searchQry,9)); $feed = 'https://www.googleapis.com/youtube/v3/search?part=snippet&q=' .urlencode($searchQry). '&type=playlist&maxResults=1&key=' .$apiKey; } $extension = 'youtubepl'; } elseif(strpos($searchQry, 'channel:') === 0) { $searchQry = trim(substr($searchQry,8)); $extension = 'youtube'; $feed = 'https://www.googleapis.com/youtube/v3/search?part=snippet&channelId=' .urlencode($searchQry). '&type=video&maxResults=20&key=' .$apiKey; } else { $feed = 'https://www.googleapis.com/youtube/v3/search?part=snippet&q=' .urlencode($searchQry). '&type=video&maxResults=20&key=' .$apiKey; $extension = 'youtube'; } } else // -- default state. { $defaultAccount = e107::pref('core','youtube_default_account'); if(empty($defaultAccount)) { $defaultAccount = 'e107inc'; } $accFeed = 'https://www.googleapis.com/youtube/v3/channels?part=contentDetails&forUsername=' .$defaultAccount. '&key=' .$apiKey; $accData = e107::getFile()->getRemoteContent($accFeed); $accData = json_decode($accData,true); $channelID = e107::pref('core', 'youtube_default_account'); if(!empty($accData['items'])) { foreach($accData['items'] as $val) { if($val['kind'] === 'youtube#channel') { $channelID = $val['id']; break; } } } $feed = 'https://www.googleapis.com/youtube/v3/search?part=snippet&channelId=' .$channelID. '&type=video&maxResults=20&key=' .$apiKey; $extension = 'youtube'; } if(!empty($feed) ) { if(!empty($apiKey)) { $data = e107::getFile()->getRemoteContent($feed); $data = json_decode($data,true); $items = array(); } else // empty key. { $link = ''.IMALAN_177.''; $items = "

".e107::getParser()->lanVars(e107::getParser()->toHTML(IMALAN_174, true), array('x'=>$link)). '

'; } } $bbcode = $this->getQuery('bbcode'); $close = (!empty($bbcode)) ? false : true; // only close on 'select' when bbcodes are not in use. if(!empty($data)) { $tp = e107::getParser(); foreach($data['items'] as $value) { $id = $value['id']['videoId']; $thumbnail = $value['snippet']['thumbnails']['medium']['url']; $items[] = array( // 'previewHtml' => $bbcode !== 'video' ? null : $tp->toVideo($id. '.' .$extension, array('w' =>210, 'h' =>140)), 'previewHtml' => $tp->toVideo($id. '.' .$extension, array('w' =>210, 'h' =>140)), 'previewUrl' => $thumbnail, 'saveValue' => $id. '.' .$extension, // youtube", 'thumbUrl' => $thumbnail, 'title' => varset($value['snippet']['title']), 'close' => $close ); if($extension === 'youtubepl') // save Image for background. { $thumbnail = $value['snippet']['thumbnails']['high']['url']; $hiresThumbnail = $thumbnail; e107::getMedia()->saveThumb($hiresThumbnail, $id); //TODO move to $tp->Video(); ? } } } // return print_a($data,true); $parms = array( 'width' => 200, 'height'=>113, 'type'=>'image', 'bbcode'=>'video', 'tagid'=> $this->getQuery('tagid'), 'action'=>'youtube', 'searchPlaceholder'=>IMALAN_175, 'gridClass' => 'col-xs-6 col-sm-3 media-carousel-item-youtube', 'perPage' => 8, ); $text = e107::getMedia()->browserCarousel($items, $parms); if(E107_DEBUG_LEVEL > 0 && !empty($feed)) { $text .= '
Debug: ' . $feed. '
'; if(!empty($data)) { $text .= print_a($data,true); } } return $text; } function importPage() { $this->processUploadUrl(); $this->batchImportForm(); } function processUploadUrl($import = false, $cat='_common') { $fl = e107::getFile(); $mes = e107::getMessage(); $tp = e107::getParser(); if(!empty($_POST['upload_remote_url'])) { $fileName = basename($_POST['upload_url']); if(strpos($fileName,'?')!==false) { list($fileName,$bla) = explode('?', $fileName); } $uploadCaption = !empty($_POST['upload_caption']) ? $tp->filter($_POST['upload_caption']) : ''; $fileName = str_replace(array('%','+'),'',$fileName); // remove script extensions. if(substr($fileName,-4) === '.php' || substr($fileName,-4) === '.htm' || substr($fileName,-5) === '.html' || substr($fileName,-4) === '.asp') { $fileName = empty($uploadCaption) ? str_replace(array('.php', '.html', '.asp', '.htm'),'',$fileName). '_' .time() : eHelper::dasherize(strtolower($uploadCaption)); } if(!$fl->isAllowedType($_POST['upload_url'])) { $mes->addError(defset('IMALAN_190', "Importing of this file-type is not allowed.")); } elseif(!$fl->getRemoteFile($tp->filter($_POST['upload_url'], 'url'), $fileName, 'import')) { $mes->addError(IMALAN_176); } elseif($import == true) { $data = array('media_caption' => $uploadCaption); e107::getMedia()->importFile($fileName,$cat, null, $data); } } } /** * @return bool|false *@deprecated by $prefs. */ function settingsPage() { return false; global $pref; $frm = e107::getForm(); $tp = e107::getParser(); $sql = e107::getDb(); $ns = e107::getRender(); $mes = e107::getMessage(); if(function_exists('gd_info')) { $gd_info = gd_info(); $gd_version = $gd_info['GD Version']; } else { $gd_version = " ".IMALAN_55. ''; } $folder1 = e107::getFolder('imagemagick'); if($pref['resize_method'] === 'ImageMagick' && (!vartrue($folder1))) { $mes->addWarning('Please add: $IMAGEMAGICK_DIRECTORY="'.$pref['im_path'].'"; to your e107_config.php file'); } //$IM_NOTE = ""; $folder = e107::getFolder('imagemagick'); $im_path = vartrue($folder); if($im_path != '') { $im_file = $im_path.'convert'; if(!file_exists($im_file)) { //$IM_NOTE = "".IMALAN_52.""; $mes->addWarning(IMALAN_52); } else { $cmd = "{$im_file} -version"; $tmp = `$cmd`; if(strpos($tmp, 'ImageMagick') === FALSE) { //$IM_NOTE = "".IMALAN_53.""; $mes->addWarning(IMALAN_53); } } } $text = "
".IMALAN_7." '; list($img_import_w,$img_import_h) = explode('x',$pref['img_import_resize']); $text .= ' '; /* $text .= " // Removed to prevent mod_security blocks, and show only when relevant (non-GD2 users) "; // Removed as IE6 should no longer be supported. A 3rd-party plugin can be made for this functionality if really needed. $text .= " "; */ $text .= '
".IMALAN_1."
".$frm->checkbox('image_post', 1, $pref['image_post'])."
".IMALAN_2. '
' .IMALAN_10. ' ' .r_userclass('image_post_class',$pref['image_post_class'], 'off', 'public,guest,nobody,member,admin,main,classes')."
".IMALAN_11. '
' .IMALAN_12. ' ' .$frm->select_open('image_post_disabled_method'). ' ' .$frm->option(IMALAN_14, '0', ($pref['image_post_disabled_method'] == '0')). ' ' .$frm->option(IMALAN_15, '1', ($pref['image_post_disabled_method'] == '1')). ' ' .$frm->select_close()."
".IMALAN_13. '
' .IMALAN_105."
".IMALAN_106. '
' .$frm->text('img_import_resize_w', $img_import_w,4). 'px X ' .$frm->text('img_import_resize_h', $img_import_h,4). 'px
' .IMALAN_3."
".IMALAN_54." {$gd_version}
".$frm->select_open('resize_method'). ' ' .$frm->option('gd1', 'gd1', ($pref['resize_method'] === 'gd1')). ' ' .$frm->option('gd2', 'gd2', ($pref['resize_method'] === 'gd2')). ' ' .$frm->option('ImageMagick', 'ImageMagick', ($pref['resize_method'] === 'ImageMagick')). ' ' .$frm->select_close()."
".IMALAN_4. '
".IMALAN_5."
{$IM_NOTE}
".$frm->text('im_path', $pref['im_path'])."
".IMALAN_6."
".IMALAN_34."
".$frm->checkbox('enable_png_image_fix', 1, ($pref['enable_png_image_fix']))."
".IMALAN_35."
' .IMALAN_36. ' ' .$frm->admin_button('check_avatar_sizes', ADLAN_145)."
".$frm->admin_button('update_options', IMALAN_8, 'update'). '
'; echo $mes->render().$text; return; // $ns->tablerender(LAN_MEDIAMANAGER." :: ".IMALAN_7, $mes->render().$text); } function avatarPageDeleteChecked() { $sql = e107::getDb(); $mes = e107::getMessage(); $tp = e107::getParser(); if(!empty($_POST['multiaction'])) { $actions = $tp->filter($_POST['multiaction']); $tmp = array(); $tmp1 = array(); $message = array(); foreach ($actions as $todel) { list($usr,$path) = explode('#', $todel); // $path = basename($path); $path = str_replace('../', '',$path); // clean the path. $mes->addDebug('usr: '. (int) $usr .' path: '.$path); $image_type = 2; if(strpos($path, '-upload-') === 0) { $image_type = 1; $path = substr($path, strlen('-upload-')); } //delete it from server $deletePath = e_AVATAR.$tp->filter($path); if(@unlink($deletePath)) { $mes->addDebug('Deleted: '.$deletePath); $message[] = basename($path); //admin log & sysmessage } else { $mes->addError('Unable to delete: '.$deletePath); // Do not translate, temporary during beta stage. } //It's owned by an user if(!empty($usr)) { switch ($image_type) { case 1: //avatar $tmp[] = (int) $usr; break; case 2: //photo $tmp1[] = (int) $usr; break; } } } //Reset all deleted user avatars with one query if(!empty($tmp)) { $sql->update('user', "user_image='' WHERE user_id IN (".implode(',', $tmp). ')'); $mes->addDebug("user_image='' WHERE user_id IN (".implode(',', $tmp). ')'); } //Reset all deleted user photos with one query if(!empty($tmp1)) { $sql->update('user', "user_sess='' WHERE user_id IN (".implode(',', $tmp1). ')'); $mes->addDebug("user_sess='' WHERE user_id IN (".implode(',', $tmp1). ')'); } unset($tmp, $tmp1); //Format system message if(!empty($message)) { e107::getLog()->add('IMALAN_01', implode('[!br!]', $message)); $mes->addSuccess(implode(', ', $message).' '.IMALAN_28); } } } function renderHelp() { if($this->getAction() === 'avatar') { $text = IMALAN_155. ':
' .e_AVATAR_DEFAULT. ''; return array('caption'=>EMESSLAN_TITLE_INFO, 'text'=>$text); } } function avatarPage() { global $pref; if (isset($_POST['submit_show_delete_multi'])) { $this->avatarPageDeleteChecked(); } e107::css('inline', ' span.avatar-label { width:100%; display:block; padding:5px; margin-bottom:5px } div.avatar-container { margin-bottom:5px; max-height:350px } '); $sql = e107::getDb(); $frm = e107::getForm(); $tp = e107::getParser(); $mes = e107::getMessage(); $avFiles = e107::getFile()->get_files(e_MEDIA. 'avatars/', '.jpg|.png|.gif|.jpeg|.JPG|.GIF|.PNG',null,2); $dirlist = array(); foreach($avFiles as $f) { $dirlist[] = str_replace(e_MEDIA. 'avatars/', '',$f['path']). $f['fname']; } $text = ''; if (empty($dirlist)) { $text .= IMALAN_29; } else { $tmp = $sql->retrieve('user','user_id,user_image','user_image !="" ', true); $imageUsed = array(); foreach($tmp as $val) { $id = $val['user_id']; $imageUsed[$id] = str_replace('-upload-', '', $val['user_image']); } $userImages = array_flip($imageUsed); $text = $frm->open('core-image-avatars'); $text .= "
"; $count = 0; $prevType = ''; foreach($dirlist as $key=>$image_name) { //$users = IMALAN_21." | "; $row = array('user_id' => ''); $image_pre = ''; $disabled = false; /* if ($sql->select("user", "*", "user_image='-upload-".$tp->toDB($image_name)."' OR user_sess='".$tp->toDB($image_name)."'")) { $row = $sql->fetch(); if($row['user_image'] == '-upload-'.$image_name) $image_pre = '-upload-'; $users .= "{$row['user_name']} (".($row['user_sess'] == $image_name ? IMALAN_24 : IMALAN_23).")"; } else { } */ // : // $fileName = basename($image_name); $fileName = basename($image_name); $users = (in_array($fileName,$imageUsed)) ? "".IMALAN_153. '' : ''.IMALAN_154.''; //directory? if(is_dir(e_MEDIA. 'avatars/' .$image_name)) { //File info $users = "".IMALAN_66.": {$image_name} ".IMALAN_69. ''; //Friendly UI - click text to select a form element $img_src = ''.IMALAN_70.''; $disabled = true; } else { //File info // $users = "".IMALAN_66.": {$image_name} ".$users; // Control over the image size (design) // $image_size = getimagesize(e_MEDIA."avatars/".$image_name); //Friendly UI - click text to select a form element // Resized on-the-fly - avatar-size no longer an issue. // $attr = "aw=".$pref['im_width']."&ah=".$pref['im_height']; $attr = 'aw=200&ah=200'; $img_path = $tp->thumbUrl(e_MEDIA_ABS. 'avatars/' .$image_name,$attr); $type = dirname($image_name); if($prevType != $type) { $text .= "

".$type. '

'; } $for = $frm->name2id('multiaction-'.$image_name); $img_src = "
"; $prevType = $type; } //style attribute allowed here - server side width/height control //autocheck class - used for JS selectors (see eCoreImage object) $text .= "
{$users}
{$img_src}
".$frm->checkbox('multiaction[]', (int) $userImages[$fileName] ."#{$image_pre}{$image_name}", false, array('id' => $for, 'disabled' => $disabled)). '
'; $count++; } $text .= "
".$frm->admin_button('e_check_all', LAN_CHECKALL, 'action'). ' ' .$frm->admin_button('e_uncheck_all', LAN_UNCHECKALL, 'action'). ' ' .$frm->admin_button('submit_show_delete_multi', LAN_DELCHECKED, 'delete'). ' ' .$frm->admin_button('submit_show_deleteall', IMALAN_156, 'delete'). '
'; // $frm->admin_button('submit_cancel_show', IMALAN_68, 'cancel') } return $mes->render().$text; // $ns->tablerender(LAN_MEDIAMANAGER." :: ".IMALAN_18, $mes->render().$text); } /** * Invoked just before item create event * @return array */ public function beforeCreate($new_data, $old_data) { // print_a($_POST); // return data to be merged with posted model data $this->getRequest()->setPosted('media_upload'); //$dataFields = $this->getModel()->getDataFields(); //unset($dataFields['media_upload']); //$this->getModel()->setDataFields($dataFields); if($this->getQuery('for') && $this->getMediaCategory($this->getQuery('for'))) { $new_data['media_category'] = $this->getQuery('for'); } return $this->observeUploaded($new_data); } /** * Same as beforeCreate() but invoked on edit * @return TBD */ public function beforeUpdate($new_data, $old_data, $id) { // return data to be merged with posted model data // $new_data['media_category'] = implode(",",$new_data['media_category']); $this->fields['media_category']['data'] = 'str'; //XXX Quick fix for 'comma' incompatibility in Db-Update routines. return $new_data; // return $this->observeUploaded($new_data); } public function mediaData($sc_path) { if(!$sc_path) { return array(); } $path = e107::getParser()->replaceConstants($sc_path); $info = e107::getFile()->getFileInfo($path); return array( 'media_type' => $info['mime'], 'media_datestamp' => time(), 'media_url' => e107::getParser()->createConstants($path, 'rel'), 'media_size' => filesize($path), 'media_author' => USERID, 'media_usedby' => '', 'media_tags' => '', 'media_dimensions' => $info['img-width']. ' x ' .$info['img-height'] ); } // XXX - strict mysql error on Create without UPLOAD! function observeUploaded($new_data) { $fl = e107::getFile(); $mes = e107::getMessage(); if(vartrue($_FILES['file_userfile'])) // CREATE { $pref['upload_storagetype'] = '1'; require_once(e_HANDLER. 'upload_handler.php'); //TODO - still not a class! // $uploaded = process_uploaded_files(e_MEDIA.'temp/'); //FIXME doesn't handle xxx.JPG (uppercase) $uploaded = process_uploaded_files(e_IMPORT); //FIXME doesn't handle xxx.JPG (uppercase) $upload = array_shift($uploaded); if(vartrue($upload['error'])) { $mes->addError($upload['message']); return FALSE; } if(!$typePath = $this->getPath($upload['type'])) { $mes->addError(IMALAN_107); return FALSE; } $mes->addDebug(print_a($upload,TRUE)); // $oldpath = e_MEDIA."temp/".$upload['name']; $oldpath = e_IMPORT.$upload['name']; $newpath = $this->checkDupe($oldpath,$typePath.'/'.$upload['name']); if(!rename($oldpath, e_MEDIA.$newpath)) { $srch = array('[x]','[y]'); $repl = array($oldpath,$newpath); $text = str_replace($srch,$repl,IMALAN_108); $mes->add($text, E_MESSAGE_ERROR); return FALSE; } $img_data = $this->mediaData($newpath); // Basic File Info only $img_data['media_name'] = $new_data['name']; $img_data['media_caption'] = $new_data['media_caption']; $img_data['media_category'] = $new_data['media_category']; $img_data['media_description'] = $new_data['media_description']; $img_data['media_tags'] = $new_data['media_tags']; $img_data['media_userclass'] = 0; $img_data['media_author'] = USERID; if(!varset($img_data['media_name'])) { $img_data['media_name'] = $upload['name']; } $mes->addDebug(print_a($img_data,TRUE)); return $img_data; } else // Update Only ? { $img_data = $this->mediaData($new_data['media_url']); if(!($typePath = $this->getPath($img_data['media_type']))) { $mes->addError(IMALAN_109. ' ' .$typePath); return FALSE; } $fname = basename($new_data['media_url']); // move to the required place if(strpos($new_data['media_url'], '{e_IMPORT}') !== FALSE) // if(strpos($new_data['media_url'], '{e_MEDIA}temp/') !== FALSE) { $tp = e107::getParser(); $oldpath = $tp->replaceConstants($new_data['media_url']); $newpath = $this->checkDupe($oldpath,$typePath.'/'.$fname); if(!rename($oldpath, $newpath)) { $srch = array('[x]','[y]'); $repl = array($oldpath,str_replace('../', '', $newpath)); $text = str_replace($srch,$repl,IMALAN_108); $mes->add($text, E_MESSAGE_ERROR); return FALSE; } $img_data['media_url'] = $tp->createConstants($newpath, 'rel'); } if(!varset($new_data['media_name'])) { $img_data['media_name'] = basename($new_data['media_url']); } return $img_data; } } // Check for existing image path in db and rename if found. function checkDupe($oldpath,$newpath) { $mes = e107::getMessage(); $tp = e107::getParser(); $f = e107::getFile()->getFileInfo($oldpath,TRUE); $mes->addDebug('checkDupe(): newpath=' .$newpath. '
oldpath=' .$oldpath. '
' .print_r($newpath,TRUE)); if(file_exists($newpath) || e107::getDb()->select('core_media', '*',"media_url = '".$tp->createConstants($newpath,'rel')."' LIMIT 1") ) { $mes->addWarning($newpath. ' already exists.'); $file = $f['pathinfo']['filename']. '_.' .$f['pathinfo']['extension']; $newpath = $this->getPath($f['mime']).'/'.$file; return false; } return $newpath; } function beforeDelete($data, $id) // call before 'delete' is executed. - return false to prevent delete execution (e.g. some dependencies check) { return true; } function afterDelete($deleted_data, $id, $deleted_check) // call after 'delete' is successfully executed. - delete the file with the db record (optional pref) { if(!empty($deleted_data['media_url'])) { $status = e107::getFile()->delete($deleted_data['media_url']); $message = ($status !== false) ? LAN_UI_FILE_DELETED : LAN_UI_FILE_DELETED_FAILED; $mes = e107::getParser()->lanVars($message,$deleted_data['media_url'], true); $errType = ($status) ? E_MESSAGE_SUCCESS : E_MESSAGE_ERROR; e107::getMessage()->add($mes, $errType); } } function getPath($mime) { return e107::getMedia()->getPath($mime); /* $mes = e107::getMessage(); list($pmime,$tmp) = explode('/',$mime); if(!vartrue($this->mimePaths[$pmime])) { $text = str_replace('[x]',$mime,IMALAN_111); $mes->add($text, E_MESSAGE_ERROR); return FALSE; } $dir = $this->mimePaths[$pmime].date("Y-m"); if(!is_dir($dir)) { if(!mkdir($dir, 0755)) { $text = str_replace('[x]',$dir,IMALAN_112); $mes->add($text, E_MESSAGE_ERROR); return FALSE; }; } return $dir;*/ } function batchImportForm() { $frm = e107::getForm(); $mes = e107::getMessage(); $fl = e107::getFile(); $tp = e107::getParser(); $fl->setFileInfo('all'); $rejectArray = array('^\.ftpquota$','^index\.html$','^null\.txt$','\.bak$','^.tmp','.*\.xml$','^\.$','^\.\.$','^\/$','^CVS$','thumbs\.db','.*\._$','^\.htaccess$','index\.html','null\.txt'); $fl->setFileFilter($rejectArray); // $files = $fl->get_files(e_MEDIA."temp/"); $files = $fl->get_files(e_IMPORT); // e107::js('core','core/admin.js','prototype'); //TODO Detect XML file, and if found - read that instead of the directory. if(!vartrue($_POST['batch_import_selected'])) { $mes->add(IMALAN_113. ' ' .e_IMPORT. '', E_MESSAGE_INFO); } if(!count($files) ) { if(!vartrue($_POST['batch_import_selected'])) { $mes->add(IMALAN_114, E_MESSAGE_INFO); } $text = $this->uploadTab(); echo $mes->render().$text; return; } $text = "
'; // $c = 0; foreach($files as $f) { if(empty($f)) { e107::getMessage()->addWarning(IMALAN_180. ' ' .e_IMPORT. '
' .IMALAN_181); ////rename(e_IMPORT.$f['path'].$f['fname'],e_IMPOT.$f['path'].$f['fname']."-bad"); continue; } $default = $this->getFileXml($f['fname']); $f = $fl->cleanFileName($f,true); $c = md5($f['path'].$f['fname']); if(!empty($f['error'])) { $text = str_replace('[x]', $f['fname'], IMALAN_122); $mes->addWarning($text); } $large = e107::getParser()->thumbUrl($f['path'].$f['fname'], 'w=800', true); $checked = empty($_POST['batch_selected']) ? true : false; $text .= " \n"; // $c++; $lastMime = $f['mime']; } // $this->cats['_avatars_public'] = IMALAN_178; $this->cats['_avatars_private'] = IMALAN_179; if(!isset($_POST['batch_category']) && strpos($lastMime, 'image') === 0) { $_POST['batch_category'] = '_common_image'; } $text .= "
".e107::getForm()->checkbox_toggle('e-column-toggle', 'batch_selected')." ".IMALAN_121." ".LAN_FILE. ' ' .IMALAN_115. ' ' .IMALAN_116. ' ' .LAN_AUTHOR. ' ' .IMALAN_118. ' ' .IMALAN_119. ' ' .LAN_DATESTAMP." ".IMALAN_120. '
".$frm->checkbox('batch_selected[' .$c. ']',$f['fname'],$checked)." ".$this->preview($f)." ".$f['fname']. ' ' .$frm->text('batch_import_name['.$c.']', (!empty($_POST['batch_import_name'][$c]) ? $tp->filter($_POST['batch_import_name'][$c]) : $default['title']))." ".$default['authorName']. '
' .$default['authorEmail']. '
' .$f['mime']. ' ' .$f['fsize']. ' ' .e107::getDateConvert()->convert_date($f['modified'])." ".$f['img-width']. ' x ' .$f['img-height']."
".$frm->textarea('batch_import_diz['.$c.']', ($_POST['batch_import_diz'][$c] ? $_POST['batch_import_diz'][$c] : $default['description']))."
".IMALAN_123. ' ' .$frm->selectbox('batch_category',$this->cats, $tp->filter($_POST['batch_category'])); $text .= "
".$frm->admin_button('batch_import_selected', IMALAN_124, 'import') .$frm->admin_button('batch_import_delete', IMALAN_125, 'delete'); $text .= '
'; echo $mes->render().$text; } // Check for matching XML file name and if found, return data from it during import. function getFileXml($imgFile) { list($file,$ext) = explode('.',$imgFile); $xmlFile = e_IMPORT.$file. '.xml'; if(is_readable($xmlFile)) { $data = file_get_contents($xmlFile); preg_match("/(.*)<\/title>/i",$data,$title); preg_match("/(.*)<\/description>/i",$data,$diz); return array( 'title' => $title[1], 'description' => $diz[1], 'authorName' => $authorName[1], 'authorEmail' => $authorEmail[1] ); } $srch = array('_', '-'); $description = str_replace($srch, ' ',$file); $file = utf8_encode($file); $description = utf8_encode($description); return array('title'=>basename($file),'description'=>$description,'authorName'=>USERNAME,'authorEmail'=>''); /* Example: matchingfilename.xml (ie. same name as jpg|.gif|.png etc) Title of File Description of File */ } function deleteFileXml($imgFile) { list($file,$ext) = explode('.',$imgFile); $xmlFile = e_IMPORT.$file. '.xml'; if(file_exists($xmlFile)) { unlink($xmlFile); } } function batchDelete() { $tp = e107::getParser(); foreach($_POST['batch_selected'] as $key=>$file) { if(trim($file) == '') { continue; } // $oldpath = e_MEDIA."temp/".$file; $oldpath = e_IMPORT . $tp->filter($file, 'file'); if(file_exists($oldpath)) { unlink($oldpath); } } } function batchImport() { $fl = e107::getFile(); $mes = e107::getMessage(); $sql = e107::getDb(); $tp = e107::getParser(); if(!count($_POST['batch_selected'])) { $mes->addError(IMALAN_126); return; } // list($img_import_w,$img_import_h) = explode("x",e107::getPref('img_import_resize')); // Disable resize-on-import and watermark for now. $img_import_w = 2816; $img_import_h = 2112; foreach($_POST['batch_selected'] as $key=>$file) { $oldpath = e_IMPORT.$tp->filter($file, 'file'); if($_POST['batch_category'] === '_avatars_public' || $_POST['batch_category'] === '_avatars_private') { $newpath = ($_POST['batch_category'] === '_avatars_public') ? e_AVATAR_DEFAULT.$tp->filter($file, 'file') : $newpath = e_AVATAR_UPLOAD.$tp->filter($file, 'file'); if(rename($oldpath,$newpath)) { $mes->addSuccess(IMALAN_128. ' ' .$newpath); } else { $mes->addError(IMALAN_128. ' ' .$newpath); } continue; } // Resize on Import Routine ------------------------ // if(vartrue($img_import_w) && vartrue($img_import_h)) // { // $this->resizeImage($file,$img_import_w,$img_import_h); // } // End Resize routine. --------------------- $f = $fl->getFileInfo($oldpath); if(!$f['mime']) { $mes->add(IMALAN_127. ' ' .$oldpath, E_MESSAGE_WARNING); // $mes->add(print_a($f,true), E_MESSAGE_ERROR); $f['mime'] = 'other/file'; } if(!$newDir = $this->getPath($f['mime'])) { continue; } $newpath = $this->checkDupe($oldpath,$newDir.'/'.$file); $newname = $tp->toDB($_POST['batch_import_name'][$key]); $newdiz = $tp->toDB($_POST['batch_import_diz'][$key]); $f['fname'] = $file; /* if(file_exists($newpath) || $sql->select("core_media","media_url = '".$tp->createConstants($newpath,'rel')."' LIMIT 1") ) { $mes->addWarning($newpath." already exists and was renamed during import."); $file = $f['pathinfo']['filename']."_.".$f['pathinfo']['extension']; $newpath = $this->getPath($f['mime']).'/'.$file; } */ if(rename($oldpath,$newpath)) { $insert = array( 'media_caption' => $newdiz, 'media_description' => '', 'media_category' => $tp->filter($_POST['batch_category']), 'media_datestamp' => $f['modified'], 'media_url' => $tp->createConstants($newpath,'rel'), 'media_userclass' => '0', 'media_name' => $newname, 'media_author' => USERID, 'media_size' => $f['fsize'], 'media_dimensions' => $f['img-width']. ' x ' .$f['img-height'], 'media_usedby' => '', 'media_tags' => '', 'media_type' => $f['mime'] ); if($sql->insert('core_media',$insert)) { $mes->add(IMALAN_128. ' ' .$f['fname'], E_MESSAGE_SUCCESS); $this->deleteFileXml($f['fname']); } else { rename($newpath,$oldpath); //move it back. } } } } function preview($f) { list($type,$tmp) = explode('/',$f['mime']); if($type === 'image') { $url = e107::getParser()->thumbUrl($f['path'].$f['fname'], 'w=100', true); $large = e107::getParser()->thumbUrl($f['path'].$f['fname'], 'w=800', true); //echo $url; return "\"".varset($f['name'])."\""; } else { return; //TODO generic icon/image for no preview. } } public function getMediaCategory($id = null) { if (is_array($id)) { $text = ''; foreach ($id as $val) { $text .= (isset($this->cats[$val]) ? "" . $this->cats[$val] . '
' : ''); } return $text; } if(!empty($id)) { { return (isset($this->cats[$id]) ? $this->cats[$id] : 0); } } return $this->cats; } /* * UPDATE IMAGE OPTIONS - MAIN SCREEN */ function updateSettings() { global $pref,$admin_log,$tp; $mes = e107::getMessage(); $tmp = array(); $tmp['image_post'] = (int) $_POST['image_post']; $tmp['resize_method'] = $tp->toDB($_POST['resize_method']); $tmp['im_path'] = trim($tp->toDB($_POST['im_path'])); $tmp['image_post_class'] = (int) $_POST['image_post_class']; $tmp['image_post_disabled_method'] = (int) $_POST['image_post_disabled_method']; $tmp['enable_png_image_fix'] = (int) $_POST['enable_png_image_fix']; if($_POST['img_import_resize_w'] && $_POST['img_import_resize_h']) { $tmp['img_import_resize'] = (int) $_POST['img_import_resize_w'] . 'x' . (int) $_POST['img_import_resize_h']; } e107::getConfig()->setPref($tmp)->save(true,true,true); } } new media_admin(); require_once(e_ADMIN. 'auth.php'); e107::getAdminUI()->runPage(); // ----------------------------------------------------------------------- $action = e_QUERY; /* * DELETE CHECKED AVATARS - SHOW AVATAR SCREEN */ /* * DELETE ALL UNUSED IMAGES - SHOW AVATAR SCREEN */ if (isset($_POST['submit_show_deleteall'])) { $handle = opendir(e_AVATAR_UPLOAD); $dirlist = array(); $ignore = ['.', '..', 'index.html', 'null.txt', '/', 'CVS', 'Thumbs.db']; while ($file = readdir($handle)) { if(in_array($file, $ignore)) { continue; } if (!is_dir(e_AVATAR_UPLOAD.$file)) { $dirlist[] = $file; } } closedir($handle); if(!empty($dirlist)) { $imgList = ''; $count = 0; foreach ($dirlist as $image_name) { $image_name = basename($image_name); $image_todb = $tp->toDB($image_name); if (!$sql->count('user', '(*)', "WHERE user_image='-upload-{$image_todb}' OR user_sess='{$image_todb}'")) { unlink(e_AVATAR_UPLOAD.$image_name); $imgList .= '[!br!]'.$image_name; $count++; } } $message = $count. ' ' .IMALAN_26; $mes->addSuccess($message); e107::getLog()->add('IMALAN_02', $message.$imgList); unset($imgList); } } /* * DELETE ALL CHECKED BAD IMAGES - VALIDATE SCREEN */ if (isset($_POST['submit_avdelete_multi'])) { require_once(e_HANDLER. 'avatar_handler.php'); $avList = array(); $tmp = array(); $uids = array(); $tp = e107::getParser(); $sql = e107::getDb(); //Sanitize $multiaction = $tp->filter($_POST['multiaction'], 'int'); //sql queries significant reduced if(!empty($multiaction) && $sql->select('user', 'user_id, user_name, user_image', 'user_id IN (' .implode(',', $multiaction). ')')) { $search_users = $sql->db_getList('ALL', FALSE, FALSE, 'user_id'); foreach($multiaction as $uid) { if (vartrue($search_users[$uid])) { $avname = avatar($search_users[$uid]['user_image']); if (strpos($avname, 'http://') === FALSE) { // Internal file, so unlink it @unlink($avname); } $uids[] = $uid; $tmp[] = $search_users[$uid]['user_name']; $avList[] = $uid.':'.$search_users[$uid]['user_name'].':'.$search_users[$uid]['user_image']; } } //sql queries significant reduced if(!empty($uids)) { $sql->update('user', "user_image='' WHERE user_id IN (".implode(',', $uids). ')'); } $mes->addSuccess(IMALAN_51.''.implode(', ', $tmp).' '.IMALAN_28); e107::getLog()->add('IMALAN_03', implode('[!br!]', $avList)); unset($search_users); } unset($avList, $tmp, $uids); } /* * CHECK AVATARS SCREEN */ if (isset($_POST['check_avatar_sizes'])) { // Set up to track what we've done // $iUserCount = 0; $iAVinternal = 0; $iAVexternal = 0; $iAVnotfound = 0; $iAVtoobig = 0; require_once(e_HANDLER. 'avatar_handler.php'); $text = "
".CACLAN_3." '; // // Loop through avatar field for every user // $iUserCount = $sql->count('user'); $found = false; $allowedWidth = (int) $pref['im_width']; $allowedHeight = (int) $pref['im_width']; if ($sql->select('user', '*', "user_image!=''")) { while ($row = $sql->fetch()) { //Check size $avname=avatar($row['user_image']); if (strpos($avname, 'http://')!==FALSE) { $iAVexternal++; $bAVext=TRUE; } else { $iAVinternal++; $bAVext=FALSE; } $image_stats = getimagesize($avname); $sBadImage= ''; if (!$image_stats) { $iAVnotfound++; // allow delete $sBadImage=IMALAN_42; } else { $imageWidth = $image_stats[0]; $imageHeight = $image_stats[1]; if ( ($imageHeight > $allowedHeight) || ($imageWidth > $allowedWidth) ) { // Too tall or too wide $iAVtoobig++; if ($imageWidth > $allowedWidth) { $sBadImage = IMALAN_40." ($imageWidth)"; } if ($imageHeight > $allowedHeight) { if (strlen($sBadImage)) { $sBadImage .= ', '; } $sBadImage .= IMALAN_41." ($imageHeight)"; } } } //If not found or too large, allow delete if (strlen($sBadImage)) { $uparams = array('id' => $row['user_id'], 'name' => $row['user_name']); $ulink = e107::getUrl()->create('user/profile/view', $uparams); $found = true; $text .= " '; } } } //Nothing found if(!$found) { $text .= " '; } $text .= "
".LAN_OPTIONS." ".LAN_USER." ".IMALAN_62." ".LAN_URL. '
".$row['user_name']. ' ' .$sBadImage. ' ' .$avname. '
".IMALAN_65. '
".$frm->admin_button('check_all', LAN_CHECKALL, 'action'). ' ' .$frm->admin_button('uncheck_all', LAN_UNCHECKALL, 'action'). ' ' .$frm->admin_button('submit_avdelete_multi', LAN_DELCHECKED, 'delete')."
".IMALAN_38." {$allowedWidth}
".IMALAN_39." {$allowedHeight}
".IMALAN_45." {$iAVnotfound}
".IMALAN_46." {$iAVtoobig}
".IMALAN_47." {$iAVinternal}
".IMALAN_48." {$iAVexternal}
".IMALAN_49. ' ' .($iAVexternal+$iAVinternal). ' (' .(int)(100.0*(($iAVexternal+$iAVinternal)/$iUserCount)).'%, '.$iUserCount. ' ' .IMALAN_50. ')
'; $ns->tablerender(IMALAN_37, $mes->render().$text); } //Just in case... if(!e_AJAX_REQUEST) { require_once(__DIR__. '/footer.php'); }