1<?php
2
3/* Copyright (c) 1998-2011 ILIAS open source, Extended GPL, see docs/LICENSE */
4
5require_once("./Services/COPage/classes/class.ilPCPlaceHolder.php");
6require_once("./Services/COPage/classes/class.ilPageContentGUI.php");
7
8/**
9* Class ilPCPlaceHolderGUI
10*
11* User Interface for Place Holder Management
12*
13* @author Hendrik Holtmann <holtmann@me.com>
14* @version $Id: class.ilPCListGUI.php 17506 2008-09-24 13:48:46Z akill $
15*
16* @ilCtrl_Calls ilPCPlaceHolderGUI: ilPCMediaObjectGUI
17*
18* @ingroup ServicesCOPage
19*/
20class ilPCPlaceHolderGUI extends ilPageContentGUI
21{
22    public $pg_obj;
23    public $content_obj;
24    public $hier_id;
25    public $pc_id;
26    protected $styleid;
27
28    const TYPE_TEXT = "Text";
29    const TYPE_QUESTION = "Question";
30    const TYPE_MEDIA = "Media";
31    const TYPE_VERIFICATION = "Verification";
32
33    /**
34    * Constructor
35    * @access	public
36    */
37    public function __construct($a_pg_obj, $a_content_obj, $a_hier_id, $a_pc_id = "")
38    {
39        global $DIC;
40
41        $this->lng = $DIC->language();
42        $this->pg_obj = $a_pg_obj;
43        $this->content_obj = $a_content_obj;
44        $this->hier_id = $a_hier_id;
45        $this->pc_id = $a_pc_id;
46
47        parent::__construct($a_pg_obj, $a_content_obj, $a_hier_id, $a_pc_id);
48    }
49
50    /**
51    * execute command
52    */
53    public function executeCommand()
54    {
55        // get next class that processes or forwards current command
56        $next_class = $this->ctrl->getNextClass($this);
57        // get current command
58        $cmd = $this->ctrl->getCmd();
59
60        switch ($next_class) {
61            case 'ilpcmediaobjectgui':  //special handling
62                include_once("./Services/COPage/classes/class.ilPCMediaObjectGUI.php");
63                $media_gui = new ilPCMediaObjectGUI($this->pg_obj, $this->content_obj, $this->hier_id, $this->pc_id);
64                $ret = $this->ctrl->forwardCommand($media_gui);
65                break;
66
67            default:
68                $ret = $this->$cmd();
69                break;
70        }
71
72        return $ret;
73    }
74
75    /**
76    * Handle Insert
77    */
78    protected function insert()
79    {
80        $this->propertyGUI("create", self::TYPE_TEXT, "100px", "insert");
81    }
82
83    /**
84    * create new table in dom and update page in db
85    */
86    protected function create()
87    {
88        if ($_POST["plach_height"] == "" ||
89            !preg_match("/[0-9]+/", $_POST["plach_height"])) {
90            return $this->insert();
91        }
92
93        $this->content_obj = new ilPCPlaceHolder($this->getPage());
94        $this->content_obj->create($this->pg_obj, $this->hier_id, $this->pc_id);
95        $this->content_obj->setHeight($_POST["plach_height"] . "px");
96        $this->content_obj->setContentClass($_POST['plach_type']);
97        $this->updated = $this->pg_obj->update();
98        if ($this->updated === true) {
99            $this->ctrl->returnToParent($this, "jump" . $this->hier_id);
100        } else {
101            $this->insert();
102        }
103    }
104
105    /**
106    * Handle Editing
107    */
108    public function edit()
109    {
110        if ($this->getPageConfig()->getEnablePCType("PlaceHolder")) {
111            $this->edit_object();
112        } else {
113            $this->forward_edit();
114        }
115    }
116
117    /**
118    * Set Style Id.
119    *
120    * @param	int	$a_styleid	Style Id
121    */
122    public function setStyleId($a_styleid)
123    {
124        $this->styleid = $a_styleid;
125    }
126
127    /**
128    * Get Style Id.
129    *
130    * @return	int	Style Id
131    */
132    public function getStyleId()
133    {
134        return $this->styleid;
135    }
136
137    /**
138    * Handle Editing Private Methods
139    */
140    protected function edit_object()
141    {
142        $this->propertyGUI(
143            "saveProperties",
144            $this->content_obj->getContentClass(),
145            $this->content_obj->getHeight(),
146            "save"
147        );
148    }
149
150    protected function forward_edit()
151    {
152        switch ($this->content_obj->getContentClass()) {
153            case self::TYPE_MEDIA:
154                include_once("./Services/COPage/classes/class.ilPCMediaObjectGUI.php");
155                $this->ctrl->setCmdClass("ilpcmediaobjectgui");
156                $this->ctrl->setCmd("insert");
157                $media_gui = new ilPCMediaObjectGUI($this->pg_obj, null);
158                $this->ctrl->forwardCommand($media_gui);
159                break;
160
161            case self::TYPE_TEXT:
162                $this->textCOSelectionGUI();
163                break;
164
165            case self::TYPE_QUESTION:
166                include_once("./Services/COPage/classes/class.ilPCQuestionGUI.php");
167                $this->ctrl->setCmdClass("ilpcquestiongui");
168                $this->ctrl->setCmd("insert");
169                $question_gui = new ilPCQuestionGUI($this->pg_obj, $this->content_obj, $this->hier_id, $this->pc_id);
170                $question_gui->setSelfAssessmentMode(true);
171                $this->ctrl->forwardCommand($question_gui);
172                break;
173
174            case self::TYPE_VERIFICATION:
175                include_once("./Services/COPage/classes/class.ilPCVerificationGUI.php");
176                $this->ctrl->setCmdClass("ilpcverificationgui");
177                $this->ctrl->setCmd("insert");
178                $cert_gui = new ilPCVerificationGUI($this->pg_obj, $this->content_obj, $this->hier_id, $this->pc_id);
179                $this->ctrl->forwardCommand($cert_gui);
180                break;
181
182            default:
183                break;
184        }
185    }
186
187
188    /**
189    * save placeholder properties in db and return to page edit screen
190    */
191    protected function saveProperties()
192    {
193        if ($_POST["plach_height"] == "" ||
194            !preg_match("/[0-9]+/", $_POST["plach_height"])) {
195            return $this->edit_object();
196        }
197
198        $this->content_obj->setContentClass($_POST['plach_type']);
199        $this->content_obj->setHeight($_POST["plach_height"] . "px");
200
201        $this->updated = $this->pg_obj->update();
202        if ($this->updated === true) {
203            $this->ctrl->returnToParent($this, "jump" . $this->hier_id);
204        } else {
205            $this->pg_obj->addHierIDs();
206            $this->edit();
207        }
208    }
209
210    /**
211    * Object Property GUI
212    */
213    protected function propertyGUI($a_action, $a_type, $a_height, $a_mode)
214    {
215        $lng = $this->lng;
216
217        include_once("Services/Form/classes/class.ilPropertyFormGUI.php");
218        $this->form_gui = new ilPropertyFormGUI();
219        $this->form_gui->setFormAction($this->ctrl->getFormAction($this));
220        $this->form_gui->setTitle($lng->txt("cont_ed_plachprop"));
221
222        $ttype_input = new ilRadioGroupInputGUI($lng->txt("type"), "plach_type");
223        $type_captions = $this->getTypeCaptions();
224        foreach ($this->getAvailableTypes($a_type) as $type) {
225            $ttype_input->addOption(new ilRadioOption($type_captions[$type], $type));
226        }
227        $ttype_input->setRequired(true);
228        $this->form_gui->addItem($ttype_input);
229
230        $theight_input = new ilTextInputGUI($lng->txt("height"), "plach_height");
231        $theight_input->setSize(4);
232        $theight_input->setMaxLength(3);
233        $theight_input->setTitle($lng->txt("height") . " (px)");
234        $theight_input->setRequired(true);
235        $this->form_gui->addItem($theight_input);
236
237        $theight_input->setValue(preg_replace("/px/", "", $a_height));
238        $ttype_input->setValue($a_type);
239
240        $this->form_gui->addCommandButton($a_action, $lng->txt($a_mode));
241        $this->form_gui->addCommandButton("cancelCreate", $lng->txt("cancel"));
242        $this->tpl->setContent($this->form_gui->getHTML());
243    }
244
245    /**
246    * Text Item Selection
247    */
248    protected function textCOSelectionGUI()
249    {
250        $lng = $this->lng;
251
252        include_once("Services/Form/classes/class.ilPropertyFormGUI.php");
253        $this->form_gui = new ilPropertyFormGUI();
254        $this->form_gui->setFormAction($this->ctrl->getFormAction($this));
255        $this->form_gui->setTitle($lng->txt("cont_ed_select_pctext"));
256
257        // Select Question Type
258        $ttype_input = new ilRadioGroupInputGUI($lng->txt("cont_ed_textitem"), "pctext_type");
259        $ttype_input->addOption(new ilRadioOption($lng->txt("cont_ed_par"), 0));
260        $ttype_input->addOption(new ilRadioOption($lng->txt("cont_ed_dtable"), 1));
261        $ttype_input->addOption(new ilRadioOption($lng->txt("cont_ed_atable"), 2));
262        $ttype_input->addOption(new ilRadioOption($lng->txt("cont_ed_list"), 3));
263        $ttype_input->addOption(new ilRadioOption($lng->txt("cont_ed_flist"), 4));
264        $ttype_input->addOption(new ilRadioOption($lng->txt("cont_tabs"), 5));
265        $this->form_gui->addItem($ttype_input);
266
267        $this->form_gui->addCommandButton("insertPCText", $lng->txt("insert"));
268        $this->form_gui->addCommandButton("cancelCreate", $lng->txt("cancel"));
269        $this->tpl->setContent($this->form_gui->getHTML());
270    }
271
272    /**
273    * Forwards Text Item Selection to GUI classes
274    */
275    protected function insertPCText()
276    {
277        switch ($_POST['pctext_type']) {
278            case 0:  //Paragraph / Text
279
280                // js editing? -> redirect to js page editor
281                // if ($ilSetting->get("enable_js_edit", 1) && ilPageEditorGUI::_doJSEditing())
282                if (ilPageEditorGUI::_doJSEditing()) {
283                    $ret_class = $this->ctrl->getReturnClass($this);
284                    $this->ctrl->setParameterByClass($ret_class, "pl_hier_id", $this->hier_id);
285                    $this->ctrl->setParameterByClass($ret_class, "pl_pc_id", $this->pc_id);
286                    $this->ctrl->redirectByClass(
287                        $ret_class,
288                        "insertJSAtPlaceholder"
289                    );
290                }
291
292                include_once("./Services/COPage/classes/class.ilPCParagraphGUI.php");
293                $this->ctrl->setCmdClass("ilpcparagraphgui");
294                $this->ctrl->setCmd("insert");
295                $paragraph_gui = new ilPCParagraphGUI($this->pg_obj, $this->content_obj, $this->hier_id, $this->pc_id);
296                $paragraph_gui->setStyleId($this->getStyleId());
297                $paragraph_gui->setPageConfig($this->getPageConfig());
298                $this->ctrl->forwardCommand($paragraph_gui);
299                break;
300
301            case 1:  //DataTable
302                include_once("./Services/COPage/classes/class.ilPCDataTableGUI.php");
303                $this->ctrl->setCmdClass("ilpcdatatablegui");
304                $this->ctrl->setCmd("insert");
305                $dtable_gui = new ilPCDataTableGUI($this->pg_obj, $this->content_obj, $this->hier_id, $this->pc_id);
306                $this->ctrl->forwardCommand($dtable_gui);
307                break;
308
309            case 2:  //Advanced Table
310                include_once("./Services/COPage/classes/class.ilPCTableGUI.php");
311                $this->ctrl->setCmdClass("ilpctablegui");
312                $this->ctrl->setCmd("insert");
313                $atable_gui = new ilPCTableGUI($this->pg_obj, $this->content_obj, $this->hier_id, $this->pc_id);
314                $this->ctrl->forwardCommand($atable_gui);
315                break;
316
317            case 3:  //Advanced List
318                include_once("./Services/COPage/classes/class.ilPCListGUI.php");
319                $this->ctrl->setCmdClass("ilpclistgui");
320                $this->ctrl->setCmd("insert");
321                $list_gui = new ilPCListGUI($this->pg_obj, $this->content_obj, $this->hier_id, $this->pc_id);
322                $this->ctrl->forwardCommand($list_gui);
323                break;
324
325            case 4:  //File List
326                include_once("./Services/COPage/classes/class.ilPCFileListGUI.php");
327                $this->ctrl->setCmdClass("ilpcfilelistgui");
328                $this->ctrl->setCmd("insert");
329                $file_list_gui = new ilPCFileListGUI($this->pg_obj, $this->content_obj, $this->hier_id, $this->pc_id);
330                $file_list_gui->setStyleId($this->getStyleId());
331                $this->ctrl->forwardCommand($file_list_gui);
332                break;
333
334            case 5:  //Tabs
335                include_once("./Services/COPage/classes/class.ilPCTabsGUI.php");
336                $this->ctrl->setCmdClass("ilpctabsgui");
337                $this->ctrl->setCmd("insert");
338                $tabs_gui = new ilPCTabsGUI($this->pg_obj, $this->content_obj, $this->hier_id, $this->pc_id);
339                $tabs_gui->setStyleId($this->getStyleId());
340                $this->ctrl->forwardCommand($tabs_gui);
341                break;
342
343            default:
344                break;
345        }
346    }
347
348    /**
349     * Cancel
350     */
351    public function cancel()
352    {
353        $this->ctrl->returnToParent($this, "jump" . $this->hier_id);
354    }
355
356    protected function getAvailableTypes($a_selected_type = "")
357    {
358        // custom config?
359        if (method_exists($this->getPageConfig(), "getAvailablePlaceholderTypes")) {
360            $types = $this->getPageConfig()->getAvailablePlaceholderTypes();
361        } else {
362            $types = array(self::TYPE_TEXT, self::TYPE_MEDIA, self::TYPE_QUESTION);
363        }
364
365        $validator = new ilCertificateActiveValidator();
366        if (true === $validator->validate()) {
367            // we remove type verification if certificates are deactivated and this
368            // is not the currently selected value
369            if (($key = array_search(self::TYPE_VERIFICATION, $types)) !== false &&
370                self::TYPE_VERIFICATION != $a_selected_type) {
371                unset($types[$key]);
372            }
373        }
374        return $types;
375    }
376
377    protected function getTypeCaptions()
378    {
379        $lng = $this->lng;
380
381        return array(
382                self::TYPE_TEXT => $lng->txt("cont_ed_plachtext"),
383                self::TYPE_MEDIA => $lng->txt("cont_ed_plachmedia"),
384                self::TYPE_QUESTION => $lng->txt("cont_ed_plachquestion"),
385                self::TYPE_VERIFICATION => $lng->txt("cont_ed_plachverification")
386            );
387    }
388}
389