mirror of
https://github.com/foomo/foomo-docs.git
synced 2025-10-16 12:35:40 +00:00
1 line
9.7 KiB
JavaScript
1 line
9.7 KiB
JavaScript
"use strict";(self.webpackChunkfoomo=self.webpackChunkfoomo||[]).push([[5222],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>h});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=r.createContext({}),p=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},c=function(e){var t=p(e.components);return r.createElement(s.Provider,{value:t},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},u=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),m=p(n),u=a,h=m["".concat(s,".").concat(u)]||m[u]||d[u]||o;return n?r.createElement(h,l(l({ref:t},c),{},{components:n})):r.createElement(h,l({ref:t},c))}));function h(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,l=new Array(o);l[0]=u;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[m]="string"==typeof e?e:a,l[1]=i;for(var p=2;p<o;p++)l[p]=n[p];return r.createElement.apply(null,l)}return r.createElement.apply(null,n)}u.displayName="MDXCreateElement"},7222:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>p});var r=n(7462),a=(n(7294),n(3905));const o={},l="CMS",i={unversionedId:"projects/cms/index",id:"projects/cms/index",title:"CMS",description:"The foomo team has extensive experience with a wide range of CMS systems. Our long journey in the field has brought us very close to the https//app.contentful.com/ but we are watching others like https//directus.io/ very closely.",source:"@site/docs/projects/cms/index.md",sourceDirName:"projects/cms",slug:"/projects/cms/",permalink:"/docs/projects/cms/",draft:!1,editUrl:"https://github.com/foomo/foomo-docs/tree/main/foomo/docs/projects/cms/index.md",tags:[],version:"current",frontMatter:{},sidebar:"projectsSidebar",previous:{title:"Architecture",permalink:"/docs/projects/architecture"},next:{title:"contentserver",permalink:"/docs/projects/cms/contentserver"}},s={},p=[{value:"Expectations and challenges",id:"expectations-and-challenges",level:2},{value:"The need for dynamic rendering",id:"the-need-for-dynamic-rendering",level:2},{value:"Application routes vs semantic URL structures",id:"application-routes-vs-semantic-url-structures",level:2},{value:"e-commerce as an example",id:"e-commerce-as-an-example",level:3},{value:"our approach",id:"our-approach",level:2},{value:"model content",id:"model-content",level:3},{value:"export contentent to contentserver",id:"export-contentent-to-contentserver",level:3},{value:"resolving URIs",id:"resolving-uris",level:3}],c={toc:p},m="wrapper";function d(e){let{components:t,...n}=e;return(0,a.kt)(m,(0,r.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"cms"},"CMS"),(0,a.kt)("p",null,"The foomo team has extensive experience with a wide range of CMS systems. Our long journey in the field has brought us very close to the ",(0,a.kt)("a",{parentName:"p",href:"https://jamstack.org"},"https://jamstack.org")," . We almost exclusively work with ",(0,a.kt)("a",{parentName:"p",href:"https://app.contentful.com/"},"https://app.contentful.com/")," but we are watching others like ",(0,a.kt)("a",{parentName:"p",href:"https://strapi.io/"},"https://strapi.io/")," and ",(0,a.kt)("a",{parentName:"p",href:"https://directus.io/"},"https://directus.io/")," very closely."),(0,a.kt)("h2",{id:"expectations-and-challenges"},"Expectations and challenges"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"application developers want an environment, that ensures maximum productivity, they do not think of semantic structures, they think of routes"),(0,a.kt)("li",{parentName:"ul"},"customers expect maximum control and flexibility when working with content and do not distinguish between content and applications")),(0,a.kt)("h2",{id:"the-need-for-dynamic-rendering"},"The need for dynamic rendering"),(0,a.kt)("p",null,"If you can - render static content and distribute it with a CDN. "),(0,a.kt)("p",null,"There are use cases though, where static site generation does not work like"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"highly personalized content"),(0,a.kt)("li",{parentName:"ul"},"mixing content with entities from other systems, that have a different life cycle, like products")),(0,a.kt)("h2",{id:"application-routes-vs-semantic-url-structures"},"Application routes vs semantic URL structures"),(0,a.kt)("p",null,"Bridging the conceptual gap between sematic content and applications."),(0,a.kt)("p",null,"Content especially when created with a focus on SEO comes as a semantic graph. This typically conflicts with how application developers see the world. "),(0,a.kt)("h3",{id:"e-commerce-as-an-example"},"e-commerce as an example"),(0,a.kt)("p",null,"Let us take a look at a real world example:"),(0,a.kt)("table",null,(0,a.kt)("thead",{parentName:"table"},(0,a.kt)("tr",{parentName:"thead"},(0,a.kt)("th",{parentName:"tr",align:"left"},"application route / ingress"),(0,a.kt)("th",{parentName:"tr",align:"left"},"app developers view"),(0,a.kt)("th",{parentName:"tr",align:"left"},"SEO URL requirement"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:"left"},"/content/:id"),(0,a.kt)("td",{parentName:"tr",align:"left"},"/content/1"),(0,a.kt)("td",{parentName:"tr",align:"left"},"/")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:"left"}),(0,a.kt)("td",{parentName:"tr",align:"left"},"/content/2"),(0,a.kt)("td",{parentName:"tr",align:"left"},"/mens")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:"left"},"/category/:id"),(0,a.kt)("td",{parentName:"tr",align:"left"},"/category/1"),(0,a.kt)("td",{parentName:"tr",align:"left"},"/mens/shirts")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:"left"}),(0,a.kt)("td",{parentName:"tr",align:"left"},"/category/2"),(0,a.kt)("td",{parentName:"tr",align:"left"},"/mens/shirts/business")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:"left"},"/product/:id"),(0,a.kt)("td",{parentName:"tr",align:"left"},"/product/1"),(0,a.kt)("td",{parentName:"tr",align:"left"},"/mens-shirt-awesome-blue-medium")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:"left"},"/store/:id"),(0,a.kt)("td",{parentName:"tr",align:"left"},"/store/1"),(0,a.kt)("td",{parentName:"tr",align:"left"},"/mens/stores/london-perfect-shirts")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:"left"}),(0,a.kt)("td",{parentName:"tr",align:"left"},"/store/2"),(0,a.kt)("td",{parentName:"tr",align:"left"},"/kids/stores/lego-paradise")))),(0,a.kt)("h2",{id:"our-approach"},"our approach"),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"cms/contentserver"},"contentserver")," allows you to resolve URIs to mime types, which can be handled by applications."),(0,a.kt)("p",null,"Let us return to our ecommerce example."),(0,a.kt)("h3",{id:"model-content"},"model content"),(0,a.kt)("table",null,(0,a.kt)("thead",{parentName:"table"},(0,a.kt)("tr",{parentName:"thead"},(0,a.kt)("th",{parentName:"tr",align:"left"},"mime type"),(0,a.kt)("th",{parentName:"tr",align:"left"},"cms entity"),(0,a.kt)("th",{parentName:"tr",align:"left"},"application eg k8s service"))),(0,a.kt)("tbody",{parentName:"table"},(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:"left"},"application/x-page"),(0,a.kt)("td",{parentName:"tr",align:"left"},"page"),(0,a.kt)("td",{parentName:"tr",align:"left"},"https://frontend_service_page")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:"left"},"application/x-category"),(0,a.kt)("td",{parentName:"tr",align:"left"},"category"),(0,a.kt)("td",{parentName:"tr",align:"left"},"https://frontend_service_category")),(0,a.kt)("tr",{parentName:"tbody"},(0,a.kt)("td",{parentName:"tr",align:"left"},"application/x-store"),(0,a.kt)("td",{parentName:"tr",align:"left"},"store"),(0,a.kt)("td",{parentName:"tr",align:"left"},"https://frontend_service_store")))),(0,a.kt)("h3",{id:"export-contentent-to-contentserver"},"export contentent to contentserver"),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"cms/contentserver"},"contentserver")," allows you to export your content tree as json"),(0,a.kt)("h3",{id:"resolving-uris"},"resolving URIs"),(0,a.kt)("p",null,"Use standard application routing whereever possible, since it is the most efficient option."),(0,a.kt)("p",null,"Once all standard URI resolution fails, query ",(0,a.kt)("a",{parentName:"p",href:"cms/contentserver"},"contentserver")," and it will return the resolved node"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-json"},"")),(0,a.kt)("p",null,"Now you have the mime-type and you know which application can handle it."))}d.isMDXComponent=!0}}]); |