lexprodsas/contao-content-api-bundle

通过易于使用的JSON-API访问Contao内容

安装: 45

依赖: 0

建议者: 0

安全: 0

星级: 0

关注者: 0

分支: 9

类型:contao-bundle

2.6.3 2020-04-29 11:40 UTC

README

我们公司在 Die Schittigs 热爱 Contao,但网络在不断发展,静态HTML模板已经不再适用。因此,我们提出了一种易于理解的JSON-API,通过JavaScript(或任何可以处理JSON的东西)访问Contao内容。

使用Contao内容API,您可以使用 React.jsAngularvue 或任何其他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