Beispiel #1
0
 /**
  * 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;
 }