/**
  * This function returns the HtmlElements to display for 1:n relations
  *
  * @todo this only works with single valued identifiers
  * @param array $assocMapping Mapping information for this relation
  * @param string $entityClass FQCN of the foreign entity
  * @param int $entityId ID of the local entity
  * @return array Set of \Cx\Core\Html\Model\Entity\HtmlElement instances
  */
 protected function getIdentifyingDisplayValue($assocMapping, $entityClass, $entityId)
 {
     global $_CORELANG;
     $localEntityMetadata = \Env::get('em')->getClassMetadata($this->entityClass);
     $localEntityIdentifierField = $localEntityMetadata->getSingleIdentifierFieldName();
     $localEntityRepo = \Env::get('em')->getRepository($this->entityClass);
     $localEntity = $localEntityRepo->find($entityId);
     if (!$localEntity) {
         throw new \Exception('Entity not found');
     }
     $foreignEntityGetter = 'get' . preg_replace('/_([a-z])/', '\\1', ucfirst($assocMapping["fieldName"]));
     $foreignEntities = $localEntity->{$foreignEntityGetter}();
     $htmlElements = array();
     foreach ($foreignEntities as $index => $foreignEntity) {
         // entity base implements __toString()
         $displayValue = (string) $foreignEntity;
         $foreignEntityMetadata = \Env::get('em')->getClassMetadata(get_class($foreignEntity));
         $foreignEntityIdentifierField = $foreignEntityMetadata->getSingleIdentifierFieldName();
         $entityValueSerialized = 'vg_increment_number=' . $this->formId;
         $fieldsToParse = $foreignEntityMetadata->fieldNames;
         foreach ($fieldsToParse as $dbColName => $fieldName) {
             $entityValueSerialized .= '&' . $fieldName . '=' . $this->getDataElementValueAsString($foreignEntityMetadata->getFieldValue($foreignEntity, $fieldName));
         }
         // add relations
         foreach ($foreignEntityMetadata->associationMappings as $foreignAssocMapping) {
             if (!$foreignAssocMapping['isOwningSide']) {
                 continue;
             }
             $joinColumns = reset($foreignAssocMapping['joinColumns']);
             // if the association is a backreference to our main entity we skip it
             if ($foreignAssocMapping['targetEntity'] == $this->entityClass && $joinColumns['referencedColumnName'] == $localEntityIdentifierField) {
                 continue;
             }
             $foreignForeignEntity = $foreignEntityMetadata->getFieldValue($foreignEntity, $foreignAssocMapping['fieldName']);
             if (!$foreignForeignEntity) {
                 continue;
             }
             $foreignEntityIdentifierGetter = 'get' . preg_replace('/_([a-z])/', '\\1', ucfirst($foreignEntityIdentifierField));
             $entityValueSerialized .= '&' . $foreignAssocMapping['fieldName'] . '=' . $foreignForeignEntity->{$foreignEntityIdentifierGetter}();
         }
         $sorroundingDiv = new \Cx\Core\Html\Model\Entity\HtmlElement('div');
         $sorroundingDiv->setAttribute('class', 'oneToManyEntryRow');
         $displaySpan = new \Cx\Core\Html\Model\Entity\HtmlElement('span');
         $displaySpan->addChild(new \Cx\Core\Html\Model\Entity\TextElement($displayValue));
         $displaySpan->allowDirectClose(false);
         $hiddenInput = new \Cx\Core\Html\Model\Entity\DataElement('input');
         $hiddenInput->setAttributes(array('type' => 'hidden', 'name' => $this->createCssClassNameFromEntity($entityClass) . '[]', 'value' => $entityValueSerialized));
         $editLink = new \Cx\Core\Html\Model\Entity\HtmlElement('a');
         $editLink->setAttributes(array('class' => 'edit', 'title' => $_CORELANG['TXT_EDIT']));
         $editLink->allowDirectClose(false);
         $deleteLink = new \Cx\Core\Html\Model\Entity\HtmlElement('a');
         $deleteLink->setAttributes(array('onclick' => 'deleteAssociationMappingEntry(this)', 'class' => 'remove existing', 'title' => $_CORELANG['TXT_DELETE']));
         $deleteLink->allowDirectClose(false);
         $sorroundingDiv->addChild($displaySpan);
         $sorroundingDiv->addChild($hiddenInput);
         $sorroundingDiv->addChild($editLink);
         $sorroundingDiv->addChild($deleteLink);
         $htmlElements[] = $sorroundingDiv;
     }
     return $htmlElements;
 }
 public function getDataElementGroup($field, $dataElement, $fieldOptions = array())
 {
     global $_ARRAYLANG;
     $group = new \Cx\Core\Html\Model\Entity\HtmlElement('div');
     $group->setAttribute('class', 'group');
     $label = new \Cx\Core\Html\Model\Entity\HtmlElement('label');
     $label->setAttribute('for', 'form-' . $this->formId . '-' . $field);
     $fieldHeader = $field;
     if (isset($fieldOptions['formtext'])) {
         $fieldHeader = FormGenerator::getFormLabel($fieldOptions, 'formtext');
     } else {
         if (isset($fieldOptions['header'])) {
             $fieldHeader = FormGenerator::getFormLabel($fieldOptions, 'header');
         }
     }
     $label->addChild(new \Cx\Core\Html\Model\Entity\TextElement($fieldHeader . ' '));
     $group->addChild($label);
     $controls = new \Cx\Core\Html\Model\Entity\HtmlElement('div');
     $controls->setAttribute('class', 'controls');
     $controls->addChild($dataElement);
     if (isset($fieldOptions['tooltip'])) {
         $tooltipTrigger = new \Cx\Core\Html\Model\Entity\HtmlElement('span');
         $tooltipTrigger->setAttribute('class', 'icon-info tooltip-trigger');
         $tooltipTrigger->allowDirectClose(false);
         $tooltipMessage = new \Cx\Core\Html\Model\Entity\HtmlElement('span');
         $tooltipMessage->setAttribute('class', 'tooltip-message');
         $tooltipMessage->addChild(new \Cx\Core\Html\Model\Entity\TextElement($fieldOptions['tooltip']));
         $controls->addChild($tooltipTrigger);
         $controls->addChild($tooltipMessage);
     }
     $group->addChild($controls);
     return $group;
 }