Initial import
This commit is contained in:
163
app/models/Product.php
Normal file
163
app/models/Product.php
Normal file
@@ -0,0 +1,163 @@
|
||||
<?php
|
||||
|
||||
class Product extends Model {
|
||||
|
||||
protected $_classes = [
|
||||
"parent" => "Product"
|
||||
];
|
||||
|
||||
protected $_computed = [
|
||||
"documents" => "get_documents",
|
||||
"children" => "get_children",
|
||||
];
|
||||
|
||||
protected $_triggers = [
|
||||
"parent" => "update_path",
|
||||
"title" => "update_path",
|
||||
];
|
||||
|
||||
private $_children = null;
|
||||
public function get_children() {
|
||||
$c = $this->cache_get("children");
|
||||
if ($c) return $c;
|
||||
|
||||
if ($this->_children == null) {
|
||||
$this->_children = Product::find([["parent", "=", $this->id]])->orderBy("title")->all();
|
||||
}
|
||||
$this->cache_set("children", $this->_children);
|
||||
return $this->_children;
|
||||
}
|
||||
|
||||
public function get_full_title() {
|
||||
$tree = $this->get_tree();
|
||||
|
||||
$n = [];
|
||||
foreach ($tree as $t) {
|
||||
$n[] = $t->title;
|
||||
}
|
||||
|
||||
$out = implode(" / ", $n);
|
||||
return $out;
|
||||
}
|
||||
|
||||
public function update_path($ppath = null) {
|
||||
if ($ppath == null) {
|
||||
$this->full_path = $this->get_full_title();
|
||||
} else {
|
||||
$this->full_path = $ppath . " / " . $this->title;
|
||||
}
|
||||
$this->full_path = str_replace("/ / ", "/ ", $this->full_path);
|
||||
$this->save();
|
||||
foreach ($this->get_children() as $child) {
|
||||
$child->update_path($this->fill_path);
|
||||
}
|
||||
}
|
||||
|
||||
public function get_tree() {
|
||||
$out = [];
|
||||
if ($this->load("parent")) {
|
||||
$p = $this->parent;
|
||||
$out = $p->get_tree();
|
||||
}
|
||||
array_push($out, $this);
|
||||
|
||||
return $out;
|
||||
}
|
||||
|
||||
public function overview_md() {
|
||||
return \Michelf\Markdown::defaultTransform($this->overview);
|
||||
}
|
||||
|
||||
public function on_delete() {
|
||||
DB::getInstance()->query("delete from docproduct where product=:id", ["id" => $this->id]);
|
||||
}
|
||||
|
||||
private $_documents = null;
|
||||
|
||||
public function get_documents() {
|
||||
|
||||
$d = $this->cache_get("documents");
|
||||
if ($d) return $d;
|
||||
|
||||
if ($this->_documents == null) {
|
||||
//$dpl = DocProduct::find([["product", "=", $this->id]])->limit(100)->all();
|
||||
$dpl = DocProduct::find([["product", "=", $this->id]])->all();
|
||||
$this->_documents = new Collection;
|
||||
foreach ($dpl as $dp) {
|
||||
if ($dp->load("document")) {
|
||||
$this->_documents->push($dp->document);
|
||||
}
|
||||
}
|
||||
|
||||
$this->_documents->sort("subsubtitle", true);
|
||||
$this->_documents->sort("subtitle", true);
|
||||
$this->_documents->sort("title", true);
|
||||
}
|
||||
$this->cache_set("documents", $this->_documents);
|
||||
return $this->_documents;
|
||||
}
|
||||
|
||||
public function add_document($doc) {
|
||||
$dp = new DocProduct;
|
||||
$dp->product = $this->id;
|
||||
$dp->document = $doc->id;
|
||||
$dp->save();
|
||||
}
|
||||
|
||||
public function meta() {
|
||||
if ($this->metadata == null) {
|
||||
return [];
|
||||
}
|
||||
return explode(",", $this->metadata);
|
||||
}
|
||||
|
||||
public function add_meta($id, $save = true) {
|
||||
$m = $this->meta();
|
||||
if (!in_array($id, $m)) {
|
||||
$m[] = $id;
|
||||
}
|
||||
$this->metadata = implode(",", $m);
|
||||
if ($save) $this->save();
|
||||
}
|
||||
|
||||
public function del_meta($id, $save = true) {
|
||||
$m = $this->meta();
|
||||
$o = [];
|
||||
foreach ($m as $v) {
|
||||
if ($v != $id) {
|
||||
$o[] = $v;
|
||||
}
|
||||
}
|
||||
$this->metadaya = implode(",", $o);
|
||||
if ($save) $this->save();
|
||||
}
|
||||
|
||||
public function documents_sorted_by_meta() {
|
||||
|
||||
if ($this->metadata == null) {
|
||||
$meta = [];
|
||||
} else {
|
||||
$meta = explode(",", $this->metadata);
|
||||
}
|
||||
|
||||
$docs = $this->get_documents();
|
||||
|
||||
|
||||
while (count($meta) > 0) {
|
||||
$mid = array_pop($meta);
|
||||
$docs->sort_with_function( function($a, $b) use ($mid) {
|
||||
$va = $a->get_metadata_by_id($mid);
|
||||
$vb = $b->get_metadata_by_id($mid);
|
||||
|
||||
if ($va > $vb) return 1;
|
||||
if ($va < $vb) return -1;
|
||||
return 0;
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
return $docs;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user