gpt4 book ai didi

silverstripe - 创建 DataObject 以在 SilverStripe 中构建表行和列

转载 作者:行者123 更新时间:2023-12-04 13:00:04 28 4
gpt4 key购买 nike

我正在尝试为 SilverStripe 站点做一些非常不同的事情:在几个子页面上是数据表,这些表每个都有自己的一组列标题,有些表的列比其他表多。我想避免在富文本编辑器中构建表格,因为这很容易出现很多错误,而且随着时间的推移维护起来很麻烦。

我想要做的是创建一个 DataObject,它允许第 n 个列数和第 n 个相应行数。通过这种方式,我可以在模板中调用一个循环(或可能是两个),其中我已经有了 HTML 表结构。内容管理员可以完全控制任何给定子页面的表中的哪些列,并且他们不必担心维护 HTML 表设置。

我有一些想法不会产生我想要的结果,如果没有 a) 使内容管理器的 UI 体验过于复杂 b) 无法正确地将列与行链接起来。

我曾想过为表格标题创建一个 DataObject,为表格行创建一个,但后来我对如何以一种有意义的方式组合它们感到困惑,尤其是因为可能有任意数量的列。

有没有人有任何建议来解决这个问题?

更新:好的,我有一些可以用于 TableRowItem 数据对象的东西,它可以工作,并且接近工作。但是,现在的问题是:当我基本上动态创建字段值时,如何将它们保存到数据库中?现在,唯一保存到数据库的字段是 PDF 文件上传字段,点击“创建”后,其他所有内容都会被删除。

<?php

class TruckBodyPdfTableRowItem extends DataObject {

private static $db = array(
);

// One-to-one relationship with gallery page
private static $has_one = array(
'TablePage'=> 'Page',
'TableColumnSet' => 'TableColumnSet',
'PDF' => 'File',
);


// tidy up the CMS by not showing these fields
public function getCMSFields() {
$fields = parent::getCMSFields();
$fields->removeFieldFromTab("Root.Main","TablePageID");
$fields->removeFieldFromTab("Root.Main","TableColumnSetID");
$fields->removeFieldFromTab("Root.Main","SortOrder");
$fields->addFieldsToTab("Root.Main", $this->getMyColumnOptions());

return $fields;
}
public function getMyColumnOptions()
{
$columnArray = [];
$Columns = DataObject::get('TableColumnSet');

foreach($Columns as $Column){
$columnArray[] = TextField::create($Column->TableColumnHeader);
}

return $columnArray;
}

// Tell the datagrid what fields to show in the table
private static $summary_fields = array(
);

public function canEdit() {
return true;
}

public function canDelete() {
return true;
}

public function canCreate(){
return true;
}

public function canPublish(){
return true;
}

public function canView(){
return true;
}
}

但这些是棘手的部分:弄清楚如何将值从一个 DataObject 映射到另一个 DataObject 的标签,然后根据已创建的列数自动生成第 n 行。
<?php

class TablePage extends Page
{
private static $db = array(
'H1' => 'varchar(250)',
);

private static $has_many = array(
'TableRowItems' => 'TableRowItem',
'TableColumnSets' => 'TableColumnSet'
);

private static $has_one = array(

);

public function getCMSFields()
{
$fields = parent::getCMSFields();

$fields->addFieldToTab("Root.Main", new TextField("H1"), "Content");

$gridFieldConfig = GridFieldConfig_RecordEditor::create();

$gridFieldConfig->getComponentByType('GridFieldDataColumns')->setDisplayFields(array(
// field from drawer class => label in UI
'TableColumnHeader' => 'Table Column Header'
));

$gridfield = new GridField(
"TableColumnSets",
"Table Column Sets",
$this->TableColumnSets(),
$gridFieldConfig
);

$fields->addFieldToTab('Root.Specs Table', $gridfield);




$gridFieldConfig2 = GridFieldConfig_RecordEditor::create();

$gridFieldConfig2->getComponentByType('GridFieldDataColumns')->setDisplayFields(array(
// field from drawer class => label in UI
'TableRowValue' => 'Table Row Value'
));

$gridfield2 = new GridField(
"TableRowItems",
"Table Row Items",
$this->TableRowItems(),
$gridFieldConfig2
);
$fields->addFieldToTab('Root.Specs Table', $gridfield2);



return $fields;
}
}

class TablePage_Controller extends Page_Controller
{
private static $allowed_actions = array(

);

public function init()
{
parent::init();
// You can include any CSS or JS required by your project here.
// See: http://doc.silverstripe.org/framework/en/reference/requirements
}
}

下面是 TableColumnSet 和 TableRowValue 类。我想,会有一组与第 n 行相关联的列标题,所以我想会有一个 $has_many这两个类之间的关系,因为一个 TableColumnSet 可以有许多 TableRowValues,但所有 TableRowValues 只能有一个 TableColumnSet。我希望使用下拉列表将 TableRowValues 与 TableColumnSet 值相关联,并创建所有列标题,但这听起来像是个坏主意。必须手动将一行中的每个字段与列标题相关联似乎很乏味,而且内容管理器可能会很困难。
<?php

class TableColumnSet extends DataObject {

private static $db = array(
'SortOrder' => 'Int',
'TableColumnHeader'=>'varchar(250)'
);

// One-to-one relationship with gallery page
private static $has_one = array(
'TablePage'=> 'Page'
);

private static $has_many = array(
'TableRowItems' => 'TableRowItem'
);

// tidy up the CMS by not showing these fields
public function getCMSFields() {
$fields = parent::getCMSFields();
$fields->removeFieldFromTab("Root.Main","TablePageID");

$fields->removeFieldFromTab("Root.Main","SortOrder");

return $fields;
}

// Tell the datagrid what fields to show in the table
private static $summary_fields = array(
'TableColumnHeader' => 'Table Column Header',
);

public function canEdit() {
return true;
}

public function canDelete() {
return true;
}

public function canCreate(){
return true;
}

public function canPublish(){
return true;
}

public function canView(){
return true;
}
}

我觉得这里可能有一些东西,至少在列标题和行之间的关系方面?不过,我不确定。

最佳答案

我可能不在基地,因为我没有使用 SilverStripe 的经验。但是……我的 PHP/HTML 表格解决方案可能适用于这里:

<?php

// parse your table data into this structure
$tableData = array(
"rowOne" => array(
"columnName" => "columnValue1",
"colName" => "colValue1"
// .....
),
"rowTwo" => array(
"columnName" => "columnValue2",
"colName" => "colValue2"
// .....
)
);

// now loop through the array with a printHeader parameter
$tableHTML = array(
"<table>"
);
$tableHead = array(
"<thead>"
);
$tableBody = array(
"<tbody>"
);
$printHeader = true;

foreach ($tableData as $row) {
foreach ($row as $column => $value) {
$tableRow = "<tr>";
if ($printHeader) {
$tableHead[] = "<th>".$column."</th>";
}
$tableRow .= "<td>".$value."</td>";
}
$tableBody[] = $tableRow."</tr>";
// after the first row, set printHeader to false and close the <thead>
$printHeader = false;
$tableHead[] = "</thead>";
}

// implode table header to string with linebreaks
$tableHead = implode(PHP_EOL, $tableHead);

// close table <tbody> & implode to string with linebreaks
$tableBody[] = "</tbody>";
$tableBody = implode(PHP_EOL, $tableBody);

// add all table elements together
$tableHTML[] = $tableHead;
$tableHTML[] = $tableBody;
$tableHTML[] = "</table>";
// implode table array to string
$tableHTML = implode(PHP_EOL, $tableHTML);

// print or write anywhere
echo($tableHTML);

?>

循环中所有步骤的数组结构是保持默认服务器内存更干净以删除旧数据。如果您将所有内容连接为字符串( $var .= "string"; ),所有引用都将保留在内存中,并在显示大表时使服务器陷入困境。
我希望这会有所帮助

关于silverstripe - 创建 DataObject 以在 SilverStripe 中构建表行和列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43980343/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com