zeroseven/z7-blog

TYPO3 的另一个博客系统

安装: 6,698

依赖项: 3

建议者: 0

安全: 0

星级: 3

关注者: 12

分支: 1

开放问题: 2

类型:typo3-cms-extension

v1.4.1 2024-02-19 09:50 UTC

README

maintenance-status

TYPO3 博客扩展

已弃用

此扩展已被 pagebased_blog(由 pagebased 驱动)取代,它是功能更强大且性能大幅提升的全新继任者。

经过多年的开发和维护 z7_blog,我们提升了整个体验。我们将所有关于此扩展的经验都融入到它的继任者中。

版本 1.4 是此扩展将收到的最后一个功能更新。感谢您过去使用并喜欢我们的博客扩展。

⁉️ 为什么还需要另一个博客扩展?

为最佳开发者

我们热爱 TYPO3 开发者,TYPO3 开发者也热爱这个扩展。从未如此简单地将博客添加到 TYPO3 页面,对其进行自定义,并将信息放置在合适的位置。只需几行代码即可扩展 Extbase 模型,同步帖子页面的内容,或为 ViewHelpers 或存储库创建新的过滤参数。一切尽在你手中。

想要 RSS-Feed 或评论功能?此扩展高度模块化:整个功能可以轻松安装或移除,或为您自己的博客开发功能。这样,您始终只会拥有您真正需要的精确数量的功能和配置。说到需求:您真的需要这个扩展!

顺便说一下,我们当然支持多语言和多域名设置。

为熟练的编辑者

我们热爱 TYPO3 编辑者,TYPO3 编辑者也热爱这个扩展。从未如此简单地进行博客文章和类别的维护和管理,分配标签,并在 TYPO3 页面上输出所有经过筛选和控制的项。由于它与页面和内容元素一样正常工作,您可以立即开始。此外,后端还支持您在页面树中进行自动帖子排序、自动完成和许多其他实用工具,以帮助您快速完成任务。

为成功的 SEO

我们热爱 SEO 人员,SEO 人员也热爱这个扩展。为您的网站生成内容的好机会。由于所有帖子都是“常规”TYPO3 页面,因此 TYPO3 核心提供的所有可能性也在这里。这样,您不必担心像在这个博客中基于记录的扩展那样,担心 open graph 数据、网站地图、规范或元标签。一切都在这里。更重要的是,我们为所有帖子添加了结构化数据。

🍭 功能概述

  • 基于 TYPO3 页面
  • 支持多域名设置
  • 扩展的过滤器插件
  • 结构化数据
  • 变量 AJAX 分页
  • 后端自动完成标签
  • 页面树中自动排序
  • 自定义插件布局
  • 自定义流体模板的条件
  • 可用的模块化子扩展
    • RSS-Feed
    • 评论功能

✨ "子扩展"

如前所述:为了使此扩展具有大量功能,但又不使其臃肿,这些功能可以通过我们的子扩展概念进行安装或移除。这样,您也可以向博客添加自己的子扩展。

以下是一些现有子扩展的概述

🔧 安装

通过 composer req zeroseven/z7-blog 获取此扩展。

⚙️ 设置

将帖子详细信息添加到模板中

如果您需要获取每个博客文章的信息,不需要单独维护每一个。使用以下TypoScript在您喜欢的地方为每篇文章添加博客内容。

page.100 = USER
page.100 {
    userFunc = Zeroseven\Z7Blog\Utility\PostInfoRenderUtility->renderUserFunc
    file = EXT:z7_blog/Resources/Private/Partials/Post/Info/Summary.html
    settings {
        pass.any = settings
        to = the template
    }
}

… 或者通过模板中的ViewHelper渲染信息

<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:blog="http://typo3.org/ns/Zeroseven/Z7Blog/ViewHelpers" data-namespace-typo3-fluid="true">
    <main>
        <h1>{page.title}</h1>
        <blog:postInfo file="EXT:z7_blog/Resources/Private/Partials/Post/Info/Summary.html" />
    </main>
</html>

… 或者渲染自定义内容元素

tt_content.custom_blogpost_info =< lib.contentElement
tt_content.custom_blogpost_info {
    templateName = Generic

    20 = USER
    20 {
        userFunc = Zeroseven\Z7Blog\Utility\PostInfoRenderUtility->renderUserFunc
        file = EXT:z7_blog/Resources/Private/Partials/Post/Info/Summary.html
    }
}

因此,您可以看到,有多种方法可以实现您想要的功能。请随意选择最适合您的方法!

使用不同的布局

通过TSconfig为编辑器添加可选择的布局。在Fluidtemplate中,您可以使用条件,取决于变量 {settings.layout}

tx_z7blog.content.[CType].layouts {
  sidebar = Sidebar-Teaser
  archive = Archive
}

⚠️ CType可以由TCA配置 contentLayoutKey 覆盖。

扩展模型和需求类

您可以通过添加自己的 traits 来扩展领域模型或需求类。

your_extension/Classes/Domain/Traits/PostModel.php:

<?php declare(strict_types=1);

namespace Vendor\YourExtension\Domain\Traits;

trait PostModel
{

    protected $lol = true;

    public function getLol(): bool
    {
        return $this->lol;
    }

}

your_extension/Classes/Domain/Traits/PostDemand.php:

<?php declare(strict_types=1);

namespace Vendor\YourExtension\Domain\Traits;

class PostDemand
{
    /** @var bool */
    public $navHide = false;

    /** @var array */
    public $keywords = [];
}

your_extension/ext_localconf.php:

<?php

call_user_func(static function () {

    // Load post trait collector instead of the "default" model
    $extbaseObjectContainer = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\TYPO3\CMS\Extbase\Object\Container\Container::class);
    $extbaseObjectContainer->registerImplementation(\Zeroseven\Z7Blog\Domain\Model\Post::class, \Zeroseven\Z7Blog\Domain\Model\TraitCollector\PostTraitCollector::class);
});

// Register trait
$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['z7_blog']['traits'][\Zeroseven\Z7Blog\Domain\Model\Post::class][] = \Vendor\YourExtension\Domain\Traits\PostModel::class;
$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['z7_blog']['traits'][\Zeroseven\Z7Blog\Domain\Demand\PostDemand::class][] = \Vendor\YourExtension\Domain\Traits\PostDemand::class;

JavaScript事件

该扩展在前端触发了关于博客文章分页的各种有用JavaScript事件。我们的自定义触发器始终以 z7_blog 开头,以便与潜在的其它自定义事件区分开来。目前可用的事件包括

一个示例实现可能如下所示

document.addEventListener('z7_blog:addToList:complete', e => {
  console.log('Do something after the new blog posts have been added to the DOM');
});

☝️ 提示: z7_blog:addToList:complete 事件触发器还会传递各种变量,您可以使用它们来修改。例如,所有刚刚添加到列表中的新项目将被传递。

SEO配置

如果使用过滤器作为GET参数,通常建议将其排除在爬虫之外。尤其是当有多个标签和主题的多选时,可能会有成千上万种组合被爬取。

示例robots.txt

Disallow: *tx_z7blog_list%5Btopics%5D=*s
Disallow: *tx_z7blog_list%5Btags%5D=*

结构化数据

每篇文章都会自动获得结构化数据。如果您想扩展这些数据,可以通过TypoScript进行编辑。

示例

plugin.tx_z7blog.settings.post.structuredData {

    # Create new attribute "publisher"
    publisher {

        # Define type "Organisation"
        typeOrganization {

            # … and so on
            name = zeroseven design studios GmbH
            logo.typeImageObject {
                url = https://www.zeroseven.de/resources/logo.png
                width = 365
                height = 28
            }
        }
    }
}

要创建一个新的 @type,您可以在配置中用相应的 type 前缀。

流体模板和TypoScript的自定义条件

我们的博客为您的流体模板和TypoScript设置提供自定义条件。最好通过提供简单的示例来展示。假设您想在所有标题中添加一些额外内容,但仅限于博客文章

流体

<blog:condition.isPost>
    <span>It's a post</span>
</blog:condition.isPost>

TypoScript

[z7_blog.post]
page.10 = TEXT
page.10.value = It's a post
[global]

对于TYPO3 12,只有2个条件可用

[z7_blog.post]
[z7_blog.category]

您还可以将其集成到流体模板的标准 ifViewHelper 中,以实现更高的灵活性

<f:if condition="{media} && {blog:condition.isPost()}">
    <f:then>
        <span>It's a post with an image</span>
    <f:then>
    <f:else>
        <span>It's a "normal" page or the image is missing</span>
    <f:else>
</f:if>

查看z7_blog在Classes/ViewHelpers/Conditions目录中提供的所有自定义条件。

🚧 待办事项

  • 可以通过升级向导运行来自各种TYPO3 Blog扩展的升级
  • 集成PSR14事件以控制器、存储库、结构化数据等