wordsonline_connector-1.0.x-dev/src/Form/UpdateForm.php
src/Form/UpdateForm.php
<?php
namespace Drupal\wordsonline_connector\Form;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Url;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Drupal\Core\Archiver\ArchiverException;
use Drupal\Core\Database\Connection;
use Drupal\Core\Messenger\Messenger;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Archiver\ArchiverManager;
use Drupal\Core\Extension\ModuleHandler;
use Drupal\Core\StringTranslation\StringTranslationTrait;
use Drupal\Core\File\FileSystemInterface;
use Psr\Log\LoggerInterface;
use Drupal\Core\File\FileUrlGenerator;
use Drupal\Core\Extension\ModuleExtensionList;
use Drupal\wordsonline_connector\WordsOnlineConst;
/**
* Form to update version.
*/
class UpdateForm extends FormBase {
use StringTranslationTrait;
const FILE_EXISTS_REPLACE = 1;
/**
* Database.
*
* @var \Drupal\Core\Database\Connection
*/
protected $database;
/**
* FileUrlGenerator.
*
* @var Drupal\Core\File\FileUrlGenerator
*/
protected $fileUrlGenerator;
/**
* ModuleExtensionList.
*
* @var Drupal\Core\Extension\ModuleExtensionList
*/
protected $moduleExtensionList;
/**
* Messenger.
*
* @var \Drupal\Core\Messenger\Messenger
*/
protected $messenger;
/**
* Archiver.
*
* @var Drupal\Core\Archiver\ArchiverManager
*/
protected $archiver;
/**
* Module handler.
*
* @var \Drupal\Core\Extension\ModuleHandler
*/
protected $moduleHandler;
/**
* The file system service.
*
* @var \Drupal\Core\File\FileSystemInterface
*/
protected $fileSystem;
/**
* The logger service.
*
* @var \Psr\Log\LoggerInterface
*/
protected $logger;
/**
* Constructor.
*
* @param \Drupal\Core\Database\Connection $database
* Database connection.
* @param \Drupal\Core\Messenger\Messenger $messenger
* Messenger.
* @param \Drupal\Core\Archiver\ArchiverManager $archiver
* Archiver manager.
* @param \Drupal\Core\Extension\ModuleHandler $moduleHandler
* Module handler.
* @param \Drupal\Core\File\FileSystemInterface $file_system
* File System.
* @param \Psr\Log\LoggerInterface $logger
* The logger.
* @param \Drupal\Core\File\FileUrlGenerator $fileUrlGenerator
* The file Url generator.
* @param \Drupal\Core\Extension\ModuleExtensionList
* The list module extension list.
*/
public function __construct(Connection $database, Messenger $messenger, ArchiverManager $archiver, ModuleHandler $moduleHandler, FileSystemInterface $file_system, LoggerInterface $logger, FileUrlGenerator $fileUrlGenerator, ModuleExtensionList $moduleExtensionList) {
$this->database = $database;
$this->messenger = $messenger;
$this->archiver = $archiver;
$this->moduleHandler = $moduleHandler;
$this->fileSystem = $file_system;
$this->logger = $logger;
$this->fileUrlGenerator = $fileUrlGenerator;
$this->moduleExtensionList = $moduleExtensionList;
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container) {
$database = $container->get('database');
$messenger = $container->get('messenger');
$archiver = $container->get('plugin.manager.archiver');
$moduleHandler = $container->get('module_handler');
$fileSystem = $container->get('file_system');
$logger = $container->get('logger.factory')
->get(WordsOnlineConst::MODULE_ID);
$fileUrlGenerator = $container->get('file_url_generator');
$moduleExtensionList = $container->get('extension.list.module');
return new static(
$database,
$messenger,
$archiver,
$moduleHandler,
$fileSystem,
$logger,
$fileUrlGenerator,
$moduleExtensionList
);
}
/**
* Get Id of form.
*
* @return string
* Return form id.
*/
public function getFormId() {
return 'wol_update_form';
}
/**
* Build the form UI.
*
* @param array $form
* Form.
* @param Drupal\Core\Form\FormStateInterface $form_state
* Form State.
*
* @return array
* Return form array.
*/
public function buildForm(array $form, FormStateInterface $form_state) {
$version = (float) (str_replace("-dev", "", \Drupal::VERSION));
if ($version >= 10.2) {
$form['new_file'] = [
'#type' => 'managed_file',
'#title' => $this->t('Update file'),
'#description' => $this->t('Allowed extensions: zip'),
'#description_display' => 'after',
'#required' => TRUE,
'#upload_location' => WordsOnlineConst::UPLOAD_FOLDER,
'#upload_validators' => [
'FileExtension' => ['extensions' =>'zip'],
],
];
} else {
$form['new_file'] = [
'#type' => 'managed_file',
'#title' => $this->t('Update file'),
'#description' => $this->t('Allowed extensions: zip'),
'#description_display' => 'after',
'#required' => TRUE,
'#upload_location' => WordsOnlineConst::UPLOAD_FOLDER,
'#upload_validators' => [
'file_validate_extensions' => ['zip'],
],
];
}
$form['#attributes']['enctype'] = 'multipart/form-data';
$form['#attached']['library'][] = 'wordsonline_connector/wordsonline';
$form['actions']['submit'] = [
'#type' => 'submit',
'#value' => $this->t('Update'),
'#name' => 'update',
];
$form_state->disableCache();
return $form;
}
/**
* Remove old version zip files.
*
* @param string $fileName
* Return file name.
*/
public function remove($fileName) {
try {
$absolute_path = $this->fileSystem->realpath(WordsOnlineConst::UPLOAD_FOLDER);
$files = glob("{$absolute_path}/*");
foreach ($files as $file) {
if (is_file($file)) {
$public_path = str_replace($absolute_path, WordsOnlineConst::UPLOAD_FOLDER, $file);
if ($public_path == $fileName) {
continue;
}
unlink($file);
$query = $this->database->delete('file_managed');
$query->condition('uri', $public_path);
$query->execute();
}
}
}
catch (Exception $e) {
$this->logger->error($e->getMessage());
}
}
/**
* Update version by replace files.
*
* @param array $form
* Form.
* @param Drupal\Core\Form\FormStateInterface $form_state
* Form state.
*/
public function update(array $form, FormStateInterface $form_state) {
try {
$field = $form_state->getUserInput();
$file = $field['new_file'];
$fids = $file['fids'];
$f_ret = $this->database->query("SELECT * FROM file_managed where fid =:fid LIMIT 1", [':fid' => $fids])->fetchAssoc();
if ($f_ret != NULL) {
$file_path = $f_ret['uri'];
$this->remove($file_path);
$module_path = $this->fileSystem->realpath($this->moduleHandler->getModule(WordsOnlineConst::MODULE_ID)->getPath());
$zip = $this->archiver->getInstance(['filepath' => $file_path]);
try {
$zip->extract($module_path);
$npath = $this->moduleExtensionList->getPath(WordsOnlineConst::MODULE_ID);
$import = $this->fileSystem->realpath($npath . '/js/languages.json');//$this->fileUrlGenerator->generateAbsoluteString($npath . '/js/languages.json');
$content = file_get_contents($import);
$langs = json_decode($content);
foreach ($langs as $lang) {
$results = $this->database
->query(
WordsOnlineConst::GET_WORDSONLINE_SUPPORT_LANGUAGE_BY_CODE_QUERY,
[":code" => (string) $lang->code]
)
->fetchAssoc();
if ($results != NULL) {
$this->database
->update(WordsOnlineConst::LANGUAGE_JOB_TABLE)
->condition("code", $lang->code)
->fields(
[
'code' => $lang->code,
'lang_name' => $lang->lang_name,
'wol_code' => $lang->wol_code
]
)
->execute();
} else {
$this->database->insert(WordsOnlineConst::LANGUAGE_JOB_TABLE)
->fields(['code', 'lang_name', 'wol_code'])
->values([
'code' => $lang->code,
'lang_name' => $lang->lang_name,
'wol_code' => $lang->wol_code
])
->execute();
}
}
}
catch (ArchiverException $exception) {
watchdog_exception(WordsOnlineConst::MODULE_ID, $exception);
$this->messenger->addMessage("Update error");
}
}
$url = new Url('wordsonline_connector.wol_update', [], []);
$url->setAbsolute();
$response = new RedirectResponse($url->toString());
$response->send();
$this->messenger->addMessage("Update successful");
}
catch (Exception $e) {
$this->logger->error($e->getMessage());
$url = new Url('wordsonline_connector.wol_update', [], []);
$url->setAbsolute();
$response = new RedirectResponse($url->toString());
$response->send();
$this->messenger->addMessage("Update error");
return;
}
}
/**
* Validate the form.
*
* @param array $form
* Form.
* @param Drupal\Core\Form\FormStateInterface $form_state
* Form state.
*/
public function validateForm(array &$form, FormStateInterface $form_state) {
}
/**
* Submit the form.
*
* @param array $form
* Form.
* @param Drupal\Core\Form\FormStateInterface $form_state
* Form state.
*/
public function submitForm(array &$form, FormStateInterface $form_state) {
$this->update($form, $form_state);
}
}
