Edit File by line

Deprecated: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in /home/sportsfever/public_html/filemanger/function.php on line 93
/home/sportsfe.../httpdocs/wp-conte.../plugins/wp-file-.../lib/php
File: elFinderVolumeGoogleDrive.class.php
<?php
[0] Fix | Delete
[1] Fix | Delete
/**
[2] Fix | Delete
* Simple elFinder driver for GoogleDrive
[3] Fix | Delete
* google-api-php-client-2.x or above.
[4] Fix | Delete
*
[5] Fix | Delete
* @author Dmitry (dio) Levashov
[6] Fix | Delete
* @author Cem (discofever)
[7] Fix | Delete
**/
[8] Fix | Delete
class elFinderVolumeGoogleDrive extends elFinderVolumeDriver
[9] Fix | Delete
{
[10] Fix | Delete
/**
[11] Fix | Delete
* Driver id
[12] Fix | Delete
* Must be started from letter and contains [a-z0-9]
[13] Fix | Delete
* Used as part of volume id.
[14] Fix | Delete
*
[15] Fix | Delete
* @var string
[16] Fix | Delete
**/
[17] Fix | Delete
protected $driverId = 'gd';
[18] Fix | Delete
[19] Fix | Delete
/**
[20] Fix | Delete
* Google API client object.
[21] Fix | Delete
*
[22] Fix | Delete
* @var object
[23] Fix | Delete
**/
[24] Fix | Delete
protected $client = null;
[25] Fix | Delete
[26] Fix | Delete
/**
[27] Fix | Delete
* GoogleDrive service object.
[28] Fix | Delete
*
[29] Fix | Delete
* @var object
[30] Fix | Delete
**/
[31] Fix | Delete
protected $service = null;
[32] Fix | Delete
[33] Fix | Delete
/**
[34] Fix | Delete
* Cache of parents of each directories.
[35] Fix | Delete
*
[36] Fix | Delete
* @var array
[37] Fix | Delete
*/
[38] Fix | Delete
protected $parents = [];
[39] Fix | Delete
[40] Fix | Delete
/**
[41] Fix | Delete
* Cache of chiled directories of each directories.
[42] Fix | Delete
*
[43] Fix | Delete
* @var array
[44] Fix | Delete
*/
[45] Fix | Delete
protected $directories = null;
[46] Fix | Delete
[47] Fix | Delete
/**
[48] Fix | Delete
* Cache of itemID => name of each items.
[49] Fix | Delete
*
[50] Fix | Delete
* @var array
[51] Fix | Delete
*/
[52] Fix | Delete
protected $names = [];
[53] Fix | Delete
[54] Fix | Delete
/**
[55] Fix | Delete
* MIME tyoe of directory.
[56] Fix | Delete
*
[57] Fix | Delete
* @var string
[58] Fix | Delete
*/
[59] Fix | Delete
const DIRMIME = 'application/vnd.google-apps.folder';
[60] Fix | Delete
[61] Fix | Delete
/**
[62] Fix | Delete
* Fetch fields for list.
[63] Fix | Delete
*
[64] Fix | Delete
* @var string
[65] Fix | Delete
*/
[66] Fix | Delete
const FETCHFIELDS_LIST = 'files(id,name,mimeType,modifiedTime,parents,permissions,size,imageMediaMetadata(height,width),thumbnailLink,webContentLink,webViewLink),nextPageToken';
[67] Fix | Delete
[68] Fix | Delete
/**
[69] Fix | Delete
* Fetch fields for get.
[70] Fix | Delete
*
[71] Fix | Delete
* @var string
[72] Fix | Delete
*/
[73] Fix | Delete
const FETCHFIELDS_GET = 'id,name,mimeType,modifiedTime,parents,permissions,size,imageMediaMetadata(height,width),thumbnailLink,webContentLink,webViewLink';
[74] Fix | Delete
[75] Fix | Delete
/**
[76] Fix | Delete
* Directory for tmp files
[77] Fix | Delete
* If not set driver will try to use tmbDir as tmpDir.
[78] Fix | Delete
*
[79] Fix | Delete
* @var string
[80] Fix | Delete
**/
[81] Fix | Delete
protected $tmp = '';
[82] Fix | Delete
[83] Fix | Delete
/**
[84] Fix | Delete
* Net mount key.
[85] Fix | Delete
*
[86] Fix | Delete
* @var string
[87] Fix | Delete
**/
[88] Fix | Delete
public $netMountKey = '';
[89] Fix | Delete
[90] Fix | Delete
/**
[91] Fix | Delete
* Current token expires
[92] Fix | Delete
*
[93] Fix | Delete
* @var integer
[94] Fix | Delete
**/
[95] Fix | Delete
private $expires;
[96] Fix | Delete
[97] Fix | Delete
/**
[98] Fix | Delete
* Constructor
[99] Fix | Delete
* Extend options with required fields.
[100] Fix | Delete
*
[101] Fix | Delete
* @author Dmitry (dio) Levashov
[102] Fix | Delete
* @author Cem (DiscoFever)
[103] Fix | Delete
**/
[104] Fix | Delete
public function __construct()
[105] Fix | Delete
{
[106] Fix | Delete
$opts = [
[107] Fix | Delete
'client_id' => '',
[108] Fix | Delete
'client_secret' => '',
[109] Fix | Delete
'access_token' => [],
[110] Fix | Delete
'refresh_token' => '',
[111] Fix | Delete
'serviceAccountConfigFile' => '',
[112] Fix | Delete
'root' => 'My Drive',
[113] Fix | Delete
'gdAlias' => '%s@GDrive',
[114] Fix | Delete
'googleApiClient' => '',
[115] Fix | Delete
'path' => '/',
[116] Fix | Delete
'tmbPath' => '',
[117] Fix | Delete
'separator' => '/',
[118] Fix | Delete
'useGoogleTmb' => true,
[119] Fix | Delete
'acceptedName' => '#.#',
[120] Fix | Delete
'rootCssClass' => 'elfinder-navbar-root-googledrive',
[121] Fix | Delete
'publishPermission' => [
[122] Fix | Delete
'type' => 'anyone',
[123] Fix | Delete
'role' => 'reader',
[124] Fix | Delete
'withLink' => true,
[125] Fix | Delete
],
[126] Fix | Delete
'appsExportMap' => [
[127] Fix | Delete
'application/vnd.google-apps.document' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
[128] Fix | Delete
'application/vnd.google-apps.spreadsheet' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
[129] Fix | Delete
'application/vnd.google-apps.drawing' => 'application/pdf',
[130] Fix | Delete
'application/vnd.google-apps.presentation' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
[131] Fix | Delete
'application/vnd.google-apps.script' => 'application/vnd.google-apps.script+json',
[132] Fix | Delete
'default' => 'application/pdf',
[133] Fix | Delete
],
[134] Fix | Delete
];
[135] Fix | Delete
$this->options = array_merge($this->options, $opts);
[136] Fix | Delete
$this->options['mimeDetect'] = 'internal';
[137] Fix | Delete
}
[138] Fix | Delete
[139] Fix | Delete
/*********************************************************************/
[140] Fix | Delete
/* ORIGINAL FUNCTIONS */
[141] Fix | Delete
/*********************************************************************/
[142] Fix | Delete
[143] Fix | Delete
/**
[144] Fix | Delete
* Get Parent ID, Item ID, Parent Path as an array from path.
[145] Fix | Delete
*
[146] Fix | Delete
* @param string $path
[147] Fix | Delete
*
[148] Fix | Delete
* @return array
[149] Fix | Delete
*/
[150] Fix | Delete
protected function _gd_splitPath($path)
[151] Fix | Delete
{
[152] Fix | Delete
$path = trim($path, '/');
[153] Fix | Delete
$pid = '';
[154] Fix | Delete
if ($path === '') {
[155] Fix | Delete
$id = 'root';
[156] Fix | Delete
$parent = '';
[157] Fix | Delete
} else {
[158] Fix | Delete
$path = str_replace('\\/', chr(0), $path);
[159] Fix | Delete
$paths = explode('/', $path);
[160] Fix | Delete
$id = array_pop($paths);
[161] Fix | Delete
$id = str_replace(chr(0), '/', $id);
[162] Fix | Delete
if ($paths) {
[163] Fix | Delete
$parent = '/' . implode('/', $paths);
[164] Fix | Delete
$pid = array_pop($paths);
[165] Fix | Delete
} else {
[166] Fix | Delete
$rootid = ($this->root === '/') ? 'root' : trim($this->root, '/');
[167] Fix | Delete
if ($id === $rootid) {
[168] Fix | Delete
$parent = '';
[169] Fix | Delete
} else {
[170] Fix | Delete
$parent = $this->root;
[171] Fix | Delete
$pid = $rootid;
[172] Fix | Delete
}
[173] Fix | Delete
}
[174] Fix | Delete
}
[175] Fix | Delete
[176] Fix | Delete
return array($pid, $id, $parent);
[177] Fix | Delete
}
[178] Fix | Delete
[179] Fix | Delete
/**
[180] Fix | Delete
* Drive query and fetchAll.
[181] Fix | Delete
*
[182] Fix | Delete
* @param string $sql
[183] Fix | Delete
*
[184] Fix | Delete
* @return bool|array
[185] Fix | Delete
*/
[186] Fix | Delete
private function _gd_query($opts)
[187] Fix | Delete
{
[188] Fix | Delete
$result = [];
[189] Fix | Delete
$pageToken = null;
[190] Fix | Delete
$parameters = [
[191] Fix | Delete
'fields' => self::FETCHFIELDS_LIST,
[192] Fix | Delete
'pageSize' => 1000,
[193] Fix | Delete
'spaces' => 'drive',
[194] Fix | Delete
];
[195] Fix | Delete
[196] Fix | Delete
if (is_array($opts)) {
[197] Fix | Delete
$parameters = array_merge($parameters, $opts);
[198] Fix | Delete
}
[199] Fix | Delete
do {
[200] Fix | Delete
try {
[201] Fix | Delete
if ($pageToken) {
[202] Fix | Delete
$parameters['pageToken'] = $pageToken;
[203] Fix | Delete
}
[204] Fix | Delete
$files = $this->service->files->listFiles($parameters);
[205] Fix | Delete
[206] Fix | Delete
$result = array_merge($result, $files->getFiles());
[207] Fix | Delete
$pageToken = $files->getNextPageToken();
[208] Fix | Delete
} catch (Exception $e) {
[209] Fix | Delete
$pageToken = null;
[210] Fix | Delete
}
[211] Fix | Delete
} while ($pageToken);
[212] Fix | Delete
[213] Fix | Delete
return $result;
[214] Fix | Delete
}
[215] Fix | Delete
[216] Fix | Delete
/**
[217] Fix | Delete
* Get dat(googledrive metadata) from GoogleDrive.
[218] Fix | Delete
*
[219] Fix | Delete
* @param string $path
[220] Fix | Delete
*
[221] Fix | Delete
* @return array googledrive metadata
[222] Fix | Delete
*/
[223] Fix | Delete
private function _gd_getFile($path, $fields = '')
[224] Fix | Delete
{
[225] Fix | Delete
list(, $itemId) = $this->_gd_splitPath($path);
[226] Fix | Delete
if (!$fields) {
[227] Fix | Delete
$fields = self::FETCHFIELDS_GET;
[228] Fix | Delete
}
[229] Fix | Delete
try {
[230] Fix | Delete
$file = $this->service->files->get($itemId, ['fields' => $fields]);
[231] Fix | Delete
if ($file instanceof Google_Service_Drive_DriveFile) {
[232] Fix | Delete
return $file;
[233] Fix | Delete
} else {
[234] Fix | Delete
return [];
[235] Fix | Delete
}
[236] Fix | Delete
} catch (Exception $e) {
[237] Fix | Delete
return [];
[238] Fix | Delete
}
[239] Fix | Delete
}
[240] Fix | Delete
[241] Fix | Delete
/**
[242] Fix | Delete
* Parse line from googledrive metadata output and return file stat (array).
[243] Fix | Delete
*
[244] Fix | Delete
* @param array $raw line from ftp_rawlist() output
[245] Fix | Delete
*
[246] Fix | Delete
* @return array
[247] Fix | Delete
* @author Dmitry Levashov
[248] Fix | Delete
**/
[249] Fix | Delete
protected function _gd_parseRaw($raw)
[250] Fix | Delete
{
[251] Fix | Delete
$stat = [];
[252] Fix | Delete
[253] Fix | Delete
$stat['iid'] = isset($raw['id']) ? $raw['id'] : 'root';
[254] Fix | Delete
$stat['name'] = isset($raw['name']) ? $raw['name'] : '';
[255] Fix | Delete
if (isset($raw['modifiedTime'])) {
[256] Fix | Delete
$stat['ts'] = strtotime($raw['modifiedTime']);
[257] Fix | Delete
}
[258] Fix | Delete
[259] Fix | Delete
if ($raw['mimeType'] === self::DIRMIME) {
[260] Fix | Delete
$stat['mime'] = 'directory';
[261] Fix | Delete
$stat['size'] = 0;
[262] Fix | Delete
} else {
[263] Fix | Delete
$stat['mime'] = $raw['mimeType'] == 'image/bmp' ? 'image/x-ms-bmp' : $raw['mimeType'];
[264] Fix | Delete
$stat['size'] = (int)$raw['size'];
[265] Fix | Delete
if ($size = $raw->getImageMediaMetadata()) {
[266] Fix | Delete
$stat['width'] = $size['width'];
[267] Fix | Delete
$stat['height'] = $size['height'];
[268] Fix | Delete
}
[269] Fix | Delete
[270] Fix | Delete
$published = $this->_gd_isPublished($raw);
[271] Fix | Delete
[272] Fix | Delete
if ($this->options['useGoogleTmb']) {
[273] Fix | Delete
if (isset($raw['thumbnailLink'])) {
[274] Fix | Delete
if ($published) {
[275] Fix | Delete
$stat['tmb'] = 'drive.google.com/thumbnail?authuser=0&sz=s' . $this->options['tmbSize'] . '&id=' . $raw['id'];
[276] Fix | Delete
} else {
[277] Fix | Delete
$stat['tmb'] = substr($raw['thumbnailLink'], 8); // remove "https://"
[278] Fix | Delete
}
[279] Fix | Delete
} else {
[280] Fix | Delete
$stat['tmb'] = '';
[281] Fix | Delete
}
[282] Fix | Delete
}
[283] Fix | Delete
[284] Fix | Delete
if ($published) {
[285] Fix | Delete
$stat['url'] = $this->_gd_getLink($raw);
[286] Fix | Delete
} elseif (!$this->disabledGetUrl) {
[287] Fix | Delete
$stat['url'] = '1';
[288] Fix | Delete
}
[289] Fix | Delete
}
[290] Fix | Delete
[291] Fix | Delete
return $stat;
[292] Fix | Delete
}
[293] Fix | Delete
[294] Fix | Delete
/**
[295] Fix | Delete
* Get dat(googledrive metadata) from GoogleDrive.
[296] Fix | Delete
*
[297] Fix | Delete
* @param string $path
[298] Fix | Delete
*
[299] Fix | Delete
* @return array googledrive metadata
[300] Fix | Delete
*/
[301] Fix | Delete
private function _gd_getNameByPath($path)
[302] Fix | Delete
{
[303] Fix | Delete
list(, $itemId) = $this->_gd_splitPath($path);
[304] Fix | Delete
if (!$this->names) {
[305] Fix | Delete
$this->_gd_getDirectoryData();
[306] Fix | Delete
}
[307] Fix | Delete
[308] Fix | Delete
return isset($this->names[$itemId]) ? $this->names[$itemId] : '';
[309] Fix | Delete
}
[310] Fix | Delete
[311] Fix | Delete
/**
[312] Fix | Delete
* Make cache of $parents, $names and $directories.
[313] Fix | Delete
*
[314] Fix | Delete
* @param bool $usecache
[315] Fix | Delete
*/
[316] Fix | Delete
protected function _gd_getDirectoryData($usecache = true)
[317] Fix | Delete
{
[318] Fix | Delete
if ($usecache) {
[319] Fix | Delete
$cache = $this->session->get($this->id . $this->netMountKey, []);
[320] Fix | Delete
if ($cache) {
[321] Fix | Delete
$this->parents = $cache['parents'];
[322] Fix | Delete
$this->names = $cache['names'];
[323] Fix | Delete
$this->directories = $cache['directories'];
[324] Fix | Delete
[325] Fix | Delete
return;
[326] Fix | Delete
}
[327] Fix | Delete
}
[328] Fix | Delete
[329] Fix | Delete
$root = '';
[330] Fix | Delete
if ($this->root === '/') {
[331] Fix | Delete
// get root id
[332] Fix | Delete
if ($res = $this->_gd_getFile('/', 'id')) {
[333] Fix | Delete
$root = $res->getId();
[334] Fix | Delete
}
[335] Fix | Delete
}
[336] Fix | Delete
[337] Fix | Delete
$data = [];
[338] Fix | Delete
$opts = [
[339] Fix | Delete
'fields' => 'files(id, name, parents)',
[340] Fix | Delete
'q' => sprintf('trashed=false and mimeType="%s"', self::DIRMIME),
[341] Fix | Delete
];
[342] Fix | Delete
$res = $this->_gd_query($opts);
[343] Fix | Delete
foreach ($res as $raw) {
[344] Fix | Delete
if ($parents = $raw->getParents()) {
[345] Fix | Delete
$id = $raw->getId();
[346] Fix | Delete
$this->parents[$id] = $parents;
[347] Fix | Delete
$this->names[$id] = $raw->getName();
[348] Fix | Delete
foreach ($parents as $p) {
[349] Fix | Delete
if (isset($data[$p])) {
[350] Fix | Delete
$data[$p][] = $id;
[351] Fix | Delete
} else {
[352] Fix | Delete
$data[$p] = [$id];
[353] Fix | Delete
}
[354] Fix | Delete
}
[355] Fix | Delete
}
[356] Fix | Delete
}
[357] Fix | Delete
if ($root && isset($data[$root])) {
[358] Fix | Delete
$data['root'] = $data[$root];
[359] Fix | Delete
}
[360] Fix | Delete
$this->directories = $data;
[361] Fix | Delete
$this->session->set($this->id . $this->netMountKey, [
[362] Fix | Delete
'parents' => $this->parents,
[363] Fix | Delete
'names' => $this->names,
[364] Fix | Delete
'directories' => $this->directories,
[365] Fix | Delete
]);
[366] Fix | Delete
}
[367] Fix | Delete
[368] Fix | Delete
/**
[369] Fix | Delete
* Get descendants directories.
[370] Fix | Delete
*
[371] Fix | Delete
* @param string $itemId
[372] Fix | Delete
*
[373] Fix | Delete
* @return array
[374] Fix | Delete
*/
[375] Fix | Delete
protected function _gd_getDirectories($itemId)
[376] Fix | Delete
{
[377] Fix | Delete
$ret = [];
[378] Fix | Delete
if ($this->directories === null) {
[379] Fix | Delete
$this->_gd_getDirectoryData();
[380] Fix | Delete
}
[381] Fix | Delete
$data = $this->directories;
[382] Fix | Delete
if (isset($data[$itemId])) {
[383] Fix | Delete
$ret = $data[$itemId];
[384] Fix | Delete
foreach ($data[$itemId] as $cid) {
[385] Fix | Delete
$ret = array_merge($ret, $this->_gd_getDirectories($cid));
[386] Fix | Delete
}
[387] Fix | Delete
}
[388] Fix | Delete
[389] Fix | Delete
return $ret;
[390] Fix | Delete
}
[391] Fix | Delete
[392] Fix | Delete
/**
[393] Fix | Delete
* Get ID based path from item ID.
[394] Fix | Delete
*
[395] Fix | Delete
* @param string $id
[396] Fix | Delete
*
[397] Fix | Delete
* @return array
[398] Fix | Delete
*/
[399] Fix | Delete
protected function _gd_getMountPaths($id)
[400] Fix | Delete
{
[401] Fix | Delete
$root = false;
[402] Fix | Delete
if ($this->directories === null) {
[403] Fix | Delete
$this->_gd_getDirectoryData();
[404] Fix | Delete
}
[405] Fix | Delete
list($pid) = explode('/', $id, 2);
[406] Fix | Delete
$path = $id;
[407] Fix | Delete
if ('/' . $pid === $this->root) {
[408] Fix | Delete
$root = true;
[409] Fix | Delete
} elseif (!isset($this->parents[$pid])) {
[410] Fix | Delete
$root = true;
[411] Fix | Delete
$path = ltrim(substr($path, strlen($pid)), '/');
[412] Fix | Delete
}
[413] Fix | Delete
$res = [];
[414] Fix | Delete
if ($root) {
[415] Fix | Delete
if ($this->root === '/' || strpos('/' . $path, $this->root) === 0) {
[416] Fix | Delete
$res = [(strpos($path, '/') === false) ? '/' : ('/' . $path)];
[417] Fix | Delete
}
[418] Fix | Delete
} else {
[419] Fix | Delete
foreach ($this->parents[$pid] as $p) {
[420] Fix | Delete
$_p = $p . '/' . $path;
[421] Fix | Delete
$res = array_merge($res, $this->_gd_getMountPaths($_p));
[422] Fix | Delete
}
[423] Fix | Delete
}
[424] Fix | Delete
[425] Fix | Delete
return $res;
[426] Fix | Delete
}
[427] Fix | Delete
[428] Fix | Delete
/**
[429] Fix | Delete
* Return is published.
[430] Fix | Delete
*
[431] Fix | Delete
* @param object $file
[432] Fix | Delete
*
[433] Fix | Delete
* @return bool
[434] Fix | Delete
*/
[435] Fix | Delete
protected function _gd_isPublished($file)
[436] Fix | Delete
{
[437] Fix | Delete
$res = false;
[438] Fix | Delete
$pType = $this->options['publishPermission']['type'];
[439] Fix | Delete
$pRole = $this->options['publishPermission']['role'];
[440] Fix | Delete
if ($permissions = $file->getPermissions()) {
[441] Fix | Delete
foreach ($permissions as $permission) {
[442] Fix | Delete
if ($permission->type === $pType && $permission->role === $pRole) {
[443] Fix | Delete
$res = true;
[444] Fix | Delete
break;
[445] Fix | Delete
}
[446] Fix | Delete
}
[447] Fix | Delete
}
[448] Fix | Delete
[449] Fix | Delete
return $res;
[450] Fix | Delete
}
[451] Fix | Delete
[452] Fix | Delete
/**
[453] Fix | Delete
* return item URL link.
[454] Fix | Delete
*
[455] Fix | Delete
* @param object $file
[456] Fix | Delete
*
[457] Fix | Delete
* @return string
[458] Fix | Delete
*/
[459] Fix | Delete
protected function _gd_getLink($file)
[460] Fix | Delete
{
[461] Fix | Delete
if (strpos($file->mimeType, 'application/vnd.google-apps.') !== 0) {
[462] Fix | Delete
if ($url = $file->getWebContentLink()) {
[463] Fix | Delete
return str_replace('export=download', 'export=media', $url);
[464] Fix | Delete
}
[465] Fix | Delete
}
[466] Fix | Delete
if ($url = $file->getWebViewLink()) {
[467] Fix | Delete
return $url;
[468] Fix | Delete
}
[469] Fix | Delete
[470] Fix | Delete
return '';
[471] Fix | Delete
}
[472] Fix | Delete
[473] Fix | Delete
/**
[474] Fix | Delete
* Get download url.
[475] Fix | Delete
*
[476] Fix | Delete
* @param Google_Service_Drive_DriveFile $file
[477] Fix | Delete
*
[478] Fix | Delete
* @return string|false
[479] Fix | Delete
*/
[480] Fix | Delete
protected function _gd_getDownloadUrl($file)
[481] Fix | Delete
{
[482] Fix | Delete
if (strpos($file->mimeType, 'application/vnd.google-apps.') !== 0) {
[483] Fix | Delete
return 'https://www.googleapis.com/drive/v3/files/' . $file->getId() . '?alt=media';
[484] Fix | Delete
} else {
[485] Fix | Delete
$mimeMap = $this->options['appsExportMap'];
[486] Fix | Delete
if (isset($mimeMap[$file->getMimeType()])) {
[487] Fix | Delete
$mime = $mimeMap[$file->getMimeType()];
[488] Fix | Delete
} else {
[489] Fix | Delete
$mime = $mimeMap['default'];
[490] Fix | Delete
}
[491] Fix | Delete
$mime = rawurlencode($mime);
[492] Fix | Delete
[493] Fix | Delete
return 'https://www.googleapis.com/drive/v3/files/' . $file->getId() . '/export?mimeType=' . $mime;
[494] Fix | Delete
}
[495] Fix | Delete
[496] Fix | Delete
return false;
[497] Fix | Delete
}
[498] Fix | Delete
[499] Fix | Delete
It is recommended that you Edit text format, this type of Fix handles quite a lot in one request
Function