Link Search Menu Expand Document

Muuta renderöityvää sisältöä dynaamisesti

Tässä ohjeessa muutetaan Sivujetin renderöimän sivun HTML:ää mutatoimalla tietokantaan tallennettua dataa dynaamisesti “lennosta”.

Step 0: Paikallista Site.php.

Paikallista Site.php, joka sijaitsee samassa kansiossa kuin Theme.php, ks. ensimmäinen tutoriaali.

Step 1: Lisää esimerkkisisältö

  1. Lisää johonkin sivuun muokkaustilassa Osio-sisältö, ja sen sisälle Teksti-sisältö
  2. Lisää Osio -sisällölle CSS-luokka footer “Tyylit (koodi)” -tabissa (huomaa että kirjautuneen käyttäjän rooli tulee olla vähintään \Sivujetti\Auth\ACL::ROLE_ADMIN_EDITOR)
  3. Muokkaa Teksti-sisällön tekstiksi esim. (c) [[year]] Yritys Oy

Step 2: Mutatoi sivun sisältölohkoa

Muokkaa ${site_kansio}/Site.php -tiedostoon tekstieditorilla:

<?php declare(strict_types=1);

namespace MySite;

use Sivujetti\Block\BlockTree;
use Sivujetti\Block\Entities\Block;
use Sivujetti\Page\Entities\Page;
use Sivujetti\UserSite\{UserSiteAPI, UserSiteInterface};

class Site implements UserSiteInterface {
    /**
     * @param \Sivujetti\UserSite\UserSiteAPI $api
     */
    public function __construct(UserSiteAPI $api) {
        $api->on($api::ON_PAGE_BEFORE_RENDER, function(Page $page, bool $editModeIsOn) {
            if ($editModeIsOn)
                return;
            $footerSectionBlock = BlockTree::findBlock($page->blocks, fn(Block $b) =>
                $b->type === "Section2" && str_starts_with($b->styleClasses, "footer")
            );
            if ($footerSectionBlock) {
                $footerTextBlock = BlockTree::findBlock($footerSectionBlock->children, fn(Block $b) => $b->type === "Text");
                $footerTextBlock->html = str_replace("[[year]]", date_create()->format("Y"), $footerTextBlock->html);
            }
        });
    }
}

Step 3: Profit

Tämän jälkeen Sivujetti renderöi:

<div todo>
  <p>(c) 2024 Yritys Oy</p>
</div>

, eikä

<div todo>
  <p>(c) [[year]] Yritys Oy</p>
</div>

Mutatoi useita sisältölohkoja

Jos haluat muuttaa useamman kuin yhden lohkon sisältöä, korvaa BlockTree::findBlock() -kutsu BlockTree::filterBlocks() -kutsulla:

<?php declare(strict_types=1);

namespace MySite;

use Sivujetti\Block\BlockTree;
use Sivujetti\Block\Entities\Block;
use Sivujetti\Page\Entities\Page;
use Sivujetti\UserSite\{UserSiteAPI, UserSiteInterface};

class Site implements UserSiteInterface {
    /**
     * @param \Sivujetti\UserSite\UserSiteAPI $api
     */
    public function __construct(UserSiteAPI $api) {
        $api->on($api::ON_PAGE_BEFORE_RENDER, function(Page $page, bool $editModeIsOn) {
            if ($editModeIsOn)
                return;
            $allTextBlocks = BlockTree::filterBlocks($page->blocks, fn(Block $b) => $b->type === "Text");
            foreach ($allTextBlocks as $block) {
                $block->html = str_replace("[[year]]", date_create()->format("Y"), $block->html);
            }
        });
    }
}

© Copyright 2021-present ut4 (CC BY-SA).