Кастомизация getCreateForm и getEditForm для гибкой верстки полей

Материал из Umicms
Перейти к:навигация, поиск

По умолчанию, методы getCreateForm и getEditForm настроены таким образом, что для каждого типа полей используется один и тот же блок в TPL-шаблоне, из-за этого бывает сложно оформить верстку нужным образом, когда необходимо каждое поле оформить особым образом. Также не всегда необходимо выводить все поля из группы. Оригинальные методы getCreateForm и getEditForm можно вынести в кастом и настроить таким образом, таким образом что в макрос будут передаваться идентифкаторы полей, вместо групп, а сам код, в TPL-шаблоне будет сначала искать блок у которого префикс с нужным идентфикатором поля, допустим: reflection_field_string_h1

Добавим в папку classes/modules/data/ файл permissions.custom.php следующего содержания:

<?php
    $permissions = Array('main' => Array('getCreateFormCustom' , 'getEditFormCustom'));
?>

а в файл classes/modules/data/__custom.php добавим новые методы:

    public function getCreateFormCustom($object_type_id, $template = "default", $fields_names = "", $parent_id) {
      if(!permissionsCollection::getInstance()->isAuth() || !$parent_id) return false;
      
			if(!$template) $template = "default";
			
			list($template_block) = def_module::loadTemplates("tpls/data/reflection/{$template}.tpl", "reflection_fields");
			
			$fields_names = trim($fields_names);

			$fields_arr = strlen($fields_names) ? explode(" ", $fields_names) : array();

			
			if(!is_array($fields_arr)) {
				return "";
			}

			$line_arr = Array();
        
				$fields = Array();
				$type = umiObjectTypesCollection::getInstance()->getType($object_type_id);
				      					
				foreach($fields_arr as $field_name) {				
				  $field_id = $type->getFieldId($field_name);	
					$field = umiFieldsCollection::getInstance()->getField($field_id);
				
					if(!$field->getIsVisible() && !$all) continue;
					if($field->getIsSystem()) continue;
					
					$fields[] = $this->renderEditFieldCustom($template, $field);
				}
				
				if(empty($fields)) continue;

			$line_arr['nodes:field'] = $line_arr['void:fields'] = $fields;
			$line_arr['parent_id'] = $parent_id;
			$line_arr['object_type_id'] = $object_type_id;
			$line_arr['template'] = $template;
			$line_arr['fields_arr'] = $fields_names;
			return def_module::parseTemplate($template_block, $line_arr);
		}
		  
   	public function getEditFormCustom($template = "editpage", $fields_names = "", $all = false, $ignorePermissions = false) {
			 if(!$page_id = htmlspecialchars(getRequest('id'))) return false; 
       $hierarchy = umiHierarchy::getInstance();
       $element = $hierarchy->getElement($page_id);
 
       if($element instanceof umiHierarchyElement) {
            $object_id = $element->getObjectId();
            $permissions = permissionsCollection::getInstance();
            if(!$permissions->isOwnerOfObject($object_id)) return false;
      }else return false;
            
      if(!$template) $template = "default";

			$b_allow = false;
			$inst_users = cmsController::getInstance()->getModule("users");

			if($permissions->isSv()) {
				$ignorePermissions = true;
			}
			
			if($permissions->isSv()) {
				$ignorePermissions = true;
			}
			
			if(!$ignorePermissions) {
				$b_allow = $permissions->isOwnerOfObject($object_id);

				$arr_helements = $hierarchy->getObjectInstances($object_id);
				foreach ($arr_helements as $i_element_id) {
					$arr_allow = $inst_users->isAllowedObject($inst_users->user_id, $i_element_id);
					if (is_array($arr_allow) && count($arr_allow) > 1) {
						$b_allow = intval($arr_allow[1]);
						if ($b_allow) break;
					}
				}

				if (!$b_allow) {
					return templater::getInstance()->putLangs("%data_edit_foregin_object%");
				}
			}
	  
			list($template_block) = def_module::loadTemplates("tpls/data/reflection/{$template}.tpl", "reflection_fields");
			
      if(!($object = umiObjectsCollection::getInstance()->getObject($object_id))) {
				return $template_block_empty;
			}
			$fields_names = trim($fields_names);

			$fields_arr = strlen($fields_names) ? explode(" ", $fields_names) : array();

			
			if(!is_array($fields_arr)) {
				return "";
			}
       
			$line_arr = Array();
        $object_type_id = $object->getTypeId();
				$fields = Array();
				$type = umiObjectTypesCollection::getInstance()->getType($object_type_id);
				      					
				foreach($fields_arr as $field_name) {				
				  $field_id = $type->getFieldId($field_name);	
					$field = umiFieldsCollection::getInstance()->getField($field_id);
				
					if(!$field->getIsVisible() && !$all) continue;
					if($field->getIsSystem()) continue;
					
					$fields[] = $this->renderEditFieldCustom($template, $field, $object);
				}
				
			$line_arr['nodes:field'] = $line_arr['void:fields'] = $fields;
			$line_arr['object_id'] = $object_id;
			$line_arr['page_link'] = $hierarchy->getPathById($page_id);
			$line_arr['template'] = $template;

			return def_module::parseTemplate($template_block, $line_arr, false, $object_id);
		}
		
        
    public function renderEditFieldCustom($template, umiField $field, $object = false) {
			$field_type_id = $field->getFieldTypeId();
			$field_type = umiFieldTypesCollection::getInstance()->getFieldType($field_type_id);
			$is_multiple = $field_type->getIsMultiple();

			$data_type = $field_type->getDataType();

			$xsl = xslTemplater::getInstance()->getIsInited();

			switch($data_type) {
				case "counter":
				case "int": {
					$res = $this->renderEditFieldIntCustom($field, $is_multiple, $object, $template);
					break;
				}


				case "price":
				case "float": {
					$res = $this->renderEditFieldIntCustom($field, $is_multiple, $object, $template);
					break;
				}


				case "string": {
					$res = $this->renderEditFieldStringCustom($field, $is_multiple, $object, $template);
					break;
				}

				case "date": {
					$res = $this->renderEditFieldDateCustom($field, $is_multiple, $object, $template);
					break;
				}

				case "password": {
					$res = $this->renderEditFieldPasswordCustom($field, $is_multiple, $object, $template);
					break;
				}

				case "relation": {
					$res = $this->renderEditFieldRelationCustom($field, $is_multiple, $object, $template);
					break;
				}


				case "symlink": {
					$res = $this->renderEditFieldSymlinkCustom($field, $is_multiple, $object, $template);
					break;
				}

				case "img_file": {
					$res = $this->renderEditFieldImageFileCustom($field, $is_multiple, $object, $template);
					break;
				}

				case "video_file" :
				case "swf_file": {
					$res = $this->renderEditFieldFileCustom($field, $is_multiple, $object, $template);
					break;
				}

				case "file": {
					$res = $this->renderEditFieldFileCustom($field, $is_multiple, $object, $template);
					break;
				}

				case "text": {
					$res = $this->renderEditFieldTextCustom($field, $is_multiple, $object, $template);
					break;
				}

				case "wysiwyg": {
					$res = $this->renderEditFieldWYSIWYGCustom($field, $is_multiple, $object, $template);
					break;
				}

				case "boolean": {
					$res = $this->renderEditFieldBooleanCustom($field, $is_multiple, $object, $template);
					break;
				}
				
				
				case "tags": {
					$res = $this->renderEditFieldTagsCustom($field, $is_multiple, $object, $template);
					break;
				}
				
				case "optioned": {
					$res = $this->renderEditFieldOptionedCustom($field, $is_multiple, $object, $template);
					break;
				}


				default: {
					$res = $xsl ? NULL : "";
					break;
				}
			}
			
			if($res === false) {
				return NULL;
			}
			
			if($xsl) {
				if($data_type == 'counter') $data_type = 'int';

				$res['attribute:type'] = $data_type;
				$res['attribute:id'] = $field->getId();
				
				if($field->getIsRequired()) {
					$res['attribute:required'] = 'required';
				}
				if($tip = $field->getTip()) {
					$res['attribute:tip'] = $tip;
				}
			} else {
				$required = $field->getIsRequired();
				$res = def_module::parseTemplate($res, array(
					'required' => ($required ? 'required' : ''),
					'required_asteriks' => ($required ? '*' : '')
				));
			}
			
			return $res;
		}


		public function renderEditFieldStringCustom($field, $is_multiple, $object, $template) {
		  $field_name = $field->getName();
		  list($template_block) = def_module::loadTemplates("tpls/data/reflection/{$template}.tpl", "reflection_field_string_" . $field_name);
		  if(!$template_block){
			list($template_block) = def_module::loadTemplates("tpls/data/reflection/{$template}.tpl", "reflection_field_string");
      }
      
			$block_arr = Array();

			if($is_multiple) {
			
			} else {				
				$block_arr['attribute:name'] = $field_name;
				$block_arr['attribute:title'] = $field->getTitle();
				$block_arr['attribute:tip'] = $field->getTip();

				$block_arr['node:value'] = ($object) ? $object->getValue($field->getName()) : "";

				if($object) {
					$block_arr['void:object_id'] = $object->getId();
				}


				$block_arr['attribute:input_name'] = ($object) ? "data[" . $object->getId() . "][{$field_name}]" : "data[new][{$field_name}]";
			}

			return def_module::parseTemplate($template_block, $block_arr);
		}

		public function renderEditFieldTextCustom($field, $is_multiple, $object, $template) {
		  		  $field_name = $field->getName();
		  list($template_block) = def_module::loadTemplates("tpls/data/reflection/{$template}.tpl", "reflection_field_text_" . $field_name);
		  if(!$template_block){
			list($template_block) = def_module::loadTemplates("tpls/data/reflection/{$template}.tpl", "reflection_field_text");
       }
			$block_arr = Array();

			if($is_multiple) {
				
			} else {

				$block_arr['attribute:name'] = $field_name;
				$block_arr['attribute:title'] = $field->getTitle();
				$block_arr['attribute:tip'] = $field->getTip();

				$block_arr['node:value'] = ($object) ? $object->getValue($field->getName()) : "";

				if($object) {
					$block_arr['void:object_id'] = $object->getId();
				}


				$block_arr['attribute:input_name'] = ($object) ? "data[" . $object->getId() . "][{$field_name}]" : "data[new][{$field_name}]";
			}

			return def_module::parseTemplate($template_block, $block_arr);
		}

		public function renderEditFieldIntCustom($field, $is_multiple, $object, $template) {
				  $field_name = $field->getName();
		  list($template_block) = def_module::loadTemplates("tpls/data/reflection/{$template}.tpl", "reflection_field_int_" . $field_name);
		  if(!$template_block){
			list($template_block) = def_module::loadTemplates("tpls/data/reflection/{$template}.tpl", "reflection_field_int");
       }
			$block_arr = Array();

			if($is_multiple) {
				
			} else {

				$block_arr['attribute:name'] = $field_name;
				$block_arr['attribute:title'] = $field->getTitle();
				$block_arr['attribute:tip'] = $field->getTip();

				$block_arr['node:value'] = ($object) ? $object->getValue($field->getName()) : "";

				if($object) {
					$block_arr['void:object_id'] = $object->getId();
				}


				$block_arr['attribute:input_name'] = ($object) ? "data[" . $object->getId() . "][{$field_name}]" : "data[new][{$field_name}]";
			}

			return def_module::parseTemplate($template_block, $block_arr);
		}

		public function renderEditFieldBooleanCustom($field, $is_multiple, $object, $template) {
				  $field_name = $field->getName();
		  list($template_block) = def_module::loadTemplates("tpls/data/reflection/{$template}.tpl", "reflection_field_boolean_" . $field_name);
		  if(!$template_block){
			list($template_block) = def_module::loadTemplates("tpls/data/reflection/{$template}.tpl", "reflection_field_boolean");
      }
			$block_arr = Array();

			if ($is_multiple) {
				
			} else {

				$block_arr['attribute:name'] = $field_name;
				$block_arr['attribute:title'] = $field->getTitle();
				$block_arr['attribute:tip'] = $field->getTip();

				$block_arr['attribute:checked'] = "";
				$block_arr['node:value'] = 0;
				if ($object) {
					$block_arr['node:value'] = (int) $object->getValue($field->getName());
					$block_arr['attribute:checked'] = (bool) $object->getValue($field->getName())? "checked" : "";
					$block_arr['void:object_id'] = $object->getId();
				}


				$block_arr['attribute:input_name'] = ($object) ? "data[" . $object->getId() . "][{$field_name}]" : "data[new][{$field_name}]";
			}

			return def_module::parseTemplate($template_block, $block_arr);
		}

        
		public function renderEditFieldRelationCustom($field, $is_multiple, $object, $template) {
			if(!($field instanceof umiField)) return;
			
			if($guide_id = $field->getGuideId()) {
				if(cmsController::getInstance()->getCurrentMode() != "admin") {
					$guide_items = umiObjectsCollection::getInstance()->getGuidedItems($guide_id);
				} else {
					try {
						$sel = new selector('objects');
						$sel->types('object-type')->id($guide_id);
						$total = $sel->length;
					} catch (selectorException $e) {
						$total = 16;
					}
					
					
					if($total <= 15) {
						$guide_items = umiObjectsCollection::getInstance()->getGuidedItems($guide_id);
					} else {
						$fieldName = $field->getName();
						$guide_items = Array();
		
						if($object instanceof iUmiObject) {
							$val = $object->getValue($fieldName);
						} else {
							$val = false;
						}
	
						if($val && !is_array($val)) {
							$val = Array($val);
						}
	
						if(is_array($val)) {
								$objects = umiObjectsCollection::getInstance();
								foreach($val as $item_id) {
										$item = $objects->getObject($item_id);
										if($item instanceof iUmiObject) {
												$guide_items[$item_id] = $item->getName();
										}
										unset($item_id);
										unset($item);
								}
								unset($val);
						}
					}
				}
			} else {
				$guide_items = array();
			}
			
			if(sizeof($guide_items) == 0) {
				if($object instanceof iUmiObject) {
					$val = $object->getValue($field->getName());
					if($val && !is_array($val)) $val = array($val);
					if(sizeof($val)) {
						foreach($val as $itemId) {
							if($item = selector::get('object')->id($itemId)) {
								$guide_items[$itemId] = $item->name;
							}
						}
					}
				}
			}
			
			$xsl = xslTemplater::getInstance()->getIsInited();

		  $field_name = $field->getName();

		  list($template_block, $template_block_line, $template_block_line_a) = def_module::loadTemplates("tpls/data/reflection/{$template}.tpl", "reflection_field_relation_" . $field_name, "reflection_field_relation_option_" . $field_name, "reflection_field_relation_option_a_" . $field_name);
		  if(!$template_block){      
        list($template_block, $template_block_line, $template_block_line_a, $template_mul_block, $template_mul_block_line, $template_mul_block_line_a) = def_module::loadTemplates("tpls/data/reflection/{$template}.tpl", "reflection_field_relation", "reflection_field_relation_option", "reflection_field_relation_option_a", "reflection_field_multiple_relation", "reflection_field_multiple_relation_option", "reflection_field_multiple_relation_option_a");
      }
      
      
			$block_arr = Array();

			if($object) {
				$value = $object->getValue($field->getName());
			} else {
				$value = Array();
			}
			$fieldName = $field->getName();
			if ($fieldName == 'publish_status' && cmsController::getInstance()->getCurrentMode() != "admin") {	
				return "";
			}
			if($is_multiple) {
				$block_arr['attribute:name'] = $field_name;
				$block_arr['attribute:title'] = $field->getTitle();
				$block_arr['attribute:tip'] = $field->getTip();
				$block_arr['attribute:multiple'] = "multiple";
				
				if($guide_id = $field->getGuideId()) {
					$block_arr['attribute:type-id'] = $guide_id;
					
					$guide = umiObjectTypesCollection::getInstance()->getType($guide_id);
					if($guide instanceof umiObjectType) {
						if($guide->getIsPublic()) {
							$block_arr['attribute:public-guide'] = true;
						}
					}
				}


				$options = Array();
				foreach($guide_items as $item_id => $item_name) {
					$selected = (in_array($item_id, $value)) ? " selected" : "";
					
					$item_object = umiObjectsCollection::getInstance()->getObject($item_id);
					if(!is_object($item_object)) {
						continue;
					}

					if($item_object->getValue("is_hidden") && !$selected) {
						continue;
					}

					if($template_block_line || $xsl) {
						$line = ($selected) ? $template_mul_block_line_a : $template_mul_block_line;
						$line_arr = Array();
						$line_arr['attribute:id'] = $item_id;
						$line_arr['xlink:href'] = "uobject://" . $item_id;
						$line_arr['node:name'] = $item_name;

						if($selected) {
							$line_arr['attribute:selected'] = "selected";
						}

						$options[] = def_module::parseTemplate($line, $line_arr, false, $item_id);
					} else {
						$options .= "<option value=\"{$item_id}\"{$selected}>{$item_name}</option>\n";
					}
				}

				if($object) {
					$block_arr['void:object_id'] = $object->getId();
				}


				$block_arr['subnodes:values'] = $block_arr['void:options'] = $options;
				$block_arr['attribute:input_name'] = ($object) ? "data[" . $object->getId() . "][{$field_name}][]" : "data[new][{$field_name}][]";

				return def_module::parseTemplate($template_mul_block, $block_arr);
			} else {
				$field_name = $field->getName();
				$block_arr['attribute:name'] = $field_name;
				$block_arr['attribute:title'] = $field->getTitle();
				$block_arr['attribute:tip'] = $field->getTip();
				
				if($guide_id = $field->getGuideId()) {
					$block_arr['attribute:type-id'] = $guide_id;
					
					$guide = umiObjectTypesCollection::getInstance()->getType($guide_id);
					if($guide instanceof umiObjectType) {
						if($guide->getIsPublic()) {
							$block_arr['attribute:public-guide'] = true;
						}
					}
				}

				$options = "";
				foreach($guide_items as $item_id => $item_name) {
					$selected = ($item_id == $value) ? " selected" : "";

					$item_object = umiObjectsCollection::getInstance()->getObject($item_id);
					if(!is_object($item_object)) {
						continue;
					}

					if($item_object->getValue("is_hidden") && !$selected) {
						continue;
					}


					if($template_block_line || $xsl) {
						$line = ($selected) ? $template_block_line_a : $template_block_line;
						$line_arr = Array();
						$line_arr['attribute:id'] = $item_id;
						$line_arr['xlink:href'] = "uobject://" . $item_id;
						$line_arr['node:name'] = $item_name;
						if($selected) {
							$line_arr['attribute:selected'] = "selected";
						}

						$options[] = def_module::parseTemplate($line, $line_arr, false, $item_id);
					} else {
						$options .= "<option value=\"{$item_id}\"{$selected}>{$item_name}</option>\n";
					}
				}

				if($object) {
					$block_arr['void:object_id'] = $object->getId();
				}


				$block_arr['subnodes:values'] = $block_arr['void:options'] = $options;
				$block_arr['attribute:input_name'] = ($object) ? "data[" . $object->getId() . "][{$field_name}]" : "data[new][{$field_name}]";

				return def_module::parseTemplate($template_block, $block_arr);
			}
		}

TPL-шаблон в папке tpls/data/reflection/ должен быть примерно следующим:

<?php

$FORMS = Array();

$FORMS['reflection_fields'] = <<<END

<form method="post" action="%pre_lang%/data/addNewObject/%object_type_id%/" enctype="multipart/form-data" >

<table border="0" width="500">
	%fields%
</table>
<input type="hidden" name="parent" value="%parent_id%" />
<input type="hidden" name="active" value="0" />
<input type="hidden" name="system_template" value="%template%" />
<input type="hidden" name="fields" value="%fields_arr%" />
<input type="submit" />

</form>

END;

$FORMS['reflection_field_string_h1'] = <<<END
  
	<tr>
		<td>
			%title%:
		</td>

		<td>
			<input type="text" name="%input_name%" value="%value%" size="50" />
		</td>
	</tr>

END;

$FORMS['reflection_field_string'] = <<<END
  
	<tr>
		<td>
			%title%:
		</td>

		<td>
			<input type="text" name="%input_name%" value="%value%" size="50" />
		</td>
	</tr>

END;

$FORMS['reflection_field_string_title'] = <<<END
	<tr>
		<td>
			%title%:
		</td>

		<td>
			<input type="text" name="%input_name%" value="%value%" size="50" />
		</td>
	</tr>

END;

?>

Примеры вызовов макросов:

%data getEditFormCustom('editpage', 'h1 photo vid menu_pic_ua')%
%data getCreateFormCustom(827, 'newpage', 'title h1 druzhelyubnost photo menu_pic_ua', 45)%