ILIAS  release_5-0 Revision 5.0.0-1144-gc4397b1f870
All Data Structures Namespaces Files Functions Variables Modules Pages
class.ilPCAMDPageList.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (c) 1998-2010 ILIAS open source, Extended GPL, see docs/LICENSE */
3 
4 require_once("./Services/COPage/classes/class.ilPageContent.php");
5 
17 {
18  var $dom;
19 
23  function init()
24  {
25  $this->setType("amdpl");
26  }
27 
32  static function getLangVars()
33  {
34  return array("ed_insert_amd_page_list", "pc_amdpl");
35  }
36 
40  function setNode(&$a_node)
41  {
42  parent::setNode($a_node); // this is the PageContent node
43  $this->amdpl_node =& $a_node->first_child(); // this is the courses node
44  }
45 
52  function create(&$a_pg_obj, $a_hier_id, $a_pc_id = "")
53  {
54  $this->node = $this->createPageContentNode();
55  $a_pg_obj->insertContent($this, $a_hier_id, IL_INSERT_AFTER, $a_pc_id);
56  $this->amdpl_node = $this->dom->create_element("AMDPageList");
57  $this->amdpl_node = $this->node->append_child($this->amdpl_node);
58  }
59 
63  function setData(array $a_fields_data)
64  {
65  global $ilDB;
66 
67  $data_id = $this->amdpl_node->get_attribute("Id");
68  if($data_id)
69  {
70  $ilDB->manipulate("DELETE FROM pg_amd_page_list".
71  " WHERE id = ".$ilDB->quote($data_id, "integer"));
72  }
73  else
74  {
75  $data_id = $ilDB->nextId("pg_amd_page_list");
76  $this->amdpl_node->set_attribute("Id", $data_id);
77  };
78 
79  foreach($a_fields_data as $field_id => $field_data)
80  {
81  $fields = array(
82  "id" => array("integer", $data_id)
83  ,"field_id" => array("integer", $field_id)
84  ,"data" => array("text", serialize($field_data))
85  );
86  $ilDB->insert("pg_amd_page_list", $fields);
87  }
88  }
89 
96  function getFieldValues($a_data_id = null)
97  {
98  global $ilDB;
99 
100  $res = array();
101 
102  if(!$a_data_id)
103  {
104  if (is_object($this->amdpl_node))
105  {
106  $a_data_id = $this->amdpl_node->get_attribute("Id");
107  }
108  }
109 
110  if($a_data_id)
111  {
112  $set = $ilDB->query("SELECT * FROM pg_amd_page_list".
113  " WHERE id = ".$ilDB->quote($a_data_id, "integer"));
114  while($row = $ilDB->fetchAssoc($set))
115  {
116  $res[$row["field_id"]] = unserialize($row["data"]);
117  }
118  }
119 
120  return $res;
121  }
122 
123  static function handleCopiedContent(DOMDocument $a_domdoc, $a_self_ass = true, $a_clone_mobs = false)
124  {
125  global $ilDB;
126 
127  // #15688
128 
129  $xpath = new DOMXPath($a_domdoc);
130  $nodes = $xpath->query("//AMDPageList");
131  foreach($nodes as $node)
132  {
133  $old_id = $node->getAttribute("Id");
134  break;
135  }
136 
137  if($old_id)
138  {
139  $new_id = $ilDB->nextId("pg_amd_page_list");
140 
141  $set = $ilDB->query("SELECT * FROM pg_amd_page_list".
142  " WHERE id = ".$ilDB->quote($old_id, "integer"));
143  while($row = $ilDB->fetchAssoc($set))
144  {
145  $fields = array(
146  "id" => array("integer", $new_id)
147  ,"field_id" => array("integer", $row["field_id"])
148  ,"data" => array("text", $row["data"])
149  );
150  $ilDB->insert("pg_amd_page_list", $fields);
151  }
152 
153  $node->setAttribute("Id", $new_id);
154  }
155  }
156 
157 
158  //
159  // presentation
160  //
161 
162  protected function findPages($a_list_id)
163  {
164  global $ilDB;
165 
166  $list_values = $this->getFieldValues($a_list_id);
167  $wiki_id = $this->getPage()->getWikiId();
168 
169  $found_result = array();
170 
171  // only search in active fields
172  $found_ids = null;
173  $recs = ilAdvancedMDRecord::_getSelectedRecordsByObject("wiki", $wiki_id, "wpg");
174  foreach($recs as $record)
175  {
176  foreach(ilAdvancedMDFieldDefinition::getInstancesByRecordId($record->getRecordId(), true) as $field)
177  {
178  if(isset($list_values[$field->getFieldId()]))
179  {
180  $field_form = ilADTFactory::getInstance()->getSearchBridgeForDefinitionInstance($field->getADTDefinition(), true, false);
181  $field->setSearchValueSerialized($field_form, $list_values[$field->getFieldId()]);
182  $found_pages = $field->searchSubObjects($field_form, $wiki_id, "wpg");
183  if(is_array($found_ids))
184  {
185  $found_ids = array_intersect($found_ids, $found_pages);
186  }
187  else
188  {
189  $found_ids = $found_pages;
190  }
191  }
192  }
193  }
194 
195  if(sizeof($found_ids))
196  {
197  $sql = "SELECT id,title FROM il_wiki_page".
198  " WHERE ".$ilDB->in("id", $found_ids, "", "integer").
199  " ORDER BY title";
200  $set = $ilDB->query($sql);
201  while($row = $ilDB->fetchAssoc($set))
202  {
203  $found_result[$row["id"]] = $row["title"];
204  }
205  }
206 
207  return $found_result;
208  }
209 
210  function modifyPageContentPostXsl($a_html, $a_mode)
211  {
212  global $lng;
213 
214  if($this->getPage()->getParentType() != "wpg")
215  {
216  return $a_html;
217  }
218 
219  include_once('Services/AdvancedMetaData/classes/class.ilAdvancedMDRecord.php');
220  include_once('Services/AdvancedMetaData/classes/class.ilAdvancedMDFieldDefinition.php');
221  include_once('Modules/Wiki/classes/class.ilWikiUtil.php');
222 
223  $wiki_id = $this->getPage()->getWikiId();
224 
225  $c_pos = 0;
226  $start = strpos($a_html, "[[[[[AMDPageList;");
227  if (is_int($start))
228  {
229  $end = strpos($a_html, "]]]]]", $start);
230  }
231  $i = 1;
232  while ($end > 0)
233  {
234  $list_id = (int)substr($a_html, $start + 17, $end - $start - 17);
235 
236  $ltpl = new ilTemplate("tpl.wiki_amd_page_list.html", true, true, "Modules/Wiki");
237 
238  $pages = $this->findPages($list_id);
239  if(sizeof($pages))
240  {
241  $ltpl->setCurrentBlock("page_bl");
242  foreach($pages as $page_id => $page_title)
243  {
244  // see ilWikiUtil::makeLink()
245  $frag = new stdClass;
246  $frag->mFragment = null;
247  $frag->mTextform = $page_title;
248 
249  $ltpl->setVariable("PAGE", ilWikiUtil::makeLink($frag, $wiki_id, $page_title));
250  $ltpl->parseCurrentBlock();
251  }
252  }
253  else
254  {
255  $ltpl->touchBlock("no_hits_bl");
256  }
257 
258  $a_html = substr($a_html, 0, $start).
259  $ltpl->get().
260  substr($a_html, $end + 5);
261 
262  $start = strpos($a_html, "[[[[[AMDPageList;", $start + 5);
263  $end = 0;
264  if (is_int($start))
265  {
266  $end = strpos($a_html, "]]]]]", $start);
267  }
268  }
269 
270  return $a_html;
271  }
272 
282  public static function migrateField($a_obj_id, $a_field_id, $old_option, $new_option, $a_is_multi = false)
283  {
284  global $ilDB;
285 
286  // this does only work for select and select multi
287 
288  $set = $ilDB->query("SELECT * FROM pg_amd_page_list".
289  " WHERE field_id = ".$ilDB->quote($a_field_id, "integer"));
290  while($row = $ilDB->fetchAssoc($set))
291  {
292  $data = unserialize(unserialize($row["data"]));
293  if(is_array($data) &&
294  in_array($old_option, $data))
295  {
296  $idx = array_search($old_option, $data);
297  if($new_option)
298  {
299  $data[$idx] = $new_option;
300  }
301  else
302  {
303  unset($data[$idx]);
304  }
305 
306  $fields = array(
307  "data" => array("text", serialize(serialize($data)))
308  );
309  $primary = array(
310  "id" => array("integer", $row["id"]),
311  "field_id" => array("integer", $row["field_id"])
312  );
313  $ilDB->update("pg_amd_page_list", $fields, $primary);
314  }
315  }
316  }
317 }
318 
319 ?>
static handleCopiedContent(DOMDocument $a_domdoc, $a_self_ass=true, $a_clone_mobs=false)
init()
Init page content component.
modifyPageContentPostXsl($a_html, $a_mode)
Class ilPCAMDPageList.
static makeLink(&$nt, $a_wiki_id, $text='', $query='', $trail='', $prefix='', $a_offline=false)
Make a wiki link, the following formats are supported:
setType($a_type)
Set Type.
setData(array $a_fields_data)
Set list settings.
static getInstance()
Get singleton.
setNode(&$a_node)
Set node.
Class ilPageContent.
static getInstancesByRecordId($a_record_id, $a_only_searchable=false)
Get definitions by record id.
static migrateField($a_obj_id, $a_field_id, $old_option, $new_option, $a_is_multi=false)
Migrate search/filter values on advmd change.
special template class to simplify handling of ITX/PEAR
static _getSelectedRecordsByObject($a_obj_type, $a_obj_id, $a_sub_type="")
Get selected records by object.
getFieldValues($a_data_id=null)
Get filter field values.
const IL_INSERT_AFTER
create(&$a_pg_obj, $a_hier_id, $a_pc_id="")
Create list node in xml.
static getLangVars()
Get lang vars needed for editing.
createPageContentNode($a_set_this_node=true)
Create page content node (always use this method first when adding a new element) ...
global $lng
Definition: privfeed.php:40
global $ilDB