- Модуль: mail
- Путь к файлу: ~/bitrix/modules/mail/lib/imap.php
- Класс: BitrixMailImap
- Вызов: Imap::listMailboxes
public function listMailboxes($pattern, &$error, $flat = false)
{
$error = null;
$listGetter = function ($parent = null, $level = 0) use (&$listGetter, &$delimiter, &$error)
{
$pattern = $parent ? sprintf('%s%s%%', $parent, $delimiter) : '%';
$list = $this->listex('', $pattern, $error);
if (false === $list)
{
return false;
}
foreach ($list as $i => $item)
{
$item['title'] = $item['name'];
$item['level'] = $level;
if ($parent)
{
$regex = sprintf(
'/^%s%s(.)/',
preg_quote($parent, '/'),
preg_quote($delimiter, '/')
);
if (!preg_match($regex, $item['name']))
{
unset($list[$i]);
continue;
}
$item['title'] = preg_replace($regex, '1', $item['name']);
}
if ($item['name'] == $parent)
{
continue;
}
if ($item['delim'] === null)
{
continue;
}
$delimiter = $item['delim'];
if (!preg_grep('/^ x5c ( Noinferiors | HasNoChildren ) $/ix', $item['flags']))
{
$children = $listGetter($item['name'], $level + 1);
if ($children === false)
{
return false;
}
if (!empty($children))
{
$item['children'] = $children;
}
}
$list[$i] = $item;
}
return array_values($list);
};
$list = $listGetter();
if (false === $list)
{
return false;
}
$regex = sprintf(
'/^%s$/i',
preg_replace(
array('/ ( x5c * )+ /x', '/ ( % )+ /x'),
array('.*', $delimiter ? sprintf('[^x%s]*', bin2hex($delimiter)) : '.*'),
preg_quote($pattern, '/')
)
);
$listFilter = function ($list) use (&$listFilter, $regex)
{
foreach ($list as $i => $item)
{
if (!preg_match($regex, $item['name']))
{
if (empty($item['children']))
{
unset($list[$i]);
continue;
}
}
if (!empty($item['children']))
{
$item['children'] = $listFilter($item['children']);
if (empty($item['children']))
{
unset($item['children']);
}
}
$list[$i] = $item;
}
$list = array_values($list);
for ($i = 0; $i < count($list); $i++)
{
$item = $list[$i];
if (!preg_match($regex, $item['name']))
{
$children = empty($item['children']) ? array() : $item['children'];
array_splice($list, $i, 1, $children);
$i += count($children) - 1;
}
}
return $list;
};
$list = $listFilter($list);
$listHandler = function ($list, $path = array()) use (&$listHandler, $regex, $flat)
{
for ($i = 0; $i < count($list); $i++)
{
$item = $list[$i];
$item['path'] = array_merge($path, array($item['title']));
if (!empty($item['children']))
{
$item['children'] = $listHandler($item['children'], $item['path']);
}
$list[$i] = $item;
if ($flat && !empty($item['children']))
{
unset($list[$i]['children']);
array_splice($list, $i + 1, 0, $item['children']);
$i += count($item['children']);
}
}
return array_values($list);
};
$list = $listHandler($list);
return $list;
}