# FormUtils.class.php

Go to the documentation of this file.

    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     final class FormUtils extends StaticFactory
    00016     {
    00017         /* void */ public static function object2form(
    00018             $object, Form $form, $ignoreNull = true
    00019         )
    00020         {
    00021             Assert::isTrue(is_object($object));
    00022
    00023             $primitives = $form->getPrimitiveList();
    00024
    00025             if ($object instanceof Prototyped) {
    00026                 $proto = $object->proto();
    00027
    00028                 foreach (array_keys($proto->getExpandedPropertyList()) as $name) {
    00029                     if ($form->primitiveExists($name)) {
    00030                         $proto->importPrimitive(
    00031                             $name,
    00032                             $form,
    00033                             $form->get($name),
    00034                             $object,
    00035                             $ignoreNull
    00036                         );
    00037                     }
    00038                 }
    00039             } else {
    00040                 $class = new ReflectionClass($object);
    00041
    00042                 foreach ($class->getProperties() as $property) {
    00043                     $name = $property->getName();
    00044
    00045                     if (isset($primitives[$name])) {
    00046                         $getter = 'get'.ucfirst($name);
    00047                         if ($class->hasMethod($getter)) {
    00048                             $value = $object->$getter();
    00049                             if (!$ignoreNull || ($value !== null)) {
    00050                                 $form->importValue($name, $value);
    00051                             }
    00052                         }
    00053                     }
    00054                 }
    00055             }
    00056         }
    00057
    00058         /* void */ public static function form2object(
    00059             Form $form, $object, $ignoreNull = true
    00060         )
    00061         {
    00062             Assert::isTrue(is_object($object));
    00063
    00064             if ($object instanceof Prototyped) {
    00065                 $proto = $object->proto();
    00066                 $list = $proto->getExpandedPropertyList();
    00067
    00068                 foreach ($form->getPrimitiveList() as $name => $prm) {
    00069                     if (isset($list[$name])) {
    00070                         $proto->exportPrimitive($name, $prm, $object, $ignoreNull);
    00071                     }
    00072                 }
    00073             } else {
    00074                 $class = new ReflectionClass($object);
    00075
    00076                 foreach ($form->getPrimitiveList() as $name => $prm) {
    00077                     $setter = 'set'.ucfirst($name);
    00078
    00079                     if ($prm instanceof ListedPrimitive)
    00080                         $value = $prm->getChoiceValue();
    00081                     else
    00082                         $value = $prm->getValue();
    00083
    00084                     if (
    00085                         $class->hasMethod($setter)
    00086                         && (!$ignoreNull || ($value !== null))
    00087                     ) {
    00088                         if ( // magic!
    00089                             $prm->getName() == 'id'
    00090                             && (
    00091                                 $value instanceof Identifiable
    00092                             )
    00093                         ) {
    00094                             $value = $value->getId();
    00095                         }
    00096
    00097                         if ($value === null) {
    00098                             $dropper = 'drop'.ucfirst($name);
    00099
    00100                             if ($class->hasMethod($dropper)) {
    00101                                 $object->$dropper();
    00102                                 continue;
    00103                             }
    00104                         }
    00105
    00106                         $object->$setter($value);
    00107                     }
    00108                 }
    00109             }
    00110         }
    00111
    00112         public static function checkPrototyped(Prototyped $object)
    00113         {
    00114             $form = $object->proto()->makeForm();
    00115
    00116             self::object2form($object, $form, false);
    00117
    00118             return $form->getErrors();
    00119         }
    00120     }
    00121 ?>