/
edit.php
138 lines (116 loc) · 4.4 KB
/
edit.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
<?php
/**
* @package net.nemein.wiki
* @author The Midgard Project, http://www.midgard-project.org
* @copyright The Midgard Project, http://www.midgard-project.org
* @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License
*/
use midcom\datamanager\schemadb;
use midcom\datamanager\datamanager;
use midcom\datamanager\controller;
/**
* Wikipage edit handler
*
* @package net.nemein.wiki
*/
class net_nemein_wiki_handler_edit extends midcom_baseclasses_components_handler
{
/**
* The wikipage we're editing
*
* @var net_nemein_wiki_wikipage
*/
private $page;
/**
* The Controller of the article used for editing
*
* @var controller
*/
private $controller;
/**
* @var schemadb
*/
private $schemadb;
/**
* Internal helper, loads the controller for the current article. Any error triggers a 500.
*/
private function load_controller()
{
$operations = [
'save' => '',
'preview' => $this->_l10n->get('preview'),
'cancel' => ''
];
$this->schemadb = schemadb::from_path($this->_config->get('schemadb'));
foreach ($this->schemadb->all() as $schema) {
$schema->set('operations', $operations);
if ($schema->has_field('title')) {
$field =& $schema->get_field('title');
$field['hidden'] = true;
}
}
$dm = new datamanager($this->schemadb);
$this->controller = $dm
->set_storage($this->page)
->get_controller();
}
/**
* Check the edit request
*
* @param mixed $handler_id The ID of the handler.
* @param array $args The argument list.
* @param array &$data The local request data.
*/
public function _handler_edit($handler_id, array $args, array &$data)
{
$this->page = $this->_master->load_page($args[0]);
$this->page->require_do('midgard:update');
$this->load_controller();
midcom::get()->head->set_pagetitle(sprintf($this->_l10n->get('edit %s'), $this->page->title));
$workflow = $this->get_workflow('datamanager', [
'controller' => $this->controller,
'save_callback' => [$this, 'save_callback']
]);
foreach ($this->schemadb->all() as $name => $schema) {
if ($name == $this->controller->get_datamanager()->get_schema()->get_name()) {
// The page is already of this type, skip
continue;
}
$label = sprintf($this->_l10n->get('change to %s'), $this->_l10n->get($schema->get('description')));
$workflow->add_post_button("change/{$this->page->name}/", $label, ['change_to' => $name]);
}
$response = $workflow->run();
if ($workflow->get_state() == 'preview') {
$this->add_preview();
} elseif ($workflow->get_state() == 'save') {
$indexer = midcom::get()->indexer;
net_nemein_wiki_viewer::index($this->controller->get_datamanager(), $indexer, $this->_topic);
midcom::get()->uimessages->add($this->_l10n->get($this->_component), sprintf($this->_l10n->get('page %s saved'), $this->page->title));
}
return $response;
}
private function add_preview()
{
$parser = new net_nemein_wiki_parser($this->page);
$preview = $parser->get_html();
midcom::get()->head->add_jscript('var wikipage_preview = ' . json_encode(['content' => '<div class="wiki_preview">' . $preview . '</div>']));
midcom::get()->head->add_jquery_state_script('$("form.datamanager2 .form").prepend(wikipage_preview.content)');
}
/**
* @param mixed $handler_id The ID of the handler.
* @param array $args The argument list.
* @param array &$data The local request data.
*/
public function _handler_change($handler_id, array $args, array &$data)
{
if (empty($_POST['change_to'])) {
throw new midcom_error_forbidden('Only POST requests are allowed here.');
}
$this->page = $this->_master->load_page($args[0]);
$this->page->require_do('midgard:update');
// Change schema to redirect
$this->page->set_parameter('midcom.helper.datamanager2', 'schema_name', $_POST['change_to']);
// Redirect to editing
return new midcom_response_relocate("edit/{$this->page->name}/");
}
}