1. Go to this page and download the library: Download nomadicjosh/vihzhuo library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
declare(strict_types=1);
use Qubus\Http\Emitter\SapiEmitter;
use Qubus\Http\ServerRequestFactory;
use Vihzhuo\Vihzhuo;
onfiguration must return an array.');
}
$vihzhuo = new Vihzhuo($config);
$request = ServerRequestFactory::fromGlobals();
$response = $vihzhuo->handleRequest($request);
new SapiEmitter()->emit($response);
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Vihzhuo\Vihzhuo;
final class PageBuilderRoute
{
public function __construct(private readonly Vihzhuo $vihzhuo)
{
}
public function __invoke(ServerRequestInterface $request): ResponseInterface
{
return $this->vihzhuo->handleRequest($request);
}
}
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Vihzhuo\Vihzhuo;
/** @return ResponseInterface|null */
function handleCmsRequest(
Vihzhuo $vihzhuo,
ServerRequestInterface $request,
bool $userCanManagePages
): ?ResponseInterface {
// Public pages, Vihzhuo assets, and uploaded images.
$publicResponse = $vihzhuo->handlePublicRequest($request);
if ($publicResponse !== null) {
return $publicResponse;
}
// Apply the host application's authentication/authorization before this.
if ($userCanManagePages) {
$managerResponse = $vihzhuo->handleAuthenticatedRequest($request);
if ($managerResponse !== null) {
return $managerResponse;
}
}
return null; // Let the next application route or middleware run.
}
use Vihzhuo\Contracts\PageContract;
/** @var PageContract $page */
$response = $vihzhuo->renderPageBuilder($page);
declare(strict_types=1);
namespace App\PageBuilder\Blocks\LatestPosts;
use Vihzhuo\Modules\GrapesJS\Block\BaseModel;
final class Model extends BaseModel
{
/** @var list<array{title: string, url: string}> */
private array $posts = [];
protected function init(): void
{
$this->posts = [
['title' => 'First post', 'url' => '/blog/first-post'],
];
}
// Optional editor-only initialization for a fast or deterministic preview.
protected function initEdit(): void
{
$this->posts = [
['title' => 'Example post', 'url' => '#'],
];
}
/** @return list<array{title: string, url: string}> */
public function posts(): array
{
return $this->posts;
}
}
<ul class="latest-posts">
foreach ($block->posts() as $post):
declare(strict_types=1);
namespace App\PageBuilder\Blocks\LatestPosts;
use Vihzhuo\Modules\GrapesJS\Block\BaseController;
final class Controller extends BaseController
{
public function handleRequest(): void
{
// Perform block-specific request coordination here.
// The initialized model, page, and editor flag are protected properties.
}
}