Strapi V3에서 다음 단계에 대한 미리 보기 버튼을 만듭니다.js

35349 단어 strapicmsnextjs
Quadri Sherriff는 포부를 가진 기술 작가이자 소프트웨어 프로그래머입니다. Amir Tadrisi는 첨단 기술에 도전하는 fullstack 엔지니어입니다. 그는 훌륭한 글을 많이 썼습니다.Implementing Previews with Next Applications using a Strapi backendHow to use Image and preview in your Nextjs - Strapi blog Next 미리보기 시스템 사용 정보제이스와 스텔라피.
나는 이 기회를 빌려 그들에게 감사를 드립니다. 왜냐하면 이 용례가 매우 환영을 받기 때문에, 그들의 글은 많은 문제에 대답했습니다.내가 강조하고자 하는 것은 이러한 유형의 공헌은 Strapi 커뮤니티에 매우 중요하다는 것이다. 만약 당신이 그 중의 일부가 되기를 원한다면, 나는 당신을 우리의 Write for the Community Program에 가입하도록 초청한다.
이 (아주) 짧은 문장은 Quadi와 Amir가 쓴 내용을 보충할 것이다.Strapi admin에서 미리 보기 단추를 직접 실행하는 방법을 보실 수 있습니다.좋아, 그렇지 않아?

맞춤형 구성


Strapi는 완전히 시작된 것임을 분명히 알고 있을 것입니다.만약 콘텐츠 관리자에 무작위 GIF를 만드는 단추를 포함하고 싶다면, 이것은 절대적으로 가능하다는 것을 알아야 한다.구성 요소를 만들고 관리자에게 주입하기만 하면 됩니다.
구성 요소를 주입하는 것이 바로 우리가 해야 할 일이다.
이 자습서는 Strapi의 v3을 기반으로 합니다.이 강좌 v4 버전의 한 버전은 페이지 상단에 언급되며, 이 버전은 사용할 수 있습니다.
앞에서 설명한 바와 같이 가장 좋아하는 프런트엔드 프레임(예: 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을 구성하는 버튼만 만들면 됩니다.

확장성

/extensions 폴더에는 사용자 정의 플러그인 파일이 모두 들어 있습니다.the dedicated documentation page.에 대한 자세한 내용
다음 그림과 같이 content-manager 폴더가 있어야 합니다.
Capture_decran_2021-07-27_a_08.23.03.png
  • 다음을 포함하는 ./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;
    
    여기에는 해명해야 할 것이 매우 많다.첫 번째는 버튼에 대한 SVG eye 아이콘 가져오기입니다.
  • 다음을 포함하는 ./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 전단.우선, 우리는 modifiedDatahook에서 layoutuseContentManagerEditViewDataManager를 얻었다.첫 번째는 항목 데이터가 포함된 대상이고, 두 번째는 항목에 대한 더 재미있는 정보(APID, 내용 유형, 메타데이터 등)
    내용이 발표되었을 때, slug 필드가 없거나, 필요한 환경 변수가 존재하지 않으면, 우리는 아무것도 하지 않습니다.사실, 우리는 내용이 아직 발표되지 않았을 때만 미리 보기 단추를 표시하고 싶습니다.또한, slug나 필요한 env 변수를 포함하지 않으면, 앞에서 미리 볼 수 없습니다.
    if (modifiedData.published_at) {
      return null;
    }
    
    if (!modifiedData.slug) {
      return null;
    }
    
    if (!CLIENT_URL || !CLIENT_PREVIEW_SECRET) {
      return null;
    }
    
    문제가 없으면 Content Manager의 편집 뷰에 버튼을 표시하기만 하면 됩니다.
    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을 가져와서 정확한 경로를 추가하기만 하면 됩니다. (여기는Next.js): /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();
    };
    
    프레젠테이션의 경우 언어 환경, APID 및 컨텐츠 유형 등 보다 유연한 데이터 미리보기를 원하는 데이터에 대한 정보가 더 필요합니다.나는 단지 나의 URL에 더 많은 매개 변수를 추가하면 된다.
    `${CLIENT_URL}/api/preview?secret=${CLIENT_PREVIEW_SECRET}&slug=${modifiedData.slug}&locale=${modifiedData.locale}&apiID=${layout.apiID}&kind=${layout.kind}`
    
    이것이 바로 내가 레이아웃 대상을 필요로 하는 이유이다. 그러나 만약 당신이 그것을 필요로 하지 않는다면, 당신은 그것을 삭제할 수 있다.이 필드에 대해 자세히 설명하지는 않겠지만 FoodAdvisor의 소스 코드를 확인하여 방법을 더 잘 이해하십시오.
  • ./pages/api
  • ./utils/index.js
  • 됐어, 다른 할 일이 없어!너는 너의 관리자를 만들어서 너의 서버를 실행하고 너의 내용을 미리 볼 수 있다.
  • 다음 명령을 사용하여 관리자를 구성합니다.
  • yarn build --clean
    
  • 서버 재부팅
  • yarn develop
    
    현재 항목을 만들거나 slug 필드만 채우면 내용 관리자 오른쪽에 미리 보기 단추를 볼 수 있습니다.

    이것이 바로 FoodDadVisor 프런트엔드의 모양입니다.

    결론


    Strapi 사용자 정의는 매우 쉽습니다.우리는 이곳에서 세 개의 파일만 만들었는데, 그 중 하나는 이다.svg!
    Strapi는 헤더가 없는 CMS이기 때문에 이 컴퓨터의 미리 보기 기능을 제공하지 않지만, 원본이기 때문에, 전방 응용 프로그램의 수요에 적응하기 위해 자유롭고 유연성을 제공합니다.
    이것은 아마도 관리자 인터페이스에서 미리보기를 실현하는 가장 간단한 방법일 것이다.Content Manager에서 프런트엔드 응용 프로그램 미리 보기를 직접 표시하는 구성 요소를 추가로 생성하는 것이 좋습니다.
    다음 글 안녕!

    좋은 웹페이지 즐겨찾기