| Current Path : /var/www/element/data/www/greenpr.ru/bitrix3/modules/fileman/classes/general/ |
| Current File : /var/www/element/data/www/greenpr.ru/bitrix3/modules/fileman/classes/general/medialib.php |
<?
IncludeModuleLangFile(__FILE__);
class CMedialib
{
function Init(){}
function GetOperations($collectionId)
{
global $USER;
static $oCollections;
static $arOp;
$userGroups = $USER->GetUserGroupArray();
$key = $collectionId.'|'.implode('-', $userGroups);
if (!is_array($arOp[$key]))
{
if (!is_array($arOp))
$arOp = array();
if (!is_array($oCollections))
{
$res = CMedialib::GetCollectionTree();
$oCollections = $res['Collections'];
}
$userGroups = $USER->GetUserGroupArray();
$res = CMedialib::GetAccessPermissionsArray($collectionId, $oCollections);
$arOp[$key] = array();
foreach ($res as $group_id => $task_id)
{
if (in_array($group_id, $userGroups))
$arOp[$key] = array_merge($arOp[$key], CTask::GetOperations($task_id, true));
}
}
return $arOp[$key];
}
function CanDoOperation($operation, $collectionId=0, $userId = false)
{
if ($GLOBALS["USER"]->IsAdmin())
return true;
$arOp = CMedialib::GetOperations($collectionId);
return in_array($operation, $arOp);
}
function GetAccessPermissionsArray($collectionId = 0, $oCollections = false)
{
static $arAllTasks;
if (is_array($arAllTasks[$collectionId]))
return $arAllTasks[$collectionId];
$col = $oCollections[$collectionId];
$arCols = array();
$resTask = array();
if ($col || $collectionId == 0)
{
$arCols[] = $collectionId;
if (intVal($col['PARENT_ID']) > 0)
{
$col_ = $col;
while($col_ && intVal($col_['PARENT_ID']) > 0)
{
$arCols[] = $col_['PARENT_ID'];
$col_ = $oCollections[$col_['PARENT_ID']];
}
}
$arCols[] = 0;
$arPerm = CMedialib::_GetAccessPermissions($arCols);
for($i = count($arCols); $i >= 0; $i--)
{
$colId = $arCols[$i];
if (is_array($arPerm[$colId]))
{
for ($j = 0, $n = count($arPerm[$colId]); $j < $n; $j++)
$resTask[$arPerm[$colId][$j]['GROUP_ID']] = $arPerm[$colId][$j]['TASK_ID'];
}
}
}
if (!is_array($arAllTasks))
$arAllTasks = array();
$arAllTasks[$collectionId] = $resTask;
return $resTask;
}
function _GetAccessPermissions($arCols = array())
{
global $DB;
$s = '0';
for($i=0; $i < count($arCols); $i++)
$s .= ",".IntVal($arCols[$i]);
$q = 'WHERE MCI.COLLECTION_ID in ('.$strCollections.')';
$strSql = 'SELECT *
FROM b_group_collection_task GCT
WHERE GCT.COLLECTION_ID in ('.$s.')';
$res = $DB->Query($strSql , false, "File: ".__FILE__."<br>Line: ".__LINE__);
$arResult = array();
while($arRes = $res->Fetch())
{
$colid = $arRes['COLLECTION_ID'];
if (!is_array($arResult[$colid]))
$arResult[$colid] = array();
unset($arRes['COLLECTION_ID']);
$arResult[$colid][] = $arRes;
}
return $arResult;
}
function ShowDialogScript($arConfig = array())
{
global $USER;
$strWarn = '';
$arConfig['bReadOnly'] = false;
$arConfig['lang'] = LANGUAGE_ID;
$event = '';
if (isset($arConfig['event']))
$event = preg_replace("/[^a-zA-Z0-9_]/i", "", $arConfig['event']);
if (strlen($event) <= 0)
$strWarn .= GetMessage('ML_BAD_EVENT').'. ';
$resultDest = "";
$bDest = is_array($arConfig['arResultDest']);
if ($bDest)
{
if (isset($arConfig['arResultDest']["FUNCTION_NAME"]))
{
$arConfig['arResultDest']["FUNCTION_NAME"] = preg_replace("/[^a-zA-Z0-9_]/i", "", $arConfig['arResultDest']["FUNCTION_NAME"]);
$bDest = strlen($arConfig['arResultDest']["FUNCTION_NAME"]) > 0;
$resultDest = "FUNCTION";
}
elseif (isset($arConfig['arResultDest']["FORM_NAME"], $arConfig['arResultDest']["FORM_ELEMENT_NAME"]))
{
$arConfig['arResultDest']["FORM_NAME"] = preg_replace("/[^a-zA-Z0-9_]/i", "", $arConfig['arResultDest']["FORM_NAME"]);
$arConfig['arResultDest']["FORM_ELEMENT_NAME"] = preg_replace("/[^a-zA-Z0-9_]/i", "", $arConfig['arResultDest']["FORM_ELEMENT_NAME"]);
$bDest = strlen($arConfig['arResultDest']["FORM_NAME"]) > 0 && strlen($arConfig['arResultDest']["FORM_ELEMENT_NAME"]) > 0;
$resultDest = "FORM";
}
elseif (isset($arConfig['arResultDest']["ELEMENT_ID"]))
{
$arConfig['arResultDest']["ELEMENT_ID"] = preg_replace("/[^a-zA-Z0-9_]/i", "", $arConfig['arResultDest']["ELEMENT_ID"]);
$bDest = strlen($arConfig['arResultDest']["ELEMENT_ID"]) > 0;
$resultDest = "ID";
}
else
{
$bDest = false;
}
}
if (!$bDest)
$strWarn .= GetMessage('ML_BAD_RETURN').'. ';
if (strlen($strWarn) <= 0)
{
?>
<script>
<?CMedialib::AppendLangMessages();?>
window.<?=$arConfig['event']?> = function(bLoadJS)
{
<?if(!CMedialib::CanDoOperation('medialib_view_collection', 0)):?>
return alert(ML_MESS.AccessDenied);
<?else:?>
if (!window.BXMediaLib)
{
if (bLoadJS !== false)
{
// Append CSS
if (!window.ml_styles_link || !window.ml_styles_link.parentNode)
window.ml_styles_link = jsUtils.loadCSSFile("/bitrix/js/fileman/medialib/medialib.css?v=<?=@filemtime($_SERVER['DOCUMENT_ROOT'].'/bitrix/js/fileman/medialib/medialib.css')?>");
if (!window.jsAjaxUtil)
jsUtils.loadJSFile("/bitrix/js/main/ajax.js?v=<?=@filemtime($_SERVER['DOCUMENT_ROOT'].'/bitrix/js/main/ajax.js')?>");
jsUtils.loadJSFile("/bitrix/js/fileman/medialib/core.js?v=<?=@filemtime($_SERVER['DOCUMENT_ROOT'].'/bitrix/js/fileman/medialib/core.js')?>");
}
return setTimeout(function(){<?=$arConfig['event']?>(false)}, 50);
}
<?CMedialib::ShowJS()?>
<?
$arSet = explode(',' , CUserOptions::GetOption("fileman", "medialib_user_set", '600,450,0'));
$width = $arSet[0] ? $arSet[0] : 600;
$height = $arSet[1] ? $arSet[1] : 450;
$coll_id = $arSet[2] ? $arSet[2] : 0;
?>
window._mlUserSettings = window._mlUserSettings || {width: <?=$width?>, height: <?=$height?>, coll_id: <?=$coll_id?>}
var oConfig =
{
sessid: "<?=bitrix_sessid()?>",
thumbWidth : <?= COption::GetOptionInt($module_id, "ml_thumb_width", 140)?>,
thumbHeight : <?= COption::GetOptionInt($module_id, "ml_thumb_height", 105) ?>,
userSettings : window._mlUserSettings,
resType: "<?= $resultDest?>",
arResultDest : <?= CUtil::PhpToJSObject($arConfig['arResultDest'])?>,
rootAccess: {
new_col: '<?= CMedialib::CanDoOperation('medialib_new_collection', 0)?>',
edit: '<?= CMedialib::CanDoOperation('medialib_edit_collection', 0)?>',
del: '<?= CMedialib::CanDoOperation('medialib_del_collection', 0)?>',
new_item: '<?= CMedialib::CanDoOperation('medialib_new_item', 0)?>',
edit_item: '<?= CMedialib::CanDoOperation('medialib_edit_item', 0)?>',
del_item: '<?= CMedialib::CanDoOperation('medialib_del_item', 0)?>',
access: '<?= CMedialib::CanDoOperation('medialib_access', 0)?>'
},
bCanUpload: <?= $USER->CanDoOperation('fileman_upload_files') ? 'true' : 'false'?>,
bCanViewStructure: <?= $USER->CanDoOperation('fileman_view_file_structure') ? 'true' : 'false'?>,
strExt : "<?= CMedialib::GetMediaExtentions()?>",
lang : "<?= $arConfig['lang']?>"
};
window.oBXMedialib = new BXMediaLib(oConfig);
oBXMedialib.Open();
<?endif;?>
}
</script>
<?
}
else
{
echo '<font color="#FF0000">'.htmlspecialchars($strWarn).'</font>';
}
}
function AttachJSScripts()
{
if(!defined("BX_B_MEDIALIB_SCRIPT_LOADED"))
{
define("BX_B_MEDIALIB_SCRIPT_LOADED", true);
?>
if (window.jsUtils)
{
jsUtils.addEvent(window, 'load', function(){jsUtils.loadJSFile("/bitrix/js/main/file_dialog.js?v=<?=@filemtime($_SERVER['DOCUMENT_ROOT'].'/bitrix/js/main/file_dialog.js')?>");}, false);
}
<?
}
}
function AppendLangMessages()
{
?>
var ML_MESS =
{
AccessDenied : '<?= GetMessage('ML_ACCESS_DENIED')?>',
SessExpired : '<?= GetMessage('ML_SESS_EXPIRED')?>',
DelCollection : '<?= GetMessage('ML_DEL_COLLECTION')?>',
DelItem : '<?= GetMessage('ML_DEL_ITEM')?>',
DelCollectionConf : '<?= GetMessage('ML_DEL_COLLECTION_CONFIRM')?>',
DelItemConf : '<?= GetMessage('ML_DEL_ITEM_CONFIRM')?>',
EditCollection : '<?= GetMessage('ML_EDIT_COLLECTION')?>',
EditItem : '<?= GetMessage('ML_EDIT_ITEM')?>',
NewCollection : '<?= GetMessage('ML_NEW_COLLECTION')?>',
Collection : '<?= GetMessage('ML_COLLECTION')?>',
ColLocEr : '<?= GetMessage('ML_COL_LOC_ER')?>',
ColLocEr2 : '<?= GetMessage('ML_COL_LOC_ER2')?>',
Item : '<?= GetMessage('ML_ITEM')?>',
NewItem : '<?= GetMessage('ML_NEW_ITEM')?>',
DelColFromItem : '<?= GetMessage('ML_DEL_COL2ITEM')?>',
ItemNoColWarn : '<?= GetMessage('ML_COL2ITEM_WARN')?>',
DateModified : '<?= GetMessage('ML_DATE_MODIFIED')?>',
FileSize : '<?= GetMessage('ML_FILE_SIZE')?>',
ImageSize : '<?= GetMessage('ML_IMAGE_SIZE')?>',
CheckedColTitle : '<?= GetMessage('ML_CHECKED_COL_TITLE')?>',
ItSourceError : '<?= GetMessage('ML_SOURCE_ERROR')?>',
ItNameError : '<?= GetMessage('ML_NAME_ERROR')?>',
ItCollsError : '<?= GetMessage('ML_COLLS_ERROR')?>',
ColNameError : '<?= GetMessage('ML_COL_NAME_ERROR')?>',
DelItConfTxt : '<?= GetMessage('ML_DEL_CONF_TEXT')?>',
DelItB1 : '<?= GetMessage('ML_DEL_IT_B1')?>',
DelItB2 : '<?= GetMessage('ML_DEL_IT_B2')?>',
CollAccessDenied : '<?= GetMessage('ML_COLL_ACCESS_DENIED')?>',
CollAccessDenied2 : '<?= GetMessage('ML_COLL_ACCESS_DENIED2')?>',
CollAccessDenied3: '<?= GetMessage('ML_COLL_ACCESS_DENIED3')?>',
CollAccessDenied4: '<?= GetMessage('ML_COLL_ACCESS_DENIED4')?>',
BadSubmit: '<?= GetMessage('ML_BAD_SUBMIT')?>',
ColNameError: '<?= GetMessage('ML_COL_NAME_ERROR')?>',
ItemExtError: '<?= GetMessage('ML_ITEM_EXT_ERROR')?>',
EditItemError: '<?= GetMessage('ML_EDIT_ITEM_ERROR')?>'
};
<?
}
function AppendLangMessagesEx()
{
?>
ML_MESS.Edit = '<?= GetMessage('ML_EDIT')?>';
ML_MESS.Delete = '<?= GetMessage('ML_DELETE')?>';
ML_MESS.Access = '<?= GetMessage('ML_ACCESS')?>';
ML_MESS.AccessTitle = '<?= GetMessage('ML_ACCESS_TITLE')?>';
ML_MESS.AddElement = '<?= GetMessage('ML_ADD_ELEMENT')?>';
ML_MESS.AddElementTitle = '<?= GetMessage('ML_ADD_ELEMENT_TITLE')?>';
ML_MESS.AddCollection = '<?= GetMessage('ML_ADD_COLLECTION')?>';
ML_MESS.AddCollectionTitle = '<?= GetMessage('ML_ADD_COLLECTION_TITLE')?>';
ML_MESS.MultiDelConfirm = '<?= GetMessage('ML_MULTI_DEL_CONFIRM')?>';
ML_MESS.Decreased = '<?= GetMessage('ML_DECREASED')?>';
<?
}
function Start($Params)
{
$Params['bReadOnly'] = false;
CMedialib::BuildDialog($Params);
// TODO: Check access
?>#ML_SUBDIALOGS_BEGIN#<?
CMedialib::BuildAddCollectionDialog($Params);
CMedialib::BuildAddItemDialog($Params);
CMedialib::BuildConfirmDialog($Params);
?>#ML_SUBDIALOGS_END#
<script><?CMedialib::GetCollections();?></script>
<?
}
function BuildDialog($Params)
{
?>
#ML_MAIN_DIALOG_BEGIN#
<form name="medialib_form"><table id="ml_frame" class="ml-frame"><tr>
<td class="ml-title-cell">
<table onmousedown="jsFloatDiv.StartDrag(arguments[0], document.getElementById('bxmedialib'));"><tr><td style="width: 10px; padding-left: 3px;"><img class="ml-iconkit ml-dd-dot" src="/bitrix/images/1.gif" /></td><td class="ml-diad-title" id="ml_diag_title"><?=GetMessage('ML_MEDIALIB')?></td><td id="bxml_close" class="ml-close" title="<?=GetMessage('ML_CLOSE')?>"><img src="/bitrix/images/1.gif"></td></tr></table>
</td></tr>
<tr><td class="ml-content-cell">
<div class="ml-head-cont" id="ml_head_cont">
<table><tr><td class="ml-left">
<div class="ml-breadcrumbs" id="ml_breadcrumbs"></div>
</td><td class="ml-right">
<?/*
<input class="ml-search" id="medialib_search" type="text" value=" - <?=GetMessage('ML_SEARCH_DEF')?> - "/>
*/?>
</td></tr></table>
</div>
<div class="ml-left-sec" id="ml_left_cont">
<div class="ml-collect-cont" id="ml_coll_cont"><div class="ml-no-colls"> - <?= GetMessage('ML_NO_COLS')?> - </div></div>
</div>
<div class="ml-right-sec" id="ml_right_cont">
<div class="ml-list-cont" id="ml_list_cont"><div class="ml-list-noitems"> - <?= GetMessage('ML_NO_ITEMS')?> - </div></div>
<div class="ml-info-cont" id="ml_info_wnd">
<div class="ml-info-noinfo"> - <?= GetMessage('ML_NO_ITEM_INFO')?> - </div>
<table class="ml-info-tbl">
<tr>
<td colSpan="2">
<div class="ml-info-name" id="ml_info_name"></div>
<div class="ml-info-collections" id="ml_info_colls"></div>
</td>
</tr>
<tr>
<td style="width: 50%;">
<span><?= GetMessage('ML_KEYWORDS')?>:</span>
<span id="ml_info_keys"></span>
</td>
<td rowSpan="2" style="width: 50%; vertical-align: top;">
<span><?= GetMessage('ML_DESC')?>:</span>
<div class="ml-info-desc" id="ml_info_desc"></div>
</td>
</tr>
<tr>
<td style="vertical-align: top;">
<div class="ml-info-details" id="ml_info_details"></div>
</td>
</tr>
</table>
</div>
</div>
<div class="ml-buttons-cont" id="ml_but_cont">
<table><tr>
<td class="ml-left">
<?if (!$Params['bReadOnly']):?>
<a id="ml_add_collection" href="javascript:void(0)" title="<?=GetMessage('ML_ADD_COLLECTION_TITLE')?>" class="ml-add-el-link"><img src="/bitrix/images/1.gif" /><?=GetMessage('ML_ADD_COLLECTION')?></a>
<a id="ml_add_item" href="javascript:void(0)" title="<?=GetMessage('ML_ADD_ELEMENT_TITLE')?>" class="ml-add-el-link"><img src="/bitrix/images/1.gif" /><?=GetMessage('ML_ADD_ELEMENT')?></a>
<?endif;?>
</td><td class="ml-right">
<input id="medialib_but_save" type="button" value="<?=GetMessage('ML_SELECT')?>" />
<input id="medialib_but_cancel" type="button" value="<?=GetMessage('ML_CANCEL')?>" />
</td></tr></table>
</div>
</td></tr>
</table>
</form>
<div id="bxml_resizer" class="ml-resizer"></div>
#ML_MAIN_DIALOG_END#
<?
}
function BuildAddCollectionDialog($Params)
{
?>
<div id="mlsd_coll" class="mlsd"><table class="mlsd-frame"><tr>
<td class="ml-title-cell">
<table onmousedown="jsFloatDiv.StartDrag(arguments[0], document.getElementById('mlsd_coll'));"><tr><td style="width: 10px; padding-left: 3px;"><img class="ml-iconkit ml-dd-dot" src="/bitrix/images/1.gif" /></td><td class="ml-diad-title"><span id="mlsd_coll_title"></span></td><td id="mlsd_coll_close" class="ml-close" title="<?=GetMessage('ML_CLOSE')?>"><img src="/bitrix/images/1.gif"></td></tr></table>
</td></tr>
<tr><td class="ml-content-cell">
<table class="mlsd-fields-tbl">
<tr><td><b><?=GetMessage('ML_NAME')?>:</b></td><td><input type="text" id="mlsd_coll_name" /></td></tr>
<tr><td style="vertical-align: top;"><?=GetMessage('ML_DESC')?>:</td><td><textarea id="mlsd_coll_desc" rows="2" cols="21"></textarea></td></tr>
<tr><td><?=GetMessage('ML_KEYWORDS')?>:</td><td><input type="text" id="mlsd_coll_keywords" /></td></tr>
<tr><td><?=GetMessage('ML_PLACE')?>:</td>
<td><select id="mlsd_coll_parent" style="width: 190px;"><option value="0"><?= GetMessage('ML_UPPER_LEVEL')?></option></select></td></tr>
</table>
</td></tr>
<tr><td class="ml-buttons-cell">
<input id="mlsd_coll_save" type="button" value="<?=GetMessage('ML_SAVE')?>">
<input id="mlsd_coll_cancel" type="button" value="<?=GetMessage('ML_CANCEL')?>">
</td></tr>
</table>
</div>
<?
}
function BuildAddItemDialog($Params)
{
?>
<div id="mlsd_item" class="mlsd"><table class="mlsd-frame"><tr>
<td class="ml-title-cell">
<table onmousedown="jsFloatDiv.StartDrag(arguments[0], document.getElementById('mlsd_item'));"><tr><td style="width: 10px; padding-left: 3px;"><img class="ml-iconkit ml-dd-dot" src="/bitrix/images/1.gif" /></td><td class="ml-diad-title"><span id="mlsd_item_title"></span></td><td id="mlsd_item_close" class="ml-close" title="<?=GetMessage('ML_CLOSE')?>"><img src="/bitrix/images/1.gif"></td></tr></table>
</td></tr>
<tr><td class="ml-content-cell">
<div id="mlsd_item_upload" style="overflow: hidden;"><iframe class="mlsd-iframe" id="mlsd_iframe_upload" src="javascript:''" frameborder="0"></iframe></div>
</td></tr>
<tr><td class="ml-buttons-cell">
<input id="mlsd_item_save" type="button" value="<?=GetMessage('ML_SAVE')?>">
<input id="mlsd_item_cancel" type="button" value="<?=GetMessage('ML_CANCEL')?>">
</td></tr>
</table>
</div>
<?
CAdminFileDialog::ShowScript(Array
(
"event" => "mlOpenFileDialog",
"arResultDest" => Array("FUNCTION_NAME" => "mlOnFileDialogSave"),
"arPath" => Array(),
"select" => 'F',
"operation" => 'O',// O - open, S - save
"showUploadTab" => true,
"showAddToMenuTab" => false,
"fileFilter" => CMedialib::GetMediaExtentions(),
"allowAllFiles" => false,
"SaveConfig" => true
)
);
}
function ShowUploadForm($Params)
{
?>
<HTML>
<HEAD>
<style>
body {margin:0px !important; overflow: hidden;}
body *{font-family:Verdana,Arial,Helvetica,sans-serif; font-size: 13px; color: #000;}
form {margin:0px !important;}
table.mlsd-ifrm-tbl {width: 400px; height: 265px; margin: 3px;}
a.mlsd-up-link{text-decoration: none; color: #6E8C9B; font-size: 11px;}
table.mlsd-ifrm-tbl input{width: 220px;}
div.mlsd-col-cont{height: 70px;}
div.mlsd-col-label, div.mlsd-col-sel{font-weight: bold; float: left; padding: 2px; margin: 2px;}
div.mlsd-col-sel select{width: 90px;}
div.mlsd-ch-col{float: left; border: 1px solid #6E8C9B; width: 80px; height: 20px; padding: 0px; overflow: hidden; margin: 2px; position: relative; background: url(/bitrix/images/fileman/medialib/group_bg.gif) repeat-x scroll left top;}
div.mlsd-ch-col span{white-space: nowrap; font-size: 12px !important; display: block; margin: 2px 0 0 2px;}
div.mlsd-ch-col img.ml-col-del{width: 17px; height: 18px; background-image: url(/bitrix/images/fileman/medialib/iconkit.gif); position: absolute; display: none; background-position: 0px -60px; top: 1px; right: 1px; cursor: pointer;}
div.col-over img.ml-col-del{display: block !important;}
div.mlsd-prev-cont{width: 150px; height: 140px; border: 1px solid #6E8C9B; text-align: center;}
div.mlsd-prev-cont img{margin: 2px;}
div.mlsd-prev-cont span{color: #6E8C9B; font-size: 11px; display: block; padding: 2px;}
select option.opt-checked{color: #808080; font-weight: bold; background-color: #F2F6F8;}
div.mlsd-size-cont{text-align: center; color: #808080;}
</style>
</HEAD>
<BODY style="margin:0px !important;">
<form name="ml_item_form" action="/bitrix/admin/fileman_medialib.php?action=edit_item&<?=bitrix_sessid_get()?>" onsubmit="return parent.oBXMediaLib.EditItemDialogOnsubmit();" method="post" enctype="multipart/form-data">
<table class="mlsd-ifrm-tbl">
<tr><td colSpan="2">
<div id="mlsd_fname_cont">
<b><?=GetMessage('ML_FILE')?>:</b><span style="padding: 0px 15px" id="ml_file_name"></span>
</div>
<div id="mlsd_load_cont">
<b><label for="ml_load_file"><?=GetMessage('ML_FILE')?>:</label></b>
<input id="ml_load_file" type="file" name="load_file" size="35" style="margin-left: 15px; width:180px;">
</div>
<div id="mlsd_select_cont" style="display: none;">
<b><label for="mlsd_item_path"><?=GetMessage('ML_FILE')?>:</label></b>
<input type="text" size="25" value="" id="mlsd_item_path" style="margin-left: 15px; width: 280px;" name="item_path">
<input type="button" id="mlsd_open_fd" value="..." style="width: 30px;">
</div>
<div style="text-align: right; padding-right: 20px;">
<div style="float: left; text-align: left; margin-top: -2px;">
<a id="mlsd_fname_change" href="javascript:void(0)" class="mlsd-up-link" title="<?=GetMessage('ML_CHANGE_FILE_TITLE')?>">(<?=GetMessage('ML_CHANGE')?>)</a>
<a id="mlsd_fname_change_back" href="javascript:void(0)" class="mlsd-up-link" title="<?=GetMessage('ML_CHANGE_UNDO_TITLE')?>">(<?=GetMessage('ML_CHANGE_UNDO')?>)</a>
</div>
<a id="mlsd_select_fd" href="javascript:void(0)" class="mlsd-up-link" title="<?=GetMessage('ML_SELECT_FILE_TITLE')?>"><?=GetMessage('ML_SELECT_FILE')?></a>
<a id="mlsd_select_pc" href="javascript:void(0)" class="mlsd-up-link" title="<?=GetMessage('ML_LOAD_FILE_TITLE')?>" style="display: none;"><?=GetMessage('ML_LOAD_FILE')?></a>
</div>
</td></tr>
<tr><td><b><label for="mlsd_item_name"><?=GetMessage('ML_NAME')?>:</label></b><br /><input type="text" id="mlsd_item_name" name="item_name"/></td>
<td rowSpan="3" style="padding-top: 10px;">
<div class="mlsd-prev-cont"><span id="mlsd_no_preview"><?= GetMessage('ML_NO_PREVIEW')?></span><img id="mlsd_item_thumb" src="/bitrix/images/1.gif" /></div>
<div class="mlsd-size-cont" id="mlsd_item_size" title="<?=GetMessage('ML_SIZE_IN_PX')?>"></div>
</td></tr>
<tr>
<td style="vertical-align: top;"><label for="mlsd_item_desc"><?=GetMessage('ML_DESC')?>:</label><br />
<textarea id="mlsd_item_desc" rows="2" cols="26" name="item_desc"></textarea></td>
</tr>
<tr><td><label for="mlsd_item_keywords"><?=GetMessage('ML_KEYWORDS')?>:<br /></label><input type="text" id="mlsd_item_keywords" name="item_keywords"/></td></tr>
<tr><td colSpan="2">
<div class="mlsd-col-cont">
<div class="mlsd-col-label"><label for="mlsd_coll_sel"><?=GetMessage('ML_COLLECTIONS')?>:</label></div>
<div class="mlsd-col-sel"><select title="<?= GetMessage('ML_ADD_COL2ITEM')?>" id="mlsd_coll_sel"><option value="0"><?= GetMessage('ML_COL_SELECT')?></option></select></div>
</div>
</td></tr>
</table>
<input type="hidden" name="MAX_FILE_SIZE" value="1000000000">
<input id="mlsd_item_collections" type="hidden" name="item_collections" value="">
<input id="mlsd_item_id" type="hidden" name="id" value="">
<input id="mlsd_source_type" type="hidden" name="source_type" value="PC">
</form>
</BODY>
</HTML>
<?
}
function BuildConfirmDialog($Params)
{
?>
<div id="ml_colfirm_dialog" class="mlsd mlsd-confirm">
<div id="ml_confd_text" class="ml-confd-text"></div>
<input id="ml_confd_b1" type="button" value="b1" style="width: 180px"/>
<input id="ml_confd_b2" type="button" value="b2" style="width: 160px" />
<input id="ml_confd_cancel" type="button" value="<?=GetMessage('ML_CANCEL')?>" />
</div>
<?
}
function BuildViewItemDialog($Params)
{
?>
<div id="mlsd_view_item" class="mlsd"><table class="mlsd-frame"><tr>
<td class="ml-title-cell">
<table onmousedown="jsFloatDiv.StartDrag(arguments[0], document.getElementById('mlsd_view_item'));"><tr><td style="width: 10px; padding-left: 3px;"><img class="ml-iconkit ml-dd-dot" src="/bitrix/images/1.gif" /></td><td class="ml-diad-title"><span id="mlsd_viewit_title"></span></td><td id="mlsd_viewit_close" class="ml-close" title="<?=GetMessage('ML_CLOSE')?>"><img src="/bitrix/images/1.gif"></td></tr></table>
</td></tr>
<tr><td class="ml-content-cell">
<div class="mlvi-info-cnt">
<table class="mlvi-info-tbl">
<tr><td>
<div class="mlvi-info-name" id="mlvi_info_name"></div>
</td></tr>
<tr><td class="mlvi-new-row">
<?= GetMessage('ML_COLLECTIONS')?>:
</td></tr>
<tr><td>
<div class="mlvi-info-collections" id="mlvi_info_colls"></div>
</td></tr>
<tr><td class="mlvi-new-row">
<span><?= GetMessage('ML_KEYWORDS')?>:</span>
<span id="mlvi_info_keys"></span>
</td></tr>
<tr><td class="mlvi-new-row">
<span><?= GetMessage('ML_DESC')?>:</span>
<div class="ml-info-desc" id="mlvi_info_desc"></div>
</td></tr>
<tr><td class="mlvi-new-row">
<div class="ml-info-details" id="mlvi_info_details"></div>
</td></tr>
</table>
</div>
<div class="mlvi-img-cnt"><img id="mlsd_viewit_img" src="/bitrix/images/1.gif" /></div>
</td></tr>
<tr><td class="ml-buttons-cell">
<input id="mlsd_viewit_del" type="button" value="<?=GetMessage('ML_DELETE')?>">
<input id="mlsd_viewit_edit" type="button" value="<?=GetMessage('ML_EDIT')?>">
<input id="mlsd_viewit_cancel" type="button" value="<?=GetMessage('ML_CANCEL')?>">
</td></tr>
</table>
</div>
<?
}
function ShowJS()
{
$css_src = '/bitrix/js/fileman/medialib/medialib.css';
$ajax_js = '/bitrix/js/main/ajax.js';
?>
// Append CSS
if (!window.ml_styles_link || !window.ml_styles_link.parentNode)
window.ml_styles_link = jsUtils.loadCSSFile("<?=$css_src.'?v='.@filemtime($_SERVER['DOCUMENT_ROOT'].$css_src)?>");
if (!window.jsAjaxUtil)
jsUtils.loadJSFile("<?=$ajax_js.'?v='.@filemtime($_SERVER['DOCUMENT_ROOT'].$ajax_js)?>");
<?
}
function GetCollections()
{
?>window.MLCollections = [<?
$arCol = CMedialibCollection::GetList(array('arFilter' => array('ACTIVE' => 'Y')));
$commonEdit = false;
$commonItemEdit = false;
$arResCol = array();
for ($i = 0, $l = count($arCol); $i < $l; $i++)
{
if (!CMedialibCollection::IsViewable($arCol[$i], $arCol))
continue;
?>
{
id: <?= $arCol[$i]['ID']?>,
name: '<?= CMedialib::Escape($arCol[$i]['NAME'])?>',
desc: '<?= CMedialib::Escape($arCol[$i]['DESCRIPTION'])?>',
date: '<?= $arCol[$i]['DATE_UPDATE']?>',
keywords: '<?= CMedialib::Escape($arCol[$i]['KEYWORDS'])?>',
parent: <?= intVal($arCol[$i]['PARENT_ID']) > 0 ? intVal($arCol[$i]['PARENT_ID']) : 'false'?>,
access: {
new_col: '<?= CMedialib::CanDoOperation('medialib_new_collection', $arCol[$i]['ID'])?>',
edit: '<?= CMedialib::CanDoOperation('medialib_edit_collection', $arCol[$i]['ID'])?>',
del: '<?= CMedialib::CanDoOperation('medialib_del_collection', $arCol[$i]['ID'])?>',
new_item: '<?= CMedialib::CanDoOperation('medialib_new_item', $arCol[$i]['ID'])?>',
edit_item: '<?= CMedialib::CanDoOperation('medialib_edit_item', $arCol[$i]['ID'])?>',
del_item: '<?= CMedialib::CanDoOperation('medialib_del_item', $arCol[$i]['ID'])?>',
access: '<?= CMedialib::CanDoOperation('medialib_access', $arCol[$i]['ID'])?>'
}
}
<?
if ($i != $l - 1)
echo ',';
$arResCol[] = $arCol[$i];
}
?>];<?
return $arResCol;
}
function DelCollection($id, $arIds = array())
{
if (!CMedialib::CanDoOperation('medialib_del_collection', $id))
return false;
for($i = 0, $l = count($arIds); $i < $l; $i++)
{
if (CMedialib::CanDoOperation('medialib_del_collection', $arIds[$i]))
CMedialibCollection::Delete($arIds[$i], false);
}
return CMedialibCollection::Delete($id);
}
function EditCollection($Params)
{
if ($Params['id'] && !CMedialib::CanDoOperation('medialib_edit_collection', $Params['id']) ||
!$Params['id'] && !CMedialib::CanDoOperation('medialib_new_collection', $Params['parent']))
return;
return CMedialibCollection::Edit(array(
'arFields' => array(
'ID' => $Params['id'],
'NAME' => $Params['name'],
'DESCRIPTION' => $Params['desc'],
'OWNER_ID' => $GLOBALS['USER']->GetId(),
'PARENT_ID' => $Params['parent'],
'KEYWORDS' => $Params['keywords']
)
));
}
function EditItem($Params)
{
$bOpName = $Params['id'] ? 'medialib_edit_item' : 'medialib_new_item';
$arCols_ = explode(',', $Params['item_collections']);
$arCols = array();
for ($i = 0, $l = count($arCols_); $i < $l; $i++)
{
if (intVal($arCols_[$i]) > 0 && CMedialib::CanDoOperation($bOpName, $arCols_[$i])) // Check access
$arCols[] = intVal($arCols_[$i]);
}
if (count($arCols) > 0)
{
if ($Params['source_type'] == 'PC')
$Params['path'] = false;
else if($Params['source_type'] == 'FD')
$Params['file'] = false;
$res = CMedialibItem::Edit(array(
'file' => $Params['file'],
'path' => $Params['path'],
'arFields' => array(
'ID' => $Params['id'],
'NAME' => $Params['name'],
'DESCRIPTION' => $Params['desc'],
'KEYWORDS' => $Params['keywords']
),
'arCollections' => $arCols
));
if ($res):
?>
<script>
top.bx_req_res = {
id: <?=intVal($res['ID'])?>,
name: '<?= CMedialib::Escape($res['NAME'])?>',
desc: '<?= CMedialib::Escape($res['DESCRIPTION'])?>',
keywords: '<?= CMedialib::Escape($res['KEYWORDS'])?>',
file_name: '<?= CMedialib::Escape($res['FILE_NAME'])?>',
date_mod: '<?= CMedialib::GetUsableDate($res['DATE_UPDATE'])?>',
height: <?= ($res['HEIGHT'] ? $res['HEIGHT'] : '0')?>,
width: <?= ($res['WIDTH'] ? $res['WIDTH'] : '0')?>,
file_size: '<?= CMedialib::GetUsableSize($res['FILE_SIZE'])?>',
thumb_path: '<?= CMedialib::Escape($res['THUMB_PATH'])?>',
path: '<?= CMedialib::Escape($res['PATH'])?>',
type: '<?= $res['TYPE']?>'
};
top._ml_items_colls = [<?
for ($i = 0, $l = count($arCols); $i < $l; $i++)
echo $arCols[$i].($i != $l - 1 ? ',' : '');
?>];
</script>
<? else: ?>
<script>top.bx_req_res = false;</script>
<?endif;
}
}
function GetCollectionTree($Params = array())
{
$arColTree = array();
$arColTemp = array();
$Collections = array();
$arCol = CMedialibCollection::GetList(array('arFilter' => array('ACTIVE' => 'Y')));
$iter = 0;
for ($i = 0, $l = count($arCol); $i < $l; $i++)
{
if (isset($Params['CheckAccessFunk']) && !call_user_func($Params['CheckAccessFunk'], $arCol[$i]['ID']))
continue;
if (!CMedialib::_buildCollection($arCol[$i], $i, $arColTree, $Collections, $Params))
$arColTemp[] = array($arCol[$i], $i);
}
while(count($arColTemp) > 0 && $iter < 50)
{
$newAr = array();
for ($i = 0, $l = count($arColTemp); $i < $l; $i++)
{
if (isset($Params['CheckAccessFunk']) && !call_user_func($Params['CheckAccessFunk'], $arCol[$i]['ID']))
continue;
if (!CMedialib::_buildCollection($arColTemp[$i][0], $arColTemp[$i][1], $arColTree, $Collections, $Params))
$newAr[] = $arColTemp[$i];
}
$arColTemp = $newAr;
$iter++;
}
return array('arColTree' => $arColTree, 'Collections' => $Collections);
}
function _buildCollection($Col, $ind, &$arColTree, &$Collections, $Params = array())
{
if ($Params['CHECK_ACCESS'] === true && !CMedialib::CanDoOperation('medialib_view_collection', $Col['ID']))
return true;
if (!$Col['PARENT_ID']) // Root element
$arColTree[] = array('id' => $Col['ID'], 'child' => array());
else if ($Collections[$Col['PARENT_ID']])
CMedialib::_findChildInColTree($arColTree, $Col['PARENT_ID'], $Col['ID']);
else
return false;
$Collections[$Col['ID']] = $Col;
return true;
}
function _findChildInColTree(&$arr, $id, $colId)
{
for ($i = 0, $l = count($arr); $i < $l; $i++)
{
if ($arr[$i]['id'] == $id)
{
$arr[$i]['child'][] = array('id' => $colId, 'child' => array());
return true;
}
else if (count($arr[$i]['child']) > 0)
{
if (CMedialib::_findChildInColTree($arr[$i]['child'], $id, $colId))
return true;
}
}
return false;
}
function _BuildCollectionsSelectOptions($Collections = false, $arColTree = false, $level = 0, $selected = false)
{
if ($Collections === false && $arColTree === false)
{
$res = CMedialib::GetCollectionTree();
$Collections = $res['Collections'];
$arColTree = $res['arColTree'];
}
$str = '';
for ($i = 0, $l = count($arColTree); $i < $l; $i++)
{
$col = $Collections[$arColTree[$i]['id']];
$html = str_repeat(" . ", $level);
$s = ($selected !== false && $selected == $arColTree[$i]['id']) ? ' selected' : '';
$str .= '<option value="'.$arColTree[$i]['id'].'"'.$s.'>'.$html.htmlspecialcharsex($col['NAME']).'</option>';
if (count($arColTree[$i]['child']))
$str .= CMedialib::_BuildCollectionsSelectOptions($Collections, $arColTree[$i]['child'], $level + 1, $selected);
}
return $str;
}
function GetItems($Params)
{
$arCollections = array();
if (!CMedialib::CanDoOperation('medialib_view_collection', $Params['collectionId']))
return false;
if (isset($Params['collectionId']) && $Params['collectionId'] > 0)
$arCollections[] = $Params['collectionId'];
$arItems = CMedialibItem::GetList(array(
'arCollections' => $arCollections
));
?>
<script>
window.MLItems[<?=$Params['collectionId']?>] = [<?
for ($i = 0, $l = count($arItems); $i < $l; $i++)
{
?>
{
id: <?=intVal($arItems[$i]['ID'])?>,
name: '<?= CMedialib::Escape($arItems[$i]['NAME'])?>',
desc: '<?= CMedialib::Escape($arItems[$i]['DESCRIPTION'])?>',
keywords: '<?= CMedialib::Escape($arItems[$i]['KEYWORDS'])?>',
file_name: '<?= CMedialib::Escape($arItems[$i]['FILE_NAME'])?>',
date_mod: '<?= CMedialib::GetUsableDate($arItems[$i]['DATE_UPDATE2'])?>',
height: <?= ($arItems[$i]['HEIGHT'] ? $arItems[$i]['HEIGHT'] : '0')?>,
width: <?= ($arItems[$i]['WIDTH'] ? $arItems[$i]['WIDTH'] : '0')?>,
file_size: '<?= CMedialib::GetUsableSize($arItems[$i]['FILE_SIZE'])?>',
thumb_path: '<?= CMedialib::Escape($arItems[$i]['THUMB_PATH'])?>',
path: '<?= CMedialib::Escape($arItems[$i]['PATH'])?>',
type: '<?= $arItems[$i]['TYPE']?>'
}
<?
if ($i != $l - 1)
echo ',';
}
?>];
</script>
<?
}
function DelItem($id, $bCurrent, $colId)
{
return CMedialibItem::Delete($id, $bCurrent, $colId);
}
function DeleteThumbnails()
{
CFileman::DeleteEx(BX_PERSONAL_ROOT."/tmp/medialibrary");
}
function GetItemCollectionList($Params)
{
if(!CMedialib::CanDoOperation('medialib_view_collection', 0))
return false;
$ar = CMedialibItem::GetItemCollections($Params);
?>
<script>
window._ml_items_colls = [<?
for ($i = 0, $l = count($ar); $i < $l; $i++)
echo $ar[$i].($i != $l - 1 ? ',' : '');
?>];
</script>
<?
}
function SaveUserSettings($Params)
{
if ($GLOBALS["USER"]->IsAuthorized())
CUserOptions::SetOption("fileman", "medialib_user_set", $Params['width'].','.$Params['height'].','.$Params['coll_id']);
}
function SaveAccessPermissions($colId, $arTaskPerm)
{
global $DB;
$sql_str = "DELETE FROM b_group_collection_task WHERE COLLECTION_ID=".$colId;
$DB->Query($sql_str, false, "FILE: ".__FILE__."<br> LINE: ".__LINE__);
$str = "";
foreach($arTaskPerm as $group_id => $task_id)
{
$arInsert = $DB->PrepareInsert("b_group_collection_task", array("GROUP_ID" => $group_id, "TASK_ID" => $task_id, "COLLECTION_ID" => $colId));
$strSql = "INSERT INTO b_group_collection_task(".$arInsert[0].") VALUES(".$arInsert[1].")";
$DB->Query($strSql , false, "File: ".__FILE__."<br>Line: ".__LINE__);
}
}
function MultiActionDelete($Params = array())
{
global $DB;
if (count($Params['Cols']) > 0) // Del collections
{
$strCols = "0";
for($i = 0, $l = count($Params['Cols']); $i < $l; $i++)
{
$colId = $Params['Cols'][$i];
if (CMedialib::CanDoOperation('medialib_del_collection', $colId)) // Access
$strCols .= ",".IntVal($colId);
}
if ($strCols != "0")
{
$strSql = "DELETE FROM b_medialib_collection WHERE ID in (".$strCols.")";
$z = $DB->Query($strSql, false, "FILE: ".__FILE__."<br> LINE: ".__LINE__);
$strSql = "DELETE FROM b_medialib_collection_item WHERE COLLECTION_ID in (".$strCols.")";
$z = $DB->Query($strSql, false, "FILE: ".__FILE__."<br> LINE: ".__LINE__);
}
}
if (count($Params['Items']) > 0) // Del items
{
foreach($Params['Items'] as $colId => $arItems)
{
if (!CMedialib::CanDoOperation('medialib_del_item', $colId)) // Access
return false;
$strItems = "0";
for($i=0; $i < count($arItems); $i++)
$strItems .= ",".IntVal($arItems[$i]);
$strSql = "DELETE FROM b_medialib_collection_item WHERE ITEM_ID IN (".$strItems.") AND COLLECTION_ID=".$colId;
$z = $DB->Query($strSql, false, "FILE: ".__FILE__."<br> LINE: ".__LINE__);
}
}
CMedialibItem::DeleteEmpty(); // Del all items which are absent in 'b_medialib_collection_item'
return true;
}
function ShowBrowseButton($Params = array())
{
$value = isset($Params['value']) ? $Params['value'] : '...';
$inputId = isset($Params['id']) ? $Params['id'] : '';
$title = isset($Params['title']) ? $Params['title'] : '';
$event = $Params['event'];
$mode = isset($Params['mode']) ? $Params['mode'] : '';
if ($mode == 'file_dialog' || COption::GetOptionString('fileman', "use_medialib", "Y") == "N" || !CMedialib::CanDoOperation('medialib_view_collection', 0))
$mode = 'file_dialog';
else if ($mode == 'medialib' || !$GLOBALS["USER"]->CanDoOperation('fileman_view_file_structure'))
$mode = 'medialib';
else
$mode = 'select';
if ($mode == 'medialib' || $mode == 'select')
{
$arMLConfig = $Params['MedialibConfig'];
if (!isset($arMLConfig['event']))
$arMLConfig['event'] = 'BXOpenMLEvent';
CMedialib::ShowDialogScript($arMLConfig);
}
//$mode = 'medialib';
if ($mode == 'medialib')
{
$title = isset($Params['title']) ? $Params['title'] : GetMessage('ML_BR_BUT_ML_TITLE');
?>
<input id="<?= $inputId?>" style="display: none;"/>
<input type="button" value="<?= $value?>" title="<?= $title?>" onclick="<?= $arMLConfig['event']?>();"/>
<?
}
elseif ($mode == 'file_dialog')
{
$title = isset($Params['title']) ? $Params['title'] : GetMessage('ML_BR_BUT_FD_TITLE');
?><input type="button" value="<?= $value?>" id="<?= $inputId?>" title="<?= $title?>" /><?
}
else
{
$cid = 'bxmlbut1';
?>
<style>
div.bx-pnbutton{float:left; padding-top:3px; white-space:nowrap; cursor: pointer;}
div.bx-pnbutton table.bxml-pnbut{border-collapse: collapse;}
div.bx-pnbutton table.bxml-pnbut td {background-position:0 0 !important; background-repeat:no-repeat !important; height:25px !important; padding: 0 !important;}
div.bx-pnbutton table.bxml-pnbut td.bx-left {background-image:url(/bitrix/themes/.default/public/panel_new/buttons/normal/left.gif) !important;}
div.bx-pnbutton table.bxml-pnbut td.bx-center {background-image:url(/bitrix/themes/.default/public/panel_new/buttons/normal/main.gif) !important; background-repeat:repeat-x !important;}
div.bx-pnbutton table.bxml-pnbut td.bx-arrow-separate{background-image:url(/bitrix/themes/.default/public/panel_new/buttons/normal/arrow.gif) !important;}
div.bx-pnbutton table.bxml-pnbut td.pressed {background-image:url(/bitrix/themes/.default/public/panel_new/buttons/push/arrow.gif) !important;}
div.bx-pnbutton table.bxml-pnbut td.bx-left div{width:4px !important; height:1px; overflow:hidden;}
div.bx-pnbutton table.bxml-pnbut td.bx-arrow-separate div{width:14px !important; height:1px; overflow:hidden;}
div.bx-pnbutton table.bxml-pnbut div.bx-button-text{color:#2B2928; font-family:Tahoma,Verdana,Arial; font-size:11px; padding-right: 3px; white-space:nowrap;}
.bxml-empty-icon{height: 22px !important; width: 20px !important;}
</style>
<script>
window.<?= $cid?>_menu = new PopupMenu("<?= $cid?>_menu", 3000);
window.<?= $cid?>_menu.SetItems([
{ICONCLASS : 'bxml-empty-icon', DEFAULT: true,TEXT : '<?= GetMessage('ML_BR_BUT_ML')?>', TITLE: '<?= GetMessage('ML_BR_BUT_ML_TITLE')?>', ONCLICK: '<?= $arMLConfig['event']?>();'},
{ICONCLASS : 'bxml-empty-icon', DEFAULT: false,TEXT : '<?= GetMessage('ML_BR_BUT_FD')?>',TITLE: '<?= GetMessage('ML_BR_BUT_FD_TITLE')?>',ONCLICK: '<?= $event?>();'}
]);
function <?= $cid?>_onclick(pEl){window.<?= $cid?>_menu.ShowMenu(pEl, null, false, {top: 0,bottom: 0,left: 0,right:0});}
</script>
<div class="bx-pnbutton">
<table class="bxml-pnbut" id="<?= $cid?>_tbl">
<tr>
<td class="bx-left"><div /></td>
<td class="bx-center" title="<?= GetMessage('ML_BR_BUT_ML_TITLE')?>">
<div class="bx-button bx-pnicon icon-menu" onclick="<?= $arMLConfig['event']?>();">
<div class="bx-button-text"><?= $value?></div></div></td>
<td onclick="<?= $cid?>_onclick(this);" class="bx-arrow-separate" title="<?= GetMessage('ML_BR_BUT_SEL')?>"><div /></td>
</tr>
</table>
</div>
<?
}
}
function GetUsableSize($size = 0)
{
$size = intVal($size);
if ($size < 1024)
return $size." ".GetMessage('ML_BYTE');
$size = round($size / 1024);
if ($size < 1024)
return $size." K".GetMessage('ML_BYTE');
$size = round($size / 1024);
if ($size < 1024)
return $size." M".GetMessage('ML_BYTE');
return $size;
}
function GetUsableDate($date = '')
{
return ConvertDateTime($date, "DD.MM.YYYY HH:MI");
}
function GetMediaExtentions($bStr = true)
{
$strExt = COption::GetOptionString('fileman', "ml_media_extentions", CMedialib::GetDefaultMediaExtentions());
if ($bStr)
return $strExt;
$arStr = explode(',', $strExt);
return $arStr;
}
function GetDefaultMediaExtentions()
{
return 'jpg,jpeg,gif,png,wmv,flv,ppt,mp3,mov';
}
function CheckFileExtention($strPath = '', $arExt = false)
{
if (!$arExt)
$arExt = CMedialib::GetMediaExtentions(false);
$ext = strtolower(CFileman::GetFileExtension($strPath));
return in_array($ext, $arExt);
}
function Escape($str, $bHtmlSpCh = true)
{
if (strlen($str) <= 0)
return $str;
if ($bHtmlSpCh)
$str = htmlspecialcharsex($str);
$str = str_replace("script>","script_>", $str);
$str = str_replace("\r","",$str);
$str = str_replace("\n","\\n",$str);
$str = str_replace("'","\'",$str);
$str = str_replace("\"","\\\"",$str);
return $str;
}
}
class CMedialibCollection
{
function GetList($Params = array())
{
global $DB, $USER;
$arFilter = $Params['arFilter'];
$arOrder = isset($Params['arOrder']) ? $Params['arOrder'] : Array('ID' => 'asc');
static $arFields = array(
"ID" => Array("FIELD_NAME" => "MLC.ID", "FIELD_TYPE" => "int"),
"NAME" => Array("FIELD_NAME" => "MLC.NAME", "FIELD_TYPE" => "string"),
"ACTIVE" => Array("FIELD_NAME" => "MLC.ACTIVE", "FIELD_TYPE" => "string"),
"DATE_UPDATE" => Array("FIELD_NAME" => "MLC.DATE_UPDATE", "FIELD_TYPE" => "date"),
"KEYWORDS" => Array("FIELD_NAME" => "MLC.KEYWORDS", "FIELD_TYPE" => "string"),
"DESCRIPTION" => Array("FIELD_NAME" => "MLC.DESCRIPTION", "FIELD_TYPE" => "string"),
"OWNER_ID" => Array("FIELD_NAME" => "MLC.OWNER_ID", "FIELD_TYPE" => "int"),
"PARENT_ID" => Array("FIELD_NAME" => "MLC.PARENT_ID", "FIELD_TYPE" => "int")
);
$err_mess = (CMedialibCollection::GetErrorMess())."<br>Function: GetList<br>Line: ";
$arSqlSearch = array();
$strSqlSearch = "";
if(is_array($arFilter))
{
$filter_keys = array_keys($arFilter);
for($i=0, $l = count($filter_keys); $i<$l; $i++)
{
$n = strtoupper($filter_keys[$i]);
$val = $arFilter[$filter_keys[$i]];
if(strlen($val) <=0 || strval($val)=="NOT_REF")
continue;
if ($n == 'ID')
$arSqlSearch[] = GetFilterQuery("MLC.ID",$val,'N');
elseif(isset($arFields[$n]))
$arSqlSearch[] = GetFilterQuery($arFields[$n]["FIELD_NAME"], $val);
}
}
$strOrderBy = '';
foreach($arOrder as $by=>$order)
if(isset($arFields[strtoupper($by)]))
$strOrderBy .= $arFields[strtoupper($by)]["FIELD_NAME"].' '.(strtolower($order)=='desc'?'desc'.(strtoupper($DB->type)=="ORACLE"?" NULLS LAST":""):'asc'.(strtoupper($DB->type)=="ORACLE"?" NULLS FIRST":"")).',';
if(strlen($strOrderBy)>0)
$strOrderBy = "ORDER BY ".rtrim($strOrderBy, ",");
$strSqlSearch = GetFilterSqlSearch($arSqlSearch);
$strSql = "
SELECT
MLC.*
FROM
b_medialib_collection MLC
WHERE
$strSqlSearch
$strOrderBy";
$res = $DB->Query($strSql, false, $err_mess.__LINE__);
$arResult = Array();
while($arRes = $res->Fetch())
$arResult[]=$arRes;
return $arResult;
}
function CheckFields($arFields)
{
if (!isset($arFields['NAME']) || strlen($arFields['NAME']) <= 0)
return false;
/*
ID int not null auto_increment,
NAME varchar(255) not null,
DESCRIPTION text null,
ACTIVE char(1) not null default 'Y',
DATE_UPDATE datetime not null,
OWNER_ID int null,
PARENT_ID int null,
SITE_ID char(2) not null,
KEYWORDS varchar(255) null
*/
return true;
}
function Edit($Params)
{
global $DB;
$arFields = $Params['arFields'];
if (!isset($arFields['DATE_UPDATE']))
$arFields['DATE_UPDATE'] = date(str_replace(array('DD', 'MM', 'YYYY', 'HH', 'MI', 'SS'), array('d', 'm', 'Y', 'H', 'i', 's'), CSite::GetDateFormat("FULL")));
if(!CMedialibCollection::CheckFields($arFields))
return false;
$bNew = !isset($arFields['ID']) || $arFields['ID'] <= 0;
if ($bNew) // Add
{
unset($arFields['ID']);
$ID = CDatabase::Add("b_medialib_collection", $arFields);
}
else // Update
{
$ID = $arFields['ID'];
unset($arFields['ID']);
$strUpdate = $DB->PrepareUpdate("b_medialib_collection", $arFields);
$strSql =
"UPDATE b_medialib_collection SET ".
$strUpdate.
" WHERE ID=".IntVal($ID);
$DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__);
}
return $ID;
}
function Delete($ID, $bDelEmpty = true)
{
global $DB;
$ID = intval($ID);
$strSql = "DELETE FROM b_medialib_collection WHERE ID=".$ID;
$z = $DB->Query($strSql, false, "FILE: ".__FILE__."<br> LINE: ".__LINE__);
$strSql = "DELETE FROM b_medialib_collection_item WHERE COLLECTION_ID=".$ID;
$z = $DB->Query($strSql, false, "FILE: ".__FILE__."<br> LINE: ".__LINE__);
if ($bDelEmpty)
CMedialibItem::DeleteEmpty();
return $z;
}
function GetErrorMess()
{
return "<br>Class: CMedialibCollection<br>File: ".__FILE__;
}
function IsViewable($oCol, $arCol=false)
{
if(!$arCol)
$arCol = CMedialibCollection::GetList(array('arFilter' => array('ACTIVE' => 'Y')));
if (!CMedialib::CanDoOperation('medialib_view_collection', $oCol['ID']))
return false;
$l = count($arCol);
if ($oCol['PARENT_ID'])
{
$parId = $oCol['PARENT_ID'];
while(intVal($parId) > 0)
{
$bFind = false;
for($i = 0; $i < $l; $i++) // Find parent
{
if ($arCol[$i]['ID'] == $parId)
{
if (!CMedialib::CanDoOperation('medialib_view_collection', $arCol[$i]['ID']))
return false;
$parId = $arCol[$i]['PARENT_ID'];
$bFind = true;
break;
}
}
if (!$bFind)
return false;
}
}
return true;
}
}
class CMedialibItem
{
function CheckFields($arFields)
{
if (!isset($arFields['NAME']) || strlen($arFields['NAME']) <= 0)
return false;
return true;
}
function GetList($Params)
{
global $DB;
$q = '';
if (count($Params['arCollections']) == 1)
{
$q = 'WHERE MCI.COLLECTION_ID='.$Params['arCollections'][0];
}
elseif (count($Params['arCollections']) > 1)
{
$strCollections = "0";
for($i=0; $i < count($Params['arCollections']); $i++)
$strCollections .= ",".IntVal($Params['arCollections'][$i]);
$q = 'WHERE MCI.COLLECTION_ID in ('.$strCollections.')';
}
if (isset($Params['minId']) && $Params['minId'] > 0)
{
if (strlen($q) > 0)
$q = trim($q)." AND MI.ID>=".$Params['minId'];
else
$q .= "WHERE MI.ID>=".$Params['minId'];
}
$err_mess = CMedialibCollection::GetErrorMess()."<br>Function: CMedialibItem::GetList<br>Line: ";
$strSql = "SELECT
MI.*,MCI.COLLECTION_ID, F.HEIGHT, F.WIDTH, F.FILE_SIZE, F.CONTENT_TYPE, F.SUBDIR, F.FILE_NAME,
".$DB->DateToCharFunction("MI.DATE_UPDATE")." as DATE_UPDATE2
FROM b_medialib_collection_item MCI
INNER JOIN b_medialib_item MI ON (MI.ID=MCI.ITEM_ID)
INNER JOIN b_file F ON (F.ID=MI.SOURCE_ID) ".$q;
$res = $DB->Query($strSql, false, $err_mess);
//$DB->DateToCharFunction("h.DATE_CREATE", "FULL")." CREATION_TIME"
$arResult = Array();
$upload_dir = COption::GetOptionString("main", "upload_dir", "upload");
$rootPath = CSite::GetSiteDocRoot(false);
$tmbW = COption::GetOptionInt('fileman', "ml_thumb_width", 140);
$tmbH = COption::GetOptionInt('fileman', "ml_thumb_height", 105);
while($arRes = $res->Fetch())
{
CMedialibItem::GenerateThumbnail($arRes, array('rootPath' => $rootPath, 'width' => $tmbW, 'height' => $tmbH));
$arRes['PATH'] = CMedialibItem::GetFullPath($arRes, $upload_dir);
//$arRes['DATE_UPDATE'] = $DB->DateToCharFunction('DATE_UPDATE')
//CMedialibItem::GetFullPath($arRes, $upload_dir);
$arResult[]=$arRes;
}
return $arResult;
}
function Edit($Params)
{
global $DB;
$source_id = false;
$arFields = $Params['arFields'];
$bNew = !isset($arFields['ID']) || $arFields['ID'] <= 0;
$bFile_FD = $Params['path'] && strlen($Params['path']) > 0;
$bFile_PC = $Params['file'] && strlen($Params['file']['name']) > 0 && $Params['file']['size'] > 0;
if ($bFile_FD || $bFile_PC)
{
if ($bFile_FD)
{
$DocRoot = CSite::GetSiteDocRoot(false);
$tmp_name = $DocRoot.$Params['path'];
if (file_exists($tmp_name))
{
$file_name = substr($Params['path'], strrpos($Params['path'], '/') + 1);
$arFile = array(
"name" => $file_name,
"size" => filesize($tmp_name),
"tmp_name" => $tmp_name,
"type" => CFile::IsImage($file_name) ? 'image' : 'file'
);
}
}
else if ($bFile_PC)
{
$arFile = $Params['file'];
}
if (!CMedialib::CheckFileExtention($arFile["name"]))
return false;
if (!$bNew) // Del old file
{
$arFile["old_file"] = CMedialibItem::GetSourceId($arFields['ID']);
$arFile["del"] = "Y";
}
$arFile["MODULE_ID"] = "fileman";
$source_id = CFile::SaveFile($arFile, "medialibrary");
if ($source_id) // Get file
{
$r = CFile::GetByID($source_id);
if ($arFile = $r->Fetch())
{
CMedialibItem::GenerateThumbnail($arFile, array('width' => COption::GetOptionInt('fileman', "ml_thumb_width", 140), 'height' => COption::GetOptionInt('fileman', "ml_thumb_height", 105)));
$arFile['PATH'] = CMedialibItem::GetFullPath($arFile);
}
}
}
// TODO: Add error handling
if ($bNew && !$source_id)
return false;
// 2. Add to b_medialib_item
if (!isset($arFields['DATE_UPDATE']))
$arFields['DATE_UPDATE'] = date(str_replace(array('DD', 'MM', 'YYYY', 'HH', 'MI', 'SS'), array('d', 'm', 'Y', 'H', 'i', 's'), CSite::GetDateFormat("FULL")));
if(!CMedialibItem::CheckFields($arFields))
return false;
if ($bNew) // Add
{
unset($arFields['ID']);
$arFields['SOURCE_ID'] = $source_id;
$arFields['DATE_CREATE'] = $arFields['DATE_UPDATE'];
$ID = CDatabase::Add("b_medialib_item", $arFields);
}
else // Update
{
if ($source_id)
$arFields['SOURCE_ID'] = $source_id;
$ID = $arFields['ID'];
unset($arFields['ID']);
$strUpdate = $DB->PrepareUpdate("b_medialib_item", $arFields);
$strSql =
"UPDATE b_medialib_item SET ".
$strUpdate.
" WHERE ID=".IntVal($ID);
$res = $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__);
}
// 3. Set fields to b_medialib_collection_item
if (!$bNew) // Del all rows if
{
$strSql = "DELETE FROM b_medialib_collection_item WHERE ITEM_ID=".$ID;
$DB->Query($strSql, false, "FILE: ".__FILE__."<br> LINE: ".__LINE__);
}
$strCollections = "0";
for($i=0; $i < count($Params['arCollections']); $i++)
$strCollections .= ",".IntVal($Params['arCollections'][$i]);
$strSql =
"INSERT INTO b_medialib_collection_item(ITEM_ID, COLLECTION_ID) ".
"SELECT ".$ID.", ID ".
"FROM b_medialib_collection ".
"WHERE ID in (".$strCollections.")";
$res = $DB->Query($strSql, false, "FILE: ".__FILE__."<br> LINE: ".__LINE__);
if (!$arFields['ID'])
$arFields['ID'] = $ID;
if ($source_id)
$arFields = array_merge($arFile, $arFields);
return $arFields;
}
function GenerateThumbnail(&$arFile, $Params = array())
{
$rootPath = isset($Params['rootPath']) ? $Params['rootPath'] : CSite::GetSiteDocRoot(false);
if (CFile::IsImage($arFile['FILE_NAME']))
{
$tmbPath = CMedialibItem::GetThumbPath($arFile);
$destPath = $rootPath.$tmbPath;
$arSize = array('width' => $Params['width'], 'height' => $Params['height']);
if (file_exists($destPath) || CFile::ResizeImageFile($rootPath.CMedialibItem::GetFullPath($arFile), $destPath, $arSize))
$arFile['THUMB_PATH'] = $tmbPath;
$arFile['TYPE'] = 'image';
}
else
$arFile['TYPE'] = 'file';
}
function GetItemCollections($Params)
{
global $DB;
$strSql = 'SELECT MCI.COLLECTION_ID
FROM b_medialib_collection_item MCI
WHERE MCI.ITEM_ID='.intVal($Params['ID']);
$res = $DB->Query($strSql, false, "FILE: ".__FILE__."<br> LINE: ".__LINE__);
$arResult = array();
while($arRes = $res->Fetch())
$arResult[]=$arRes['COLLECTION_ID'];
return $arResult;
}
function Delete($ID, $bCurrent, $colId)
{
global $DB;
if ($bCurrent) // Del from one collection
{
if (!CMedialib::CanDoOperation('medialib_del_item', $colId))
return false;
$strSql = "DELETE FROM b_medialib_collection_item WHERE ITEM_ID=".$ID." AND COLLECTION_ID=".$colId;
$z = $DB->Query($strSql, false, "FILE: ".__FILE__."<br> LINE: ".__LINE__);
}
else // Del from all collections
{
$arCols = CMedialibItem::GetItemCollections(array('ID' => $ID));
for ($i = 0, $l = count($arCols); $i < $l; $i++)
{
if (!CMedialib::CanDoOperation('medialib_del_item', $arCols[$i])) // Check access
return false;
}
$strSql = "DELETE FROM b_medialib_collection_item WHERE ITEM_ID=".$ID;
$z = $DB->Query($strSql, false, "FILE: ".__FILE__."<br> LINE: ".__LINE__);
}
CMedialibItem::DeleteEmpty();
return $z;
}
function DeleteEmpty()
{
global $DB;
$strSql = 'SELECT MI.*,MCI.COLLECTION_ID
FROM b_medialib_item MI
LEFT JOIN b_medialib_collection_item MCI ON (MI.ID=MCI.ITEM_ID)
WHERE MCI.COLLECTION_ID is null';
$res = $DB->Query($strSql, false, "FILE: ".__FILE__."<br> LINE: ".__LINE__);
$strItems = "0";
$strFiles = "0";
while($arRes = $res->Fetch())
{
$strItems .= ",".IntVal($arRes['ID']);
$strFiles .= ",".IntVal($arRes['SOURCE_ID']);
}
// Clean from 'b_medialib_item'
if ($strItems != "0")
$DB->Query("DELETE FROM b_medialib_item WHERE ID in (".$strItems.")", false, "FILE: ".__FILE__."<br> LINE: ".__LINE__);
// Clean from 'b_file'
if ($strFiles != "0")
$DB->Query("DELETE FROM b_file WHERE ID in (".$strFiles.")", false, "FILE: ".__FILE__."<br> LINE: ".__LINE__);
}
function GetThumbPath($arImage)
{
return BX_PERSONAL_ROOT."/tmp/".$arImage['SUBDIR'].'/'.$arImage['FILE_NAME'];
}
function GetFullPath($arImage, $upload_dir = false)
{
if (!$upload_dir)
$upload_dir = COption::GetOptionString("main", "upload_dir", "upload");
return '/'.$upload_dir.'/'.$arImage['SUBDIR'].'/'.$arImage['FILE_NAME'];
}
function GetSourceId($id)
{
global $DB;
$strSql = 'SELECT SOURCE_ID
FROM b_medialib_item
WHERE ID='.intVal($id);
$r = $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__);
if ($res = $r->Fetch())
return $res['SOURCE_ID'];
return false;
}
}
?>