Concrete5 8.2.1 在混凝土外使用 Core 类
Concrete5 8.2.1 Using Core classes outside of concrete
我正在尝试使用 Concrete Core 类 在主文件夹结构之外创建用户。
例如我有一个名为
的主文件夹
Project One
-- concrete
-- application
-- packages
... etc etc
和另一个名为用户上传的文件夹。在这里我有一个 import-users.php 脚本。
我有一个页面,其中有一个带有文件上传元素的表单。这需要一个 CSV 并尝试将其发送到 import-users.php 脚本,准备循环并为 CSV 中的每一行创建一个新用户。但是我在尝试使用 classes:
时不断收到以下错误
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 安装之外使用 class?示例将非常有用
编辑 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);
}
});
});
首先,您应该为您发送到服务器的每个请求添加一个验证令牌,并且服务器端脚本应该验证接收到的令牌。
然后,您应该在单页控制器中处理提交。
让我们假设您的单个页面在 /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);
}
}
控制器的命名空间及其class名称必须反映单个页面的URL。
示例:
您的单页可用 /test
- 视图的完整路径:
/application/single_pages/test.php
- 控制器的完整路径:
/application/controllers/single_page/test.php
- 控制器的命名空间:
Application\Controller\SinglePage
- Class控制器名称:
Test
您的单个页面可用 /foo/bar/baz
- 视图的完整路径:
/application/single_pages/foo/bar/baz.php
- 控制器的完整路径:
/application/controllers/single_page/foo/bar/baz.php
- 控制器的命名空间:
Application\Controller\SinglePage\Foo\Bar
- Class控制器名称:
Baz
我正在尝试使用 Concrete Core 类 在主文件夹结构之外创建用户。
例如我有一个名为
的主文件夹Project One
-- concrete
-- application
-- packages
... etc etc
和另一个名为用户上传的文件夹。在这里我有一个 import-users.php 脚本。
我有一个页面,其中有一个带有文件上传元素的表单。这需要一个 CSV 并尝试将其发送到 import-users.php 脚本,准备循环并为 CSV 中的每一行创建一个新用户。但是我在尝试使用 classes:
时不断收到以下错误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 安装之外使用 class?示例将非常有用
编辑 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);
}
});
});
首先,您应该为您发送到服务器的每个请求添加一个验证令牌,并且服务器端脚本应该验证接收到的令牌。
然后,您应该在单页控制器中处理提交。
让我们假设您的单个页面在 /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);
}
}
控制器的命名空间及其class名称必须反映单个页面的URL。
示例:
您的单页可用
/test
- 视图的完整路径:
/application/single_pages/test.php
- 控制器的完整路径:
/application/controllers/single_page/test.php
- 控制器的命名空间:
Application\Controller\SinglePage
- Class控制器名称:
Test
- 视图的完整路径:
您的单个页面可用
/foo/bar/baz
- 视图的完整路径:
/application/single_pages/foo/bar/baz.php
- 控制器的完整路径:
/application/controllers/single_page/foo/bar/baz.php
- 控制器的命名空间:
Application\Controller\SinglePage\Foo\Bar
- Class控制器名称:
Baz
- 视图的完整路径: