0

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

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

我见过一个 PHP 页面(在templates文件夹中),它从自定义数据库表中获取所有数据(通过变量自动注入?)并将其格式化为 html 表。

这就是迄今为止所建造的。

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

  • 在现有的 html 表中创建一个链接(带有记录的 id),该链接链接到一个新页面(例如 pagenamewhichidonotknow?id=34
  • 并在该页面上,接收链接发送的 id(从querystring?获取),
  • 从自定义数据库表中获取数据(不知道如何)
  • 然后创建一个漂亮的页面(知道如何做到这一点;-))

我意识到这是一个很大的问题,但我真的不知道从哪里开始。谷歌搜索向我显示了很多带有此警告的页面“此指南是为 Contao 2.x 编写的,其中很多信息已过时!请仔细阅读,仅用作通用指南。” 和其他页面是德语,尽管在高中学习了 3 年,但不是我的 usp。

任何帮助表示赞赏。

4

2 回答 2

1

要在前端获取项目列表:

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

  • 转到“主题”
  • 点击齿轮图标
  • 创建一个新模块
  • 给它一个名字
  • 从下拉列表中选择模块类型(要选择的模型名称应如下所示:“yourCustomModulNameList”或类似名称)

第 2 步 / 将新的 List-Module 嵌入到文章中:

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

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

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

希望这可以帮助 :)

于 2016-07-05T10:19:51.303 回答
1

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

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

让我们开始介绍如何通过创建listModule并将其添加到listPage来链接到detailsPage

  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') );

This will create a column in your custom table that you will use it later to access the page ID in the template

  1. Run the install tool.
  2. Work on any errors that may arise. If none, go to next
  3. Create the frontend module according to this url Front end module

  4. In the compile function do as below

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;
}

please note the itemId parameter added to the url

  1. Create a template /system/modules/my_module/templates/my_template.html5

    and you will be able to access easily the items

<?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. Now go to themes -> modules ->new module and create a new module. I am assuming you have followed the instructions in that link on how to add your module to your module list. Assuming you added to the miscellaneous group, select your module. You will see a page picker with label 'linkToDetail'. select the detailsPage you created in the beginning.

  2. Go to articles -> listPage -> new select 'module' as the element type and the choose your listModule above. We are good here. preview your page and you should be good.

Now lets build the detailsModule and add it to the detailsPage

  1. Follow all the steps above only that in the compile function of the details module, you will select the details data as follows``

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

step 7,8 and 9 are same.

This will help in the case where details page changes in times of ID. It makes it dynamic enough.

Hope this helps

于 2016-07-05T13:15:30.590 回答