00001 <?php 00002 /*************************************************************************** 00003 * Copyright (C) 2006-2008 by Konstantin V. Arkhipov * 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 BaseEditor implements Controller 00016 { 00017 const COMMAND_SUCCEEDED = 'success'; 00018 const COMMAND_FAILED = 'error'; 00019 00020 // to be redefined in __construct 00021 protected $commandMap = array(); 00022 protected $defaultAction = 'edit'; 00023 00024 protected $map = null; 00025 protected $subject = null; 00026 00027 protected $idFieldName = null; 00028 00029 public function __construct(Prototyped $subject) 00030 { 00031 $this->subject = $subject; 00032 00033 $form = 00034 $this->subject->proto()->makeForm()->add( 00035 Primitive::choice('action')->setList($this->commandMap)-> 00036 setDefault($this->defaultAction) 00037 ); 00038 00039 if ($this->idFieldName) 00040 $form->add( 00041 Primitive::alias($this->idFieldName, $form->get('id')) 00042 ); 00043 00044 $this->map = 00045 MappedForm::create($form)-> 00046 addSource('id', RequestType::get())-> 00047 addSource('action', RequestType::get())-> 00048 setDefaultType(RequestType::post()); 00049 00050 if ($this->idFieldName) 00051 $this->map->addSource($this->idFieldName, RequestType::get()); 00052 } 00053 00057 public function postHandleRequest(ModelAndView $mav, HttpRequest $request) 00058 { 00059 $form = $this->getForm(); 00060 00061 if ($mav->getView() == self::COMMAND_SUCCEEDED) { 00062 00063 $mav->setView(new RedirectToView(get_class($this))); 00064 00065 $mav->getModel()-> 00066 drop('id'); 00067 00068 } else { 00069 $mav->setView(get_class($this)); 00070 00071 if ($command = $form->getValue('action')) 00072 $mav->getModel()->set('action', $command); 00073 else 00074 $form->dropAllErrors(); 00075 00076 $mav->getModel()->set('form', $form); 00077 } 00078 00079 return $mav; 00080 } 00081 00085 public function getForm() 00086 { 00087 return $this->map->getForm(); 00088 } 00089 } 00090 ?>