lexprodsas / contao-content-api-bundle
通过易于使用的JSON-API访问Contao内容
Requires
- php: ^5.6|^7.0
- contao/core-bundle: ^4.4
Requires (Dev)
- evert/phpdoc-md: ~0.2.0
README
我们公司在 Die Schittigs 热爱 Contao,但网络在不断发展,静态HTML模板已经不再适用。因此,我们提出了一种易于理解的JSON-API,通过JavaScript(或任何可以处理JSON的东西)访问Contao内容。
使用Contao内容API,您可以使用 React.js、Angular、vue 或任何其他JS框架编写整个网站前端。同时,仍然使用出色的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
通过文件名获取语言文件的内容
/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