PHP code example of verstka / sdk-php74
1. Go to this page and download the library: Download verstka/sdk-php74 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/ */
verstka / sdk-php74 example snippets
use Verstka\Sdk\Config\VerstkaConfig;
$config = new VerstkaConfig(
'verstka-api-key', // apiKey
'verstka-api-secret', // apiSecret
'https://site.example/verstka/callback' // callbackUrl
);
$config = new VerstkaConfig(
'verstka-api-key', // apiKey
'verstka-api-secret', // apiSecret
'https://site.example/verstka/callback', // callbackUrl
'https://api.r2.verstka.org/integration', // apiUrl
200 * 1024 * 1024, // maxContentSize
60.0, // requestTimeout
120.0, // downloadTimeout
false // debug
);
use Verstka\Sdk\Client\VerstkaClient;
use Verstka\Sdk\Config\VerstkaConfig;
function openVerstkaEditor(int $articleId, User $user, VerstkaConfig $config): void
{
$article = ArticleRepository::find($articleId);
if (!UserPolicy::canEdit($user, $article)) {
throw new RuntimeException('Access denied');
}
$client = new VerstkaClient($config);
$editorUrl = $client->getEditorUrl(
(string) $article->id,
$article->vms_json,
[]
);
header('Location: ' . $editorUrl, true, 302);
exit;
}
use Verstka\Sdk\Storage\StorageAdapter;
final class CmsStorage implements StorageAdapter
{
public function saveMedia(
string $filename,
string $tempPath,
string $materialId,
array $metadata
): string {
return $this->saveToCdn("articles/$materialId/$filename", $tempPath);
}
public function saveFontFile(
string $filename,
string $tempPath,
string $materialId,
array $metadata
): string {
return $this->saveToCdn("verstka/fonts/$filename", $tempPath);
}
public function saveFontsManifest(
string $filename,
string $tempPath,
string $materialId,
array $metadata
): string {
return $this->saveToCdn("verstka/fonts/$filename", $tempPath);
}
}
use Verstka\Sdk\Storage\LocalStorageAdapter;
$storage = new LocalStorageAdapter(
'/var/www/uploads',
'https://cdn.example.com/uploads'
);
use Verstka\Sdk\Client\VerstkaClient;
use Verstka\Sdk\Finalize\ContentFinalizeContext;
use Verstka\Sdk\Finalize\ContentFinalizeResult;
$client = new VerstkaClient($config);
$storage = new CmsStorage();
$result = $client->processMaterialCallback(
$requestPayload,
$_SERVER['HTTP_X_VERSTKA_SIGNATURE'] ?? '',
$storage,
function (ContentFinalizeContext $ctx): ContentFinalizeResult {
ArticleRepository::saveVerstkaContent(
$ctx->materialId,
$ctx->vmsHtml,
$ctx->vmsJson,
$ctx->metadata
);
return new ContentFinalizeResult(true, $ctx->vmsJson);
}
);
header('Content-Type: application/json');
echo json_encode($result->toResponse());
use Verstka\Sdk\Finalize\FontsFinalizeContext;
use Verstka\Sdk\Finalize\FontsFinalizeResult;
$result = $client->processFontsCallback(
$requestPayload,
$_SERVER['HTTP_X_VERSTKA_SIGNATURE'] ?? '',
$storage,
function (FontsFinalizeContext $ctx): FontsFinalizeResult {
SiteSettings::set('verstka_fonts_css_url', $ctx->cssUrl);
SiteSettings::set('verstka_fonts_json_url', $ctx->jsonUrl);
return new FontsFinalizeResult(true, $ctx->fonts);
}
);
use Verstka\Sdk\Integration\CallbackDispatcher;
use Verstka\Sdk\Finalize\ContentFinalizeContext;
use Verstka\Sdk\Finalize\ContentFinalizeResult;
use Verstka\Sdk\Finalize\FontsFinalizeContext;
use Verstka\Sdk\Finalize\FontsFinalizeResult;
try {
$response = CallbackDispatcher::dispatch(
$client,
$requestPayload,
$_SERVER['HTTP_X_VERSTKA_SIGNATURE'] ?? '',
$storage,
function (ContentFinalizeContext $ctx): ContentFinalizeResult {
ArticleRepository::saveVerstkaContent(
$ctx->materialId,
$ctx->vmsHtml,
$ctx->vmsJson,
$ctx->metadata
);
return new ContentFinalizeResult(true, $ctx->vmsJson);
},
function (FontsFinalizeContext $ctx): FontsFinalizeResult {
SiteSettings::set('verstka_fonts_css_url', $ctx->cssUrl);
return new FontsFinalizeResult(true, $ctx->fonts);
}
);
header('Content-Type: application/json');
echo json_encode($response);
} catch (\Throwable $e) {
$error = CallbackDispatcher::mapException($e);
http_response_code($error->status);
header('Content-Type: application/json');
echo json_encode($error->toArray());
}
$editorUrl = $client->getEditorUrl(
(string) $article->id,
$article->vms_json,
[
'editor_user_id' => (string) $user->id,
'section_id' => (string) $article->section_id,
'timeLimitedAuthToken' => $cmsToken,
'customContainers' => [],
]
);
use Verstka\Sdk\Finalize\ContentPreSaveContext;
use Verstka\Sdk\Finalize\PreSaveDecision;
$result = $client->processMaterialCallback(
$payload,
$signature,
$storage,
$onFinalize,
function (ContentPreSaveContext $ctx): PreSaveDecision {
if (!UserPolicy::canSave($ctx->metadata['timeLimitedAuthToken'] ?? null, $ctx->materialId)) {
return new PreSaveDecision(false, 'Access denied');
}
return new PreSaveDecision(true);
}
);
$client->getEditorUrl('42', null, [
'webhook_auth_user' => 'callback-user',
'webhook_auth_password' => 'callback-password',
]);
$client->getEditorUrl('42', null, [
'webhook_auth_user' => 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...',
]);