1: <?php
2:
3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
16:
17: abstract class WireSaveableItemsLookup extends WireSaveableItems {
18:
19: 20: 21: 22:
23: abstract public function getLookupTable();
24:
25: 26: 27: 28: 29: 30: 31:
32: public function getLookupField() {
33: $lookupTable = $this->getLookupTable();
34: if(!$lookupTable) return '';
35: return preg_replace('/_?' . $this->getTable() . '_?/', '', $lookupTable) . '_id';
36: }
37:
38: 39: 40: 41: 42: 43: 44: 45:
46: protected function getLoadQuery($selectors = null) {
47: $query = parent::getLoadQuery($selectors);
48: $table = $this->getTable();
49: $lookupTable = $this->getLookupTable();
50: $query->select("$lookupTable." . $this->getLookupField());
51: $query->leftjoin("$lookupTable ON $lookupTable.{$table}_id=$table.id ")->orderby("sort");
52: return $query;
53: }
54:
55: 56: 57: 58: 59: 60: 61: 62: 63:
64: protected function ___load(WireArray $items, $selectors = null) {
65:
66: $query = $this->getLoadQuery($selectors);
67: $result = $this->fuel('db')->query($query);
68: $lookupField = $this->getLookupField();
69:
70: while($row = $result->fetch_assoc()) {
71:
72: $item = $this->makeBlankItem();
73: $lookupValue = $row[$lookupField];
74: unset($row[$lookupField]);
75: $item->addLookupItem($lookupValue, $row);
76:
77: foreach($row as $field => $value) {
78: $item->$field = $value;
79: }
80:
81: if($items->has($item)) {
82:
83:
84:
85: $item = $items->get($item);
86: $item->addLookupItem($lookupValue, $row);
87: } else {
88:
89: $items->add($item);
90: }
91: }
92:
93: if($result) $result->free();
94: $items->setTrackChanges(true);
95: return $items;
96: }
97:
98: 99: 100: 101: 102: 103:
104: protected function saveItemKey($key) {
105: if($key == $this->getLookupField()) return false;
106: return parent::saveItemKey($key);
107: }
108:
109: 110: 111: 112:
113: public function ___save(Saveable $item) {
114:
115: if(!$item instanceof HasLookupItems) throw new WireException($this->className() . "::save() requires an item that implements HasLookupItems interface");
116:
117: $lookupTable = $this->getLookupTable();
118: $lookupField = $this->getLookupField();
119: $table = $this->getTable();
120:
121: if($item->id) $this->fuel('db')->query("DELETE FROM $lookupTable WHERE {$table}_id={$item->id}");
122:
123: $result = parent::___save($item);
124:
125:
126: $sort = 0;
127: if($item->id) foreach($item->getLookupItems() as $key => $value) {
128: $this->fuel('db')->query("INSERT INTO $lookupTable SET {$table}_id='{$item->id}', $lookupField='{$value->id}', sort='$sort'");
129: $this->resetTrackChanges();
130: $sort++;
131: }
132:
133:
134: return $result;
135: }
136:
137: 138: 139: 140:
141: public function ___delete(Saveable $item) {
142: $this->fuel('db')->query("DELETE FROM " . $this->getLookupTable() . " WHERE " . $this->getTable() . "_id={$item->id}");
143: return parent::___delete($item);
144: }
145: }
146: