介绍
你好,
我想建立一个像这样的大数据结构:
[products]
.[cat_1]
.[cat_1.1]
.[item-A] //type 1
.[item-B] //type 1
. ...
.[cat_1.2]
.[item-X] //type 2
.[cat_2]
.[item-Y] //type 3
到目前为止一切顺利。
目标
由于该网站应该是一种目录,因此 URL 将是例如:
www.example.com/products/cat_1/.../cat_Y/
。
该 URL 上的行为应该是:向所有子项(仅项目或仅子组)显示其预览图像和指向 example.com/products/cat_1/.../cat_Y/item-X
。
Itemtypes当然是不同的。
我做了什么
类
我实现了基于复合模式的结构,因此节点和叶子有一个共同的基类,在我的例子中,它保存了对象的名称。节点包含叶子或节点的数组,该数组由称为 addChild()
的方法填充。
实现类似这样:
<?php
abstract class Base
{
public $name;
public $previewImage; //path to preview image
public function __construct($name,$preview){
$this->name=$name;
$this->previewImage=$preview;
}
}
class SubGroup extends Base{
public $children= array();
public function getChildrenByPath(Array $subGroupPath){
//example: array("cat_1","cat_1-1",...);
$subChildren=$this->children;
foreach($subGroupPath as $currentPathStep){//follow subGroupPath
foreach($subChildren as $currentChildr){// step through children and compare to path
if($currentChild->uriPattern == $currentPathStep){
$subChildren=$currentChild->getChildren();
break; //end foreach
}
}
}
return $subChildren;
}
public function addChild(Base $new_child){
$this->children[]=$new_child;
}
public function getChildren(){
return $this->children;
}
}
class ProductType01 extends Base{
public property1,property2,property3;
}
?>
对象/数据结构
我在一个单独的 php 文件中设置了一些项目来创建一个虚拟结构并尝试玩(稍后可以在数据库中):
$cat01 = new SubGroup("category 01","preview_cat_01.png");
$cat01->addChild( new ProductType01("Item-01","preview_01.png"));
$cat01->addChild( new ProductType01("Item-02","preview_02.png"));
...
$products = new subGroup("","","products"); //very first node
$products->addChild($cat01);
因此 addChild() 方法将项目添加到第一个类别的数组中。
介绍
<main>
<?php
$children=$products->getChildrenByPath($uri);
foreach($children as $value){
echo "<div class='previewImage_element'>";
echo "<img src='".$value->previewImage."' style='width:calc(120px *4/3);height:calc(120px*3/4);'>";
echo "<br /><a href='".."'>".$value->name."</a></div>\n";
}
?>
</main>
这就是我在表格结构中列出预览图像的方式,当然没问题。 这也可以作为一种方法自动化。
问题
我不知道复合(以及我构建它的方式)是否是正确的设计模式以及达到所需灵 active 和易于实现结构的最佳方法。乍一看,复合模式似乎与我的分层数据相匹配,但要完成一个简单的实现还有很多工作要做。
例如:如何建立项目的超链接,因为我无法向上移动树结构来收集上面的所有级别?
我不是在寻找一种“简单”的方法来设置类,而是在寻找一种轻松使用它们的方法。
内部数组是实现它的方法还是有更复杂的方法来指向子节点/子节点?
有了这种结构,你们将如何实现多语言功能?
我可以用什么方式(尽可能)将数据和 html 分开?
这是开始的好方法吗?有什么提示吗?有帮助吗?非常欢迎批评!!
最佳答案
您可以在您的基类中添加一个父变量并在 addChild 中设置它。检查 null 是必要的,但它允许您在树层次结构中双向移动。
关于PHP,哎呀;为可变深度的分类项目选择正确的设计模式并显示项目链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32614624/