从自定义模块读取和显示数据

Reading and showing data from a custom module

我是 Contao 项目的新手,也是该项目唯一的开发人员....

自定义模块已创建。对于此自定义模块,有一个数据输入表单(在 dca 文件夹中的 php 文件中定义),用户可以在其中输入所有数据,然后存储在自定义 table. 该模块的代码遵循博文 'Create a custom module - the basics' (http://blog.qzminski.com/article/create-a-custom-module-the-basics.html).

中所述的布局

我看到了一个 PHP 页面(在 templates 文件夹中),它从自定义数据库 table 获取所有数据(通过变量自动注入?)和格式html table.

这就是目前构建的内容。

现在我要做的是为单个项目创建一个显示页面。通常是:

我意识到这是一个大问题,但我真的不知道从哪里开始。 谷歌搜索显示了很多带有此警告的页面 "This guite was written for Contao 2.x and a lot of it's information is outdated! Read with care and only use as a general-purpose guide." 和其他页面是德语的,尽管我在高中学了 3 年,但不是我的 usp。

感谢任何帮助。

在前端获取项目列表:

第 1 步/创建一个列表模块:

  • 转到"themes"
  • 单击齿轮图标
  • 创建一个新模块
  • 给它起个名字
  • 从下拉列表中选择模块类型 (选择的模型名称应该是这样的: "yourCustomModulNameList" 或类似)

步骤 2 / 将新的列表模块嵌入到文章中:

  • 转到主菜单中的文章
  • 编辑应包含列表的文章
  • 选择新的内容元素
  • 选择"Modul"作为类型
  • select 你命名的模块

...为单个项目创建展示页面,步骤几乎相同:

  • 创建一个 reader-modul
  • 将此 reader-模块插入新页面(在新文章中)
  • 告诉之前创建的 list-modul reader-modul 在哪里

希望这对您有所帮助:)

希望我能让你好起来。为了实现你想要的,你需要创建两个前端模块,listModuledetailsModule 和两个页面,listPagedetailsPage 因此在后端(站点结构)中创建这两个页面。您将 listModule 添加到 listPage 并将 detailsModule 添加到 detailsPage.

切勿对页面 ID 进行硬编码,除非您别无选择。

让我们开始了解如何通过创建 listModule 并将其添加到 detailsPage =]listPage

  1. 创建/system/modules/my_module/dca/tl_module.php
  2. 添加以下代码并保存

$GLOBALS['TL_DCA']['tl_module']['palettes']['my_module'] = '{title_legend},name,headline,type,linkToDetail;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID,space';

$GLOBALS['TL_DCA']['tl_module']['fields']['linkToDetail']=array( 'label' => &$GLOBALS['TL_LANG']['tl_module']['linkToDetail'], 'exclude' => true, 'inputType' => 'pageTree', 'foreignKey' => 'tl_page.title', 'eval' => array('fieldType'=>'radio'), 'sql' => "int(10) unsigned NOT NULL default '0'", 'relation' => array('type'=>'hasOne', 'load'=>'eager') );

这将在您的自定义 table 中创建一个列,稍后您将使用它来访问模板中的页面 ID

  1. 运行 安装工具。
  2. 解决可能出现的任何错误。如果none,转到下一步
  3. 根据这个创建前端模块url Front end module

  4. compile函数中做如下

protected function compile(){

    $objItems = $this->Database->execute("SELECT * FROM my_custom_table");


    if (!$objItems->numRows)
    {
        return;
    }

    $arrItems = array();

    // Generate item rows
    while ($objItems->next())
    {

        $objPage = \PageModel::findPublishedById($objItems->linkToDetail);

        $arrItems[] = array
        (
            'linkToDetail' => $objPage->getFrontendUrl('itemId='.$objItems->id),
        );
    }

    $this->Template->items = $arrItems;
}

请注意url

中添加的itemId参数
  1. 创建模板/system/modules/my_module/templates/my_template.html5

    您将能够轻松访问这些项目

<?php if($this->items): foreach ($this->items as $item): ?>

<div class="item">

<?php if ($item['linkToDetail']): ?>

<a href="<?php echo $item['linkToDetail']; ?>">Please take me to the details page</a><?php endif; ?>

</div>

<?php endforeach; endif; ?>

  1. 现在转到 themes -> modules ->new module 并创建一个新模块。我假设您已按照 link 中关于如何将模块添加到模块列表中的说明进行操作。假设您添加到杂项组,select 您的模块。您将看到带有标签 'linkToDetail' 的页面选择器。 select 您在开始时创建的 detailsPage

  2. 转到 articles -> listPage -> new select 'module' 作为元素类型,然后选择上面的 listModule。我们在这里很好。预览你的页面,你应该没问题。

现在让我们构建 detailsModule 并将其添加到 detailsPage

  1. 按照以上所有步骤只是在详情模块的compile函数中,您将select详情数据如下``

$objItemDetails = $this->Database->execute("SELECT * FROM my_custom_table where id=".\Input::get('itemId'));

步骤 7,8 和 9 相同。

这将有助于详细信息页面随着 ID 的变化而变化的情况。它使它足够动态。

希望对您有所帮助