function &buildWidget(&$record, &$field, &$form, $formFieldName, $new = false) { /* * * This field uses a table widget. * */ //$field['display'] = 'block'; $table =& $record->_table; $formTool =& Dataface_FormTool::getInstance(); $factory =& Dataface_FormTool::factory(); $widget =& $field['widget']; $el =& $factory->addElement('grid', $formFieldName, $widget['label']); $el->setProperties($widget); $rperms = $record->getPermissions(array('relationship' => $field['relationship'])); if (!$record->checkPermission('add new related record', array('relationship' => $field['relationship']))) { //echo "No add new ".$record->_table->tablename; $el->addNew = false; } if (!$record->checkPermission('add existing related record', array('relationship' => $field['relationship']))) { //echo "No add new ".$record->_table->tablename; $el->addExisting = false; } if (isset($field['relationship'])) { $relationship =& $table->getRelationship($field['relationship']); if (!$record->checkPermission('remove related record', array('relationship' => $field['relationship']))) { $el->delete = false; } else { if ($relationship->isOneToMany() and isset($rperms['delete related record']) and !@$rperms['delete related record']) { $el->delete = false; } } if (!$relationship->supportsRemove()) { $el->delete = false; } if (!$relationship->supportsAddNew()) { $el->addNew = false; } if (!$relationship->supportsAddExisting()) { $el->addExisting = false; } else { $el->addExistingFilters = $relationship->getAddExistingFilters(); } $el->table = $relationship->getDomainTable(); if (isset($widget['columns'])) { $columns = array_map('trim', explode(',', $widget['columns'])); } else { $columns = $relationship->_schema['short_columns']; } $count = 0; $subfactory = new HTML_QuickForm(); $dummyRelatedRecord = new Dataface_RelatedRecord($record, $relationship->getName()); //print_r($dummyRelatedRecord->getPermissions()); $orderCol = $relationship->getOrderColumn(); if (!$orderCol or PEAR::isError($orderCol)) { $el->reorder = false; } foreach ($columns as $column) { $colTable =& $relationship->getTable($column); if (!$colTable) { echo "Could not find table for column {$column}"; } $colPerms = $dummyRelatedRecord->getPermissions(array('field' => $column)); if (!@$colPerms['view']) { unset($colTable); unset($dummyRecord); continue; } // We need to be a bit more refined on this one. We need to take // into account the context being that we are in a relationship. $dummyRecord = new Dataface_Record($colTable->tablename, $record->vals()); /* if ( !$dummyRecord->checkPermission('view', array('field'=>$column, 'recordmask'=>array('view'=>1))) ) { unset($colTable); unset($dummyRecord); continue; } */ $colFieldDef =& $colTable->getField($column); $columnElement =& $formTool->buildWidget($dummyRecord, $colFieldDef, $subfactory, $column, false); $defaultValue = $colTable->getDefaultValue($column); $columnElement->setValue($defaultValue); $el->defaults[$column] = $defaultValue; $el->addField($colFieldDef, $columnElement, $colPerms); unset($columnElement); unset($colFieldDef); unset($dummyRecord); unset($colTable); unset($elementFilter); } } else { if (isset($widget['fields'])) { $widget_fields =& $widget['fields']; foreach ($widget_fields as $widget_field) { $widget_field =& Dataface_Table::getTableField($widget_field, $this->db); if (PEAR::isError($widget_field)) { return $widget_field; } $widget_widget = $formTool->buildWidget($record, $widget_field, $factory, $widget_field['name']); $defaultValue = $table->getDefaultValue($widget_field['name']); $widget_widget->setValue($defaultValue); $el->addField($widget_widget); $el->defaults[$widget_field['name']] = $defaultValue; } } else { if (isset($field['fields'])) { foreach (array_keys($field['fields']) as $field_key) { $widget_widget = $formTool->buildWidget($record, $field['fields'][$field_key], $factory, $field['fields'][$field_key]['name']); $defaultValue = $table->getDefaultValue($widget_field['name']); $widget_widget->setValue($defaultValue); $el->defaults[$widget_field['name']] = $defaultValue; $el->addField($widget_widget); unset($widget_widget); } } } } return $el; }