Skip to content

Commit 28d72ce

Browse files
authored
Merge pull request #1740 from algolia/feat/MAGE-986-no-code-redirect-config
MAGE-986 Configurable no-code redirects
2 parents 823cea0 + 66df79f commit 28d72ce

18 files changed

+1608
-724
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
<?php
2+
3+
namespace Algolia\AlgoliaSearch\Block\Adminhtml\System\Config\Form\Field;
4+
5+
use Magento\Config\Block\System\Config\Form\Field;
6+
use Magento\Framework\Data\Form\Element\AbstractElement;
7+
8+
class Checkboxes extends Field
9+
{
10+
protected function _getElementHtml(AbstractElement $element)
11+
{
12+
$elementId = $element->getHtmlId();
13+
14+
$html = $this->getCss($elementId);
15+
16+
$html .= sprintf('<div id="%s">', $elementId);
17+
$name = $element->getName();
18+
$options = $element->getValues();
19+
$values = empty($element->getValue()) ? [] : explode(',', $element->getValue()); // store as CSV in config
20+
21+
foreach ($options as $key => $option) {
22+
$value = $option['value'];
23+
$html .= $this->getCheckboxHtml(
24+
$elementId . '_' . $key,
25+
$name,
26+
$value,
27+
in_array($value, $values),
28+
$option['label'],
29+
array_key_exists('description', $option) ? $option['description'] : ''
30+
);
31+
}
32+
33+
$html .= '</div>';
34+
return $html;
35+
}
36+
37+
protected function getCss($elementId): string {
38+
return <<<CSS
39+
<style>
40+
#$elementId .form-group {
41+
display: grid;
42+
grid-template-columns: 24px 1fr;
43+
align-items: start;
44+
margin-bottom: 20px;
45+
}
46+
47+
#$elementId .form-group input[type="checkbox"] {
48+
margin-top: 2px;
49+
}
50+
#$elementId .form-content {
51+
display: flex;
52+
flex-direction: column;
53+
}
54+
#$elementId .form-content label {
55+
font-weight: bold;
56+
color: #333;
57+
}
58+
#$elementId .form-content .description {
59+
font-size: 0.9em;
60+
color: #666;
61+
margin-top: 2px;
62+
}
63+
</style>
64+
CSS;
65+
}
66+
67+
protected function getCheckboxHtml(
68+
string $id,
69+
string $name,
70+
string $value,
71+
bool $checked,
72+
?string $label = null,
73+
?string $description = null
74+
): string
75+
{
76+
$html = '<div class="form-group">';
77+
$html .= sprintf(
78+
'<input type="checkbox" id="%s" name="%s[]" value="%s" %s />',
79+
$id,
80+
$name,
81+
$value,
82+
$checked ? 'checked' : ''
83+
);
84+
$html .= '<div class="form-content">';
85+
$html .= sprintf('<label for="%s">%s</label>',$id, $label ?? $name);
86+
if ($description) {
87+
$html .= sprintf('<span class="description">%s</span>', $description);
88+
}
89+
$html .= '</div>';
90+
$html .= '</div>';
91+
return $html;
92+
}
93+
}

Block/Algolia.php

+5-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
use Algolia\AlgoliaSearch\Helper\AlgoliaHelper;
66
use Algolia\AlgoliaSearch\Helper\ConfigHelper;
7+
use Algolia\AlgoliaSearch\Helper\Configuration\AutocompleteHelper;
8+
use Algolia\AlgoliaSearch\Helper\Configuration\InstantSearchHelper;
79
use Algolia\AlgoliaSearch\Helper\Configuration\PersonalizationHelper;
810
use Algolia\AlgoliaSearch\Helper\Data as CoreHelper;
911
use Algolia\AlgoliaSearch\Helper\Entity\CategoryHelper;
@@ -40,6 +42,9 @@ class Algolia extends Template implements CollectionDataSourceInterface
4042

4143
public function __construct(
4244
protected ConfigHelper $config,
45+
protected AutocompleteHelper $autocompleteConfig,
46+
protected InstantSearchHelper $instantSearchConfig,
47+
protected PersonalizationHelper $personalizationHelper,
4348
protected CatalogSearchHelper $catalogSearchHelper,
4449
protected ProductHelper $productHelper,
4550
protected Currency $currency,
@@ -53,7 +58,6 @@ public function __construct(
5358
protected CategoryHelper $categoryHelper,
5459
protected SuggestionHelper $suggestionHelper,
5560
protected LandingPageHelper $landingPageHelper,
56-
protected PersonalizationHelper $personalizationHelper,
5761
protected CheckoutSession $checkoutSession,
5862
protected DateTime $date,
5963
protected CurrentCategory $currentCategory,

Block/Configuration.php

+57-27
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
use Algolia\AlgoliaSearch\Helper\ConfigHelper;
66
use Algolia\AlgoliaSearch\Helper\InsightsHelper;
7+
use Algolia\AlgoliaSearch\Model\Source\AutocompleteRedirectMode;
8+
use Algolia\AlgoliaSearch\Model\Source\InstantSearchRedirectOptions;
79
use Magento\Framework\App\Request\Http;
810
use Magento\Framework\Data\CollectionDataSourceInterface;
911
use Magento\Framework\DataObject;
@@ -185,33 +187,8 @@ public function getConfiguration()
185187

186188
$attributesToFilter = $config->getAttributesToFilter($customerGroupId);
187189
$algoliaJsConfig = [
188-
'instant' => [
189-
'enabled' => $config->isInstantEnabled(),
190-
'selector' => $config->getInstantSelector(),
191-
'isAddToCartEnabled' => $config->isAddToCartEnable(),
192-
'addToCartParams' => $addToCartParams,
193-
'infiniteScrollEnabled' => $config->isInfiniteScrollEnabled(),
194-
'urlTrackedParameters' => $this->getUrlTrackedParameters(),
195-
'isSearchBoxEnabled' => $config->isInstantSearchBoxEnabled(),
196-
'isVisualMerchEnabled' => $config->isVisualMerchEnabled(),
197-
'categorySeparator' => $config->getCategorySeparator(),
198-
'categoryPageIdAttribute' => $config->getCategoryPageIdAttributeName(),
199-
'isCategoryNavigationEnabled' => self::IS_CATEGORY_NAVIGATION_ENABLED,
200-
'hidePagination' => $config->hidePaginationInInstantSearchPage(),
201-
'isDynamicFacetsEnabled' => $config->isDynamicFacetsEnabled()
202-
],
203-
'autocomplete' => [
204-
'enabled' => $config->isAutoCompleteEnabled(),
205-
'selector' => $config->getAutocompleteSelector(),
206-
'sections' => $config->getAutocompleteSections(),
207-
'nbOfProductsSuggestions' => $config->getNumberOfProductsSuggestions(),
208-
'nbOfCategoriesSuggestions' => $config->getNumberOfCategoriesSuggestions(),
209-
'nbOfQueriesSuggestions' => $config->getNumberOfQueriesSuggestions(),
210-
'isDebugEnabled' => $config->isAutocompleteDebugEnabled(),
211-
'isNavigatorEnabled' => $config->isAutocompleteNavigatorEnabled(),
212-
'debounceMilliseconds' => $config->getAutocompleteDebounceMilliseconds(),
213-
'minimumCharacters' => $config->getAutocompleteMinimumCharacterLength()
214-
],
190+
'instant' => $this->getInstantSearchConfig($addToCartParams),
191+
'autocomplete' => $this->getAutocompleteConfiguration(),
215192
'landingPage' => [
216193
'query' => $this->getLandingPageQuery(),
217194
'configuration' => $this->getLandingPageConfiguration(),
@@ -385,6 +362,59 @@ public function getConfiguration()
385362
return $transport->getData();
386363
}
387364

365+
protected function getAutocompleteConfiguration(): array
366+
{
367+
$config = $this->autocompleteConfig;
368+
return [
369+
'enabled' => $config->isEnabled(),
370+
'selector' => $config->getDomSelector(),
371+
'sections' => $config->getAdditionalSections(),
372+
'nbOfProductsSuggestions' => $config->getNumberOfProductsSuggestions(),
373+
'nbOfCategoriesSuggestions' => $config->getNumberOfCategoriesSuggestions(),
374+
'nbOfQueriesSuggestions' => $config->getNumberOfQueriesSuggestions(),
375+
'isDebugEnabled' => $config->isDebugEnabled(),
376+
'isNavigatorEnabled' => $config->isKeyboardNavigationEnabled(),
377+
'debounceMilliseconds' => $config->getDebounceMilliseconds(),
378+
'minimumCharacters' => $config->getMinimumCharacterLength(),
379+
'redirects' => [
380+
'enabled' => $config->isRedirectEnabled(),
381+
'showSelectableRedirect' => $config->getRedirectMode() !== AutocompleteRedirectMode::SUBMIT_ONLY,
382+
'showHitsWithRedirect' => $config->getRedirectMode() !== AutocompleteRedirectMode::SELECTABLE_REDIRECT,
383+
'openInNewWindow' => $config->isRedirectInNewWindowEnabled()
384+
]
385+
];
386+
}
387+
388+
protected function getInstantSearchConfig(array $addToCartParams): array
389+
{
390+
$config = $this->instantSearchConfig;
391+
$redirectOptions = $config->getInstantRedirectOptions();
392+
$mainConfig = $this->config;
393+
394+
return [
395+
'enabled' => $config->isEnabled(),
396+
'selector' => $config->getDomSelector(),
397+
'isAddToCartEnabled' => $config->isAddToCartEnabled(),
398+
'addToCartParams' => $addToCartParams,
399+
'infiniteScrollEnabled' => $config->isInfiniteScrollEnabled(),
400+
'urlTrackedParameters' => $this->getUrlTrackedParameters(),
401+
'isSearchBoxEnabled' => $config->isSearchBoxEnabled(),
402+
'isVisualMerchEnabled' => $mainConfig->isVisualMerchEnabled(),
403+
'categorySeparator' => $mainConfig->getCategorySeparator(),
404+
'categoryPageIdAttribute' => $mainConfig->getCategoryPageIdAttributeName(),
405+
'isCategoryNavigationEnabled' => self::IS_CATEGORY_NAVIGATION_ENABLED,
406+
'hidePagination' => $config->shouldHidePagination(),
407+
'isDynamicFacetsEnabled' => $config->isDynamicFacetsEnabled(),
408+
'redirects' => [
409+
'enabled' => $config->isInstantRedirectEnabled(),
410+
'onPageLoad' => in_array(InstantSearchRedirectOptions::REDIRECT_ON_PAGE_LOAD, $redirectOptions),
411+
'onSearchAsYouType' => in_array(InstantSearchRedirectOptions::REDIRECT_ON_SEARCH_AS_YOU_TYPE, $redirectOptions),
412+
'showSelectableRedirect' => in_array(InstantSearchRedirectOptions::SELECTABLE_REDIRECT, $redirectOptions),
413+
'openInNewWindow' => in_array(InstantSearchRedirectOptions::OPEN_IN_NEW_WINDOW, $redirectOptions)
414+
]
415+
];
416+
}
417+
388418
protected function areCategoriesInFacets($facets)
389419
{
390420
return in_array('categories', array_column($facets, 'attribute'));

0 commit comments

Comments
 (0)