cloudwords-8.x-1.x-dev/src/Form/CloudwordsProjectCreateForm.php
src/Form/CloudwordsProjectCreateForm.php
<?php
namespace Drupal\cloudwords\Form;
use Drupal\cloudwords\CloudwordsProject;
use Drupal\cloudwords\CloudwordsProjectInterface;
use Drupal\cloudwords\CloudwordsLanguage;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Render\Element;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Drupal\Core\Url;
use Drupal\Core\StreamWrapper\PrivateStream;
/**
* Class CloudwordsProjectCreateForm.
*
* @package Drupal\cloudwords\Form
*/
class CloudwordsProjectCreateForm extends FormBase {
/**
* {@inheritdoc}
*/
public function getFormId() {
return 'cloudwords_create_project_form';
}
/**
* {@inheritdoc}
*/
public function buildForm(array $form, FormStateInterface $form_state) {
// @todo check that API key is set property and client can init - don't WSOD
$client = cloudwords_get_api_client();
$departments = $client->get_departments();
$private_files = PrivateStream::basePath();
$disabled = false;
if (!$client->getAuthToken() || strlen($client->getAuthToken()) < 11) {
drupal_set_message($this->t('Cloudwords Authorization Token must be set in the Cloudwords module settings <a href="@url">here.</a>', ['@url' => \Drupal\Core\Url::fromRoute('cloudwords.settings_form')->toString()]), 'error');
$disabled = true;
}
if (!$private_files) {
drupal_set_message($this->t('The <a href="@url">private file system</a> path must be configured before you can create a project.', ['@url' => \Drupal\Core\Url::fromRoute('system.file_system_settings')->toString()]), 'error');
$disabled = true;
}
unset($_SESSION['cloudwords_project']);
$default_value = '';
// if (!empty($form_state['project'])) {
// $default_value = $form_state['project']->getName();
// }
// elseif (!empty($_SESSION['cloudwords_project'])) {
// $default_value = $_SESSION['cloudwords_project']->getName();
// $form_state['project'] = $_SESSION['cloudwords_project'];
// }
//
$form['project_name'] = [
'#type' => 'textfield',
'#title' => $this->t('Name'),
'#size' => 50,
'#maxlength' => 50,
'#required' => TRUE,
'#description' => $this->t('What do you want to call this project?'),
'#default_value' => $default_value,
'#disabled' => $disabled,
];
if($departments){
$options = [];
foreach($departments as $department){
$options[$department['id']] = $department['name'];
}
$form['department'] = [
'#type' => 'select',
'#title' => $this->t('Department'),
'#required' => TRUE,
'#description' => $this->t('Select a department'),
'#options' => $options,
];
}
$form['reference'] = [
'#type' => 'file',
'#title' => $this->t('Project reference materials'),
'#description' => $this->t('Upload additional reference materials as a zip file.'),
'#file_info' => NULL,
'#size' => 10,
'#disabled' => $disabled,
];
$languages = cloudwords_language_list();
// $info = cloudwords_translatable_info();
$rows = [];
$map = [];
$added = [];
$uid = \Drupal::currentUser()->id();
if ($cache = cloudwords_project_user_get($uid)) {
$translatables = \Drupal::database()->select('cloudwords_translatable', 'ct')
->fields('ct', ['id'])
->condition('id', $cache, 'IN')
->execute()
->fetchCol();
$translatables = cloudwords_translatable_load_multiple($translatables);
// @todo use proper getters on translatable
// Map each object to a list of languages.
foreach ($translatables as $translatable) {
$t_type = $translatable->get('type')->value;
$t_objectid = $translatable->getObjectId();
$t_language = $translatable->get('language')->value;
//$type_info = $info[$t_type];
$map[$t_type][$t_objectid][] = $languages[$t_language];
}
foreach ($translatables as $translatable) {
$t_type = $translatable->get('type')->value;
$t_objectid = $translatable->getObjectId();
$t_language = $translatable->get('language')->value;
if (!isset($added[$t_type][$t_objectid])) {
//$type_info = $info[$t_type];
// Gather target languages. Wrap every 4 languages.
$langs = [];
$key = 0;
foreach ($map[$t_type][$t_objectid] as $delta => $lang) {
if ($delta % 4 === 0) {
$key++;
}
$langs[$key][] = $lang;
}
foreach ($langs as $delta => $lang) {
$langs[$delta] = implode(', ', $langs[$delta]);
}
$targetLanguage = implode('<br />', $langs);
// remove
$translatable->getData();
// end remove
// Build row.
$rows[] = [
$translatable->getEditLink(),
$targetLanguage,
$translatable->getTextGroupLabel(),
$translatable->getTypeLabel(),
$translatable->getTranslationStatusLabel(),
];
// Mark that we've added this id.
$added[$t_type][$t_objectid] = TRUE;
}
}
}
$header = [
$this->t('Source name'),
$this->t('Language'),
$this->t('Group'),
$this->t('Type'),
$this->t('Translation exists'),
];
if ($rows) {
$form['submit'] = [
'#type' => 'submit',
'#value' => $this->t('Submit'),
'#disabled' => $disabled,
];
}
$form['table_wrapper'] = [
'#type' => 'fieldset',
'#title' => $this->t('Review content'),
];
$form['table_wrapper']['table'] = [
'#theme' => 'table',
'#header' => $header,
'#rows' => $rows,
'#attributes' => ['id' => 'cloudwords-project-table'],
'#empty' => $this->t('Nothing added to project.'),
];
// $form['pager'] = array(
// '#theme' => 'pager',
// );
if ($rows) {
$form['actions'] = ['#type' => 'actions'];
$form['actions']['submit'] = [
'#type' => 'submit',
'#value' => $this->t('Submit'),
'#disabled' => $disabled,
];
}
$form['submit'] = [
'#type' => 'submit',
'#value' => $this->t('Submit'),
];
return $form;
}
/**
* {@inheritdoc}
*/
public function validateForm(array &$form, FormStateInterface $form_state) {
if(empty(\Drupal::config('cloudwords.settings')->get('cloudwords_auth_token'))){
$form_state->setErrorByName('submit', 'No Cloudwords API Authorization Token set.');
}
$project_name = trim($form_state->getValue('project_name'));
if (( strpos($project_name, '/') !== FALSE)
|| (strpos($project_name, '\\') !== FALSE) ) {
$form_state->setErrorByName('project_name', $this->t('The project name cannot contain slashes.'));
}
$query = \Drupal::database()->query("SELECT name FROM {cloudwords_project} WHERE name = :name", array(':name' => $project_name));
$result = $query->fetchObject();
if (isset($result->name)) {
$form_state->setErrorByName('project_name', $this->t('The project name already exists. Please create a unique project name.'));
}
//@todo need to prompt that a private directory is required before getting here
$upload_dir = 'private://cloudwords/reference_material';
if (!file_prepare_directory($upload_dir, FILE_CREATE_DIRECTORY | FILE_MODIFY_PERMISSIONS)) {
$form_state->setErrorByName('reference', $this->t('Unable to create the upload directory.'));
}
// If there is a file uploaded, save it.
if (!empty($_FILES['files']['name']['reference'])) {
if (!($file = file_save_upload('reference', ['file_validate_extensions' => ['zip']], $upload_dir))) {
$form_state->setErrorByName('reference', $this->t('Please upload a zip file.'));
}
else {
$form_state->set('reference_material', $file);
}
}
parent::validateForm($form, $form_state);
}
/**
* {@inheritdoc}
*/
public function submitForm(array &$form, FormStateInterface $form_state) {
$in_cron = false;
$project = FALSE;
$client = cloudwords_get_api_client();
try {
if ($form_state->get('project') == null) {
$error_message = 'There was an error creating the project. Please check that your <a href="/admin/config/services/cloudwords">settings</a> are correct.';
$params = [
'name' => $form_state->getValue('project_name'),
'notes' => 'The content for this project has been generated by the Cloudwords for Drupal integration. Please read the following to understand how to properly translate this content: https://cloudwords.zendesk.com/entries/23056462',
'sourceLanguage' => 'en',
'projectContentType' => 'Drupal',
'uiFeatures' => [
'change_source_language' => false,
'change_target_languages' => false,
'change_source_material' => true,
'clone_project' => false,
],
];
if($form_state->getValue('department') !== null){
$params['department'] = ['id'=> (int) $form_state->getValue('department')];
}
$project = $client->create_project($params);
} else {
$project = $form_state->get('project');
}
if ($form_state->get('reference_material') !== null) {
$error_message = 'There was a problem uploading the reference material. Please try again.';
$reference_material = $form_state->get('reference_material');
foreach($reference_material as $file){
$client->upload_project_reference($project->getId(), \Drupal::service("file_system")->realpath($file->getFileUri()));
}
}
}
catch (CloudwordsApiException $e) {
\Drupal::logger('cloudwords')->notice($this->t($e->__toString()), []);
drupal_set_message($this->t($error_message), 'error');
$form_state['rebuild'] = TRUE;
// Stash the project so that we can re-use it.
$form_state['project'] = $project;
return;
}
$_SESSION['cloudwords_project'] = $project;
$project_info = [
'id' => $project->getId(),
'name' => $project->getName(),
'status' => $project->getStatus()->getCode(),
'user_id' => \Drupal::currentUser()->id(),
'created' => REQUEST_TIME,
'source_language' => $project->getSourceLanguage()->getLanguageCode(),
];
if (\Drupal::database()->query("SELECT id FROM {cloudwords_project} WHERE id = :id", [':id' => $project->getId()])->fetchField()) {
\Drupal::database()->merge('cloudwords_project')->fields($project_info)->key(['id'])->execute();
}
else {
\Drupal::database()->insert('cloudwords_project')->fields($project_info)->execute();
}
\Drupal::database()->delete('cloudwords_content')
->condition('pid', $project->getId())
->execute();
\Drupal::database()->delete('cloudwords_project_language')
->condition('pid', $project->getId())
->execute();
$batch = [
'title' => $this->t('Building project ...'),
'operations' => [],
'init_message' => $this->t('Loading items to be processed'),
'progress_message' => $this->t('Saving items as XML.'),
'error_message' => $this->t('An error occurred during processing.'),
'finished' => [$this, 'cloudwords_project_finished'],
];
$uid = \Drupal::currentUser()->id();
if($form_state->get('ctids') !== null){
$cache = $form_state->get('ctids');
}else if($ctids = cloudwords_project_user_get($uid)){
$cache = $ctids;
}
if ($cache) {
$batch['operations'][] = [[$this, 'cloudwords_project_start'], [$project, $in_cron]];
foreach (array_chunk($cache, CLOUDWORDS_BATCH_SIZE) as $ctids) {
$batch['operations'][] = [[$this, 'cloudwords_project_create_batch_serialize'], [$ctids, $project]];
}
$batch['operations'][] = [[$this, 'cloudwords_project_create_finilize_files'], [$project]];
$batch['operations'][] = [[$this, 'cloudwords_project_create_update_target_languages'], [$project]];
$batch['operations'][] = [[$this, 'cloudwords_project_create_upload_zip'], [$project]];
$batch['operations'][] = [[$this, 'cloudwords_project_create_update_reviewer_instructions'], [$project]];
//@todo enable preview bundles for OneReview
if(\Drupal::config('cloudwords.settings')->get('cloudwords_preview_bundle_enabled') != FALSE) {
foreach (array_chunk($cache, CLOUDWORDS_BATCH_SIZE) as $ctids) {
foreach($ctids as $ctid){
$batch['operations'][] = [[$this, 'cloudwords_project_create_source_preview_bundle'], [$project, $ctid]];
}
}
foreach (array_chunk($cache, CLOUDWORDS_BATCH_SIZE) as $ctids) {
foreach($ctids as $ctid){
$batch['operations'][] = [[$this, 'cloudwords_project_upload_source_preview_bundle'], [$project, $ctid]];
}
}
}
$batch['operations'][] = [[$this, 'cloudwords_project_create_project_reference_materials'], [$project]];
}
batch_set($batch);
}
/**
* Creates a project via rest call.
*/
public static function cloudwords_project_start(\Drupal\cloudwords\CloudwordsDrupalProject $project, $in_cron, &$context) {
$context['results']['in_cron'] = $in_cron;
// Prepare directory.
// @todo DO NOT USE PUBLIC DIRECTORY for projects
$destination = 'private://cloudwords/projects/' . $project->getName();
if (!file_prepare_directory($destination, FILE_CREATE_DIRECTORY | FILE_MODIFY_PERMISSIONS)) {
drupal_set_message(t('Files directory either cannot be created or is not writable.'), 'error');
throw new Exception(t('Files directory either cannot be created or is not writable.'));
}
}
public static function _cloudwords_file_name($project, $translatable) {
return $project->getName() . '-' .
$project->getSourceLanguage()->getLanguageCode() . '-' .
$translatable->cloudwordsLanguage() . '-' .
$translatable->getTextGroup() . '-' .
$translatable->getObjectId();
}
/**
* Callback for the cloudwords_project_create action.
*/
public static function cloudwords_project_create_batch_serialize($ctids, \Drupal\cloudwords\CloudwordsDrupalProject $project, &$context) {
$translatables = cloudwords_translatable_load_multiple($ctids);
//@todo turn serializer into service
module_load_include('inc', 'cloudwords', 'includes/cloudwords.serializer');
$serializer = new \CloudwordsFileformatXLIFF();
$destination = 'private://cloudwords/projects/' . $project->getName();
if (!isset($context['results']['files'])) {
$context['results']['files'] = [];
}
if (!isset($context['results']['translable_bundles'])) {
$context['results']['translable_bundles'] = [];
}
$file_storage =& $context['results']['files'];
foreach ($translatables as $translatable) {
$language = $translatable->getLanguage();
// Find a file to append to.
// First run.
if (!isset($file_storage[$language][$translatable->getObjectId()])) {
$file = $destination . '/' . \Drupal\cloudwords\Form\CloudwordsProjectCreateForm::_cloudwords_file_name($project, $translatable) . '-1.' . CLOUDWORDS_XLIFF_EXTENSION;
file_put_contents($file, $serializer->beginExport($project, $translatable));
$file_storage[$language][$translatable->getObjectId()][] = $file;
}
else {
$i = 1;
$existing_file = FALSE;
foreach ($file_storage[$language][$translatable->getObjectId()] as $file) {
// If the file is smaller than 1 megabyte.
if (filesize($file) < (1048576 * \Drupal::config('cloudwords.settings')->get('cloudwords_upload_file_size'))) {
$existing_file = $file;
break;
}
$i++;
}
if (!$existing_file) {
// The existing files are too large. We need to create a new one.
$file = $destination . '/' . \Drupal\cloudwords\Form\CloudwordsProjectCreateForm::_cloudwords_file_name($project, $translatable) . '-' . $i . '.' . CLOUDWORDS_XLIFF_EXTENSION;
file_put_contents($file, $serializer->beginExport($project, $translatable));
$file_storage[$language][$translatable->objectid][] = $file;
}
}
// Save our content to project map.
$map = array(
'pid' => $project->getId(),
'ctid' => $translatable->getId(),
);
\Drupal::database()->insert('cloudwords_content')->fields($map)->execute();
// Indicate that this target language is in use.
$context['results']['target_languages'][$translatable->getLanguage()] = $translatable->cloudwordsLanguage();
// Append this translatable.
$output = $serializer->exportTranslatable($translatable);
file_put_contents($file, $output, FILE_APPEND | LOCK_EX);
// Mark this translatable as "in project".
$translatable->status = CLOUDWORDS_QUEUE_IN_PROJECT;
$translatable->save();
$context['results']['translable_bundles'][] = ['file_name' => $file, 'translatable' => $translatable];
// Count the number processed.
if (empty($context['results']['processed'])) {
$context['results']['processed'] = 0;
$context['results']['project'] = $project;
}
$context['results']['processed']++;
}
}
public static function cloudwords_project_create_finilize_files(\Drupal\cloudwords\CloudwordsDrupalProject $project, &$context) {
$serializer = new \Drupal\cloudwords\CloudwordsFileformatXLIFF();
$destination = 'private://cloudwords/projects/' . $project->getName();
// Find our xml files.
$valid_files = [];
if ($items = @scandir($destination)) {
foreach ($items as $item) {
if (is_file("$destination/$item") && strpos($item, '.') !== 0) {
$valid_files[] = "$destination/$item";
}
}
}
foreach ($valid_files as $file) {
file_put_contents($file, $serializer->endExport($project), FILE_APPEND | LOCK_EX);
}
}
/**
* Batch callback to update a project's target language.
*/
public static function cloudwords_project_create_update_target_languages(\Drupal\cloudwords\CloudwordsDrupalProject $project, &$context) {
// Update the target languages.
// @todo handle if the source language is not english
$params = [
'id' => $project->getId(),
'name' => $project->getName(),
'targetLanguages' => array_values($context['results']['target_languages']),
'sourceLanguage' => 'en',
];
try {
$project = cloudwords_get_api_client()->update_project($params);
foreach($project->getTargetLanguages() as $language) {
$project->setLanguageImportStatus($language, CLOUDWORDS_LANGUAGE_NOT_IMPORTED);
}
}
catch (Exception $e) {
drupal_set_message(t($e->getMessage()), 'error');
throw $e;
}
}
public static function cloudwords_project_create_upload_zip(\Drupal\cloudwords\CloudwordsDrupalProject $project, &$context) {
// Create zip archive.
$archiver = new \ZipArchive();
$zip_file = \Drupal::service("file_system")->realpath('private://cloudwords/projects/' . $project->getName() . '.zip');
$destination = 'private://cloudwords/projects/' . $project->getName();
if ($archiver->open($zip_file, \ZIPARCHIVE::CREATE || \ZIPARCHIVE::OVERWRITE) !== TRUE) {
return FALSE;
}
// Find our xml files.
$valid_files = [];
if ($items = @scandir($destination)) {
foreach ($items as $item) {
if (is_file("$destination/$item") && strpos($item, '.') !== 0) {
$valid_files[] = "$destination/$item";
}
}
}
foreach ($valid_files as $file) {
$archiver->addFromString(basename($file), file_get_contents($file));
}
$archiver->close();
// Upload the source materials zip archive.
try{
cloudwords_get_api_client()->upload_project_source($project->getId(), $zip_file);
}
catch (Exception $e) {
drupal_set_message(t($e->getMessage()), 'error');
throw $e;
}
$context['results']['project'] = $project;
}
/**
* Batch callback to update a project's reviewer instructions.
*/
public static function cloudwords_project_create_update_reviewer_instructions(\Drupal\cloudwords\CloudwordsDrupalProject $project, &$context) {
global $base_url;
$language_list = [];
foreach(\Drupal::languageManager()->getlanguages() as $k => $v){
$language_list[$k] = $v->getName();
}
foreach($context['results']['target_languages'] as $target_language_drupal => $target_language_cloudwords){
//text for target langauage
$language = $language_list[$target_language_drupal];
$project_url = $base_url.'/admin/structure/cloudwords/project/'.$project->getId();
$content = 'To review the ' . $language . ' translation, please follow these steps:
1. Go to the project page in Drupal: ' . $project_url . '
2. For ' . $language . ', click Import.
';
try {
cloudwords_get_api_client()->create_reviewer_instruction($project->getId(), $target_language_cloudwords, $content);
}
catch (Exception $e) {
drupal_set_message(t($e->getMessage()), 'error');
throw $e;
}
}
}
/**
* Batch callback to create archives for a project's in context preview.
*/
public static function cloudwords_project_create_source_preview_bundle(\Drupal\cloudwords\CloudwordsDrupalProject $project, $ctid, &$context) {
if(!isset($context['results']['translable_bundles'])){
return;
}
if (!isset($context['results']['source_bundle_documents'])) {
$context['results']['source_bundle_documents'] = [];
}
if (!isset($context['results']['source_bundle_archives'])) {
$context['results']['source_bundle_archives'] = [];
}
// Get source bundles to map
$source_bundles = cloudwords_get_api_client()->get_source_bundle($project->getId());
foreach($context['results']['translable_bundles'] as $translable_bundle){
//get source
if($translable_bundle['translatable']->getType() == 'node' && $translable_bundle['translatable']->getId() == $ctid){
$file_name = basename($translable_bundle['file_name']);
$file_name = str_replace(' ','_',$file_name);
$source_bundle = _cloudwords_get_bundle_by_filename($file_name, $source_bundles);
$entity = \Drupal::entityTypeManager()->getStorage($translable_bundle['translatable']->getType())->load($translable_bundle['translatable']->getObjectId());
$cloudwords_base_url = \Drupal::config('cloudwords.settings')->get('cloudwords_drupal_base_url');
$source_path = $entity->toUrl('canonical', ['absolute' => TRUE, 'base_url' => $cloudwords_base_url])->toString();
$language_code = $entity->language()->getId();
// ensure source entity is published and accessible by preview generator
if($entity->isPublished()){
//only create the archive once
if(!isset($context['results']['source_bundle_documents'][$entity->id()])){
$scraper = new \Drupal\cloudwords\CloudwordsPreviewScraper($project->getName(), $language_code, $entity->id(), $source_path);
$zip_file_path = $scraper->get_zip_file();
//$zip_file_path = cloudwords_preview_generate_archive_from_path($project->getName(), $language_code, $node->nid, $url);
$context['results']['source_bundle_documents'][$entity->id()] = $zip_file_path;
}else{
$zip_file_path = $context['results']['source_bundle_documents'][$entity->id()];
}
$context['results']['source_bundle_archives'][$ctid] = array('document_id' => $source_bundle['id'], 'zip_file_path' => $zip_file_path);
}else{
drupal_set_message(t('Skipped source preview as source entity is unpublished'), 'notice');
}
}
}
//$context['results']['project'] = $project;
}
/**
* Batch callback to upload archives for a project's in context preview.
*/
public static function cloudwords_project_upload_source_preview_bundle(\Drupal\cloudwords\CloudwordsDrupalProject $project, $ctid, &$context) {
if(isset($context['results']['source_bundle_archives'][$ctid])){
$document_id = $context['results']['source_bundle_archives'][$ctid]['document_id'];
$zip_file_path = $context['results']['source_bundle_archives'][$ctid]['zip_file_path'];
try{
cloudwords_get_api_client()->upload_source_preview_bundle($project->getId(), $document_id, $zip_file_path);
}
catch (Exception $e) {
drupal_set_message(t($e->getMessage()), 'error');
\Drupal::logger('cloudwords')->notice(t($e->__toString()), []);
return;
}
}
}
/**
* Batch callback to add automatically generated reference materials
*/
public static function cloudwords_project_create_project_reference_materials(\Drupal\cloudwords\CloudwordsDrupalProject $project, &$context) {
if (!isset($context['results']['translable_bundles'])) {
return;
}
$lines = array();
foreach($context['results']['translable_bundles'] as $translable_bundle){
$objectid = $translable_bundle['translatable']->getObjectId();
$language = $translable_bundle['translatable']->getLanguage();
$textgroup = $translable_bundle['translatable']->getTextGroup();
$i = $objectid.$language;
$file_name = explode('/', $translable_bundle['file_name']);
// @todo get the url of the object id rather than putting together string.
$lines[$i] = [
$translable_bundle['translatable']->getName(),
end($file_name),
$language.'/'.$textgroup.'/'.$objectid
];
}
$file_content = 'label,filename,url'. PHP_EOL;
foreach($lines as $line){
$file_content .= implode(',', $line). PHP_EOL;
}
$upload_dir = 'private://cloudwords/reference_material/';
$manifest_file_path = $upload_dir.'/'.$project->getName().'-manifest';
$archiver = new \ZipArchive();
$zip_file = \Drupal::service("file_system")->realpath($manifest_file_path . '.zip');
if ($archiver->open($zip_file, \ZIPARCHIVE::CREATE || \ZIPARCHIVE::OVERWRITE) !== TRUE) {
return FALSE;
}
//$archiver->addFromString($project->getName().'-manifest.csv', file_get_contents($manifest_file_path.'.csv'));
$archiver->addFromString($project->getName().'-manifest.csv', $file_content);
$archiver->close();
$client = cloudwords_get_api_client();
$client->upload_project_reference($project->getId(), \Drupal::service("file_system")->realpath($manifest_file_path . '.zip'));
}
/**
* Finished callback.
*/
public static function cloudwords_project_finished($success, $results, $operations, $time) {
// @todo to finish
if ($success == "block") {
$message = \Drupal::translation()->formatPlural($results['processed'],
'Uploaded %count item.',
'Uploaded %count items.',
['%count' => $results['processed']]
);
drupal_set_message($message);
unset($_SESSION['cloudwords_project']);
//$user = \Drupal::currentUser();
\Drupal::database()->update('cloudwords_translatable')
->condition('user_id', \Drupal::currentUser()->id())
->fields(array(
'user_id' => 0,
))
->execute();
if ($results['in_cron'] == false) {
return new RedirectResponse(Url::fromRoute('cloudwords.cloudwords_project_overview_form', ['cloudwords_project' => $results['project']->getId()], ['absolute' => TRUE])->toString());
}
}
else {
return new RedirectResponse(Url::fromRoute('cloudwords.cloudwords_project_overview_form', ['cloudwords_project' => $results['project']->getId()], ['absolute' => TRUE])->toString());
}
}
}
