faisel / contao-api
通过易于使用的 JSON-API 访问 Contao 内容
Requires
- php: ^7.0|^8.0
- contao/core-bundle: ^4.4
Requires (Dev)
- evert/phpdoc-md: ~0.2.0
This package is auto-updated.
Last update: 2024-09-18 03:27:33 UTC
README
我们所在的 Die Schittigs 团队热爱 Die Schittigs,但也热爱 Contao,因为网页正在不断发展,静态 HTML 模板已经不再适用。因此,我们想出了一个易于理解的 JSON-API,通过 JavaScript(或其他可以处理 JSON 的任何东西)来访问 Contao 内容。
使用 Contao 内容 API,您可以用 React.js、Angular、vue 或任何其他 JS 框架编写整个网站的 Frontend,同时仍然使用出色的 Contao 后端。
要求
您需要一个正在运行的 Contao 4.4.x 安装。请注意,API 与 Contao 3.x 不兼容。
安装
如果您还没有安装,请在 Contao 安装的主目录中输入以下命令
composer require dieschittigs/contao-content-api
Contao 内容 API 现已安装并准备好使用。
使用方法
安装后,以下路由可用
/api/sitemap
获取包括根页面的站点地图。
/api/sitemap/flat
获取所有页面作为键值对,其中键是 URL。
/api/urls[?file=sitemap]
获取从生成的站点地图 XML(s) 中获取的所有 URL。如果定义了 file
,则只解析该 XML。
/api/page?url=/about/team.html
获取页面,包括 url
上的所有文章和内容。
/api/newsreader?url=/news/detail/new-website.html
从 url
获取新闻阅读器内容
/api/?url=/page/or/newsarticle.html
尝试获取 url
上的页面,以及任何阅读器的内容
/api/user
如果可用,获取登录的前端用户。
/api/module?id=5
通过 ID 获取模块的内容
/api/text?file=tl_news,modules
通过文件名(s)获取语言文件的内容
/api/file?path=files/uploads&depth=2
获取 path
上的文件或目录及其子目录,限制为 depth
所有路由还接受额外的 lang
参数(例如 ?lang=de
)。如果您需要覆盖语言。
配置
禁用 API
编辑您的 parameters.yml
。
parameters:
…
content_api_enabled:
false
…
API 路由现在全部已禁用。这可能有助于您仅想使用捆绑中包含的类。
响应头
编辑您的 parameters.yml
。
parameters:
…
content_api_headers:
'Access-Control-Allow-Origin': 'https://mysite.org'
…
这些头将添加到 API 的所有响应中。
自定义阅读器
Contao 有阅读器模块的概念(例如新闻阅读器)。这些可以在文章内部任何位置插入,以读取 URL 并显示其内容。如果您想添加额外的阅读器模块,可以通过在 parameters.yml
中添加它们来实现。
parameters:
…
content_api_readers:
newsreader: NewsModel
blogreader: BlogModel
…
请注意,第二个参数是 模型 类,而不是 模块 类。新的阅读器现在可在以下位置使用
/api/blogreader?url=/blog/detail/on-the-topic.html
或者,如果您想包括整个页面,在以下位置
/api?url=/blog/detail/on-the-topic.html
API 内部会尝试使用在 URL 中找到的别名实例化模型。它还尝试添加所有可以找到的 ContentModels
。
钩子
我们提供了一些基本的钩子
class Hooks{
// $GLOBALS['TL_HOOKS']['apiBeforeInit']
public static apiBeforeInit(Request $request){
return $request
}
// $GLOBALS['TL_HOOKS']['apiAfterInit']
public static apiAfterInit(Request $request){
return $request
}
// $GLOBALS['TL_HOOKS']['apiContaoJson']
public static apiContaoJson(ContaoJson $contaoJson, mixed $data){
if($data instanceof ContentModel){
$contaoJson->data = null;
// End of the line
return false;
}
// Do your thing, ContaoJson
return true;
}
// $GLOBALS['TL_HOOKS']['apiResponse']
public static apiResponse(mixed $data){
$data->tamperedWith = true;
return $data;
}
// $GLOBALS['TL_HOOKS']['apiModuleGenerated']
public static function apiModuleGenerated(ApiModule $module, string $moduleClass)
{
// Override the way certain modules are handled
if ($moduleClass != 'Contao\ModuleBlogList') {
return;
}
$_module = new ModuleBlogList($module->model, null);
$module->items = $_module->fetchItems(
$module->category
);
}
}
文档
为API编写的类可以作为构建Contao之上任何内容的好起点。
贡献
欢迎提交错误报告和拉取请求 :)
© Die Schittigs GmbH 2019