Example #1
0
 public static function saveOrUpdateObjectFromFormData()
 {
     $model_class_name = POSTAccess::getRequiredPostValue(self::FIELD_CLASS_NAME);
     $object_id = POSTAccess::getOptionalPostValue(self::FIELD_OBJECT_ID);
     \OLOG\CheckClassInterfaces::exceptionIfClassNotImplementsInterface($model_class_name, \OLOG\Model\InterfaceSave::class);
     $new_prop_values_arr = [];
     $null_fields_arr = [];
     $reflect = new \ReflectionClass($model_class_name);
     foreach ($reflect->getProperties() as $prop_obj) {
         if (!$prop_obj->isStatic()) {
             // игнорируем статические свойства класса - они относятся не к объекту, а только к классу (http://www.php.net/manual/en/language.oop5.static.php), и в них хранятся настройки ActiveRecord и CRUD
             $prop_name = $prop_obj->getName();
             // сейчас если поля нет в форме - оно не будет изменено в объекте. это позволяет показывать в форме только часть полей, на остальные форма не повлияет
             if (array_key_exists($prop_name, $_POST)) {
                 // Проверка на заполнение обязательных полей делается на уровне СУБД, через нот нулл в таблице
                 $new_prop_values_arr[$prop_name] = $_POST[$prop_name];
             }
             // чтение возможных NULL
             if (array_key_exists($prop_name . "___is_null", $_POST)) {
                 if ($_POST[$prop_name . "___is_null"]) {
                     $null_fields_arr[$prop_name] = 1;
                 }
             }
         }
     }
     $obj = null;
     if ($object_id) {
         $obj = CRUDObjectLoader::createAndLoadObject($model_class_name, $object_id);
     } else {
         $obj = new $model_class_name();
     }
     $obj = CRUDFieldsAccess::setObjectFieldsFromArray($obj, $new_prop_values_arr, $null_fields_arr);
     $obj->save();
     return $obj->getId();
 }