次のstrapi v 3のプレビューボタンを作成します.js
Quadri保安官、意欲的な技術的な作家、ソフトウェアプログラマーとアミルTadrisi、最先端のテクノロジーで働く挑戦を愛しているFullstackエンジニアは、大きな記事を書きました;Implementing Previews with Next Applications using a Strapi backend & How to use Image and preview in your Nextjs - Strapi blog 次のプレビューシステムを使用する.strapiによるjs
私は、このユースケースが非常に要求されて、彼らの記事が多くの質問に答えるので、彼らに感謝するためにこの機会を利用しています.私は、このタイプの貢献がStrapiコミュニティにとって非常に重要であると強調したいです、そして、あなたがそれの一部でありたいならば、私はあなたに我々に加わるよう招待しますWrite for the Community Program .
この(非常に)短い記事は、Quadriとアミルが書いたものを補うものになります.あなたはstrapi管理者に直接プレビューボタンを実装する方法が表示されます.すごいじゃない?
あなたが確かに知っていなければならないように、Strapiは完全にオープンソースです.ランダムなGIFを生成するコンテンツマネージャーにボタンを入れたいなら、それは絶対に可能です.単にコンポーネントを作成し、管理者にそれを注入します.
コンポーネントを注入することは、我々がここでするつもりです.
注意してください、このチュートリアルはstrapiのv 3に基づいています.v 4版のこのチュートリアルのバージョンは、それが利用可能になるとき、ページの最上位で言及されます.
前に述べたように、あなたは既にあなたの好きなフロントエンドのフレームワークのようなプレビューシステムを持っていると仮定するつもりですNext.js このような特定のプレビューURLが必要です.
The
あなたは
クリエイトア
クリエイトア
クリエイトア
コンテンツが既に公開されている場合、我々は何もしない
./pages/api ./utils/index.js まあ、何もすることはありません!あなたの管理者を構築することができますあなたのサーバーを実行し、コンテンツをプレビュー! 次のコマンドを使用して管理者をビルドします.
サーバの再起動
これはFoodAdviderフロントエンドのようになります.
strapiのカスタマイズは非常に簡単です.我々は、ここで3つのファイルを作成し、それらの1つだけです.SVG!
Straapiはネイティブのプレビュー機能を提供していませんので、それはヘッドレスCMSですが、オープンソースであることで、それはあなたのフロントエンドアプリケーションのニーズに適応する自由と柔軟性を与える.
これはおそらく管理者で行うことができるプレビューの最も簡単な実装でした.コンテンツマネージャでフロントエンドのアプリケーションプレビューを直接表示するコンポーネントを作成することで、さらに進むことに挑戦します!
次の記事でお会いしましょう!
私は、このユースケースが非常に要求されて、彼らの記事が多くの質問に答えるので、彼らに感謝するためにこの機会を利用しています.私は、このタイプの貢献がStrapiコミュニティにとって非常に重要であると強調したいです、そして、あなたがそれの一部でありたいならば、私はあなたに我々に加わるよう招待しますWrite for the Community Program .
この(非常に)短い記事は、Quadriとアミルが書いたものを補うものになります.あなたはstrapi管理者に直接プレビューボタンを実装する方法が表示されます.すごいじゃない?
カスタマイズ
あなたが確かに知っていなければならないように、Strapiは完全にオープンソースです.ランダムなGIFを生成するコンテンツマネージャーにボタンを入れたいなら、それは絶対に可能です.単にコンポーネントを作成し、管理者にそれを注入します.
コンポーネントを注入することは、我々がここでするつもりです.
注意してください、このチュートリアルはstrapiのv 3に基づいています.v 4版のこのチュートリアルのバージョンは、それが利用可能になるとき、ページの最上位で言及されます.
前に述べたように、あなたは既にあなたの好きなフロントエンドのフレームワークのようなプレビューシステムを持っていると仮定するつもりですNext.js このような特定のプレビューURLが必要です.
http://localhost:3000/api/preview?secret=fdsfasdmgrNPQXtfdsfMswfdsfdsfasdkjfow&slug=pricing](http://localhost:3000/api/preview?secret=fdsfasdmgrNPQXtfdsfMswfdsfdsfasdkjfow&slug=pricing&lang=en&type=page
我々は、単にあなたのコレクションタイプに基づいてこのURLを構築するコンテンツマネージャのボタンを作成します.拡張
The
/extensions
フォルダには、すべてのプラグインのカスタマイズ可能なファイルが含まれます.詳細情報the dedicated documentation page. あなたは
content-manager
以下のフォルダ./extensions/content-manager/admin/src/index.js
以下を含むファイルimport pluginPkg from '../../package.json';
import pluginId from './pluginId';
import pluginLogo from './assets/images/logo.svg';
import App from './containers/Main';
import ExternalLink from './InjectedComponents/ExternalLink';
import ConfigureViewButton from './InjectedComponents/ContentTypeBuilder/ConfigureViewButton';
import lifecycles from './lifecycles';
import reducers from './reducers';
import trads from './translations';
export default (strapi) => {
const pluginDescription = pluginPkg.strapi.description || pluginPkg.description;
const plugin = {
blockerComponent: null,
blockerComponentProps: {},
description: pluginDescription,
icon: pluginPkg.strapi.icon,
id: pluginId,
initializer: null,
injectedComponents: [
{
plugin: 'content-type-builder.listView',
area: 'list.link',
component: ConfigureViewButton,
key: 'content-manager.link',
},
// This is the injection zone
{
plugin: 'content-manager.editView',
area: 'right.links',
component: ExternalLink,
key: 'content-manager.preview-link',
},
],
injectionZones: {
editView: { informations: [] },
listView: { actions: [], deleteModalAdditionalInfos: [] },
},
isReady: true,
isRequired: pluginPkg.strapi.required || false,
layout: null,
lifecycles,
mainComponent: App,
name: pluginPkg.strapi.name,
pluginLogo,
preventComponentRendering: false,
reducers,
trads,
};
return strapi.registerPlugin(plugin);
};
このファイルを使用すると、すぐに作成するカスタムコンポーネントを注入できます.このコンポーネントはすでにインポート中です.import ExternalLink from './InjectedComponents/ExternalLink';
そうすると、injectedComponents: [
{
plugin: 'content-type-builder.listView',
area: 'list.link',
component: ConfigureViewButton,
key: 'content-manager.link',
},
// This is the injection zone
{
plugin: 'content-manager.editView',
area: 'right.links',
component: ExternalLink,
key: 'content-manager.preview-link',
},
],
それについての詳細情報を見つけるdocumentation ../extensions/content-manager/admin/src/InjectedComponents/ExternalLink/index.js
以下を含むファイルimport React from 'react';
import styled from 'styled-components';
import { useContentManagerEditViewDataManager } from 'strapi-helper-plugin';
import EyeIcon from './view.svg';
const StyledExternalLink = styled.a`
display: block;
color: #333740;
width: 100%;
text-decoration: none;
span,
i,
svg {
color: #333740;
width: 13px;
height: 12px;
margin-right: 10px;
vertical-align: 0;
}
span {
font-size: 13px;
}
i {
display: inline-block;
background-image: url(${EyeIcon});
background-size: contain;
}
&:hover {
text-decoration: none;
span,
i,
svg {
color: #007eff;
}
}
`;
const ExternalLink = () => {
const { modifiedData, layout } = useContentManagerEditViewDataManager();
if (modifiedData.published_at) {
return null;
}
if (!modifiedData.slug) {
return null;
}
if (!CLIENT_URL || !CLIENT_PREVIEW_SECRET) {
return null;
}
return (
<li>
<StyledExternalLink
href={`${CLIENT_URL}/api/preview?secret=${CLIENT_PREVIEW_SECRET}&slug=${modifiedData.slug}&locale=${modifiedData.locale}&apiID=${layout.apiID}&kind=${layout.kind}`}
target="_blank"
rel="noopener noreferrer"
title="page preview"
>
<i />
Preview
</StyledExternalLink>
</li>
);
};
export default ExternalLink;
ここで説明するのにかなりのものがあります.最初の1つは、ボタンのSVGアイアイコンをインポートすることです../extensions/content-manager/admin/src/InjectedComponents/ExternalLink/view.svg
以下を含むファイル<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0z" fill="none"/><path d="M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zM12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z"/></svg>
さあ、これに集中しましょう.const ExternalLink = () => {
const { modifiedData, layout } = useContentManagerEditViewDataManager();
if (modifiedData.published_at) {
return null;
}
if (!modifiedData.slug) {
return null;
}
if (!CLIENT_URL || !CLIENT_PREVIEW_SECRET) {
return null;
}
return (
<li>
<StyledExternalLink
href={`${CLIENT_URL}/api/preview?secret=${CLIENT_PREVIEW_SECRET}&slug=${modifiedData.slug}&locale=${modifiedData.locale}&apiID=${layout.apiID}&kind=${layout.kind}`}
target="_blank"
rel="noopener noreferrer"
title="page preview"
>
<i />
Preview
</StyledExternalLink>
</li>
);
};
これは、FoodAdvisor , 次のライブデモ.JSフロントエンド.まず第一にmodifiedData
and layout
からuseContentManagerEditViewDataManager
フック.第一は、あなたのエントリーデータを含んでいるオブジェクトです、そして、第2にはあなたのエントリー(AIIID、Content - Type、Metadatas等の種類)についてのより興味深い情報がありますコンテンツが既に公開されている場合、我々は何もしない
slug
フィールドまたは必要なENV変数が存在しない場合.実際には、コンテンツがまだ公開されていないときにプレビューボタンを表示するだけです.また、それがスラグまたは必要なENV変数を含まないならば、それはあなたがあなたのフロントエンドでそれをプレビューすることができないことを意味します.if (modifiedData.published_at) {
return null;
}
if (!modifiedData.slug) {
return null;
}
if (!CLIENT_URL || !CLIENT_PREVIEW_SECRET) {
return null;
}
問題がない場合は、コンテンツマネージャーの編集ビューでボタンを単に表示します.return (
<li>
<StyledExternalLink
href={`${CLIENT_URL}/api/preview?secret=${CLIENT_PREVIEW_SECRET}&slug=${modifiedData.slug}&locale=${modifiedData.locale}&apiID=${layout.apiID}&kind=${layout.kind}`}
target="_blank"
rel="noopener noreferrer"
title="page preview"
>
<i />
Preview
</StyledExternalLink>
</li>
);
URLがどのように構築されているかを見てください.`${CLIENT_URL}/api/preview?secret=${CLIENT_PREVIEW_SECRET}&slug=${modifiedData.slug}`
ここで本当に複雑なものはありませんが、単にクライアントアプリケーションのURLをとっています./api/preview?secret=xxx&slug=xxx
あなたはおそらくあなたの次にファイルを持っているでしょう.この呼び出しを処理するJSアプリケーション.あなたにアイデアを与えるには、これはFoodAdvisorで行うことです.// ./pages/api/preview.js
import { getData } from '../../utils';
export default async (req, res) => {
if (
req.query.secret !== process.env.PREVIEW_SECRET ||
(req.query.slug != '' && !req.query.slug)
) {
return res.status(401).json({ message: 'Invalid token' });
}
const previewData = await getData(
req.query.slug,
req.query.locale,
req.query.apiID,
req.query.kind,
null
);
if (!previewData.data) {
return res.status(401).json({ message: 'Invalid slug' });
}
res.setPreviewData({});
res.writeHead(307, {
Location: previewData.slug,
});
res.end();
};
私たちのデモでは、ロケール、APIID、およびコンテンツタイプの種類など、より柔軟にプレビューするデータに関する詳細な情報が必要でした.私は、単に私のURLにより多くのparamsを加えることによってそれをすることができます:`${CLIENT_URL}/api/preview?secret=${CLIENT_PREVIEW_SECRET}&slug=${modifiedData.slug}&locale=${modifiedData.locale}&apiID=${layout.apiID}&kind=${layout.kind}`
これがレイアウトオブジェクトを必要とした理由ですが、必要な場合は削除できます.私がこの記事でこれらの分野を必要とした理由を詳述しません、しかし、よりよく私のアプローチを理解するためにFoodAdvisorのソースコードをチェックしてください.yarn build --clean
yarn develop
今、エントリを作成した後、またはスラグのフィールドを充填するだけで、コンテンツマネージャの右側にプレビューボタンを表示することができます.これはFoodAdviderフロントエンドのようになります.
結論
strapiのカスタマイズは非常に簡単です.我々は、ここで3つのファイルを作成し、それらの1つだけです.SVG!
Straapiはネイティブのプレビュー機能を提供していませんので、それはヘッドレスCMSですが、オープンソースであることで、それはあなたのフロントエンドアプリケーションのニーズに適応する自由と柔軟性を与える.
これはおそらく管理者で行うことができるプレビューの最も簡単な実装でした.コンテンツマネージャでフロントエンドのアプリケーションプレビューを直接表示するコンポーネントを作成することで、さらに進むことに挑戦します!
次の記事でお会いしましょう!
Reference
この問題について(次のstrapi v 3のプレビューボタンを作成します.js), 我々は、より多くの情報をここで見つけました https://dev.to/strapi/create-a-preview-button-in-strapi-v3-for-next-js-52eiテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol