This commit is contained in:
root
2025-11-13 19:04:05 +03:00
commit 240d0aba5f
75129 changed files with 11118122 additions and 0 deletions

View File

@@ -0,0 +1,90 @@
<?
namespace Bitrix\UI\Controller;
use Bitrix\Main\Engine\ActionFilter;
use Bitrix\Main\Engine\JsonController;
use Bitrix\Main\Engine\JsonPayload;
use Bitrix\UI\EntitySelector\Dialog;
use Bitrix\UI\EntitySelector\Item;
use Bitrix\UI\EntitySelector\SearchQuery;
class EntitySelector extends JsonController
{
protected function getDefaultPreFilters()
{
return [
new ActionFilter\Authentication(),
new ActionFilter\HttpMethod([ActionFilter\HttpMethod::METHOD_POST]),
new ActionFilter\Csrf(),
new ActionFilter\CloseSession()
];
}
public function loadAction(JsonPayload $payload)
{
$request = $payload->getData();
$request = is_array($request) ? $request : [];
$dialog = new Dialog(isset($request['dialog']) && is_array($request['dialog']) ? $request['dialog'] : []);
$dialog->load();
return [
'dialog' => $dialog->getAjaxData()
];
}
public function getChildrenAction(JsonPayload $payload)
{
$request = $payload->getData();
$request = is_array($request) ? $request : [];
$dialog = new Dialog(isset($request['dialog']) && is_array($request['dialog']) ? $request['dialog'] : []);
$parentItem = new Item(
isset($request['parentItem']) && is_array($request['parentItem']) ? $request['parentItem'] : []
);
$dialog->getChildren($parentItem);
return [
'dialog' => $dialog->getAjaxData()
];
}
public function doSearchAction(JsonPayload $payload)
{
$request = $payload->getData();
$request = is_array($request) ? $request : [];
$dialog = new Dialog(isset($request['dialog']) && is_array($request['dialog']) ? $request['dialog'] : []);
$searchQuery = new SearchQuery(
isset($request['searchQuery']) && is_array($request['searchQuery']) ? $request['searchQuery'] : []
);
$dialog->doSearch($searchQuery);
return [
'dialog' => $dialog->getAjaxData(),
'searchQuery' => $searchQuery
];
}
public function saveRecentItemsAction(JsonPayload $payload)
{
if (!$GLOBALS['USER']->isAuthorized())
{
return;
}
$request = $payload->getData();
$request = is_array($request) ? $request : [];
$dialog = new Dialog(isset($request['dialog']) && is_array($request['dialog']) ? $request['dialog'] : []);
if (isset($request['recentItems']) && is_array($request['recentItems']))
{
$dialog->saveRecentItems($request['recentItems']);
}
}
}

View File

@@ -0,0 +1,59 @@
<?
namespace Bitrix\UI\Controller;
use Bitrix\Main\Engine\ActionFilter;
use Bitrix\Main\Engine\JsonController;
use Bitrix\Main\Engine\JsonPayload;
class Feedback extends JsonController
{
protected function getDefaultPreFilters()
{
return [
new ActionFilter\Authentication(),
new ActionFilter\HttpMethod([ActionFilter\HttpMethod::METHOD_POST]),
new ActionFilter\Csrf(),
new ActionFilter\CloseSession()
];
}
public function loadDataAction(JsonPayload $payload)
{
$request = $payload->getData();
$request = is_array($request) ? $request : [];
$feedbackForm = new \Bitrix\UI\Form\FeedbackForm($request['id']);
$feedbackForm->setFormParams($request['forms']??[]);
$feedbackForm->setPresets(is_array($request['presets']) ? $request['presets'] : []);
if (isset($request['title']))
{
$feedbackForm->setTitle($request['title']);
}
if (isset($request['portalUri']))
{
$feedbackForm->setPortalUri($request['portalUri']);
}
$currentForm = $feedbackForm->getCurrentForm();
if (!isset($currentForm))
{
if (!isset($request['defaultForm']))
{
return [];
}
$feedbackForm->setFormParamsDirectly($request['defaultForm']);
}
return [
'form' => $feedbackForm->getCurrentForm(),
'presets' => $feedbackForm->getPresets(),
'title' => $feedbackForm->getTitle(),
'portalUri' => $feedbackForm->getPortalUri(),
'params' => $feedbackForm->getJsObjectParams(),
];
}
}

View File

@@ -0,0 +1,259 @@
<?php
namespace Bitrix\UI\Controller;
use Bitrix\Main\Engine\Action;
use Bitrix\Main\Engine\ActionFilter;
use Bitrix\Main\Engine\AutoWire\ExactParameter;
use Bitrix\Main\Engine\AutoWire\Parameter;
use Bitrix\Main\Engine\Controller;
use Bitrix\Main\Engine\Response;
use Bitrix\Main\Error;
use Bitrix\Main\Web\Json;
use Bitrix\UI\FileUploader\Chunk;
use Bitrix\UI\FileUploader\ControllerResolver;
use Bitrix\UI\FileUploader\Uploader;
use Bitrix\UI\FileUploader\UploaderController;
use Bitrix\UI\FileUploader\UploaderError;
class FileUploader extends Controller
{
public function configureActions()
{
$configureActions = [];
$configureActions['preview'] = [
'-prefilters' => [
ActionFilter\Csrf::class,
ActionFilter\HttpMethod::class,
],
'+prefilters' => [
new ActionFilter\HttpMethod([ActionFilter\HttpMethod::METHOD_GET]),
// new ActionFilter\CheckImageSignature(),
]
];
$configureActions['download'] = [
'-prefilters' => [
ActionFilter\Csrf::class,
ActionFilter\HttpMethod::class,
],
'+prefilters' => [
new ActionFilter\HttpMethod([ActionFilter\HttpMethod::METHOD_GET]),
]
];
return $configureActions;
}
protected function getDefaultPreFilters(): array
{
return [
new ActionFilter\HttpMethod([ActionFilter\HttpMethod::METHOD_POST]),
new ActionFilter\Csrf(),
new ActionFilter\CloseSession(),
];
}
/**
* Returns the whitelist of UploadControllers.
* You have to override this method for custom ajax controllers.
* @return array|null
*/
protected function getAvailableControllers(): ?array
{
return null;
}
public function getAutoWiredParameters(): array
{
$request = $this->getRequest();
return [
new ExactParameter(
UploaderController::class,
'controller',
function ($className, string $controller, string $controllerOptions = null) {
try
{
$options = empty($controllerOptions) ? [] : Json::decode($controllerOptions);
$options = is_array($options) ? $options : [];
}
catch (\Exception $e)
{
$options = [];
}
if (is_subclass_of($this, FileUploader::class))
{
$availableControllers = $this->getAvailableControllers();
if ($availableControllers === null)
{
$this->addError(new Error(
'You have to override "getAvailableControllers" method for your custom ajax controller.'
));
return null;
}
[$moduleId, $className] = ControllerResolver::resolveName($controller);
$className = strtolower(ltrim($className, '\\'));
$availableNames = array_map(function($name) {
return strtolower(ltrim($name, '\\'));
}, $availableControllers);
if (
!in_array(strtolower($controller), $availableNames)
&& !in_array($className, $availableNames)
)
{
$this->addError(new Error('Invalid Controller Name.'));
return null;
}
}
return ControllerResolver::createController($controller, $options);
}
),
new Parameter(
Chunk::class,
function ($className) use ($request) {
$result = Chunk::createFromRequest($request);
if ($result->isSuccess())
{
return $result->getData()['chunk'];
}
else
{
$this->addErrors($result->getErrors());
return null;
}
}
),
];
}
public function processBeforeAction(Action $action): bool
{
$contentLength = (int)$this->getRequest()->getServer()->get('CONTENT_LENGTH');
$maxFileSize = min(
\CUtil::unformat(ini_get('upload_max_filesize')),
\CUtil::unformat(ini_get('post_max_size'))
);
if ($contentLength > $maxFileSize)
{
$this->addError(new UploaderError(UploaderError::TOO_BIG_REQUEST));
return false;
}
return parent::processBeforeAction($action);
}
public function uploadAction(UploaderController $controller, Chunk $chunk, string $token = null): array
{
$uploader = new Uploader($controller);
$uploadResult = $uploader->upload($chunk, $token);
if ($uploadResult->isSuccess())
{
return $uploadResult->jsonSerialize();
}
else
{
$this->addErrors($uploadResult->getErrors());
}
return [];
}
public function loadAction(UploaderController $controller, array $fileIds): array
{
$uploader = new Uploader($controller);
$loadResults = $uploader->load($fileIds);
return [
'files' => $loadResults,
];
}
public function downloadAction(UploaderController $controller, string $fileId)
{
$uploader = new Uploader($controller);
$loadResults = $uploader->load([$fileId]);
$loadResult = $loadResults->getAll()[0] ?? null;
if ($loadResult === null)
{
$this->addError(new UploaderError(UploaderError::FILE_LOAD_FAILED));
}
else if ($loadResult->isSuccess())
{
$fileId = $loadResult->getFile() ? $loadResult->getFile()->getFileId() : 0;
if ($fileId > 0)
{
return Response\BFile::createByFileId($fileId);
}
else
{
$this->addError(new UploaderError(UploaderError::FILE_FIND_FAILED));
}
}
else
{
$this->addErrors($loadResult->getErrors());
}
return [];
}
public function previewAction(UploaderController $controller, string $fileId)
{
$uploader = new Uploader($controller);
$loadResults = $uploader->load([$fileId]);
$loadResult = $loadResults->getAll()[0] ?? null;
if ($loadResult === null)
{
$this->addError(new UploaderError(UploaderError::FILE_LOAD_FAILED));
}
else if ($loadResult->isSuccess())
{
$imageId = $loadResult->getFile() ? $loadResult->getFile()->getFileId() : 0;
$imageData = \CFile::getFileArray($imageId);
if (is_array($imageData))
{
// Sync with \Bitrix\UI\FileUploader\Uploader::getFileInfo
$response = new Response\ResizedImage($imageData, 300, 300);
$response->setResizeType(BX_RESIZE_IMAGE_PROPORTIONAL);
$response->setCacheTime(86400);
return $response;
}
else
{
$this->addError(new UploaderError(UploaderError::FILE_FIND_FAILED));
}
}
else
{
$this->addErrors($loadResult->getErrors());
}
return [];
}
public function removeAction(UploaderController $controller, array $fileIds): array
{
$uploader = new Uploader($controller);
$removeResult = $uploader->remove($fileIds);
return [
'files' => $removeResult,
];
}
}

View File

@@ -0,0 +1,96 @@
<?php
namespace Bitrix\UI\Controller;
use Bitrix\Bitrix24\License;
use Bitrix\Main\Application;
use Bitrix\Bitrix24;
use Bitrix\Bitrix24\License\Market;
use Bitrix\Main\Engine;
use Bitrix\Main\Loader;
use Bitrix\UI\FeaturePromoter;
class InfoHelper extends Engine\Controller
{
private const POPUP_PROVIDER_TEST_CODE_LIST = [];
public function getInitParamsAction(
string $type = FeaturePromoter\ProviderType::SLIDER,
string $code = '',
string $currentUrl = '',
?string $featureId = null
): array
{
$configuration = new FeaturePromoter\ProviderConfiguration($type, $code, $currentUrl, $featureId);
return (new FeaturePromoter\ProviderFactory())->createProvider($configuration)->getRendererParameters();
}
public function activateDemoLicenseAction()
{
$result = [
'success' => 'N',
];
if (Loader::includeModule('bitrix24') && defined('BX24_HOST_NAME'))
{
$res = License::getCurrent()->getDemo()->activate();
if ($res->isSuccess())
{
$result['success'] = 'Y';
}
}
return $result;
}
public function getBuySubscriptionUrlAction()
{
$action = 'blank';
if (Loader::includeModule('bitrix24'))
{
$url = Market::getDefaultBuyPath();
}
else
{
$license = Application::getInstance()->getLicense();
$url = $license->getDomainStoreLicense() . '/key_update.php?license_key=' . $license->getHashLicenseKey() . '&tobasket=y&action=b24subscr';
}
return [
'url' => $url,
'action' => $action,
];
}
public function activateTrialFeatureAction(string $featureId)
{
$result = [
'success' => 'N',
];
if (
Loader::includeModule('bitrix24')
&& method_exists(Bitrix24\Feature::class, 'trialFeature')
)
{
$trialable = Bitrix24\Feature::isFeatureTrialable($featureId);
if ($trialable)
{
$result['success'] = Bitrix24\Feature::trialFeature($featureId) ? 'Y' : 'N';
}
else
{
$result['error'] = 'IS_NOT_TRIALABLE';
}
}
return $result;
}
public function showLimitSliderAction(): bool
{
return true;
}
}

View File

@@ -0,0 +1,20 @@
<?php
namespace Bitrix\UI\Controller;
use Bitrix\Main\Engine;
use Bitrix\UI\Util;
class Manual extends Engine\Controller
{
public function getInitParamsAction(string $manualCode, array $urlParams)
{
$manualUrl = Util::getHelpdeskUrl(true) . '/manual/' . urlencode($manualCode) . '/';
$url = \CHTTP::urlAddParams($manualUrl, $urlParams, ['encode' => true]);
return [
'url' => $url,
];
}
}