fileManager = $fileManager; $this->dateTime = $dateTime; $this->number = $number; $this->acl = $acl; $this->entityManager = $entityManager; } protected function getAcl() { return $this->acl; } protected function getEntityManager() { return $this->entityManager; } protected function format($value) { if (is_float($value)) { $value = $this->number->format($value, 2); } else if (is_int($value)) { $value = $this->number->format($value); } else if (is_string($value)) { $value = nl2br($value); } return $value; } protected function getDataFromEntity(Entity $entity, $skipLinks = false) { $data = $entity->toArray(); $fieldDefs = $entity->getFields(); $fieldList = array_keys($fieldDefs); $forbidenAttributeList = []; if ($this->getAcl()) { $forbidenAttributeList = $this->getAcl()->getScopeForbiddenAttributeList($entity->getEntityType(), 'read'); } foreach ($fieldList as $field) { if (in_array($field, $forbidenAttributeList)) continue; $type = $entity->getAttributeType($field); if ($type == Entity::DATETIME) { if (!empty($data[$field])) { $data[$field] = $this->dateTime->convertSystemDateTime($data[$field]); } } else if ($type == Entity::DATE) { if (!empty($data[$field])) { $data[$field] = $this->dateTime->convertSystemDate($data[$field]); } } else if ($type == Entity::JSON_ARRAY) { if (!empty($data[$field])) { $list = $data[$field]; $newList = []; foreach ($list as $item) { $v = $item; if ($item instanceof \StdClass) { $v = get_object_vars($v); } if (!is_array($v)) { $v = []; } foreach ($v as $k => $w) { $keyRaw = $k . '_RAW'; $v[$keyRaw] = $v[$k]; $v[$k] = $this->format($v[$k]); } $newList[] = $v; } $data[$field] = $newList; } } else if ($type == Entity::JSON_OBJECT) { if (!empty($data[$field])) { $value = $data[$field]; if ($value instanceof \StdClass) { $data[$field] = get_object_vars($value); } foreach ($data[$field] as $k => $w) { $keyRaw = $k . '_RAW'; $data[$field][$keyRaw] = $data[$field][$k]; $data[$field][$k] = $this->format($data[$field][$k]); } } } else if ($type === Entity::PASSWORD) { unset($data[$field]); } if (array_key_exists($field, $data)) { $keyRaw = $field . '_RAW'; $data[$keyRaw] = $data[$field]; $data[$field] = $this->format($data[$field]); } } if (!$skipLinks) { $relationDefs = $entity->getRelations(); foreach ($entity->getRelationList() as $relation) { if ( !empty($relationDefs[$relation]['type']) && ($entity->getRelationType($relation) === 'belongsTo' || $entity->getRelationType($relation) === 'belongsToParent') ) { $relatedEntity = $entity->get($relation); if (!$relatedEntity) continue; if ($this->getAcl()) { if (!$this->getAcl()->check($relatedEntity, 'read')) continue; } $data[$relation] = $this->getDataFromEntity($relatedEntity, true); } } } return $data; } public function render(Entity $entity, $template, $id = null, $additionalData = array(), $skipLinks = false) { $code = \LightnCandy::compile($template, [ 'flags' => \LightnCandy::FLAG_HANDLEBARSJS, 'helpers' => [ 'file' => function ($context, $options) { if (count($context) && $context[0]) { $id = $context[0]; return "?entryPoint=attachment&id=" . $id; } }, 'numberFormat' => function ($context, $options) { if ($context && isset($context[0])) { $number = $context[0]; $decimals = 0; $decimalPoint = '.'; $thousandsSeparator = ','; if (isset($options['decimals'])) { $decimals = $options['decimals']; } if (isset($options['decimalPoint'])) { $decimalPoint = $options['decimalPoint']; } if (isset($options['thousandsSeparator'])) { $thousandsSeparator = $options['thousandsSeparator']; } return number_format($number, $decimals, $decimalPoint, $thousandsSeparator); } return ''; } ], 'hbhelpers' => [ 'ifEqual' => function () { $args = func_get_args(); $context = $args[count($args) - 1]; if ($args[0] === $args[1]) { return $context['fn'](); } else { return $context['inverse'] ? $context['inverse']() : ''; } }, 'ifNotEqual' => function () { $args = func_get_args(); $context = $args[count($args) - 1]; if ($args[0] !== $args[1]) { return $context['fn'](); } else { return $context['inverse'] ? $context['inverse']() : ''; } } ] ]); $toRemove = false; if ($id === null) { $id = uniqid('', true); $toRemove = true; } $fileName = 'data/cache/templates/' . $id . '.php'; $this->fileManager->putContents($fileName, $code); $renderer = $this->fileManager->getPhpContents($fileName); if ($toRemove) { $this->fileManager->removeFile($fileName); } $data = $this->getDataFromEntity($entity, $skipLinks); foreach ($additionalData as $k => $value) { $data[$k] = $value; } $html = $renderer($data); $html = str_replace('?entryPoint=attachment&', '?entryPoint=attachment&', $html); if ($this->getEntityManager()) { $html = preg_replace_callback('/\?entryPoint=attachment\&id=([A-Za-z0-9]*)/', function ($matches) { $id = $matches[1]; $attachment = $this->getEntityManager()->getEntity('Attachment', $id); if ($attachment) { $filePath = $this->getEntityManager()->getRepository('Attachment')->getFilePath($attachment); return $filePath; } }, $html); } return $html; } }