/** * Get the content. * * @param array $record * * @return string The content */ public function getContent($record) { $node = $this->m_node; $forceList = []; if (isset($node->m_postvars['atkfilter'])) { $forceList = Tools::decodeKeyValueSet($node->m_postvars['atkfilter']); } $suppressList = []; if (isset($node->m_postvars['atksuppress'])) { $suppressList = $node->m_postvars['atksuppress']; } $form = $this->editForm('edit', $record, $forceList, $suppressList, $node->getEditFieldPrefix()); return $node->tabulate('edit', $form); }
/** * Adds the attribute's edit / hide HTML code to the edit array. * * This method is called by the node if it wants the data needed to create * an edit form. The method is an override of Attribute's method, * because in the atkOneToOneRelation, we need to implement the * self::AF_ONETOONE_INTEGRATE feature. * * This is a framework method, it should never be called directly. * * @param string $mode the edit mode ("add" or "edit") * @param array $arr pointer to the edit array * @param array $defaults pointer to the default values array * @param array $error pointer to the error array * @param string $fieldprefix the fieldprefix */ public function addToEditArray($mode, &$arr, &$defaults, &$error, $fieldprefix) { /* hide */ if ($mode == 'edit' && $this->hasFlag(self::AF_HIDE_EDIT) || $mode == 'add' && $this->hasFlag(self::AF_HIDE_ADD)) { /* when adding, there's nothing to hide... */ if ($mode == 'edit' || $mode == 'add' && !$this->isEmpty($defaults)) { $arr['hide'][] = $this->hide($defaults, $fieldprefix, $mode); } } else { /* we first check if there is no edit override method, if there * is this method has the same behaviour as the Attribute's method */ if (method_exists($this->m_ownerInstance, $this->m_name . '_edit') || $this->edit($defaults, $fieldprefix, $mode) !== null) { self::addToEditArray($mode, $arr, $defaults, $error, $fieldprefix); } else { if (!$this->createDestination()) { return; } $myrecord = null; /* readonly */ if ($this->m_destInstance->hasFlag(Node::NF_READONLY) || $mode == 'edit' && $this->hasFlag(self::AF_READONLY_EDIT) || $mode == 'add' && $this->hasFlag(self::AF_READONLY_ADD)) { $this->createDestination(); $attrNames = $this->m_destInstance->getAttributeNames(); foreach ($attrNames as $attrName) { $attr = $this->m_destInstance->getAttribute($attrName); $attr->addFlag(self::AF_READONLY); } } /* we first check if the record doesn't already exist */ if (isset($defaults[$this->fieldName()]) && !empty($defaults[$this->fieldName()])) { /* record has no primarykey yet, so we must add instead of update */ $myrecord = $defaults[$this->fieldName()]; if (empty($myrecord[$this->m_destInstance->primaryKeyField()])) { $mode = 'add'; } else { $mode = 'edit'; $myrecord['atkprimkey'] = $this->m_destInstance->primaryKey($myrecord); } } else { $mode = 'add'; } /* mode */ $arr['hide'][] = '<input type="hidden" name="' . $fieldprefix . $this->fieldName() . '[mode]" value="' . $mode . '">'; /* add fields */ $forceList = Tools::decodeKeyValueSet($this->m_destinationFilter); if ($this->m_refKey != '') { if ($this->destinationHasRelation()) { $forceList[$this->m_refKey][$this->m_ownerInstance->primaryKeyField()] = $defaults[$this->m_ownerInstance->primaryKeyField()]; } else { // its possible that the destination has no relation back. In that case the refKey is just an attribute $forceList[$this->m_refKey] = $defaults[$this->m_ownerInstance->primaryKeyField()]; } } $a = $this->m_destInstance->editArray($mode, $myrecord, $forceList, [], $fieldprefix . $this->fieldName() . '_AE_', false, false); /* hidden fields */ $arr['hide'] = array_merge($arr['hide'], $a['hide']); /* editable fields, if self::AF_NOLABEL is specified or if there is just 1 field with the * same name as the relation we don't display a label * TODO FIXME */ if (!is_array($arr['fields'])) { $arr['fields'] = []; } if (!$this->hasFlag(self::AF_ONETOONE_INTEGRATE) && !$this->hasFlag(self::AF_NOLABEL) && !(count($a['fields']) == 1 && $a['fields'][0]['name'] == $this->m_name)) { /* separator and name */ if ($arr['fields'][count($arr['fields']) - 1]['html'] !== '-') { $arr['fields'][] = array('html' => '-', 'tabs' => $this->m_tabs, 'sections' => $this->getSections()); } $arr['fields'][] = array('line' => '<b>' . Tools::atktext($this->m_name, $this->m_ownerInstance->m_module, $this->m_ownerInstance->m_type) . '</b>', 'tabs' => $this->m_tabs, 'sections' => $this->getSections()); } if (is_array($a['fields'])) { // in non-integration mode we move all the fields to the one-to-one relations tabs/sections if (!$this->hasFlag(self::AF_ONETOONE_INTEGRATE) || $this->hasFlag(self::AF_ONETOONE_RESPECT_TABS)) { foreach (array_keys($a['fields']) as $key) { $a['fields'][$key]['tabs'] = $this->m_tabs; $a['fields'][$key]['sections'] = $this->getSections(); } } $arr['fields'] = array_merge($arr['fields'], $a['fields']); } if (!$this->hasFlag(self::AF_ONETOONE_INTEGRATE) && !$this->hasFlag(self::AF_NOLABEL) && !(count($a['fields']) == 1 && $a['fields'][0]['name'] == $this->m_name)) { /* separator */ $arr['fields'][] = array('html' => '-', 'tabs' => $this->m_tabs, 'sections' => $this->getSections()); } $fields = $arr['fields']; foreach ($fields as &$field) { $field['attribute'] = ''; } } } }
/** * Converts a record filter to a record array. * * @param string $filter filter string * * @return array record */ protected function filterToArray($filter) { $result = []; $values = Tools::decodeKeyValueSet($filter); foreach ($values as $field => $value) { $parts = explode('.', $field); $ref =& $result; foreach ($parts as $part) { $ref =& $ref[$part]; } $ref = $value; } return $result; }
/** * Translate the given selector to a criteria array * which key/values can be used to filter data. * * @param string $selector selector string * * @return array criteria */ protected function getCriteria($selector) { $criteria = $this->m_filters; if (empty($selector)) { return $criteria; } $selectors = explode(') OR (', $selector); foreach ($selectors as $selector) { $keyValueSet = Tools::decodeKeyValueSet($selector); foreach ($keyValueSet as $column => $value) { $column = trim($column, ' ()'); $value = trim($value, ' ()'); if (strpos($column, '.') !== false) { list($table, $column) = explode('.', $column); if ($table != $this->getTable()) { continue; } } $value = stripslashes(Tools::stripQuotes($value)); if (isset($criteria[$column]) && $criteria[$column] != $value) { $criteria[$column] = array_merge((array) $criteria[$column], (array) $value); } else { $criteria[$column] = $value; } } } return $criteria; }
/** * Based on information provided in the url (atkfilter), this function creates an array with * field values that are used as the initial values of a record in an add page. * * @return array Values of the newly created record. */ public function createForceList() { $node = $this->m_node; $forceList = []; $filterList = isset($node->m_postvars['atkfilter']) ? Tools::decodeKeyValueSet($node->m_postvars['atkfilter']) : []; foreach ($filterList as $field => $value) { list($table, $column) = explode('.', $field); if ($column == null) { $forceList[$table] = $value; } else { if ($table == $this->getNode()->getTable()) { $forceList[$column] = $value; } else { $forceList[$table][$column] = $value; } } } return $forceList; }