zeroseven/pagebased

创建基于页面的扩展的终极工具

安装: 159

依赖: 2

建议: 0

安全性: 0

星级: 5

关注者: 3

分支: 1

开放问题: 0

类型:typo3-cms-extension

v1.3.1 2024-05-14 21:51 UTC

README

在TYPO3后端以“正常”的TYPO3页面轻松管理新闻、事件、博客文章、工作等对象。此扩展为您提供必要的插件和过滤器、分类、标签和其他有用功能。

页面与记录

此扩展不是像页面那样以复杂的方式显示记录,而是使用现有的内容元素利用整个TYPO3带宽来显示内容。除了pagebased扩展的附加功能外,所有已知的TYPO3功能,如元数据、翻译处理、缓存、网站地图和URL,都无需任何配置即可使用。

Example of a page object

快速实现,代码量小

新闻博客文章、工作机会或事件,页面对象通常有很多共同点。通过配置,您可以根据需要为每个页面对象激活或停用单个功能。

  • 列表插件
  • 过滤器插件
  • 标签
  • 分类
  • 联系人
  • 关系
  • RSS源

此外,各个页面对象的全部逻辑和功能都包含在pagebased扩展中。这样,控制器、存储库、分页等都可以集中控制,并易于更新。此外,只需几秒钟就可以创建新的对象——试试看!

创建自己的扩展

通过从扩展模板构建,可以快速、轻松地创建新的Pagebased扩展。

  1. 安装 cookiecutter
  2. 运行 cookiecutter pagebased/Resources/Private/ExtensionDummy

您将被要求输入视图变量,如扩展密钥、对象名称等。之后,将为您生成一个新配置的扩展。

Create new object

配置

对象注册

在您的 ext_localconf.php 中创建一个新的注册

call_user_func(static function () {
    $object = \Zeroseven\Pagebased\Registration\ObjectRegistration::create('Job')
        ->setClassName(\Vendor\NewExtension\Domain\Model\Job::class)
        ->setControllerClass(\Vendor\NewExtension\Controller\JobController::class)
        ->setRepositoryClass(\Vendor\NewExtension\Domain\Repository\JobRepository::class)
        ->setSorting('title') // Sort jobs by their title (backend and frontend)
        ->enableDate()        // Enable date field for job objects
        ->enableTop()         // Enable top feature for job objects
        ->enableTags()        // Enable tag feature for job objects, so tagging and filtering tags is possible
        ->enableTopics(24)    // Enable topics for jobs and give it a pid where to store these
        ->enableContact(24);  // Enable responsible contact person for job objects

    $category = \Zeroseven\Pagebased\Registration\CategoryRegistration::create('Job-Category')
        ->setClassName(\Vendor\NewExtension\Domain\Model\Category::class)
        ->setRepositoryClass(\Vendor\NewExtension\Domain\Repository\CategoryRepository::class)
        ->setDocumentType(44)  // Set document type for category pages (required!)
        ->setSorting('title'); // Set default sorting for category pages

    $listPlugin = \Zeroseven\Pagebased\Registration\ListPluginRegistration::create('Job list')
        ->setDescription('Display jobs in a super nice list')
        ->addLayout('two-columns', 'Two columns'); // Additional layout option for the fluid template (available via "{settings.layout}")

    $filterPlugin = \Zeroseven\Pagebased\Registration\FilterPluginRegistration::create('Job filter')
        ->setDescription('Filter jobs');

    \Zeroseven\Pagebased\Registration\Registration::create('extension_name')
        ->setObject($object)
        ->setCategory($category)
        ->enableListPlugin($listPlugin)
        ->enableFilterPlugin($filterPlugin)
        ->store();
});

覆盖现有注册

如果您想覆盖现有注册,事件 BeforeRegistrationEvent 允许您访问所有属性并在pagebased扩展执行其余操作之前更新它们。

或者,将自动创建一个扩展配置模板。使用TYPO3 InstallTool的设置模块来覆盖默认值。

扩展插件flexForm

使用AddFlexFormEvent来扩展插件flexForm。示例

<?php

declare(strict_types=1);

namespace Zeroseven\Jobs\EventListener;

use Zeroseven\Pagebased\Registration\Event\AddFlexFormEvent;

class ExtendFlexFormEvent
{
    public function __invoke(AddFlexFormEvent $event)
    {
        $flexFormConfiguration = $event->getFlexFormConfiguration();

        if ($flexFormConfiguration->getType() === 'jobs_list' && $sheet = $flexFormConfiguration->getSheet('filter')) {
            $sheet->addField('settings.customField', [
                'type' => 'input',
                'eval' => 'trim,required'
            ], 'Custom field');
        }
    }
}

扩展您的模板

TypoScript

用户对象
page.1684843032 = USER
page.1684843032 {
    userFunc = Zeroseven\Pagebased\Utility\RenderUtility->renderUserFunc
    file = EXT:my_extension/Resources/Private/Templates/Info.html
    registration = my_registration_identifier, another_registration_identifier
}
数据处理程序
# Example to show the next object
page.1686075417 = HMENU
page.1686075417 {
    special = browse
    special.items = next

    1 = TMENU
    1.NO {
        doNotLinkIt = 1
        stdWrap.cObject = FLUIDTEMPLATE
        stdWrap.cObject {
            file = EXT:zeroseven_projects/Resources/Private/Templates/Info/Next.html

            dataProcessing.10 = Zeroseven\Pagebased\DataProcessing\ObjectProcessor
            dataProcessing.10 {
                uid.data = field:uid
                registration = my_registration_identifier
            }
        }
    }
}

自定义内容元素

创建自定义内容元素来显示对象信息

tt_content.my_content_element =< lib.contentElement
tt_content.my_content_element {
    templateName = MyContentElement
    templateRootPaths.1687792159 = EXT:my_extension/Resources/Private/Templates/Content/

    dataProcessing.1687792159 = Zeroseven\Pagebased\DataProcessing\ObjectProcessor
    dataProcessing.1687792159.registration = my_registration_identifier
}

条件

TypoScript
page.10 = TEXT
page.10.value = It's a normal page.

[my_registration_identifier.object]
    page.10.value = Nice! It's an object.
[my_registration_identifier.category]
    page.10.value = This is a category page.
[global]
Fluid
<html xmlns:pagebased="http://typo3.org/ns/Zeroseven/Pagebased/ViewHelpers" data-namespace-typo3-fluid="true">
<pagebased:condition.isObject registration="my_registration_identifier">
    <p>Nice! It's an object.</p>
</pagebased:condition.isObject>
<pagebased:condition.isCategory registration="my_registration_identifier">
    <p>This is a category page.</p>
</pagebased:condition.isCategory>
</html>

命令和任务

使用命令 pagebased:detection 更新类别和对象页面的注册信息。示例

如果您更改注册的标识符或通过API添加页面,这可能很有用。

RSS源

每个使用的pagebased列表插件都可以同时作为RSS源访问。要实现这一点,只需将 /-/rss.xml(例如:https://www.example.com/news/-/rss.xml)附加到URL即可。您就有了带有相应列表插件所有设置的RSS源!

注意:当一个页面包含多个列表插件时,将使用第一个插件。

常见问题解答(FAQ)

对象可以扩展吗?

是的。在TYPO3中,整个结构都是基于extbase的MVC概念。因此,单个类可以被覆盖和扩展。页面对象中的新属性将自动识别,可以直接用于过滤。

这是一个扩展构建器吗?

不是。功能逻辑集中在基于页面的扩展中。这样,项目中不会有冗余代码,并且可以轻松更新。

项目中可以同时运行多个页面对象吗?

是的,项目中的任何数量的对象,如工作、新闻等,都可以同时运行。它们可以配置不同,但仍可使用相同的代码。

页面对象是否进行了SEO优化?

TYPO3提供的所有SEO功能都可以在详情页面上无限制使用。此外,可以通过PSR14事件添加结构化数据。

是否可以集中使用相同的联系人和主题?

是的,您可以灵活地为每个页面对象定义一个或多个存储文件夹。这意味着联系人和主题可以一起使用或单独用于页面对象。编辑器在管理界面中会收到有关对象的提示,例如可用的联系人。

我必须创建对象类别吗?

是的!对象类别的子页面将自动识别为对象。因此,需要先创建一个类别。类别与对象类似,类似于“普通”的TYPO3页面。