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);
        }

    });
});
4

1 回答 1

2

首先,您应该为发送到服务器的每个请求添加一个验证令牌,并且服务器端脚本应该验证接收到的令牌。

然后,您应该在单页控制器中处理提交。

假设您的单个页面在/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
于 2017-11-30T10:47:56.263 回答