cforge-2.0.x-dev/src/Setup.php
src/Setup.php
<?php
namespace Drupal\cforge;
use Drupal\mcapi\Entity\Currency;
use Drupal\taxonomy\Entity\Term;
use Drupal\taxonomy\Entity\Vocabulary;
use Drupal\field\Entity\FieldConfig;
use Drupal\Core\Entity\Entity\EntityFormDisplay;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Locale\CountryManagerInterface;
use Drupal\Core\Extension\ModuleInstallerInterface;
use Drupal\Core\Extension\ExtensionDiscovery;
use Drupal\Core\Extension\ExtensionList;
use Drupal\Core\Extension\ModuleHandler;
use Drupal\Core\Url;
use Drupal\Core\Utility\LinkGeneratorInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
ini_set('max_execution_time', 150);
/**
* Configuration options for each flavour.
*
*/
class Setup extends FormBase {
/**
* The site's default country
* @var string
*/
private $country;
/**
* @var CountryManagerInterface
*/
private $countryManager;
/**
* @var ModuleInstallerInterface
*/
private $installer;
/**
* @var LinkGeneratorInterface
*/
protected $linkGenerator;
/**
* @var EntityTypeManagerInterface
*/
private $entityTypeManager;
/**
* @var \Drupal\Core\Extension\ExtensionList
*/
private $extensionList;
/**
* @var
*/
private $formBuilder;
/**
* @var
*/
private $defaultLanguage;
/**
* @var
*/
private $moduleHandler;
/**
* @var ExtensionDiscovery
*/
private $extensionDiscovery;
/**
* @param ModuleInstallerInterface $module_installer
* @param LinkGeneratorInterface $link_generator
* @param EntityTypeManagerInterface $entity_type_manager
* @param ExtensionList $extension_list
* @param type $form_builder
* @param type $language_manager
* @param ModuleHandler $module_handler
* @param CountryManagerInterface $country_manager
*/
public function __construct(ModuleInstallerInterface $module_installer, LinkGeneratorInterface $link_generator, EntityTypeManagerInterface $entity_type_manager, ExtensionList $extension_list, $form_builder, $language_manager, ModuleHandler $module_handler, CountryManagerInterface $country_manager) {
$this->installer = $module_installer;
$this->linkGenerator = $link_generator;
$this->entityTypeManager = $entity_type_manager;
$this->extensionList = $extension_list;
$this->formBuilder = $form_builder;
$this->defaultLanguage = $language_manager->getDefaultLanguage();
$this->moduleHandler = $module_handler;
$this->extensionDiscovery = new ExtensionDiscovery(\Drupal::root());
$this->countryManager = $country_manager;
$this->country = $this->config('system.date')->get('country.default');
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container) {
return new static(
$container->get('module_installer'),
$container->get('link_generator'),
$container->get('entity_type.manager'),
$container->get('extension.list.module'),
$container->get('form_builder'),
$container->get('language_manager'),
$container->get('module_handler'),
$container->get('country_manager'),
);
}
/**
* {@inheritdoc}
*/
public function getFormId() {
return 'cforge_setup_form';
}
/**
* {@inheritdoc}
*/
public function buildForm(array $form, FormStateInterface $form_state) {
// @todo move this to cf_hosted module and put dependencies in composer.json
$form['migrate'] = [
'#type' => 'submit',
'#value' => 'Skip setup and migrate from Drupal 7',
'#weight' => 0,
'#submit' => ['::migration']
];
$form['features'] = [
// Hope that yields the current language.
'#title' => (string) t('Hamlets features'),
'#type' => 'checkboxes',
'#options' => [],
// Everything enabled by default.
'#default_value' => [],
'#weight' => 1,
];
foreach ($this->extensionList->getList() as $module_name => $extension) {
$info = $extension->info;
if (@$info['project'] == 'cforge' and $module_name != 'cforge_import') {
if (!$this->moduleHandler->moduleExists($module_name)) {
$form['features']['#options'][$module_name] = $this->t($info['name']);
$form['features']['#default_value'][] = $module_name;// all Checked by default
$form['features'][$module_name]['#description'] = $this->t($info['description']);
//$form['features'][$module_name]['#default_value'] = 1;
}
}
}
$form['data_content'] = [
'#title' => $this->t('Prepare the site with'),
'#type' => 'radios',
'#options' => [
'none' => t('No content'),
'import' => $this->t('CSV Import Tools'),
],
'#default_value' => 'none',
'#weight' => 3,
'#required' => TRUE,
];
$alt_login_form = $this->formBuilder->getForm('Drupal\alt_login\Settings');
$form['aliases'] = [
'#title' => $alt_login_form['aliases']['#title'],
'#type' => 'select',
'#options' => $alt_login_form['aliases']['#options'],
'#default_value' => 'address_name',
'#weight' => 5
];
$form['default_categories'] = array(
'#title' => $this->t('Preload ad categories'),
'#description' => $this->t('Can be modified later'),
'#type' => 'radios',
'#options' => [
0 => $this->t('- None -'),
'en' => 'English LETS',
'fr' => 'French',
'be' => 'SEL Belgique, (2 Tier]'
],
'#default_value' => $this->defaultLanguage->getId(),
'#weight' => 6,
'#states' => [
'visible' => [
':input[name=data_content]' => ['value' => 'none'],
],
],
);
$form['site_default_country'] = [
'#type' => 'select',
'#title' => $this->t('Country'),
'#empty_value' => '',
'#default_value' => $this->country,
'#options' => $this->countryManager->getList(),
'#weight' => 7,
'#required' => TRUE,
'#access' => empty($this->country)
];
$form['currency_type'] = [
'#title' => $this->t('Main currency type'),
'#type' => 'radios',
'#options' => [
'hours' => $this->t('Hours'),
'other' => $this->t('Other'),
],
'#default_value' => 'hours',
'#required' => TRUE,
'#weight' => 8,
];
$form['currency_name'] = [
'#title' => $this->t('Currency name'),
'#description' => $this->t('Use the plural'),
'#type' => 'textfield',
'#placeholder' => $this->t('Units'),
'#weight' => 9,
'#states' => [
'visible' => [
':input[name="currency_type"]' => ['value' => 'other'],
],
],
];
$form['direction'] = [
'#title' => $this->t('Default transaction direction'),
'#type' => 'radios',
'#options' => [
'credit' => $this->t('Credit (push payment)'),
'bill' => $this->t('Bill (pull payment)'),
'both' => $this->t('Both (may be confusing for some users)')
],
'#default_value' => 'credit',
'#weight' => 10,
];
$form['devel'] = [
'#title' => t('Devel modules'),
'#type' => 'checkbox',
'#weight'=> 15
];
$form['submit'] = [
'#type' => 'submit',
'#value' => 'Initiate Hamlets',
'#weight' => 20,
];
return $form;
}
public function submitForm(array &$form, FormStateInterface $form_state) {
$this->moduleHandler->loadInclude('cforge', 'install');
$available_modules = array_keys($this->extensionDiscovery->scan('module'));
foreach($available_modules as $module) {
if (substr($module, 0, 7) == 'cforge_') {
module_set_weight($module, 101); //This doesn't seem to work anyway
}
}
if ($form_state->getValue('direction') == 'credit') {
if ($display = EntityFormDisplay::load('mcapi_transaction.mcapi_transaction.bill')) {
$display->setThirdPartySetting('mcapi_forms', 'permission', 'manage mcapi')->save();
}
}
elseif ($form_state->getValue('direction') == 'bill') {
if ($display = EntityFormDisplay::load('mcapi_transaction.mcapi_transaction.credit')) {
$display->setThirdPartySetting('mcapi_forms', 'permission', 'manage mcapi')->save();
}
}
if ($form_state->getValue('default_categories')) {
$terms = $this->entityTypeManager
->getStorage('taxonomy_term')
->loadByProperties(['vid' => SMALLAD_CATEGORIES_VID]);
// Delete any existing terms in the vocab (one is installed by default)
foreach ($terms as $term) {
$term->delete();
}
$vocab = Vocabulary::load(SMALLAD_CATEGORIES_VID);
// Now import the terms into the vocab.
$get_terms = 'vocab_'.$form_state->getValue('default_categories');
$last_term = $this->vocabImportRecursive($vocab, $this->$get_terms());
$vocab->save();
FieldConfig::load('mcapi_transaction.mcapi_transaction.category')
->set('default_value', [['target_uuid' => $last_term->uuid()]])
->save();
}
$country_code = $form_state->getValue('site_default_country') ?? $this->config('system.date')->get('country.default');
self::setDefaultCountry($country_code);
// Set up the currency by deleting the others.
if ($c = Currency::load('veur')) {
$c->delete();
}
if ($form_state->getValue('currency_type') == 'hours') {
if ($c = Currency::load('cc')) {
$c->delete();
}
}
if ($form_state->getValue('currency_type') == 'cc') {
if ($c = Currency::load('hhrs')) {
$c->delete();
}
}
if ($form_state->getvalue('aliases') == 'uid') {
$alt_login_conf = $this->configfactory()->getEditable('alt_login.settings')
->set('display', '[user:address:given_name] [user:address:family_name] ([user:uid])')
->save();
}
$modules = array_filter($form_state->getValue('features'));
if ($form_state->getValue('data_content') == 'import') {
$modules[] = 'cforge_import';
}
if ($form_state->getValue('devel')) {
$modules = array_merge($modules, [
'dblog',
'field_ui',
'views_ui',
'contextual',
'admin_toolbar_tools',
'config'
]);
}
$this->installer->install($modules);
\Drupal::moduleHandler()->loadInclude('cforge', 'install');
cforge_import_content('cforge', 'new');
cforge_import_content('cforge', 'all');
// Set the publiconly on all the page nodes.
$nids = \Drupal::entityQuery('node')->accessCheck(FALSE)
->condition('type', 'page')
->condition('nid', 1, '<>') // Exclude privacy policy
->execute();
foreach ($nids as $nid) {
cforge_node_set_publiconly($nid, TRUE);
}
$form_state->setRedirectUrl(
Url::fromUserInput($this->config('cforge.settings')->get('member_frontpage'))
);
}
/**
* Submit callback
*/
public function migration(array &$form, FormStateInterface $form_state) {
$modules = [
'migrate_drupal_ui',
'migrate_tools',
'options'
];
$this->installer->install($modules);
$form_state->setRedirectUrl(Url::fromUserInput('/upgrade'));
}
/**
* Import the terms in a vocabulary or a level of a vocab.
*/
private function vocabImportRecursive(Vocabulary $vocab, array $termArray, $parent = 0) : \Drupal\taxonomy\Entity\Term{
$w = $hierarchy = 0;
foreach ($termArray as $term_name => $term_children) {
$props = [
'name' => $term_name,
'weight' => $w++,
'vid' => $vocab->id(),
'parent' => $parent,
'format' => 'plain_text',
];
$term = Term::Create($props);
$term->save();
if (!empty($term_children)) {
$this->vocabImportRecursive($vocab, $term_children, $term->tid);
}
}
return $term;
}
/**
* {@inheritdoc}
*/
private function vocab_en() {
return [
'Arts & Culture' => [],
'Business Services & Clerical' => [],
'Clothing' => [],
'Computing & Electronics' => [],
'Education & Language' => [],
'Food' => [],
'Health & Wellness' => [],
'House & Garden' => [],
'LETS administration' => [],
'Sports & Leisure' => [],
'Skills & DIY' => [],
'Transport' => [],
'Miscellaneous' => []
];
}
/**
* {@inheritdoc}
*/
private function vocab_fr() {
return [
'SEL Administration' => [],
'Alimentation' => [],
'Artisanat & Bricolage' => [],
'Arts & Culture' => [],
'Cours & Langues' => [],
'Informatique & Eléctro' => [],
'Maison & Jardin' => [],
'Mobilité' => [],
'Santé & Soins' => [],
'Sports & Evasion' => [],
'Vêtements plus' => [],
'Divers' => [],
];
}
private function vocab_be() {
return [
'A Ménage / Entretien maison' => [
"Nettoyage/ produits d'entretien" => [],
'Lessive, repassage' => [],
'Couture, tricot' => [],
'Rangement' => [],
'Ménage - Divers' => [],
],
'B Travaux maisons' => [
'Travaux lourds' => [],
'Petits travaux divers' => [],
'Peinture, tapissage, décoration' => [],
'Electricité' => [],
'Plomberie, chauffage' => [],
'Carrelage, plafonnage, maçonnerie' => [],
'Menuiserie, planchers, meubles' => [],
"Isolation, économies d'énergie" => [],
"Travaux - Divers" => [],
],
'C Enfants / Ados' => [
'Grossesse et bébé' => [],
'Baby sitting' => [],
'Stages, animations créatives' => [],
'Aide scolaire' => [],
'Jeux et jouets' => [],
'Enfants - Divers' => [],
],
'D Alimentation / Gastronomie' => [
'Nettoyage fruits et légumes' => [],
'Boissons, soupes, sauces' => [],
'Plats' => [],
'Desserts' => [],
"Tables d'hôtes" => [],
'Cours, conseils, recettes' => [],
'Alimentation - Divers' => [],
],
'E Santé / Bien-être / Accompagnement' => [
'Coiffure, esthétique visage et corps' => [],
'Massage, thérapies, produits naturels' => [],
'Personnes âgées, malades, immobilisées' => [],
"Accompagnement, coaching et conseils 'psy'" => [],
'Santé - Divers' => [],
],
'F Administration / Gestion' => [
'Classement de papiers, de dossiers' => [],
'Dactylographie, mise en page' => [],
'Courriers, démarches administratives' => [],
'Assurances, questions juridiques' => [],
'Fiscalité, pension, chômage' => [],
'Administration du SEL' => [],
'Administration - Divers' => [],
],
'G Cours / Formations / Conseils' => [
'Langues, conversation, traduction' => [],
'Ecriture, rédaction, orthographe' => [],
"Recherche d'emploi" => [],
'Gestion et animation de groupes' => [],
'Cours - Divers' => [],
],
'H Jardin / Animaux / Nature' => [
'Jardin : conception, entretien, conseils' => [],
'Culture potagère, vergers' => [],
'Récolte de fruits, légumes, plantes' => [],
"Taille d'arbres et arbustes" => [],
'Animaux (domestiques -élevage]' => [],
'Biodiversité, nichoirs, découverte nature' => [],
'Engrais, semences, plants, produits divers' => [],
'Jardin et animaux - Divers' => [],
],
'I Arts / Culture / Sports & loisirs' => [
'Artisanat, peinture, dessin, sculpture' => [],
'Musique, chant, danse' => [],
'Photo, vidéo, cinema' => [],
'Animations, spectacles' => [],
'Fêtes : conseils, organisation, aide' => [],
'Promenades, excursions' => [],
"Jeux (de société, d'extérieur]" => [],
'Sports' => [],
'Culture et sport - Divers' => [],
],
'J Transports / Voyages /Hébergement' => [
'Courses' => [],
'Covoiturage et transport' => [],
'Déménagement' => [],
'Auto-moto-vélo' => [],
'Voyages, randonnées' => [],
'Hébergement, échange maisons' => [],
'Gardiennage maison' => [],
'Transport - Divers' => [],
],
'K Informatique /Électroménager' => [
'Dépannage informatique' => [],
'Réparation électroménager' => [],
'Formations Internet / email' => [],
'Formations logiciels' => [],
'Informatique, électroménager - Divers' => [],
],
'Z Divers (non classées]' => []
];
}
/**
* Set the default country on the address field and all existing users to that country.
*/
static function setDefaultCountry($country_code) {
$field = FieldConfig::load('user.user.address');
$settings = $field->get('settings');
$settings['available_countries'][$country_code] = $country_code;
$field->set('settings', $settings)
->save();
\Drupal::configFactory()->getEditable('system.date')->set('country.default', $country_code)->save();
foreach (\Drupal::entityTypeManager()->getStorage('user')->loadMultiple() as $user) {
if ($user->isAnonymous()) continue;
$user->address->country_code = $country_code;
$user->save();
}
}
}
