Бетон5 8.2.1 Использование базовых классов вне бетона

Я пытаюсь использовать классы бетона для создания пользователя вне структуры основной папки.

Например, у меня была главная папка под названием

Project One
-- concrete
-- application
-- packages
... etc etc

и еще одна папка под названием user-upload. Здесь у меня есть скрипт import-users.php.

У меня есть одна страница, которая имеет форму с элементом загрузки файла. Это берет CSV и пытается отправить его в скрипт import-users.php, готовый выполнить цикл и создать нового пользователя для каждой строки в CSV. Но я продолжаю получать следующую ошибку при попытке использовать классы:

Fatal error: Class 'Core' not found in path/user_upload/import-users.php on line 6 Call Stack: 0.2009 254592 1. {main}() path/user_upload/import-users.php:0

Как я могу использовать класс вне установки concrete5 ?? Примеры были бы чрезвычайно полезны

Редактировать 1
Скрипт для загрузки CSV

$('#user_upload_submit').click(function () {

var fileInput = document.getElementById('usersfile');
var file = fileInput.files[0];
var formData = new FormData();
formData.append('file', file);

$.ajax({
type: "POST",
url: new_path+"user_upload/import-users.php",
data: formData,
contentType: false,
processData: false,
success: function (msg) {
$('#user_result').html(msg);
},
error: function (jqXHR, exception) {
var msg = '';
if (jqXHR.status === 0) {
msg = 'Not connect.\n Verify Network.';
} else if (jqXHR.status == 404) {
msg = 'Requested page not found. [404]';
} else if (jqXHR.status == 500) {
msg = 'Internal Server Error [500].';
} else if (exception === 'parsererror') {
msg = 'Requested JSON parse failed.';
} else if (exception === 'timeout') {
msg = 'Time out error.';
} else if (exception === 'abort') {
msg = 'Ajax request aborted.';
} else {
msg = 'Uncaught Error.\n' + jqXHR.responseText;
}
alert(msg);
}

});
});

1

Решение

Прежде всего, вы должны добавлять токен проверки в каждый запрос, отправляемый на сервер, а серверный скрипт должен проверять полученный токен.

Затем вы должны обработать отправку в одностраничном контроллере.

Давайте предположим, что ваша единственная страница доступна на /test дорожка.
Вид вашей отдельной страницы (куда вы помещаете HTML и JavaScript) должен быть сохранен как /application/single_pages/test.php,
Контроллер отдельной страницы (куда вы помещаете код PHP, который обрабатывает запросы) должен быть сохранен как /application/controllers/single_page/test.php,

в /application/single_pages/test.php Вы должны добавить токен проверки к отправляемым данным и вызвать URL-адрес метода контроллера (давайте назовем его handleSubmit).

Это можно сделать с помощью этого кода:

<script>
<?php
$token = Core::make('token');
?>
$('#user_upload_submit').click(function () {
// ...
var formData = new FormData();
formData.append(<?= json_encode($token::DEFAULT_TOKEN_NAME) ?>, <?= json_encode($token->generate()) ?>);
formData.append('file', file);
$.ajax({
url: <?= json_encode($view->action('handleSubmit')) ?>,
data: formData,
// ...
});
});
</script>

Затем ваш файл контроллера (/application/controllers/single_page/test.php) может быть как то так:

<?php

namespace Application\Controller\SinglePage;

use Concrete\Core\Error\UserMessageException;
use Concrete\Core\Http\ResponseFactoryInterface;
use Concrete\Core\Page\Controller\PageController;
use Symfony\Component\HttpFoundation\File\UploadedFile;

class Test extends PageController
{
public function handleSubmit()
{
$token = $this->app->make('token');
if (!$token->validate()) {
throw new UserMessageException($token->getErrorMessage());
}
$file = $this->request->files->get('file');
if (!($file instanceof UploadedFile)) {
throw new UserMessageException(t('File not received.'));
}
if (!$file->isValid()) {
throw new UserMessageException($file->getErrorMessage());
}
// Process the file. It's path is $file->getPathname();
// ...

// Send the final response
return $this->app->make(ResponseFactoryInterface::class)->json(true);
}
}

Пространство имен контроллера и его имя класса должны отражать URL-адрес одной страницы.

Примеры:

  1. Ваша единственная страница доступна как /test

    • Полный путь к представлению: /application/single_pages/test.php
    • Полный путь к контроллеру: /application/controllers/single_page/test.php
    • Пространство имен контроллера: Application\Controller\SinglePage
    • Имя класса контроллера: Test
  2. Ваша единственная страница доступна как /foo/bar/baz

    • Полный путь к представлению: /application/single_pages/foo/bar/baz.php
    • Полный путь к контроллеру: /application/controllers/single_page/foo/bar/baz.php
    • Пространство имен контроллера: Application\Controller\SinglePage\Foo\Bar
    • Имя класса контроллера: Baz
2

Другие решения

Других решений пока нет …