Romain CANON
Développeur Web passionné, spécialisé dans TYPO3. Joueur de StarCraft II et DotA 2. Fan de Led Zepp'.



Extension TYPO3 : Usine à Sites


Présentation

Dans ce ticket, je vous présente une extension TYPO3 sur laquelle je travaille actuellement, et que je vais mettre en ligne sur le TER TYPO3 d'ici quelques semaines.

Il s'agit d'une usine à sites : un module permettant de dupliquer en quelques cliques un site entier, en partant d'un modèle pré-configuré par un intégrateur.

L'intérêt ?

Une personne souhaitant créer un site de toute pièce devra quasiment partir de zéro. En lui proposant une panoplie de sites modèles, elle pourra cependant partir sur une base existante. L'usine à sites permettra de dupliquer automatiquement le modèle, en adaptant certaines données.

Par exemple, on voudra renseigner le nom du site, son url, le logo, la couleur du fond… On peut imaginer un nombre infini d'éléments qu'un utilisateur voudrait pouvoir personnaliser.

Comment ?

Grâce à une configuration facilitée par le TypoScript, il sera aisé de définir les données pouvant être modifiées. Par exemple, rajouter un lien Facebook se configure avec quelques lignes de TypoScript.

Quand ?

Il me reste quelques fonctionnements à revoir rapidement, quelques petits points manquant à intégrer, ainsi que toute la documentation à rédiger. D'ici quelques semaines vous pourrez la trouver sur le TER.

Quelques images…

L'index du module


Création d'un site


Création d'un site (sans erreur)


Exécution du processus de duplication


Le site dupliqué dans l'arborescence

Configuration TypoScript

Ci-dessous un exemple de ce à quoi ressemblera la configuration TypoScript permettant de personnaliser un formulaire de création.

module.tx_sitefactory {
	settings {
		fields {
			# The domain name used for the new site.
			domain {
				type = text
				label = form.field.label.domain_name
				hint = form.field.hint.domain_name
				placeholder = www.example.com
				rules {
					# Obviously we want a correct domain name here...
					correctDomainName {
						eval = \TYPO3\SiteFactory\Core\Form\FieldEvaluationPresets->isCorrectDomainName
						error = form.field.error.domain_name
					}
				}
			}

			# The color of the body's background.
			backgroundColor {
				type = color_picker
				label = form.field.label.background_color
				hint = form.field.hint.color_picker_color
				placeholder = #FFFFFF
				defaultValue = #FFFFFF
				rules {
					# Hexadecimal value.
					hexadecimalValue {
						eval = \TYPO3\SiteFactory\Core\Form\FieldEvaluationPresets->isHexadecimalValue
						error = form.field.error.picker_color
					}
				}
			}

			# The link to the Facebook page.
			facebook {
				type = text
				label = form.field.label.facebook
				hint = form.field.hint.facebook
				placeholder = https://www.facebook.com/Example
				rules {
					facebookUrl {
						eval = \TYPO3\SiteFactory\Core\Form\FieldEvaluationPresets->isFacebookUrl
						error = form.field.error.facebook
					}
				}
			}

			# The link to the Facebook page.
			twitter {
				type = text
				label = form.field.label.twitter
				hint = form.field.hint.twitter
				placeholder = https://twitter.com/Example
				rules {
					facebookUrl {
						eval = \TYPO3\SiteFactory\Core\Form\FieldEvaluationPresets->isTwitterUrl
						error = form.field.error.twitter
					}
				}
			}

			# The name for the duplicated be_users
			backendUserUsername {
				type = text
				label = form.field.label.backend_user_username
				hint = form.field.hint.backend_user_username
				placeholder = form.field.label.backend_user_username
				defaultValue = form.field.label.backend_user_username
				rules {
					# We want at least one character for the name.
					noEmpty {
						eval = \TYPO3\SiteFactory\Core\Form\FieldEvaluationPresets->notEmpty
						error = form.field.error.empty
					}
				}
			}

			# The logo (image) of the site.
			logo {
				type = image_upload
				label = form.field.label.logo
				hint = form.field.hint.logo
				moveToFileMount = 1
				uploadOptions {
					width = 150c
					height = 150c
				}
				config {
					linkToPageMedia {
						page = homePage
					}
				}
			}
		}
	}
}

Il est également possible pour les développeurs de personnaliser le processus de duplication. Ci-dessous un exemple de configuration TypoScript.

module.tx_sitefactory {
	settings {
		duplication {
			# Will process the entire site's duplication: all the pages, sub pages and contents.
			pagesDuplication {
				class       = \TYPO3\SiteFactory\Core\Duplication\Process\PagesDuplicationProcess
				label       = duplication_process.pages_duplication
				sorting     = first
			}

			# Used after "pagesDuplication", it will provide an array containing a full association
			# between the uids of the model site's pages and the uids of the duplicated site's pages.
			treeUidAssociation {
				class       = \TYPO3\SiteFactory\Core\Duplication\Process\TreeUidAssociationProcess
				label       = duplication_process.pages_association
				sorting     = after:pagesDuplication
			}

			sysFileMounts {
				class       = \TYPO3\SiteFactory\Core\Duplication\Process\SysFileMountsProcess
				label       = duplication_process.mount_point_creation
				sorting     = after:treeUidAssociation
			}

			backendUserGroupCreation {
				class       = \TYPO3\SiteFactory\Core\Duplication\Process\BackendUserGroupCreationProcess
				label       = duplication_process.backend_usergroup_creation
				sorting     = after:sysFileMounts
			}

			backendUserCreation {
				class       = \TYPO3\SiteFactory\Core\Duplication\Process\BackendUserCreationProcess
				label       = duplication_process.backend_user_creation
				sorting     = after:backendUserGroupCreation
			}

			uploadedFiles {
				class       = \TYPO3\SiteFactory\Core\Duplication\Process\UploadedFilesProcess
				label       = duplication_process.uploaded_files
				sorting     = after:backendUserCreation
				usedInSiteModification = 1
			}

			backendConstantsAssignation {
				class       = \TYPO3\SiteFactory\Core\Duplication\Process\BackendConstantsAssignationProcess
				label       = duplication_process.backend_constants_assignation
				sorting     = after:uploadedFiles
				usedInSiteModification = 1
			}

			linkToPageMedia {
				class       = \TYPO3\SiteFactory\Core\Duplication\Process\LinkToPageMediaProcess
				label       = duplication_process.link_to_page_media
				sorting     = after:backendConstantsAssignation
				usedInSiteModification = 1
			}

			LinkToPageBackendLayout {
				class       = \TYPO3\SiteFactory\Core\Duplication\Process\LinkToPageBackendLayoutProcess
				label       = duplication_process.link_to_backend_layout
				sorting     = after:linkToPageMedia
				usedInSiteModification = 1
			}

			saveSiteConfiguration {
				class       = \TYPO3\SiteFactory\Core\Duplication\Process\SaveSiteConfigurationProcess
				label       = duplication_process.save_site_configuration
				sorting     = last
				usedInSiteModification = 1
			}
		}
	}
}

Une question, une remarque ? N'hésitez pas à poster un commentaire. ;-)