# Installation
설치 매뉴얼 영상
https://youtu.be/o1TvQf-dcZA
1. 데이터베이스 연결설정
- `cp .env.example .env`
2. `./install.sh` 실행
- storage/public 폴더 생성 및 퍼미션 설정
- `composer update`
- Database 생성 (schema.sql)
3. 관리자 비밀번호 변경
- 초기 계정: root / admin
- 로그인 후, 관리자 비밀번호 변경
4. 환경설정 업데이트
- Settings > Configuration: Save Changes
- .env 파일 내용 중 일부를 읽어와 데이터베이스에 저장
- 업데이트한 내용으로 .env 업데이트
5. 이미지 옵티마이저 설치
- sudo apt-get install jpegoptim
- sudo apt-get install optipng
- sudo apt-get install pngquant
- sudo apt-get install gifsicle
- sudo apt-get install webp
**기본시스템 설치완료**
5. 테스트 사이트 데이터 설치
- .install/ 안에 있는 인스톨러 설치
- database 내용 업데이트
- public/files, public/storage 에 테스트에 필요한 파일들 복사
# Build Concept
Basic concept of sf4l
**Concept**
- Core System for multiple sites
- Component와 data 분리
- Conceptual Component/Site Scope
- Component per menu
- 메뉴별 component binding
- Component를 통한 데이터 관리
**Core System**
- core
- System Components and programs
- System/Site blade template, html, css/js
- errors, seo, files 등
- Site specific Component (주로 Main)
- files
- public/files/ 에 업로드 (개발 사이트를 위해 사이트별로 rsync 로 sync 하는 스크립트 추가)
- database
- 공용 DB server/local DB server
**HTML view page structure**
- Header
- Nav: GNB
- Aside
- Search, and etc
- Main: Component
- Content: Doc, Bbs, Main, and misc
- Footer
- Copyright
- Information
**Laravel Blade Template**
- layout.blade.php: main 을 제외한 header, footer
- main.blade.php: extend()를 이용, Main Component를 삽입한다.
- 기타 Component, Doc 등도 Main 과 동일한 방식으로 삽입한다. (각 Component 에서 경로, 파일명 등의 규칙을 정함)
**Component/Site Scope**
- Global
- Site, Component 등 시스템 전체에 영향을 끼치는 프로그램
- 변수 혹은 객체
- Site
- Site 내에서만 사용하지만, 사이트 내에서 사용하는 전체 Component에 영향을 끼치는 프로그램
- 예) Site Composer
- Component
- Component 내에서만 작동
- `${Component}` 형태로 blade에 삽입
- 기타 변수 혹은 객체
**Main Component**
- 사이트 내 여러 components 의 내용들의 접근에 용이하도록 index 역할을 하는 프로그램
- 사이트별로 각기 다른 Main Component
- Sub main 으로도 확장할 수 있음 (using menu_id)
**Doc Component**
- Database/HTML file/blade template 등 주로 static 한 내용을 보여주는 프로그램
- 간단한 text/html 위주의 content 일 경우, Doc component editor 를 통해 실시간으로 생성/업데이트 가능
- 복잡한 디자인, 스크립트 등을 사용할 경우 HTML이나 blade 파일로 관리
- /resources/views/{APP_NAME}/doc/ 폴더 안에 계층형 구조로 파일 저장 가능
- 파일에 사용되는 js/css 등의 resource는 resource() 함수로 관리
- 이미지는 public/files/ 내에 추가
## Directory Information
**/public/asset**
- 시스템 스크립트
- Url: /asset
- 예) /public/asset/ckeditor -> /asset/ckeditor
**/public/files**
- git으로 관리되지 않는 사이트별 파일
- Url: /files
- 예) 메뉴용 이미지: /public/files/menu/{menu-id} -> /files/menu/{menu-id}
**/storage/app/public**
- 업로드 데이터 (프로그램이 관리)
- Storage::disk('public')
- Url: Storage::url()
## APP_NAME = Site Name
**/app/Components/{APP_NAME}**
사이트별 컴포넌트 디렉토리
/SiteComposer.php - view composer 바인딩
**/resources/views/{APP_NAME}**
사이트별 스타일 디렉토리
/asset : resource('asset/xxx.css')
## route
**(/namespace)/db/actKey/subKey/optKey/**
- uid : 가장 먼저 나오는 numeric value
- sid : 두번째 나오는 numeric value
## Variables
- $namespace
- $db
- $actKey
- $subKey
- $optKey
- $uid
- $sid
- $hide_header
- $method : $actKey 를 reverseSnake()으로 변경한 값
- $user : login 한 user 객체
- $Menu : 현재 메뉴 객체
- $access : 현재 메뉴 권한 객체
- $seoHeader : 현재 메뉴 SEO Header 객체
- $darkMode
- $isLogged, $isRoot, $isAdmin
- Config::get() : Settings > Configuration 에 있는 값들을 불러옴