queryBuilder = $queryBuilder;
$this->renderedCards = [];
}
protected function getExtraMarkup(AcfCardData $acfCardData): string
{
return '';
}
protected function markCardAsRendered(AcfCardData $acfCardData): void
{
if (! key_exists($acfCardData->getSource(), $this->renderedCards)) {
$this->renderedCards[$acfCardData->getSource()] = $acfCardData;
}
}
public function getMarkup(
AcfCardData $acfCardData,
bool $isLoadMore = false,
bool $isIgnoreCustomMarkup = false
): string {
$markup = '';
if (! $isLoadMore) {
$classes = sprintf('acf-card acf-card--id--%s', $acfCardData->getSource());
$extraClasses = trim($acfCardData->cssClasses);
$extraClasses = $extraClasses ?
' ' . $extraClasses :
'';
$classes .= $extraClasses;
$markup .= sprintf('
' . "\r\n", $classes);
}
$markup .= ! $isLoadMore ?
"\r\n\t" . '
' . "\r\n" :
'';
$markup .= "\t\t" . '$items$' . "\r\n";
$markup .= ! $isLoadMore ?
"\t" . '
' . "\r\n" :
'';
$markup .= ! $isLoadMore ?
$this->getExtraMarkup($acfCardData) :
'';
$markup .= ! $isLoadMore ?
"\r\n" . '
' . "\r\n" :
'';
$this->markCardAsRendered($acfCardData);
return $markup;
}
public function getRenderedCards(): array
{
return $this->renderedCards;
}
public function getLayoutCSS(AcfCardData $acfCardData): string
{
if (! $acfCardData->isUseLayoutCss) {
return '';
}
$css = "/*BEGIN LAYOUT_RULES*/\n";
$css .= "/*Manually edit these rules by disabling Layout Rules, otherwise these rules are updated every time you press the 'Update' button*/\n";
$rules = [];
foreach ($acfCardData->layoutRules as $layoutRule) {
$screen = 0;
switch ($layoutRule->screen) {
case CardLayoutData::SCREEN_TABLET:
$screen = 576;
break;
case CardLayoutData::SCREEN_DESKTOP:
$screen = 992;
break;
case CardLayoutData::SCREEN_LARGE_DESKTOP:
$screen = 1400;
break;
}
$rule = [];
$rule[] = ' display:grid;';
switch ($layoutRule->layout) {
case CardLayoutData::LAYOUT_ROW:
$rule[] = ' grid-auto-flow:column;';
$rule[] = sprintf(' grid-column-gap:%s;', $layoutRule->horizontalGap);
break;
case CardLayoutData::LAYOUT_COLUMN:
// the right way is 1fr, but use "1fr" because CodeMirror doesn't recognize it, "1fr" should be replaced with 1fr on the output
$rule[] = ' grid-template-columns:"1fr";';
$rule[] = sprintf(' grid-row-gap:%s;', $layoutRule->verticalGap);
break;
case CardLayoutData::LAYOUT_GRID:
$rule[] = sprintf(' grid-template-columns:repeat(%s, "1fr");', $layoutRule->amountOfColumns);
$rule[] = sprintf(' grid-column-gap:%s;', $layoutRule->horizontalGap);
$rule[] = sprintf(' grid-row-gap:%s;', $layoutRule->verticalGap);
break;
}
$rules[$screen] = $rule;
}
// order is important in media rules
ksort($rules);
foreach ($rules as $screen => $rule) {
if ($screen) {
$css .= sprintf("\n@media screen and (min-width:%spx) {", $screen);
}
$css .= "\n#card .acf-card__items {\n";
$css .= join("\n", $rule);
$css .= "\n}\n";
if ($screen) {
$css .= "}\n";
}
}
$css .= "\n/*END LAYOUT_RULES*/";
return $css;
}
}