/** * save a Job-Post either by a regular request or by an async post (AJAX) * a mandatory parameter is the ID of the Job * in case of a regular Request you can * * parameter are arbitrary elements for defaults or programming flow * * @param array $parameter * @return null|ViewModel * @throws \RuntimeException */ protected function save($parameter = array()) { $serviceLocator = $this->getServiceLocator(); $user = $this->auth->getUser(); if (empty($user->info->email)) { return $this->getErrorViewModel('no-parent', array('cause' => 'noEmail')); } $userOrg = $user->getOrganization(); if (!$userOrg->hasAssociation()) { return $this->getErrorViewModel('no-parent', array('cause' => 'noCompany')); } /** @var \Zend\Http\Request $request */ $request = $this->getRequest(); $isAjax = $request->isXmlHttpRequest(); $pageToForm = array(0 => array('locationForm', 'nameForm', 'portalForm'), 1 => array('descriptionForm'), 2 => array('previewForm')); $params = $this->params(); $formIdentifier = $params->fromQuery('form'); $pageIdentifier = (int) $params->fromQuery('page', array_key_exists('page', $parameter) ? $parameter['page'] : 0); $jobEntity = $this->initializeJob()->get($this->params(), true); $viewModel = null; $this->acl($jobEntity, 'edit'); $form = $this->getFormular($jobEntity); $valid = true; $instanceForm = null; $formErrorMessages = array(); if (isset($formIdentifier) && $request->isPost()) { // at this point the form get instantiated and immediately accumulated $instanceForm = $form->getForm($formIdentifier); if (!isset($instanceForm)) { throw new \RuntimeException('No form found for "' . $formIdentifier . '"'); } // the id may be part of the postData, but it never should be altered $postData = $request->getPost(); if (isset($postData['id'])) { unset($postData['id']); } unset($postData['applyId']); $instanceForm->setData($postData); $valid = $instanceForm->isValid(); $formErrorMessages = ArrayUtils::merge($formErrorMessages, $instanceForm->getMessages()); if ($valid) { /* * @todo This is a workaround for GeoJSON data insertion * until we figured out, what we really want it to be. */ if ('locationForm' == $formIdentifier) { $locElem = $instanceForm->getBaseFieldset()->get('geo-location'); if ($locElem instanceof \Geo\Form\GeoText) { $loc = $locElem->getValue('entity'); $locations = $jobEntity->getLocations(); if (count($locations)) { $locations->clear(); } $locations->add($loc); $jobEntity->setLocation($locElem->getValue()); } } $title = $jobEntity->getTitle(); $templateTitle = $jobEntity->getTemplateValues()->getTitle(); if (empty($templateTitle)) { $jobEntity->getTemplateValues()->setTitle($title); } $this->repositoryService->persist($jobEntity); } } // validation $jobValid = true; $errorMessage = array(); if (empty($jobEntity->getTitle())) { $jobValid = false; $errorMessage[] = $this->translator->translate('No Title'); } if (empty($jobEntity->getLocation())) { $jobValid = false; $errorMessage[] = $this->translator->translate('No Location'); } if (empty($jobEntity->getTermsAccepted())) { $jobValid = false; $errorMessage[] = $this->translator->translate('Accept the Terms'); } $errorMessage = '<br />' . implode('<br />', $errorMessage); if ($isAjax) { if ($instanceForm instanceof SummaryForm) { $instanceForm->setRenderMode(SummaryForm::RENDER_SUMMARY); $viewHelper = 'summaryform'; } else { $viewHelper = 'form'; } $viewHelperManager = $serviceLocator->get('ViewHelperManager'); $content = $viewHelperManager->get($viewHelper)->__invoke($instanceForm); $viewModel = new JsonModel(array('content' => $content, 'valid' => $valid, 'jobvalid' => $jobValid, 'errors' => $formErrorMessages, 'errorMessage' => $errorMessage)); } else { if (isset($pageIdentifier)) { $form->disableForm(); if (array_key_exists($pageIdentifier, $pageToForm)) { foreach ($pageToForm[$pageIdentifier] as $actualFormIdentifier) { $form->enableForm($actualFormIdentifier); if ($jobEntity->isDraft()) { $actualForm = $form->get($actualFormIdentifier); if ('nameForm' != $actualFormIdentifier && $actualForm instanceof SummaryFormInterface) { $form->get($actualFormIdentifier)->setDisplayMode(SummaryFormInterface::DISPLAY_FORM); } if ('locationForm' == $actualFormIdentifier) { $locElem = $actualForm->getBaseFieldset()->get('geo-location'); if ($locElem instanceof \Geo\Form\GeoText) { $loc = $jobEntity->getLocations(); if (count($loc)) { $locElem->setValue($loc->first()); } } } } } if (!$jobEntity->isDraft()) { // Job is deployed, some changes are now disabled $form->enableAll(); } } else { throw new \RuntimeException('No form found for page ' . $pageIdentifier); } } $pageLinkNext = null; $pageLinkPrevious = null; if (0 < $pageIdentifier) { $pageLinkPrevious = $this->url()->fromRoute('lang/jobs/manage', [], ['query' => ['id' => $jobEntity->getId(), 'page' => $pageIdentifier - 1]]); } if ($pageIdentifier < count($pageToForm) - 1) { $pageLinkNext = $this->url()->fromRoute('lang/jobs/manage', [], ['query' => ['id' => $jobEntity->getId(), 'page' => $pageIdentifier + 1]]); } $completionLink = $this->url()->fromRoute('lang/jobs/completion', ['id' => $jobEntity->getId()]); $viewModel = $this->getViewModel($form); $viewModel->setVariables(array('pageLinkPrevious' => $pageLinkPrevious, 'pageLinkNext' => $pageLinkNext, 'completionLink' => $completionLink, 'page' => $pageIdentifier, 'title' => $jobEntity->title, 'job' => $jobEntity, 'summary' => 'this is what we charge you for your offer...', 'valid' => $valid, 'jobvalid' => $jobValid, 'errorMessage' => $errorMessage, 'isDraft' => $jobEntity->isDraft())); } return $viewModel; }
/** * save a Job-Post either by a regular request or by an async post (AJAX) * a mandatory parameter is the ID of the Job * in case of a regular Request you can * * parameter are arbitrary elements for defaults or programming flow * * @param array $parameter * @return null|ViewModel * @throws \RuntimeException */ protected function save() { $serviceLocator = $this->serviceLocator; $formEvents = $serviceLocator->get('Jobs/JobContainer/Events'); $user = $this->auth->getUser(); if (empty($user->info->email)) { return $this->getErrorViewModel('no-parent', array('cause' => 'noEmail')); } $userOrg = $user->getOrganization(); if (!$userOrg->hasAssociation() || $userOrg->getOrganization()->isDraft()) { return $this->getErrorViewModel('no-parent', array('cause' => 'noCompany')); } try { $jobEntity = $this->initializeJob()->get($this->params(), true); } catch (NotFoundException $e) { $this->getResponse()->setStatusCode(Response::STATUS_CODE_404); return ['message' => sprintf($this->translator->translate('Job with id "%s" not found'), $e->getId()), 'exception' => $e]; } /** @var \Zend\Http\Request $request */ $request = $this->getRequest(); $isAjax = $request->isXmlHttpRequest(); $params = $this->params(); $formIdentifier = $params->fromQuery('form'); $viewModel = null; $this->acl($jobEntity, 'edit'); if ($status = $params->fromQuery('status')) { $this->changeStatus($jobEntity, $status); } $form = $this->getFormular($jobEntity); $valid = true; $instanceForm = null; $formErrorMessages = array(); if (isset($formIdentifier) && $request->isPost()) { // at this point the form get instantiated and immediately accumulated $instanceForm = $form->getForm($formIdentifier); if (!isset($instanceForm)) { throw new \RuntimeException('No form found for "' . $formIdentifier . '"'); } // the id may be part of the postData, but it never should be altered $postData = $request->getPost(); if (isset($postData['id'])) { unset($postData['id']); } unset($postData['applyId']); $instanceForm->setData($postData); $valid = $instanceForm->isValid(); $formErrorMessages = ArrayUtils::merge($formErrorMessages, $instanceForm->getMessages()); if ($valid) { /* * @todo This is a workaround for GeoJSON data insertion * until we figured out, what we really want it to be. */ if ('general.locationForm' == $formIdentifier) { $locElem = $instanceForm->getBaseFieldset()->get('geo-location'); if ($locElem instanceof \Geo\Form\GeoText) { $loc = $locElem->getValue('entity'); $locations = $jobEntity->getLocations(); if (count($locations)) { $locations->clear(); } $locations->add($loc); $jobEntity->setLocation($locElem->getValue()); } } $title = $jobEntity->getTitle(); $templateTitle = $jobEntity->getTemplateValues()->getTitle(); if (empty($templateTitle)) { $jobEntity->getTemplateValues()->setTitle($title); } $this->repositoryService->persist($jobEntity); } } // validation $jobValid = true; $errorMessage = array(); if (empty($jobEntity->getTitle())) { $jobValid = false; $errorMessage[] = $this->translator->translate('No Title'); } if (empty($jobEntity->getLocation())) { $jobValid = false; $errorMessage[] = $this->translator->translate('No Location'); } if (empty($jobEntity->getTermsAccepted())) { $jobValid = false; $errorMessage[] = $this->translator->translate('Accept the Terms'); } $result = $formEvents->trigger('ValidateJob', $this, ['form' => $form]); foreach ($result as $messages) { if (!$messages) { continue; } if (!is_array($messages)) { $messages = [$messages]; } $errorMessage = array_merge($errorMessage, $messages); $jobValid = false; } $errorMessage = '<br />' . implode('<br />', $errorMessage); if ($isAjax) { if ($instanceForm instanceof SummaryForm) { $instanceForm->setRenderMode(SummaryForm::RENDER_SUMMARY); $viewHelper = 'summaryform'; } else { $viewHelper = 'form'; } $viewHelperManager = $serviceLocator->get('ViewHelperManager'); $content = $viewHelperManager->get($viewHelper)->__invoke($instanceForm); $viewModel = new JsonModel(array('content' => $content, 'valid' => $valid, 'jobvalid' => $jobValid, 'errors' => $formErrorMessages, 'errorMessage' => $errorMessage)); } else { if ($jobEntity->isDraft()) { $form->getForm('general.nameForm')->setDisplayMode(SummaryFormInterface::DISPLAY_FORM); $form->getForm('general.portalForm')->setDisplayMode(SummaryFormInterface::DISPLAY_FORM); $locElem = $form->getForm('general.locationForm')->setDisplayMode(SummaryFormInterface::DISPLAY_FORM)->getBaseFieldset()->get('geo-location'); if ($locElem instanceof \Geo\Form\GeoText) { $loc = $jobEntity->getLocations(); if (count($loc)) { $locElem->setValue($loc->first()); } } } else { $formEvents->trigger('DisableElements', $this, ['form' => $form, 'job' => $jobEntity]); // Job is deployed, some changes are now disabled $form->enableAll(); } $completionLink = $this->url()->fromRoute('lang/jobs/completion', ['id' => $jobEntity->getId()]); $viewModel = $this->getViewModel($form); $viewModel->setVariables(array('completionLink' => $completionLink, 'title' => $jobEntity->getTitle(), 'job' => $jobEntity, 'summary' => 'this is what we charge you for your offer...', 'valid' => $valid, 'jobvalid' => $jobValid, 'errorMessage' => $errorMessage, 'isDraft' => $jobEntity->isDraft())); } return $viewModel; }