ILIAS  release_6 Revision v6.24-5-g0c8bfefb3b8
class.ilBiblFieldFactory.php
Go to the documentation of this file.
1<?php
2
9{
10
14 protected $type;
15
16
23 {
24 $this->type = $type;
25 }
26
27
31 public function getType() : ilBiblTypeInterface
32 {
33 return $this->type;
34 }
35
36
40 public function findById(int $id) : ilBiblFieldInterface
41 {
45 $inst = ilBiblField::findOrFail($id);
46 if ($this->type->isStandardField($inst->getIdentifier()) != $inst->getisStandardField()) {
47 $inst->setIsStandardField($this->type->isStandardField($inst->getIdentifier()));
48 $inst->update();
49 }
50
51 return $inst;
52 }
53
54
58 public function getFieldByTypeAndIdentifier(int $type, string $identifier) : ilBiblFieldInterface
59 {
60 $this->checkType($type);
61 $inst = $this->getARInstance($type, $identifier);
62 if (!$inst) {
63 throw new ilException("bibliografic identifier {$identifier} not found");
64 }
65
66 return $inst;
67 }
68
69
73 public function findOrCreateFieldByTypeAndIdentifier(int $type, string $identifier) : ilBiblFieldInterface
74 {
75 $this->checkType($type);
76 $inst = $this->getARInstance($type, $identifier);
77 if (!$inst) {
78 $inst = new ilBiblField();
79 $inst->setIdentifier($identifier);
80 $inst->setDataType($type);
81 $inst->setIsStandardField((bool) $this->getType()->isStandardField($identifier));
82 $inst->create();
83 }
84 $inst->setDataType($type);
85 $inst->setIdentifier($identifier);
86 $inst->setIsStandardField((bool) $this->getType()->isStandardField($identifier));
87 $inst->update();
88
89 return $inst;
90 }
91
92
96 public function getAvailableFieldsForObjId(int $obj_id) : array
97 {
98 global $DIC;
99 $sql
100 = "SELECT DISTINCT(il_bibl_attribute.name), il_bibl_data.file_type FROM il_bibl_data
101 JOIN il_bibl_entry ON il_bibl_entry.data_id = il_bibl_data.id
102 JOIN il_bibl_attribute ON il_bibl_attribute.entry_id = il_bibl_entry.id
103 WHERE il_bibl_data.id = %s;";
104
105 $result = $DIC->database()->queryF($sql, ['integer'], [$obj_id]);
106
107 $data = [];
108 while ($d = $DIC->database()->fetchObject($result)) {
109 $data[] = $this->findOrCreateFieldByTypeAndIdentifier($d->file_type, $d->name);
110 }
111
112 return $data;
113 }
114
115
120 {
121 return $this->getCollectionForFilter($type, $queryInfo)->get();
122 }
123
124
129 {
130 return $this->getCollectionForFilter($type, $queryInfo)->getArray();
131 }
132
133
138 {
139 $field = ilBiblField::where(['identifier' => $attribute->getName()])->first();
140 if ($field === null) {
141 $field = new ilBiblField();
142 $field->setIdentifier($attribute->getName());
143 $field->setDataType($this->type->getId());
144 $field->setIsStandardField($this->type->isStandardField($attribute->getName()));
145 $field->create();
146 } else {
147 $field->setDataType($this->type->getId());
148 $field->update();
149 }
150
151 return $field;
152 }
153
154
158 public function forcePosition(ilBiblFieldInterface $field) : int
159 {
160 global $DIC;
161 $tablename = ilBiblField::TABLE_NAME;
162 $q = "UPDATE {$tablename} SET position = position + 1 WHERE data_type = %s AND position >= %s;";
163 $DIC->database()->manipulateF(
164 $q,
165 ['integer', 'integer'],
166 [
167 $field->getDataType(),
168 $field->getPosition(),
169 ]
170 );
171 $field->store();
172 $DIC->database()->query("SET @i=0");
173 $DIC->database()->manipulateF(
174 "UPDATE {$tablename} SET position = (@i := @i + 1) WHERE data_type = %s ORDER BY position",
175 ['integer'],
176 [
177 $field->getDataType(),
178 ]
179 );
180
181 return (int) $field->getPosition();
182 }
183
184 // Internal Methods
185
186
192 private function getNextFreePosition(ilBiblFieldInterface $field) : int
193 {
194 global $DIC;
195 $tablename = ilBiblField::TABLE_NAME;
196 $q = "SELECT MAX(position) + 1 as next_position FROM {$tablename} WHERE data_type = %s;";
197 $res = $DIC->database()->queryF($q, ['integer'], [$field->getDataType()]);
198 $data = $DIC->database()->fetchObject($res);
199
200 return (int) $data->next_position;
201 }
202
203
210 private function getARInstance($type, $identifier)
211 {
212 return ilBiblField::where(["identifier" => $identifier, "data_type" => $type])->first();
213 }
214
215
221 private function checkType($type)
222 {
223 switch ($type) {
226 break;
227 default:
228 throw new ilException("bibliografic type not found");
229 }
230 }
231
232
240 {
241 $collection = ilBiblField::getCollection();
242
243 $collection->where(array('data_type' => $type->getId()));
244
245 if ($queryInfo) {
246 $sorting_column = $queryInfo->getSortingColumn() ? $queryInfo->getSortingColumn() : null;
247 $offset = $queryInfo->getOffset() ? $queryInfo->getOffset() : 0;
248 $sorting_direction = $queryInfo->getSortingDirection();
249 $limit = $queryInfo->getLimit();
250 if ($sorting_column) {
251 $collection->orderBy($sorting_column, $sorting_direction);
252 }
253 $collection->limit($offset, $limit);
254
255 foreach ($queryInfo->getFilters() as $queryFilter) {
256 switch ($queryFilter->getFieldName()) {
257 default:
258 $collection->where(array($queryFilter->getFieldName() => $queryFilter->getFieldValue()), $queryFilter->getOperator());
259 break;
260 }
261 }
262 }
263
264 return $collection;
265 }
266}
$result
static where($where, $operator=null)
static findOrFail($primary_key, array $add_constructor_args=array())
Tries to find the object and throws an Exception if object is not found, instead of returning null.
An exception for terminatinating execution or to throw for unit testing.
Class ilBiblFieldFactory.
getNextFreePosition(ilBiblFieldInterface $field)
filterAllFieldsForType(ilBiblTypeInterface $type, ilBiblTableQueryInfoInterface $queryInfo=null)
@inheritDoc
getType()
\ilBiblTypeInterface
getCollectionForFilter(ilBiblTypeInterface $type, ilBiblTableQueryInfoInterface $queryInfo=null)
getAvailableFieldsForObjId(int $obj_id)
@inheritDoc
getARInstance($type, $identifier)
getFieldByTypeAndIdentifier(int $type, string $identifier)
\ilBiblFieldInterface ilException if a wrong $type is passed or field is not found
findOrCreateFieldOfAttribute(ilBiblAttributeInterface $attribute)
@inheritDoc
findOrCreateFieldByTypeAndIdentifier(int $type, string $identifier)
\ilBiblFieldInterface ilException if a wrong $type is passed
filterAllFieldsForTypeAsArray(ilBiblTypeInterface $type, ilBiblTableQueryInfoInterface $queryInfo=null)
@inheritDoc
forcePosition(ilBiblFieldInterface $field)
@inheritDoc
__construct(\ilBiblTypeInterface $type)
ilBiblFieldFactory constructor.
Class ilField.
Base class for ILIAS Exception handling.
for( $i=6;$i< 13;$i++) for($i=1; $i< 13; $i++) $d
Definition: date.php:296
Interface ilBiblAttributeInterface.
Interface ilBiblFieldFactoryInterface.
Interface ilBiblEntryInterface.
store()
Stores the Object, creates a newone in Db if non existing or updates an existing.
Interface ilBiblTableQueryInfoInterface.
Interface ilBiblTypeInterface.
foreach($_POST as $key=> $value) $res
$data
Definition: storeScorm.php:23
$DIC
Definition: xapitoken.php:46