# PrototypedEditor.class.php

Go to the documentation of this file.

    00001 <?php
    00002 /****************************************************************************
    00003  *   Copyright (C) 2007-2008 by Anton E. Lebedevich                         *
    00004  *                                                                          *
    00005  *   This program is free software; you can redistribute it and/or modify   *
    00006  *   it under the terms of the GNU Lesser General Public License as         *
    00007  *   published by the Free Software Foundation; either version 3 of the     *
    00008  *   License, or (at your option) any later version.                        *
    00009  *                                                                          *
    00010  ****************************************************************************/
    00011
    00015     abstract class PrototypedEditor extends MethodMappedController
    00016     {
    00017         const COMMAND_SUCCEEDED = 'success';
    00018         const COMMAND_FAILED    = 'error';
    00019
    00020         protected $subject = null;
    00021         protected $map = null;
    00022
    00023         public function __construct(Prototyped $subject)
    00024         {
    00025             $this->subject = $subject;
    00026             $this->map =
    00027                 MappedForm::create(
    00028                     $this->subject->proto()->makeForm()
    00029                 )->
    00030                 addSource('id', RequestType::get())->
    00031                 setDefaultType(RequestType::post());
    00032
    00033             $this->
    00034                 setMethodMapping('drop', 'doDrop')->
    00035                 setMethodMapping('take', 'doTake')->
    00036                 setMethodMapping('save', 'doSave')->
    00037                 setMethodMapping('edit', 'doEdit')->
    00038                 setMethodMapping('add', 'doAdd');
    00039
    00040             $this->setDefaultAction('edit');
    00041         }
    00042
    00046         public function doDrop(HttpRequest $request)
    00047         {
    00048             $this->map->import($request);
    00049             $form = $this->getForm();
    00050
    00051             if ($object = $form->getValue('id')) {
    00052                 if ($object instanceof Identifiable) {
    00053
    00054                     $this->dropObject($request, $form, $object);
    00055
    00056                     return ModelAndView::create()->setModel(
    00057                         Model::create()->
    00058                         set('editorResult', self::COMMAND_SUCCEEDED)
    00059                     );
    00060
    00061                 } else {
    00062
    00063                     // already deleted
    00064                     $form->markMissing('id');
    00065
    00066                     return ModelAndView::create()->setModel(
    00067                         Model::create()->
    00068                         set('editorResult', self::COMMAND_FAILED)->
    00069                         set('form', $form)
    00070                     );
    00071                 }
    00072             } else {
    00073                 return ModelAndView::create()->setModel(
    00074                     Model::create()->
    00075                     set('editorResult', self::COMMAND_FAILED)->
    00076                     set('form', $form)
    00077                 );
    00078             }
    00079
    00080             Assert::isUnreachable();
    00081         }
    00082
    00083         protected function dropObject(HttpRequest $request, Form $form, Identifiable $object)
    00084         {
    00085             $object->dao()->drop($object);
    00086         }
    00087
    00091         public function doTake(HttpRequest $request)
    00092         {
    00093             $this->map->import($request);
    00094             $form = $this->getForm();
    00095
    00096             if (!$form->getRawValue('id')) {
    00097
    00098                 $isAdd = true;
    00099                 $form->markGood('id');
    00100                 $object = clone $this->subject;
    00101
    00102             } else {
    00103
    00104                 $object = $form->getValue('id');
    00105                 $isAdd = false;
    00106             }
    00107
    00108             if (!$form->getErrors()) {
    00109                 $object = $isAdd
    00110                     ? $this->addObject($request, $form, $object)
    00111                     : $this->saveObject($request, $form, $object);
    00112
    00113                 $editorResult = $form->getErrors()
    00114                     ? self::COMMAND_FAILED
    00115                     : self::COMMAND_SUCCEEDED;
    00116
    00117                 return
    00118                     ModelAndView::create()->
    00119                     setModel(
    00120                         Model::create()->
    00121                         set('id', $object->getId())->
    00122                         set('subject', $object)->
    00123                         set('form', $form)->
    00124                         set('editorResult', $editorResult)
    00125                     );
    00126             } else {
    00127                 $model =
    00128                     Model::create()->
    00129                     set('form', $form)->
    00130                     set('editorResult', self::COMMAND_FAILED);
    00131
    00132                 if ($object)
    00133                     $model->set('subject', $object);
    00134
    00135                 return ModelAndView::create()->setModel($model);
    00136             }
    00137
    00138             Assert::isUnreachable();
    00139         }
    00140
    00144         public function doSave(HttpRequest $request)
    00145         {
    00146             $this->map->import($request);
    00147             $form = $this->getForm();
    00148
    00149             $object = $form->getValue('id');
    00150
    00151             if (!$form->getErrors()) {
    00152
    00153                 $object = $this->saveObject($request, $form, $object);
    00154
    00155                 $editorResult = $form->getErrors()
    00156                     ? self::COMMAND_FAILED
    00157                     : self::COMMAND_SUCCEEDED;
    00158
    00159                 return
    00160                     ModelAndView::create()->
    00161                     setModel(
    00162                         Model::create()->
    00163                         set('id', $object->getId())->
    00164                         set('subject', $object)->
    00165                         set('form', $form)->
    00166                         set('editorResult', $editorResult)
    00167                     );
    00168             } else {
    00169                 $model =
    00170                     Model::create()->
    00171                     set('form', $form)->
    00172                     set('editorResult', self::COMMAND_FAILED);
    00173
    00174                 if ($object)
    00175                     $model->set('subject', $object);
    00176
    00177                 return ModelAndView::create()->setModel($model);
    00178             }
    00179
    00180             Assert::isUnreachable();
    00181         }
    00182
    00183         protected function saveObject(HttpRequest $request, Form $form, Identifiable $object)
    00184         {
    00185             FormUtils::form2object($form, $object, false);
    00186             return $object->dao()->save($object);
    00187         }
    00188
    00192         public function doEdit(HttpRequest $request)
    00193         {
    00194             $this->map->import($request);
    00195             $form = $this->getForm();
    00196
    00197             if ($form->getValue('id'))
    00198                 $object = $form->getValue('id');
    00199             else
    00200                 $object = clone $this->subject;
    00201
    00202             FormUtils::object2form($object, $form);
    00203
    00204             $form->dropAllErrors();
    00205
    00206             return ModelAndView::create()->setModel(
    00207                 Model::create()->
    00208                 set('subject', $object)->
    00209                 set('form', $form)
    00210             );
    00211         }
    00212
    00216         public function doAdd(HttpRequest $request)
    00217         {
    00218             $this->map->import($request);
    00219             $form = $this->getForm();
    00220
    00221             $form->markGood('id');
    00222             $object = clone $this->subject;
    00223
    00224             if (!$form->getErrors()) {
    00225
    00226                 $object = $this->addObject($request, $form, $object);
    00227
    00228                 $editorResult = $form->getErrors()
    00229                     ? self::COMMAND_FAILED
    00230                     : self::COMMAND_SUCCEEDED;
    00231
    00232                 return
    00233                     ModelAndView::create()->
    00234                     setModel(
    00235                         Model::create()->
    00236                         set('id', $object->getId())->
    00237                         set('subject', $object)->
    00238                         set('form', $form)->
    00239                         set('editorResult', $editorResult)
    00240                     );
    00241             } else {
    00242                 return
    00243                     ModelAndView::create()->
    00244                     setModel(
    00245                         Model::create()->
    00246                         set('form', $form)->
    00247                         set('subject', $object)->
    00248                         set('editorResult', self::COMMAND_FAILED)
    00249                     );
    00250             }
    00251
    00252             Assert::isUnreachable();
    00253         }
    00254
    00258         public function getForm()
    00259         {
    00260             return $this->map->getForm();
    00261         }
    00262
    00263         protected function addObject(HttpRequest $request, Form $form, Identifiable $object)
    00264         {
    00265             FormUtils::form2object($form, $object);
    00266             return $object->dao()->add($object);
    00267         }
    00268     }
    00269 ?>