Beispiel #1
0
 /**
  * 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);
 }
Beispiel #2
0
 /**
  * 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'] = '';
             }
         }
     }
 }
Beispiel #3
0
 /**
  * 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;
 }
Beispiel #4
0
 /**
  * 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;
 }
Beispiel #5
0
 /**
  * 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;
 }