ILIAS  release_5-4 Revision v5.4.26-12-gabc799a52e6
class.ilWikiUserHTMLExport.php
Go to the documentation of this file.
1 <?php
2 
3 /* Copyright (c) 1998-2014 ILIAS open source, Extended GPL, see docs/LICENSE */
4 
13 {
14  const PROCESS_OTHER_USER = 0; // another user has started a running export
15  const PROCESS_STARTED = 1; // export has been started by current user
16  const PROCESS_UPTODATE = 2; // no export necessary, current export is up-to-date
17 
18 
19  const NOT_RUNNING = 0;
20  const RUNNING = 1;
21 
22  protected $data;
23 
27  protected $db;
28 
32  protected $wiki;
33 
37  protected $user;
38 
42  protected $log;
43 
50  public function __construct(ilObjWiki $a_wiki, ilDBInterface $a_db, ilObjUser $a_user)
51  {
52  $this->db = $a_db;
53  $this->wiki = $a_wiki;
54  $this->user = $a_user;
55  $this->read();
56  $this->log = ilLoggerFactory::getLogger('wiki');
57  }
58 
65  protected function read()
66  {
67  $set = $this->db->query(
68  "SELECT * FROM wiki_user_html_export " .
69  " WHERE wiki_id = " . $this->db->quote($this->wiki->getId(), "integer")
70  );
71  if (!$this->data = $this->db->fetchAssoc($set)) {
72  $this->data = array();
73  }
74  }
75 
82  protected function getProcess()
83  {
84  $this->log->debug("getProcess");
85  $last_change = ilPageObject::getLastChangeByParent("wpg", $this->wiki->getId());
86 
87  $ilAtomQuery = $this->db->buildAtomQuery();
88  $ilAtomQuery->addTableLock('wiki_user_html_export');
89 
90  $ilAtomQuery->addQueryCallable(function (ilDBInterface $ilDB) use ($last_change, &$ret) {
91  $this->log->debug("atom query start");
92 
93  $this->read();
94  $ts = ilUtil::now();
95 
96  if ($this->data["start_ts"] != "" &&
97  $this->data["start_ts"] > $last_change) {
98  $ret = self::PROCESS_UPTODATE;
99  $this->log->debug("return: " . self::PROCESS_UPTODATE);
100  return;
101  }
102 
103  if (!isset($this->data["wiki_id"])) {
104  $this->log->debug("insert, wiki id: " . $this->wiki->getId() . ", user id: " . $this->user->getId() . ", ts: " . $ts);
105  $ilDB->manipulate("INSERT INTO wiki_user_html_export " .
106  "(wiki_id, usr_id, progress, start_ts, status) VALUES (" .
107  $ilDB->quote($this->wiki->getId(), "integer") . "," .
108  $ilDB->quote($this->user->getId(), "integer") . "," .
109  $ilDB->quote(0, "integer") . "," .
110  $ilDB->quote($ts, "timestamp") . "," .
111  $ilDB->quote(self::RUNNING, "integer") .
112  ")");
113  } else {
114  $this->log->debug("update, wiki id: " . $this->wiki->getId() . ", user id: " . $this->user->getId() . ", ts: " . $ts);
115  $ilDB->manipulate(
116  "UPDATE wiki_user_html_export SET " .
117  " start_ts = " . $ilDB->quote($ts, "timestamp") . "," .
118  " usr_id = " . $ilDB->quote($this->user->getId(), "integer") . "," .
119  " progress = " . $ilDB->quote(0, "integer") . "," .
120  " status = " . $ilDB->quote(self::RUNNING, "integer") .
121  " WHERE status = " . $ilDB->quote(self::NOT_RUNNING, "integer") .
122  " AND wiki_id = " . $ilDB->quote($this->wiki->getId(), "integer")
123  );
124  $this->read();
125  }
126 
127  if ($this->data["start_ts"] == $ts && $this->data["usr_id"] == $this->user->getId()) {
128  // we started the process
129  $ret = self::PROCESS_STARTED;
130  $this->log->debug("return: " . self::PROCESS_STARTED);
131  return;
132  }
133 
134  // process was already running
135  $ret = self::PROCESS_OTHER_USER;
136  $this->log->debug("return: " . self::PROCESS_OTHER_USER);
137  });
138 
139  $ilAtomQuery->run();
140 
141  $this->log->debug("outer return: " . $ret);
142 
143  return $ret;
144  }
145 
152  public function updateStatus($a_progress, $a_status)
153  {
154  $this->db->manipulate(
155  "UPDATE wiki_user_html_export SET " .
156  " progress = " . $this->db->quote((int) $a_progress, "integer") . "," .
157  " status = " . $this->db->quote((int) $a_status, "integer") .
158  " WHERE wiki_id = " . $this->db->quote($this->wiki->getId(), "integer") .
159  " AND usr_id = " . $this->db->quote($this->user->getId(), "integer")
160  );
161 
162  $this->read();
163  }
164 
171  public function getProgress()
172  {
173  $set = $this->db->query(
174  "SELECT progress, status FROM wiki_user_html_export " .
175  " WHERE wiki_id = " . $this->db->quote($this->wiki->getId(), "integer")
176  );
177  $rec = $this->db->fetchAssoc($set);
178 
179  return array("progress" => (int) $rec["progress"], "status" => (int) $rec["status"]);
180  }
181 
182 
189  public function initUserHTMLExport()
190  {
191  // get process, if not already running or export is up-to-date, return corresponding status
192  echo $this->getProcess();
193  exit;
194  }
195 
199  public function startUserHTMLExport()
200  {
201  ignore_user_abort(true);
202  // do the export
203  include_once("./Modules/Wiki/classes/class.ilWikiHTMLExport.php");
204  $exp = new ilWikiHTMLExport($this->wiki);
205  $exp->setMode(ilWikiHTMLExport::MODE_USER);
206  $exp->buildExportFile();
207  // reset user export status
208  $this->updateStatus(100, self::NOT_RUNNING);
209  exit;
210  }
211 
215  public function deliverFile()
216  {
217  $this->log->debug("deliver");
218  include_once("./Modules/Wiki/classes/class.ilWikiHTMLExport.php");
219  $exp = new ilWikiHTMLExport($this->wiki);
220  $exp->setMode(ilWikiHTMLExport::MODE_USER);
221  $file = $exp->getUserExportFile();
222  $this->log->debug("file: " . $file);
223  ilUtil::deliverFile($file, pathinfo($file, PATHINFO_BASENAME));
224  }
225 }
updateStatus($a_progress, $a_status)
Update status.
__construct(ilObjWiki $a_wiki, ilDBInterface $a_db, ilObjUser $a_user)
Construct.
initUserHTMLExport()
Init user html export.
static getLastChangeByParent($a_parent_type, $a_parent_id, $a_lang="")
Get all pages for parent object.
static now()
Return current timestamp in Y-m-d H:i:s format.
user()
Definition: user.php:4
Class manages user html export.
quote($value, $type)
Class ilObjWiki.
startUserHTMLExport()
Start user html export.
exit
Definition: backend.php:16
$this data['403_header']
global $ilDB
$ret
Definition: parser.php:6
Wiki HTML exporter class.
static getLogger($a_component_id)
Get component logger.
manipulate($query)
Run a (write) Query on the database.
static deliverFile( $a_file, $a_filename, $a_mime='', $isInline=false, $removeAfterDelivery=false, $a_exit_after=true)
deliver file for download via browser.