Add form placement options for homepage, archives

MAILPOET-4897
This commit is contained in:
John Oleksowicz
2023-06-12 12:15:17 -05:00
committed by Aschepikov
parent acbd7fe723
commit 481f5585a0
9 changed files with 615 additions and 27 deletions

View File

@@ -57,8 +57,25 @@ function PlacementSettings({ settingsPlacementKey }: Props): JSX.Element {
prefix = 'preview';
}
const placementSupportsArchives = settingsPlacementKey !== 'belowPosts';
return (
<>
{placementSupportsArchives && (
<ToggleControl
label={MailPoet.I18n.t('placeFormOnHomepage')}
checked={formSettings.formPlacement[settingsPlacementKey].homepage}
onChange={(newValue): void => {
compose([
changeFormSettings,
assocPath(
`formPlacement.${settingsPlacementKey}.homepage`,
newValue,
),
])(formSettings);
}}
/>
)}
<ToggleControl
label={MailPoet.I18n.t('placeFormOnAllPages')}
checked={formSettings.formPlacement[settingsPlacementKey].pages.all}
@@ -332,6 +349,171 @@ function PlacementSettings({ settingsPlacementKey }: Props): JSX.Element {
/>
</div>
</div>
{placementSupportsArchives && (
<>
<ToggleControl
label={MailPoet.I18n.t('displayOnAllTagArchives')}
checked={
formSettings.formPlacement[settingsPlacementKey].tagArchives.all
}
onChange={(newValue): void => {
compose([
changeFormSettings,
assocPath(
`formPlacement.${settingsPlacementKey}.tagArchives.all`,
newValue,
),
cond([
[
// condition, if the predicate function is true the next compose is run
(): boolean => newValue,
compose([
assocPath(
`formPlacement.${settingsPlacementKey}.tagArchives.selected`,
[],
), // if enabled clear selected tags
]),
],
[(): boolean => !newValue, identity], // if disabled do nothing
]),
])(formSettings);
}}
/>
<div data-automation-id="form-placement-select-archive-tags">
<div className="form-editor-placement-selection">
<Selection
dropDownParent={
isPreviewShown ? '.mailpoet-modal-content' : undefined
}
item={{
id: `${prefix}${formSettings.formPlacement[
settingsPlacementKey
].tagArchives.selected.join()}`,
}}
onValueChange={(e): void => {
const selected =
formSettings.formPlacement[settingsPlacementKey].tagArchives
.selected;
if (isEqual(selected, e.target.value)) {
return;
}
compose([
changeFormSettings,
assocPath(
`formPlacement.${settingsPlacementKey}.tagArchives.selected`,
e.target.value,
),
cond([
[
// only disable "All pages" toggle if not empty
(): boolean => !!e.target.value.length,
assocPath(
`formPlacement.${settingsPlacementKey}.tagArchives.all`,
false,
), // disable all if some pages are selected
],
[(): boolean => !e.target.value.length, identity],
]),
])(formSettings);
}}
field={{
id: `${prefix}tagArchives`,
name: 'tagArchives',
values: tags,
multiple: true,
placeholder: MailPoet.I18n.t('selectSpecificArchiveTags'),
getLabel: (tag): void => tag.name,
selected: (): void =>
formSettings.formPlacement[settingsPlacementKey].tagArchives
.selected,
}}
/>
</div>
</div>
<ToggleControl
label={MailPoet.I18n.t('displayOnAllCategoryArchives')}
checked={
formSettings.formPlacement[settingsPlacementKey].categoryArchives
.all
}
onChange={(newValue): void => {
compose([
changeFormSettings,
assocPath(
`formPlacement.${settingsPlacementKey}.categoryArchives.all`,
newValue,
),
cond([
[
// condition, if the predicate function is true the next compose is run
(): boolean => newValue,
compose([
assocPath(
`formPlacement.${settingsPlacementKey}.categoryArchives.selected`,
[],
), // if enabled clear selected categories
]),
],
[(): boolean => !newValue, identity], // if disabled do nothing
]),
])(formSettings);
}}
/>
<div data-automation-id="form-placement-select-archive-categories">
<div className="form-editor-placement-selection">
<Selection
dropDownParent={
isPreviewShown ? '.mailpoet-modal-content' : undefined
}
item={{
id: `${prefix}${formSettings.formPlacement[
settingsPlacementKey
].categoryArchives.selected.join()}`,
}}
onValueChange={(e): void => {
const selected =
formSettings.formPlacement[settingsPlacementKey]
.categoryArchives.selected;
if (isEqual(selected, e.target.value)) {
return;
}
compose([
changeFormSettings,
assocPath(
`formPlacement.${settingsPlacementKey}.categoryArchives.selected`,
e.target.value,
),
cond([
[
// only disable "All pages" toggle if not empty
(): boolean => !!e.target.value.length,
assocPath(
`formPlacement.${settingsPlacementKey}.categoryArchives.all`,
false,
), // disable all if some pages are selected
],
[(): boolean => !e.target.value.length, identity],
]),
])(formSettings);
}}
field={{
id: `${prefix}categoryArchives`,
name: 'categoryArchives',
values: categories,
multiple: true,
placeholder: MailPoet.I18n.t(
'selectSpecificArchiveCategories',
),
getLabel: (tag): void => tag.name,
selected: (): void =>
formSettings.formPlacement[settingsPlacementKey]
.categoryArchives.selected,
}}
/>
</div>
</div>
</>
)}
</>
);
}

View File

@@ -11,6 +11,9 @@ type FormPlacementBase = {
tags: string[] | number[];
posts: { all: boolean | '' | '1'; selected: string[] };
pages: { all: boolean | '' | '1'; selected: string[] };
homepage: boolean | '' | '1';
tagArchives: { all: boolean | '' | '1'; selected: string[] };
categoryArchives: { all: boolean | '' | '1'; selected: string[] };
};
export type FormSettingsType = {

View File

@@ -45,6 +45,25 @@ export function mapFormDataAfterLoading(data) {
? data.settings.form_placement?.popup?.pages?.selected
: [],
},
homepage: data.settings.form_placement?.popup?.homepage === '1',
tagArchives: {
all: data.settings.form_placement?.popup?.tagArchives?.all === '1',
selected: Array.isArray(
data.settings.form_placement?.popup?.tagArchives?.selected,
)
? data.settings.form_placement?.popup?.tagArchives?.selected
: [],
},
categoryArchives: {
all:
data.settings.form_placement?.popup?.categoryArchives?.all ===
'1',
selected: Array.isArray(
data.settings.form_placement?.popup?.categoryArchives?.selected,
)
? data.settings.form_placement?.popup?.categoryArchives?.selected
: [],
},
},
fixedBar: {
enabled: data.settings.form_placement?.fixed_bar?.enabled === '1',
@@ -85,6 +104,28 @@ export function mapFormDataAfterLoading(data) {
? data.settings.form_placement?.fixed_bar?.pages?.selected
: [],
},
homepage: data.settings.form_placement?.fixed_bar?.homepage === '1',
tagArchives: {
all:
data.settings.form_placement?.fixed_bar?.tagArchives?.all === '1',
selected: Array.isArray(
data.settings.form_placement?.fixed_bar?.tagArchives?.selected,
)
? data.settings.form_placement?.fixed_bar?.tagArchives?.selected
: [],
},
categoryArchives: {
all:
data.settings.form_placement?.fixed_bar?.categoryArchives?.all ===
'1',
selected: Array.isArray(
data.settings.form_placement?.fixed_bar?.categoryArchives
?.selected,
)
? data.settings.form_placement?.fixed_bar?.categoryArchives
?.selected
: [],
},
},
belowPosts: {
enabled: data.settings.form_placement?.below_posts?.enabled === '1',
@@ -151,6 +192,28 @@ export function mapFormDataAfterLoading(data) {
? data.settings.form_placement?.slide_in?.pages?.selected
: [],
},
homepage: data.settings.form_placement?.slide_in?.homepage === '1',
tagArchives: {
all:
data.settings.form_placement?.slide_in?.tagArchives?.all === '1',
selected: Array.isArray(
data.settings.form_placement?.slide_in?.tagArchives?.selected,
)
? data.settings.form_placement?.slide_in?.tagArchives?.selected
: [],
},
categoryArchives: {
all:
data.settings.form_placement?.slide_in?.categoryArchives?.all ===
'1',
selected: Array.isArray(
data.settings.form_placement?.slide_in?.categoryArchives
?.selected,
)
? data.settings.form_placement?.slide_in?.categoryArchives
?.selected
: [],
},
},
others: {
styles: {

View File

@@ -32,6 +32,23 @@ export function mapFormDataBeforeSaving(data) {
: '',
selected: data.settings.formPlacement?.popup?.pages?.selected,
},
homepage:
data.settings.formPlacement?.popup?.homepage === true ? '1' : '',
tagArchives: {
all:
data.settings.formPlacement?.popup?.tagArchives?.all === true
? '1'
: '',
selected: data.settings.formPlacement?.popup?.tagArchives?.selected,
},
categoryArchives: {
all:
data.settings.formPlacement?.popup?.categoryArchives?.all === true
? '1'
: '',
selected:
data.settings.formPlacement?.popup?.categoryArchives?.selected,
},
},
fixed_bar: {
enabled:
@@ -58,6 +75,25 @@ export function mapFormDataBeforeSaving(data) {
: '',
selected: data.settings.formPlacement?.fixedBar?.pages?.selected,
},
homepage:
data.settings.formPlacement?.fixedBar?.homepage === true ? '1' : '',
tagArchives: {
all:
data.settings.formPlacement?.fixedBar?.tagArchives?.all === true
? '1'
: '',
selected:
data.settings.formPlacement?.fixedBar?.tagArchives?.selected,
},
categoryArchives: {
all:
data.settings.formPlacement?.fixedBar?.categoryArchives?.all ===
true
? '1'
: '',
selected:
data.settings.formPlacement?.fixedBar?.categoryArchives?.selected,
},
},
below_posts: {
enabled:
@@ -107,6 +143,25 @@ export function mapFormDataBeforeSaving(data) {
: '',
selected: data.settings.formPlacement?.slideIn?.pages?.selected,
},
homepage:
data.settings.formPlacement?.slideIn?.homepage === true ? '1' : '',
tagArchives: {
all:
data.settings.formPlacement?.slideIn?.tagArchives?.all === true
? '1'
: '',
selected:
data.settings.formPlacement?.slideIn?.tagArchives?.selected,
},
categoryArchives: {
all:
data.settings.formPlacement?.slideIn?.categoryArchives?.all ===
true
? '1'
: '',
selected:
data.settings.formPlacement?.slideIn?.categoryArchives?.selected,
},
},
others: {
styles: data.settings.formPlacement?.others?.styles,

View File

@@ -234,6 +234,10 @@ class Hooks {
'woocommerce_product_loop_end',
[$this->displayFormInWPContent, 'wooProductListDisplay']
);
$this->wp->addAction(
'wp_footer',
[$this->displayFormInWPContent, 'maybeRenderFormsInFooter']
);
}
public function setupMailer() {

View File

@@ -61,6 +61,8 @@ class DisplayFormInWPContent {
private $inWooProductLoop = false;
private $renderedDisplayTypes = [];
public function __construct(
WPFunctions $wp,
FormsRepository $formsRepository,
@@ -81,43 +83,69 @@ class DisplayFormInWPContent {
$this->woocommerceHelper = $woocommerceHelper;
}
/**
* This takes input from an action and any plugin or theme can pass anything.
* We return string for regular content otherwise we just pass thru what comes.
* @param mixed $content
* @return string|mixed
*/
private function display($content = null) {
if (!is_string($content) || !$this->shouldDisplay()) return $content;
private function getFormMarkup(): string {
$formMarkup = '';
$forms = $this->getForms();
if (count($forms) === 0) {
return $content;
return $formMarkup;
}
$this->assetsController->setupFrontEndDependencies();
$result = $content;
foreach ($forms as $displayType => $form) {
$result .= $this->getContentBellow($form, $displayType);
}
return $result;
$formMarkup .= $this->getContentBellow($form, $displayType);
}
return $formMarkup;
}
/**
* Hooked to the_content filter
*/
public function contentDisplay($content = null) {
$this->inWooProductLoop = false;
return $this->display($content);
return $this->getContentWithFormMarkup($content);
}
/**
* Hooked to woocommerce_product_loop_end filter
*/
public function wooProductListDisplay($content = null) {
$this->inWooProductLoop = true;
return $this->display($content);
return $this->getContentWithFormMarkup($content);
}
private function getContentWithFormMarkup($content = null) {
if (!is_string($content) || !$this->shouldDisplay()) {
return $content;
}
$formsMarkup = $this->getFormMarkup();
if ($formsMarkup === '') {
return $content;
}
$this->assetsController->setupFrontEndDependencies();
return $content . $formsMarkup;
}
/**
* Hooked to wp_footer action.
*
* @return void
*/
public function maybeRenderFormsInFooter(): void {
if ($this->wp->isArchive() || $this->wp->isFrontPage()) {
$formMarkup = $this->getFormMarkup();
if (!empty($formMarkup)) {
$this->assetsController->setupFrontEndDependencies();
// We are in control of the template and the data can be considered safe at this point
// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped, WordPressDotOrg.sniffs.OutputEscaping.UnescapedOutputParameter
echo $formMarkup;
}
}
}
private function shouldDisplay(): bool {
$result = true;
// This is a fix Yoast plugin and Shapely theme compatibility
// This is to make sure we only display once for each page
// Yast plugin calls `get_the_excerpt` which also triggers hook `the_content` we don't want to include our form in that
// Yoast plugin calls `get_the_excerpt` which also triggers hook `the_content` we don't want to include our form in that
// Shapely calls the hook `the_content` multiple times on the page as well and we would display popup multiple times - not ideal
if (!$this->wp->inTheLoop() || !$this->wp->isMainQuery()) {
$result = $this->wp->applyFilters('mailpoet_display_form_is_main_loop', false);
@@ -228,6 +256,7 @@ class DisplayFormInWPContent {
// add API version
$templateData['api_version'] = API::CURRENT_VERSION;
$this->renderedDisplayTypes[] = $displayType;
return $this->templateRenderer->render('form/front_end_form.html', $templateData);
}
@@ -251,6 +280,9 @@ class DisplayFormInWPContent {
}
private function shouldDisplayFormType(FormEntity $form, string $formType): bool {
if ($this->wasDisplayTypeAlreadyRendered($formType)) {
return false;
}
$settings = $form->getSettings();
// check the structure just to be sure
@@ -267,6 +299,10 @@ class DisplayFormInWPContent {
if (!$this->shouldDisplayFormForWPUser($form, $formType)) return false;
if ($this->wp->isFrontPage() && $this->shouldDisplayFormOnFrontPage($setup)) {
return true;
}
if ($this->wp->isSingular($this->wp->applyFilters('mailpoet_display_form_supported_post_types', self::SUPPORTED_POST_TYPES))) {
if ($this->shouldDisplayFormOnPost($setup, 'posts')) return true;
if ($this->shouldDisplayFormOnCategory($setup)) return true;
@@ -277,6 +313,14 @@ class DisplayFormInWPContent {
return true;
}
if ($this->wp->isTag() || $this->wp->isTax('product_tag')) {
if ($this->shouldDisplayFormOnTagArchive($setup)) return true;
}
if ($this->wp->isCategory() || $this->wp->isTax('product_cat')) {
if ($this->shouldDisplayFormOnCategoryArchive($setup)) return true;
}
if ($this->displayFormInProductListPage()) {
// Allow form display on Woo Shop listing page
if (is_null($this->wooShopPageId)) return false;
@@ -313,4 +357,28 @@ class DisplayFormInWPContent {
if ($this->wp->hasTerm($setup['tags'], 'product_tag')) return true;
return false;
}
private function shouldDisplayFormOnFrontPage(array $setup): bool {
return ($setup['homepage'] ?? false) === '1';
}
private function shouldDisplayFormOnCategoryArchive($setup): bool {
if (!isset($setup['categoryArchives'])) return false;
if (($setup['categoryArchives']['all'] ?? false) === '1') return true;
$selectedCategories = $setup['categoryArchives']['selected'] ?? [];
if ($selectedCategories === []) return false;
return $this->wp->hasCategory($selectedCategories) || $this->wp->hasTerm($selectedCategories, 'product_cat');
}
private function shouldDisplayFormOnTagArchive($setup): bool {
if (!isset($setup['tagArchives'])) return false;
if (($setup['tagArchives']['all'] ?? false) === '1') return true;
$selectedTags = $setup['tagArchives']['selected'] ?? [];
if ($selectedTags === []) return false;
return $this->wp->hasTag($selectedTags) || $this->wp->hasTerm($selectedTags, 'product_tag');
}
private function wasDisplayTypeAlreadyRendered(string $displayType): bool {
return in_array($displayType, $this->renderedDisplayTypes);
}
}

View File

@@ -643,6 +643,10 @@ class Functions {
return is_main_query();
}
public function isFrontPage(): bool {
return is_front_page();
}
public function getPrivacyPolicyUrl(): string {
return get_privacy_policy_url();
}
@@ -693,6 +697,18 @@ class Functions {
return is_archive();
}
public function isTag($tag = '') {
return is_tag($tag);
}
public function isCategory($category = '') {
return is_category($category);
}
public function isTax($taxonomy = '', $term = '') {
return is_tax($taxonomy, $term);
}
/**
* Determines whether the query is for an existing post type archive page.
*

View File

@@ -522,6 +522,198 @@ class DisplayFormInWPContentTest extends \MailPoetUnitTest {
expect($result)->endsWith($formHtml);
}
public function testDisplayFormOnAllTagArchives(): void {
$formHtml = '<form id="test-form"></form>';
$this->wp->expects($this->any())->method('isTag')->willReturn(true);
$this->wp->expects($this->any())->method('isArchive')->willReturn(true);
$this->assetsController->expects($this->once())->method('setupFrontEndDependencies');
$this->templateRenderer->expects($this->once())->method('render')->willReturn($formHtml);
$form = new FormEntity('My Form');
$form->setSettings([
'segments' => ['3'],
'form_placement' => [
'popup' => ['enabled' => '1', '', 'tagArchives' => ['all' => '1']],
],
'success_message' => 'Hello',
]);
$form->setBody([['type' => 'submit', 'params' => ['label' => 'Subscribe!'], 'id' => 'submit', 'name' => 'Submit']]);
$this->repository->expects($this->once())->method('findBy')->willReturn([$form]);
ob_start();
$this->hook->maybeRenderFormsInFooter();
$renderedFormHtml = ob_get_clean();
expect($renderedFormHtml)->equals($formHtml);
}
public function testItRendersOnlyForSpecificTagArchive(): void {
$formHtml = '<form id="test-form"></form>';
$this->wp->expects($this->any())->method('isArchive')->willReturn(true);
$this->wp->expects($this->any())->method('isTag')->willReturn(true);
$this->wp->expects($this->any())->method('hasTag')->willReturnCallback(function(array $tags) {
if (in_array('10', $tags)) {
return true;
}
return false;
});
$this->assetsController->expects($this->once())->method('setupFrontEndDependencies');
$this->templateRenderer->expects($this->once())->method('render')->willReturn($formHtml);
$form = new FormEntity('My Form');
$form->setSettings([
'segments' => ['3'],
'form_placement' => [
'popup' => ['enabled' => '1', '', 'tagArchives' => ['all' => '', 'selected' => ['10']]],
],
'success_message' => 'Hello',
]);
$form->setBody([['type' => 'submit', 'params' => ['label' => 'Subscribe!'], 'id' => 'submit', 'name' => 'Submit']]);
$this->repository->expects($this->any())->method('findBy')->willReturn([$form]);
ob_start();
$this->hook->maybeRenderFormsInFooter();
$renderedFormHtml = ob_get_clean();
expect($renderedFormHtml)->equals($formHtml);
$form->setSettings([
'segments' => ['3'],
'form_placement' => [
'popup' => ['enabled' => '1', '', 'categoryArchives' => ['all' => '', 'selected' => ['15']]],
],
'success_message' => 'Hello',
]);
ob_start();
$this->hook->maybeRenderFormsInFooter();
$renderedFormHtml = ob_get_clean();
expect($renderedFormHtml)->equals('');
}
public function testItDoesNotDisplayOnTagListingIfNotEnabled(): void {
$this->wp->expects($this->any())->method('isTag')->willReturn(true);
$this->wp->expects($this->any())->method('isArchive')->willReturn(true);
$this->assetsController->expects($this->never())->method('setupFrontEndDependencies');
$form = new FormEntity('My Form');
$form->setSettings([
'segments' => ['3'],
'form_placement' => [
'popup' => ['enabled' => '1', '', 'tagArchives' => ['all' => '']],
],
'success_message' => 'Hello',
]);
$form->setBody([['type' => 'submit', 'params' => ['label' => 'Subscribe!'], 'id' => 'submit', 'name' => 'Submit']]);
$this->repository->expects($this->once())->method('findBy')->willReturn([$form]);
ob_start();
$this->hook->maybeRenderFormsInFooter();
$renderedFormHtml = ob_get_clean();
expect($renderedFormHtml)->equals('');
}
public function testDisplayFormOnAllCategoryArchives(): void {
$formHtml = '<form id="test-form"></form>';
$this->wp->expects($this->any())->method('isArchive')->willReturn(true);
$this->wp->expects($this->any())->method('isCategory')->willReturn(true);
$this->assetsController->expects($this->once())->method('setupFrontEndDependencies');
$this->templateRenderer->expects($this->once())->method('render')->willReturn($formHtml);
$form = new FormEntity('My Form');
$form->setSettings([
'segments' => ['3'],
'form_placement' => [
'popup' => ['enabled' => '1', '', 'categoryArchives' => ['all' => '1']],
],
'success_message' => 'Hello',
]);
$form->setBody([['type' => 'submit', 'params' => ['label' => 'Subscribe!'], 'id' => 'submit', 'name' => 'Submit']]);
$this->repository->expects($this->once())->method('findBy')->willReturn([$form]);
ob_start();
$this->hook->maybeRenderFormsInFooter();
$renderedFormHtml = ob_get_clean();
expect($renderedFormHtml)->equals($formHtml);
}
public function testItRendersOnlyForSpecificCategoryArchive(): void {
$formHtml = '<form id="test-form"></form>';
$this->wp->expects($this->any())->method('isArchive')->willReturn(true);
$this->wp->expects($this->any())->method('isCategory')->willReturn(true);
$this->wp->expects($this->any())->method('hasCategory')->willReturnCallback(function(array $categories) {
return in_array('10', $categories);
});
$this->assetsController->expects($this->once())->method('setupFrontEndDependencies');
$this->templateRenderer->expects($this->once())->method('render')->willReturn($formHtml);
$form = new FormEntity('My Form');
$form->setSettings([
'segments' => ['3'],
'form_placement' => [
'popup' => ['enabled' => '1', '', 'categoryArchives' => ['all' => '', 'selected' => ['10']]],
],
'success_message' => 'Hello',
]);
$form->setBody([['type' => 'submit', 'params' => ['label' => 'Subscribe!'], 'id' => 'submit', 'name' => 'Submit']]);
$this->repository->expects($this->any())->method('findBy')->willReturn([$form]);
ob_start();
$this->hook->maybeRenderFormsInFooter();
$renderedFormHtml = ob_get_clean();
expect($renderedFormHtml)->equals($formHtml);
$form->setSettings([
'segments' => ['3'],
'form_placement' => [
'popup' => ['enabled' => '1', '', 'categoryArchives' => ['all' => '', 'selected' => ['15']]],
],
'success_message' => 'Hello',
]);
ob_start();
$this->hook->maybeRenderFormsInFooter();
$renderedFormHtml = ob_get_clean();
expect($renderedFormHtml)->equals('');
}
public function testItDoesNotDisplayOnCategoryListingIfNotEnabled(): void {
$this->wp->expects($this->any())->method('isArchive')->willReturn(true);
$this->wp->expects($this->any())->method('isCategory')->willReturn(true);
$this->assetsController->expects($this->never())->method('setupFrontEndDependencies');
$form = new FormEntity('My Form');
$form->setSettings([
'segments' => ['3'],
'form_placement' => [
'popup' => ['enabled' => '1', '', 'categoryArchives' => ['all' => '']],
],
'success_message' => 'Hello',
]);
$form->setBody([['type' => 'submit', 'params' => ['label' => 'Subscribe!'], 'id' => 'submit', 'name' => 'Submit']]);
$this->repository->expects($this->once())->method('findBy')->willReturn([$form]);
ob_start();
$this->hook->maybeRenderFormsInFooter();
$renderedFormHtml = ob_get_clean();
expect($renderedFormHtml)->equals('');
}
public function testItDisplaysOnHomepage(): void {
$formHtml = '<form id="test-form"></form>';
$this->wp->expects($this->any())->method('isFrontPage')->willReturn(true);
$this->assetsController->expects($this->once())->method('setupFrontEndDependencies');
$this->templateRenderer->expects($this->once())->method('render')->willReturn($formHtml);
$form = new FormEntity('My Form');
$form->setSettings([
'segments' => ['3'],
'form_placement' => [
'popup' => ['enabled' => '1', 'homepage' => '1'],
],
'success_message' => 'Hello',
]);
$form->setBody([['type' => 'submit', 'params' => ['label' => 'Subscribe!'], 'id' => 'submit', 'name' => 'Submit']]);
$this->repository->expects($this->once())->method('findBy')->willReturn([$form]);
ob_start();
$this->hook->maybeRenderFormsInFooter();
$renderedFormHtml = ob_get_clean();
expect($renderedFormHtml)->equals($formHtml);
}
public function testDoesNotAppendPopupFormIfLoggedInAndSubscribed() {
$formHtml = '<form id="test-form"></form>';
$subscriber = new SubscriberEntity();

View File

@@ -95,6 +95,7 @@
'placeFormBellowPagesDescription': __('This form placement allows you to add this form at the end of all the pages or posts, below the content.'),
'placeFormOnAllPages': _x('Display on all pages', 'This is a text on a switch if a form should be displayed bellow all pages'),
'placeFormOnAllPosts': _x('Display on all posts/products', 'This is a text on a switch if a form should be displayed bellow all posts'),
'placeFormOnHomepage': __('Display on the homepage'),
'placeFormOthers': _x('Others (widget)', 'Placement of the form using theme widget'),
'formPlacementDelay': _x('Display with a delay of', 'Label on a selection of different times'),
'formPlacementPlacementPosition': _x('Position', 'Placement of a fixed bar form, on top of the page or on the bottom'),
@@ -133,7 +134,11 @@
'customFieldTypeSelect': _x('Select', 'Form input type'),
'selectPage': _x('Select', 'It is a placeholder in the select box - verb'),
'displayOnCategories': __('Display on posts with these categories'),
'displayOnAllCategoryArchives': __('Display on all post/product category archives'),
'displayOnTags': __('Display on posts with these tags'),
'displayOnAllTagArchives': __('Display on all post/product tag archives'),
'selectSpecificArchiveTags': __('Select specific tags'),
'selectSpecificArchiveCategories': __('Select specific categories'),
'customFieldTypeDate': __('Date'),
'customFieldDateType': __('Type of date'),
'customFieldDateFormat': __('Order'),