initializeLogger($config);
// example code: set Joomla input object to class variable
// $this->input = Factory::getApplication()->getInput();
// example code: get parameter id from the Joomla input object from class variable
// $id = $this->input->getInt('id', 0);
}
public static function getSubscribedEvents(): array {
return [
'onVisformsEmailPrepare' => 'onVisformsEmailPrepare',
'onVisformsBeforeEmailPrepare' => 'onVisformsBeforeEmailPrepare',
'onVisformsBeforeFormSave' => 'onVisformsBeforeFormSave',
'onVisformsBeforeFormSaveAfterUpload' => 'onVisformsBeforeFormSaveAfterUpload',
'onVisformsAfterFormSave' => 'onVisformsAfterFormSave',
'onVisformsAfterFormSaveError' => 'onVisformsAfterFormSaveError',
'onVisformsBeforeSuccessAction' => 'onVisformsBeforeSuccessAction',
'onVisformsMessageText' => 'onVisformsMessageText',
'onVisformsAfterEditFormSave' => 'onVisformsAfterEditFormSave',
'onVisformsAfterEditFormSaveError' => 'onVisformsAfterEditFormSaveError',
'onVisformsEditFormPrepare' => 'onVisformsEditFormPrepare',
'onVisformsBeforeEditFormSave' => 'onVisformsBeforeEditFormSave',
'onVisformsPrepareJForm' => 'onVisformsPrepareJForm',
'onVisformsBeforeJFormSave' => 'onVisformsBeforeJFormSave',
'onVisformsAfterJFormSave' => 'onVisformsAfterJFormSave',
'onVisformsBeforeJFormDelete' => 'onVisformsBeforeJFormDelete',
'onVisformsAfterJFormDelete' => 'onVisformsAfterJFormDelete',
'onVisformsJFormChangeState' => 'onVisformsJFormChangeState',
'onVisformsSaveJFormExtraData' => 'onVisformsSaveJFormExtraData',
'onVisformsAfterBatchCopyForm' => 'onVisformsAfterBatchCopyForm',
'onVisformsdataAfterJFormSave' => 'onVisformsdataAfterJFormSave',
'onVisformsdataAfterJFormDelete' => 'onVisformsdataAfterJFormDelete',
'onVisformsdataJFormChangeState' => 'onVisformsdataJFormChangeState',
'onVisformsFormPrepare' => 'onVisformsFormPrepare',
'onVisformsAfterCustomtextPrepare' => 'onVisformsAfterCustomtextPrepare',
'onVisformsPrepareDoiMailText' => 'onVisformsPrepareDoiMailText',
'onVisformsAddWebAssets' => 'onVisformsAddWebAssets',
'onVisformsSpambotCheck' => 'onVisformsSpambotCheck',
'onVisfieldBeforeCreate' => 'onVisfieldBeforeCreate',
'onVisformsBeforeHtmlPrepare' => 'onVisformsBeforeHtmlPrepare',
'onVisformsAfterHtmlPrepare' => 'onVisformsAfterHtmlPrepare',
'onVisformsBeforeConfirmDoi' => 'onVisformsBeforeConfirmDoi',
'onVisformsAfterConfirmDoi' => 'onVisformsAfterConfirmDoi',
];
}
// common for both: form submit and data edit
public function onVisformsEmailPrepare(VisformsEmailPrepareEvent $event): void {
// context = 'com_visforms.form.resultmail'
// context = 'com_visforms.form.receiptmail'
// triggered in VisformsModel after the mail object is instantiated and directly before the mail is sent:
// can be used to modify the mail object: mail object is instantiated and all properties are set and can be modified
$context = $event->getContext();
$mail = $event->getMail();
$form = $event->getForm();
// example code: simply change email text
// $mail->Body = '
My new admin email body.
';
// example code: add user selected mail recipients to admin email
// selected by multi-selection form field 'email-select'
return;
}
public function onVisformsBeforeEmailPrepare(VisformsBeforeEmailPrepareEvent $event): void {
// context = 'com_visforms.form.resultmail'
// context = 'com_visforms.form.receiptmail'
// triggered in VisformsModel before the mail object is instantiated:
// can be used to modify the form object (i.e. to stop sending the mail or change addresses)
$context = $event->getContext();
$form = $event->getForm();
}
// form submit specific
public function onVisformsBeforeFormSave(VisformsBeforeFormSaveEvent $event): void {
// context = 'com_visforms.form'
$context = $event->getContext();
$form = $event->getForm();
$fields = $event->getFields();
// example code: exit, if we are in administration
/*$app = $this->getApplication();
if ($app->isClient('administrator')) {
return;
}*/
// $event->addResult($this->onVisformsBeforeFormSave_preventNonLoggedInUser($context, $form, $fields));
// $event->addResult($this->onVisformsBeforeFormSave_SendMails($context, $form, $fields));
// Set Event result
// true = continue visforms action
// $event->addResult(true)
// false = aboard visforms action
// $event->addResult(false);
}
public function onVisformsBeforeFormSaveAfterUpload(VisformsBeforeFormSaveAfterUploadEvent $event): void {
// context = 'com_visforms.form.form' (form was sent)
// context = 'com_visforms.form.edit' (form data was edited)
$context = $event->getContext();
$form = $event->getForm();
$fields = $event->getFields();
}
public function onVisformsAfterFormSave(VisformsAfterFormSaveEvent $event): void {
// context = 'com_visforms.form'
$context = $event->getContext();
$form = $event->getForm();
$fields = $event->getFields();
}
public function onVisformsAfterFormSaveError(VisformsAfterFormSaveErrorEvent $event): void {
// context = 'com_visforms.form'
$context = $event->getContext();
$form = $event->getForm();
$fields = $event->getFields();
}
public function onVisformsBeforeSuccessAction(VisformsBeforeSuccessActionEvent $event): void {
// override properties in $form (i.e. redirect url, successmessage)
// context = 'com_visforms.form'
// triggered in VisformsController before form result text is parameter processed and before running of all content plugins
$context = $event->getContext();
$form = $event->getForm();
$fields = $event->getFields();
// example code: simply change the result text before all parameters are processed
// $form->textresult = "Mein neuer Ergebnis-Text.
";
}
public function onVisformsMessageText(VisformsMessageTextEvent $event): void {
// context = 'com_visforms.form'
// triggered in VisformsController after form result text is parameter processed and before running of all content plugins
$context = $event->getContext();
$form = $event->getForm();
$fields = $event->getFields();
$msg = $event->getMessage();
// example code: simply change the result text after all parameters are processed
// $msg = preg_replace('#search-me#', '${0} and replace-me', $msg);
// set modified msg in event
$event->setArgument('msg', $msg);
}
// data edit specific
public function onVisformsAfterEditFormSave(VisformsAfterEditFormSaveEvent $event): void {
// after saving edit form results
// context = 'com_visforms.form'
$context = $event->getContext();
$form = $event->getForm();
$fields = $event->getFields();
}
public function onVisformsAfterEditFormSaveError(VisformsAfterEditFormSaveErrorEvent $event): void {
// clean up, saving edit form results in an error (i.e. delete uploaded files)
// context = 'com_visforms.form'
$context = $event->getContext();
$form = $event->getForm();
$fields = $event->getFields();
}
public function onVisformsEditFormPrepare(VisformsEditFormPrepareEvent $event): void {
// context = 'com_visforms.form'
$context = $event->getContext();
$form = $event->getForm();
$menu_params = $event->getMenuParams();
}
public function onVisformsBeforeEditFormSave(VisformsBeforeEditFormSaveEvent $event): void {
// context = 'com_visforms.form'
$context = $event->getContext();
$form = $event->getForm();
$fields = $event->getFields();
// Set Event result
// true = continue visforms action
// $event->addResult(true)
// false = aboard visforms action
// $event->addResult(false);
}
// JForm events: Visforms
// Triggered in Administration only, Overrides for the Joomla default events
public function onVisformsPrepareJForm(VisformsPrepareJFormEvent $event): void {
$form = $event->getForm();
}
public function onVisformsBeforeJFormSave(Model\BeforeSaveEvent $event): void {
$context = $event->getContext();
$table = $event->getItem();
$isNew = $event->getIsNew();
$data = $event->getData();
}
public function onVisformsAfterJFormSave(Model\AfterSaveEvent $event): void {
// context = 'com_visforms.visfield'
// context = 'com_visforms.visform'
$context = $event->getContext();
$table = $event->getItem();
$isNew = $event->getIsNew();
$data = $event->getData();
// example code: reaction only to selected contexts
/*if (($context === 'com_visforms.visfield') || ($context === 'com_visforms.visform')) {
return;
}*/
}
public function onVisformsBeforeJFormDelete(Model\BeforeDeleteEvent $event): void {
// context = 'com_visforms.visfield'
// context = 'com_visforms.visform'
$context = $event->getContext();
$table = $event->getItem();
// example code: reaction only when deleting a field
/*if ($context == 'com_visforms.visfield') {
return;
}*/
// example code: skip plugin if we are deleting something other than a visforms form or field
/*if (($context != 'com_visforms.visfield') && ($context != 'com_visforms.visform')) {
return;
}*/
// example code: we ware deleting a form
// delete fields in visfields table
// delete datatable if table exists
// delete pdfs in vispdf table
/*if ($context == 'com_visforms.visform') {
return;
}*/
}
public function onVisformsAfterJFormDelete(Model\AfterDeleteEvent $event): void {
// context = 'com_visforms.visfield'
// context = 'com_visforms.visform'
$context = $event->getContext();
$table = $event->getItem();
// example code: reaction only to selected contexts
/*if (($context === 'com_visforms.visform') || ($context === 'com_visforms.visfield')) {
return;
}*/
}
public function onVisformsJFormChangeState(Model\AfterChangeStateEvent $event): void {
// context = 'com_visforms.visfield'
// context = 'com_visforms.visform'
$context = $event->getContext();
$value = $event->getValue();
$pks = $event->getPks();
// example code: reaction only to selected context
/*if ($context === 'com_visforms.visform') {
return;
}*/
// example code: reaction only to selected context
/*if ($context === 'com_visforms.visfield') {
return;
}*/
}
public function onVisformsSaveJFormExtraData(VisformsSaveJFormExtraDataEvent $event): void {
$data = $event->getData();
$fid = $event->getFid();
$isNew = $event->getIsNew();
}
public function onVisformsAfterBatchCopyForm(VisformsAfterBatchCopyFormEvent $event) : void {
$pk = $event->getPk();
$newId = $event->getNewId();
}
// JForm events: Visforms data
public function onVisformsdataAfterJFormSave(Model\AfterSaveEvent $event): void {
// context = 'com_visforms.visdata'
// event is triggered from administration and from site
$context = $event->getContext();
$table = $event->getItem();
$isNew = $event->getIsNew();
$data = $event->getData();
// example code: we only want to react if the event comes from administration, because the site is handled by onVisformsAfterEditFormSave
/*$app = $this->getApplication();
if ($app->isClient('site')) {
return;
}*/
// example code: reaction only to selected context
/*if ($context === 'com_visforms.visdata') {
return;
}*/
}
public function onVisformsdataAfterJFormDelete(Model\AfterDeleteEvent $event): void {
// context = 'com_visforms.visdata'
$context = $event->getContext();
$table = $event->getItem();
}
public function onVisformsdataJFormChangeState(Model\AfterChangeStateEvent $event): void {
// context = 'com_visforms.visdata'
$context = $event->getContext();
$pks = $event->getPks();
$value = $event->getValue();
// example code: reaction only to selected context
/*if ($context === 'com_visforms.visdata') {
return;
}*/
}
// mixed singles
public function onVisformsFormPrepare(VisformsFormPrepareEvent $event): void {
// context = 'com_visforms.form'
// context = 'mod_visforms.form'
// context = 'plg_vfformview.form'
// the event is form-based and is fired once for the form
// triggered almost immediately before the layout file (component/module/plugin) is loaded
$context = $event->getContext();
$form = $event->getForm();
$menu_params = $event->getMenuParams();
// $this->onVisformsFormPrepare_preventNonLoggedInUser($context, $form, $menu_params);
// $this->onVisformsFormPrepare_SendMails($context, $form, $menu_params);
}
public function onVisformsAfterCustomtextPrepare(VisformsAfterCustomtextPrepareEvent $event): void {
// context = 'com_visforms.field'
// can be used to modify the visfield custom text property late, after all visforms specific processing is complete
$context = $event->getContext();
$layout = $event->getLayout();
$html = $event->getHtml();
// set modified html in event
$event->setArgument('html', $html);
}
public function onVisformsPrepareDoiMailText(VisformsPrepareDoiMailTextEvent $event): void {
// context = 'com_visforms.form.receiptmail'
// used to replace custom placeholder for Double-Opt-In Link
$context = $event->getContext();
$text = $event->getText();
$form = $event->getForm();
// set modified Text in event.
$event->setArgument('text', $text);
}
public function onVisformsAddWebAssets(VisformsAddWebAssetsEvent $event): void {
// context = 'com_visforms.form.form' (component via menu, modul or plugin)
// context = 'com_visforms.form.message' (component)
// context = 'com_visforms.form.data' (only available with component)
// context = 'com_visforms.form.datas' (component, plugin)
// context = 'com_visforms.form.edit' (component)
// context = 'com_visforms.form.edit_link' (component via menu, modul or plugin)
$context = $event->getContext();
$fid = $event->getFid();
// component via menu, modul or plugin means:
// The form is displayed with the help of a menu item 'Visforms Form' or a module of the type 'Visforms' or the 'Content Plugin Visforms Form'.
//
// add custom JavaScript and CSS to Visforms depending on view type (menu, modul, plugin) and action (form, message, data, datas, edit, edit_link)
}
public function onVisformsSpambotCheck(VisformsSpambotCheckEvent $event) : void {
// context = 'com_visforms.visformedit'
// context = 'com_visforms.visform'
$context = $event->getContext();
// stop event propagation
// $event->stopPropagation();
// Set Event result
// false = continue visforms action
// $event->addResult(false);
// true = aboard visforms action
//$event->addResult(true);
}
// mixed pairs: before, after
public function onVisfieldBeforeCreate(VisfieldBeforeCreateEvent $event): void {
// context = 'com_visforms.field'
//$context, &$field, &$form
$context = $event->getContext();
$form = $event->getForm();
$field = $event->getField();
}
public function onVisformsBeforeHtmlPrepare(VisformsBeforeHtmlPrepareEvent $event): void {
// context = 'com_visforms.field'
// the event is field specific and is fired per field
// it allows changes on field properties before control html is created
$context = $event->getContext();
$layout = $event->getLayout();
$field = $event->getField();
}
public function onVisformsAfterHtmlPrepare(VisformsAfterHtmlPrepareEvent $event): void {
// context = 'com_visforms.field'
// allow changes on field properties after control html is created
$context = $event->getContext();
$layout = $event->getLayout();
$html = $event->getHtml();
$field = $event->getField();
// set modified html in event
$event->setArgument('html', $html);
}
public function onVisformsBeforeConfirmDoi(VisformsBeforeConfirmDoiEvent $event): void {
// context = 'com_visforms'
// use in double-opt-in confirmation process
// implement an individual action before the confirmation is validated and database changes are made
$context = $event->getContext();
$fid = $event->getFid();
$recordId = $event->getRecordId();
}
public function onVisformsAfterConfirmDoi(VisformsAfterConfirmDoiEvent $event): void {
// context = 'com_visforms'
// used to implement an individual action performed after successful double-opt-in
$context = $event->getContext();
$fid = $event->getFid();
$recordId = $event->getRecordId();
}
// not an event
protected function removeUploadedFiles($context, $form, $fields): bool {
if ($context != 'com_visforms.form') {
return true;
}
if ($this->getApplication()->isClient('administrator')) {
return true;
}
return true;
}
// implementation: example functions
private function onVisformsFormPrepare_preventNonLoggedInUser($context, $form, $menu_params): bool {
// documentation example code: add a custom submit handler
// here: prevent submitting by users who are not logged in
// first possibility: the message appears before the form is sent
// to be called from the handler onVisformsFormPrepare()
// skip plugin if context is wrong
$allowedContexts = array('com_visforms.form', 'mod_visforms.form', 'plg_vfformview.form');
if (!in_array($context, $allowedContexts)) {
return true;
}
$app = $this->getApplication();
// only perform action, if we are in front end
if ($app->isClient('administrator')) {
return true;
}
// if $form->parentFormId is not set: Visforms or 'Content Plugin Form View' version is too old
if (!isset($form->parentFormId)) {
return true;
}
// get value of id attribute of the form which is going to be displayed
$parentFormId = $form->parentFormId;
// START: add custom submit handler function to the form
$user = Factory::getApplication()->getIdentity();
if (!$user->id) {
$script = 'jQuery(document).ready(function () {
//add custom submit action function to form
window["' . $parentFormId . 'SubmitAction"] = function (form) {
// return false: to prevent form from being submitted
alert("Please log in first");
return false;
// your alternative code in here
// return true: your submit-handler performs another action and form should be send
// return true;
};
});';
$wa = $app->getDocument()->getWebAssetManager();
$wa->addInlineScript($script);
}
// END: add custom submit handler function to the form
return true;
}
private function onVisformsBeforeFormSave_preventNonLoggedInUser($context, $form, $fields): bool {
// documentation example code: add a custom submit handler
// here: prevent submitting by users who are not logged in
// second possibility: the message appears after submitting the form
// to be called from the handler onVisformsBeforeFormSave()
// skip plugin if context is wrong
$allowedContexts = array('com_visforms.form', 'mod_visforms.form', 'plg_vfformview.form');
if (!in_array($context, $allowedContexts)) {
return true;
}
$app = $this->getApplication();
// only perform action, if we are in front end
if ($app->isClient('administrator')) {
return true;
}
// YOUR CODE IN HERE
$user = Factory::getApplication()->getIdentity();
if (!$user->id) {
$message = 'Please log in first';
$input = $app->getInput();
$return = $input->post->get('return', null, 'cmd');
$url = (!empty($return)) ? base64_decode(strtr($return, '-_,', '+/=')) : 'index.php';
$app->enqueueMessage($message, 'warning');
$app->redirect(Route::_($url, false));
$app->close();
return false;
}
return true;
}
private function onVisformsFormPrepare_SendMails($context, $form, $menu_params): bool {
// documentation example code: hidden field and set its value dynamically
// to be called from the handler onVisformsFormPrepare()
// skip plugin if context is wrong
$allowedContexts = array('com_visforms.form', 'mod_visforms.form', 'plg_vfformview.form');
if (!in_array($context, $allowedContexts)) {
return true;
}
$app = $this->getApplication();
// only perform action, if we are in front end
if ($app->isClient('administrator')) {
return true;
}
// if $form->parentFormId is not set: Visforms or 'Content Plugin Form View' version is too old
if (!isset($form->parentFormId)) {
return true;
}
// get value of id attribute of the form which is going to be displayed
$parentFormId = $form->parentFormId;
// START: add custom submit handler function to the form
// todo: clarify why using the expression "<input/>" doesn't work and the input-element does not get created
$script = 'jQuery(document).ready(function () {
console.log("onVisformsFormPrepare_SendMails");
jQuery("<input/>",
{"id" : "'. $parentFormId .'myhiddenfield",
"type" : "hidden",
"value" : "0",
"name" : "myhiddenfield"}).appendTo("#'. $parentFormId .'");
console.log("onVisformsFormPrepare_SendMails");
window["'. $parentFormId .'SubmitAction"] = function (form) {
if (jQuery(form.submitButton).hasClass("formready")) {
jQuery("#'. $parentFormId .'myhiddenfield").val("1");
};
return true;
};
});';
$script = 'jQuery(document).ready(function () {
let el = document.createElement("input");
el.id = "'. $parentFormId .'myhiddenfield"
el.type = "hidden";
el.value = "0";
el.name = "myhiddenfield";
jQuery("#'. $parentFormId .'").append(el);
window["'. $parentFormId .'SubmitAction"] = function (form) {
if (jQuery(form.submitButton).hasClass("formready")) {
jQuery("#'. $parentFormId .'myhiddenfield").val("1");
};
return true;
};
});';
$wa = Factory::getApplication()->getDocument()->getWebAssetManager();
$wa->addInlineScript($script);
// END: add custom submit handler function to the form
return true;
}
private function onVisformsBeforeFormSave_SendMails($context, $form, $fields): bool {
// documentation example code: hidden field and set its value dynamically
// to be called from the handler onVisformsBeforeFormSave()
// skip plugin if context is wrong
$allowedContexts = array('com_visforms.form', 'mod_visforms.form', 'plg_vfformview.form');
if (!in_array($context, $allowedContexts)) {
return true;
}
$app = $this->getApplication();
// only perform action, if we are in front end
if ($app->isClient('administrator')) {
return true;
}
// YOUR CODE IN HERE
$sendMail = $app->getInput()->post->get('myhiddenfield', "0", 'STRING');
if (!empty($sendMail)) {
// enable sending the admin email
$form->emailresult = 1;
// enable sending the user mail
$form->emailreceipt = 1;
return true;
}
return true;
}
private function onVisformsBeforeEmailPrepare_changeNumberFormat($context, $form): bool {
// context = 'com_visforms.form.resultmail'
// context = 'com_visforms.form.receiptmail'
// triggered in VisformsModel before the mail object is instantiated:
// can be used to modify the form object (i.e. to stop sending the mail or change addresses)
if($form->id == 2) {
$field = $this->getFieldByID($form, 84);
// german notation without thousands separator
$field->dbValue = number_format($field->dbValue, 2, '.', '') . ' €';
}
return true;
}
// implementation: helper functions
private function getField(&$form, string $name): null | object {
if (is_array($form->fields)) {
foreach ($form->fields as $field) {
$fieldName = (!empty($form->context)) ? str_replace($form->context, '', $field->name) : $field->name;
if ($name === $fieldName) {
return $field;
}
}
}
return null;
}
private function getFieldValue(&$form, string $name): string {
$field = $this->getField($form, $name);
if (isset($field)) {
return is_null($field->dbValue) ? '' : $field->dbValue;
}
return '';
}
private function getFieldByID(&$form, string $ID): null | object {
if (is_array($form->fields)) {
foreach ($form->fields as $field) {
$fieldID = (!empty($form->context)) ? str_replace($form->context, '', $field->id) : $field->id;
if ($ID === $fieldID) {
return $field;
}
}
}
return null;
}
private function getFieldValueByID(&$form, string $ID): string {
$field = $this->getFieldByID($form, $ID);
if (isset($field)) {
return is_null($field->dbValue) ? '' : $field->dbValue;
}
return '';
}
// implementation: logging
private function initializeLogger($config) {
$this->loggerName = $config['type'] . '-' . $config['name'];
$options['format'] = "{CODE}\t{MESSAGE}";
$options['text_entry_format'] = "{PRIORITY}\t{MESSAGE}";
$options['text_file'] = $config['type'] . '_' . $config['name'] . '.php';
try {
Log::addLogger($options, Log::ALL, array($this->loggerName, 'jerror'));
}
catch (\RuntimeException $e) {}
}
private function addLogEntry($message, $code = Log::ERROR) {
try {
Log::add($message, $code, $this->loggerName);
}
catch (\RuntimeException $exception) {
// prevent routine from failing due to problems with logger
}
}
}