public function getCMSFields()
 {
     $fields = parent::getCMSFields();
     if ($this->ID) {
         // now swap out to an orderable CTF field
         $fields->removeFieldFromTab('Root.Items', 'Items');
         foreach ($this->has_many() as $relationship => $component) {
             $relationshipFields = singleton($component)->summaryFields();
             $foreignKey = $this->getRemoteJoinField($relationship);
             $ctf = new DataListOrderableComplexTableField($this, $relationship, $component, $relationshipFields, "getCMSFields", "\"{$foreignKey}\" = " . $this->ID);
             $ctf->setPermissions(TableListField::permissions_for_object($component));
             $fields->addFieldToTab('Root.Items', $ctf);
         }
     }
     return $fields;
 }
 /**
  * Creates and returns the result table field for resultsForm.
  * Uses {@link resultsTableClassName()} to initialise the formfield. 
  * Method is called from {@link ResultsForm}.
  *
  * @param array $searchCriteria passed through from ResultsForm 
  *
  * @return TableListField 
  */
 function getResultsTable($searchCriteria)
 {
     $summaryFields = $this->getResultColumns($searchCriteria);
     $className = $this->parentController->resultsTableClassName();
     $tf = new $className($this->modelClass, $this->modelClass, $summaryFields);
     $tf->setCustomQuery($this->getSearchQuery($searchCriteria));
     $tf->setPageSize($this->parentController->stat('page_length'));
     $tf->setShowPagination(true);
     // @todo Remove records that can't be viewed by the current user
     $tf->setPermissions(array_merge(array('view', 'export'), TableListField::permissions_for_object($this->modelClass)));
     // csv export settings (select all columns regardless of user checkbox settings in 'ResultsAssembly')
     $exportFields = $this->getResultColumns($searchCriteria, false);
     $tf->setFieldListCsv($exportFields);
     $url = '<a href=\\"' . $this->Link() . '/$ID/edit\\">$value</a>';
     $tf->setFieldFormatting(array_combine(array_keys($summaryFields), array_fill(0, count($summaryFields), $url)));
     return $tf;
 }
	/**
	 * Gets the form fields as defined through the metadata
	 * on {@link $obj} and the custom parameters passed to FormScaffolder.
	 * Depending on those parameters, the fields can be used in ajax-context,
	 * contain {@link TabSet}s etc.
	 * 
	 * @return FieldSet
	 */
	public function getFieldSet() {
		$fields = new FieldSet();
		
		// tabbed or untabbed
		if($this->tabbed) {
			$fields->push(new TabSet("Root", $mainTab = new Tab("Main")));
			$mainTab->setTitle(_t('SiteTree.TABMAIN', "Main"));
		}
		
		// add database fields
		foreach($this->obj->db() as $fieldName => $fieldType) {
			if($this->restrictFields && !in_array($fieldName, $this->restrictFields)) continue;
			
			// @todo Pass localized title
			if($this->fieldClasses && isset($this->fieldClasses[$fieldName])) {
				$fieldClass = $this->fieldClasses[$fieldName];
				$fieldObject = new $fieldClass($fieldName);
			} else {
				$fieldObject = $this->obj->dbObject($fieldName)->scaffoldFormField(null, $this->getParamsArray());
			}
			$fieldObject->setTitle($this->obj->fieldLabel($fieldName));
			if($this->tabbed) {
				$fields->addFieldToTab("Root.Main", $fieldObject);
			} else {
				$fields->push($fieldObject);
			}
		}
		
		// add has_one relation fields
		if($this->obj->has_one()) {
			foreach($this->obj->has_one() as $relationship => $component) {
				if($this->restrictFields && !in_array($relationship, $this->restrictFields)) continue;
				$hasOneField = $this->obj->dbObject("{$relationship}ID")->scaffoldFormField(null, $this->getParamsArray());
				$hasOneField->setTitle($this->obj->fieldLabel($relationship));
				if($this->tabbed) {
					$fields->addFieldToTab("Root.Main", $hasOneField);
				} else {
					$fields->push($hasOneField);
				}
			}
		}
		
		// only add relational fields if an ID is present
		if($this->obj->ID) {
			// add has_many relation fields
			if($this->obj->has_many() && ($this->includeRelations === true || isset($this->includeRelations['has_many']))) {
				foreach($this->obj->has_many() as $relationship => $component) {
					if($this->tabbed) {
						$relationTab = $fields->findOrMakeTab(
							"Root.$relationship", 
							$this->obj->fieldLabel($relationship)
						);
					}
					$relationshipFields = singleton($component)->summaryFields();
					$foreignKey = $this->obj->getComponentJoinField($relationship);
					$ctf = new ComplexTableField(
						$this,
						$relationship,
						$component,
						$relationshipFields,
						"getCMSFields", 
						"$foreignKey = " . $this->obj->ID
					);
					$ctf->setPermissions(TableListField::permissions_for_object($component));
					if($this->tabbed) {
						$fields->addFieldToTab("Root.$relationship", $ctf);
					} else {
						$fields->push($ctf);
					}
				}
			}

			if($this->obj->many_many() && ($this->includeRelations === true || isset($this->includeRelations['many_many']))) {
				foreach($this->obj->many_many() as $relationship => $component) {
					if($this->tabbed) {
						$relationTab = $fields->findOrMakeTab(
							"Root.$relationship", 
							$this->obj->fieldLabel($relationship)
						);
					}

					$relationshipFields = singleton($component)->summaryFields();
					$filterWhere = $this->obj->getManyManyFilter($relationship, $component);
					$filterJoin = $this->obj->getManyManyJoin($relationship, $component);
					$ctf =  new ComplexTableField(
						$this,
						$relationship,
						$component,
						$relationshipFields,
						"getCMSFields", 
						$filterWhere,
						'', 
						$filterJoin
					);
					$ctf->setPermissions(TableListField::permissions_for_object($component));
					$ctf->popupClass = "ScaffoldingComplexTableField_Popup";
					if($this->tabbed) {
						$fields->addFieldToTab("Root.$relationship", $ctf);
					} else {
						$fields->push($ctf);
					}
				}
			}
		}
		
		return $fields;
	}
Exemple #4
0
 /**
  * Shows results from the "search" action in a TableListField.
  *
  * @return Form
  */
 function ResultsForm($searchCriteria)
 {
     if ($searchCriteria instanceof HTTPRequest) {
         $searchCriteria = $searchCriteria->getVars();
     }
     $summaryFields = $this->getResultColumns($searchCriteria);
     $className = $this->parentController->resultsTableClassName();
     $tf = new $className($this->modelClass, $this->modelClass, $summaryFields);
     $tf->setCustomQuery($this->getSearchQuery($searchCriteria));
     $tf->setPageSize($this->parentController->stat('page_length'));
     $tf->setShowPagination(true);
     // @todo Remove records that can't be viewed by the current user
     $tf->setPermissions(array_merge(array('view', 'export'), TableListField::permissions_for_object($this->modelClass)));
     // csv export settings (select all columns regardless of user checkbox settings in 'ResultsAssembly')
     $exportFields = $this->getResultColumns($searchCriteria, false);
     $tf->setFieldListCsv($exportFields);
     $url = '<a href=\\"' . $this->Link() . '/$ID/edit\\">$value</a>';
     $tf->setFieldFormatting(array_combine(array_keys($summaryFields), array_fill(0, count($summaryFields), $url)));
     // implemented as a form to enable further actions on the resultset
     // (serverside sorting, export as CSV, etc)
     $form = new Form($this, 'ResultsForm', new FieldSet(new HeaderField('SearchResultsHeader', _t('ModelAdmin.SEARCHRESULTS', 'Search Results'), 2), $tf), new FieldSet(new FormAction("goBack", _t('ModelAdmin.GOBACK', "Back")), new FormAction("goForward", _t('ModelAdmin.GOFORWARD', "Forward"))));
     // Include the search criteria on the results form URL, but not dodgy variables like those below
     $filteredCriteria = $searchCriteria;
     unset($filteredCriteria['ctf']);
     unset($filteredCriteria['url']);
     unset($filteredCriteria['action_search']);
     if (isset($filteredCriteria['Investors__PEFirm__IsPECMember']) && !$filteredCriteria['Investors__PEFirm__IsPECMember']) {
         unset($filteredCriteria['Investors__PEFirm__IsPECMember']);
     }
     $form->setFormAction($this->Link() . '/ResultsForm?' . http_build_query($filteredCriteria));
     return $form;
 }