#XE 48개의 스레드 ✕ 해제
?
익명 1주 전
XpressEngine(XE)으로 만든 홈페이지를 아직 쓰고 계신가요? 회원 수천 명, 게시글 수년치가 쌓인 그 사이트 말입니다. 잘 돌아가고 있으니 손대기 무섭고, 새로 만들자니 그 데이터가 다 날아갈까 봐 못 건드리는 — 그 상태로 몇 년째 멈춰 있는 분들이 많습니다. 문제는, XE의 공식 개발은 사실상 멈춘 지 오래라는 겁니다. 새 보안 패치가 나오지 않는다는 뜻이에요. 겉으론 멀쩡해 보여도 안에서는 시간이 지날수록 위험이 쌓입니다. 새로 만들어 데이터를 버리라는 이야기가 아닙니다. 먼저… XpressEngine(XE)으로 만든 홈페이지를 아직 쓰고 계신가요? 회원 수천 명, 게시글 수년치가 쌓인 그 사이트 말입니다. 잘 돌아가고 있으니 손대기 무섭고, 새로 만들자니 그 데이터가 다 날아갈까 봐 못 건드리는 — 그 상태로 몇 년째 멈춰 있는 분들이 많습니다. 문제는, XE의 공식 개발은 사실상 멈춘 지 오래라는 겁니다. 새 보안 패치가 나오지 않는다는 뜻이에요. 겉으론 멀쩡해 보여도 안에서는 시간이 지날수록 위험이 쌓입니다. 새로 만들어 데이터를 버리라는 이야기가 아닙니다. 먼저 내 사이트가 지금 어느 정도 위험한지부터 점검해 보자는 겁니다. 아래 5가지만 확인해도 감이 옵니다. 1. PHP 버전이 몇인가 XE 사이트가 옛 PHP(5.x~7.0대)에서 돌고 있다면 위험 신호입니다. 그 버전들은 이미 보안 지원이 끝나, 알려진 취약점이 있어도 고쳐지지 않습니다. 호스팅 관리자에서 PHP 버전을 확인해 보세요. 그런데 무턱대고 PHP만 올리면 옛 XE가 깨질 수 있어, 코드와 함께 손봐야 합니다. 2. 마지막 업데이트가 언제였나 코어와 모듈을 마지막으로 업데이트한 게 언제인지 떠올려 보세요. "기억도 안 난다"면 그동안 공개된 취약점에 그대로 노출돼 있었을 가능성이 큽니다. 특히 게시판·회원·파일 업로드처럼 외부 입력을 받는 부분이 위험합니다. 3. 관리자 페이지가 그대로 노출돼 있나 기본 관리자 주소가 외부에서 그대로 열린다면, 자동화된 공격의 표적이 됩니다. 로그인 시도 제한이나 2차 인증 없이 비밀번호 하나로만 막혀 있다면 더 위험합니다. 4. SSL(자물쇠)과 혼합 콘텐츠 주소가 https로 잘 뜨는지, 자물쇠 안에 "안전하지 않음" 경고는 없는지 보세요. 옛 사이트는 일부 이미지·스크립트가 http로 남아 있어 브라우저가 경고를 띄우는 경우가 흔합니다. 방문자 신뢰와 검색 노출 모두에 악영향입니다. 5. 방치된 애드온·스킨 설치만 해두고 안 쓰는 모듈·애드온·스킨이 쌓여 있지 않나요? 쓰지 않아도 코드는 서버에 남아 공격 통로가 됩니다. "언젠가 쓸지 몰라" 남겨둔 것들이 가장 흔한 구멍입니다. 그래서, 새로 만들어야 하나요? 아닙니다. 데이터를 버리지 않고도 현대화하는 길이 있습니다. XE의 후속인 라이믹스(Rhymix)로 옮기거나, 회원·게시글 데이터를 그대로 둔 채 보안·모바일·관리 환경만 현대 스택으로 바꾸는 방법입니다. 핵심은 "20년 쌓인 데이터는 지키고, 낡은 부분만 갈아낀다"는 것이죠. 위 5가지 중 두 개 이상 마음에 걸렸다면, 지금이 점검할 때입니다. 사이트 주소만 주시면 어디가 위험하고 무엇부터 손봐야 하는지 무료로 진단해 드립니다. 새로 만들지, 살릴지는 그 다음에 정해도 늦지 않습니다.
이온디
이온디 7개월 전
API 모듈과 연동하는 게시판 스킨, 포트폴리오 매니저입니다. 글쓰기 화면에서 AI를 활용하여 글감을 제안받을 수 있는 기능을 탑재했습니다. 카테고리, 태그, 본문, 제목을 빠른 편집이 가능합니다. https://youtube.com/shorts/xEHvl4j325o?feature=share > 사용 가능한 모델: (50) ['models/embedding-gecko-001', 'models/gemini-2.5-pro-preview-03-25', 'models/gemini-2.5-flas… API 모듈과 연동하는 게시판 스킨, 포트폴리오 매니저입니다. 글쓰기 화면에서 AI를 활용하여 글감을 제안받을 수 있는 기능을 탑재했습니다. 카테고리, 태그, 본문, 제목을 빠른 편집이 가능합니다. https://youtube.com/shorts/xEHvl4j325o?feature=share > 사용 가능한 모델: (50) ['models/embedding-gecko-001', 'models/gemini-2.5-pro-preview-03-25', 'models/gemini-2.5-flash', 'models/gemini-2.5-pro-preview-05-06', 'models/gemini-2.5-pro-preview-06-05', 'models/gemini-2.5-pro', 'models/gemini-2.0-flash-exp', 'models/gemini-2.0-flash', 'models/gemini-2.0-flash-001', 'models/gemini-2.0-flash-exp-image-generation', 'models/gemini-2.0-flash-lite-001', 'models/gemini-2.0-flash-lite', 'models/gemini-2.0-flash-lite-preview-02-05', 'models/gemini-2.0-flash-lite-preview', 'models/gemini-2.0-pro-exp', 'models/gemini-2.0-pro-exp-02-05', 'models/gemini-exp-1206', 'models/gemini-2.0-flash-thinking-exp-01-21', 'models/gemini-2.0-flash-thinking-exp', 'models/gemini-2.0-flash-thinking-exp-1219', 'models/gemini-2.5-flash-preview-tts', 'models/gemini-2.5-pro-preview-tts', 'models/learnlm-2.0-flash-experimental', 'models/gemma-3-1b-it', 'models/gemma-3-4b-it', 'models/gemma-3-12b-it', 'models/gemma-3-27b-it', 'models/gemma-3n-e4b-it', 'models/gemma-3n-e2b-it', 'models/gemini-flash-latest', 'models/gemini-flash-lite-latest', 'models/gemini-pro-latest', 'models/gemini-2.5-flash-lite', 'models/gemini-2.5-flash-image-preview', 'models/gemini-2.5-flash-image', 'models/gemini-2.5-flash-preview-09-2025', 'models/gemini-2.5-flash-lite-preview-09-2025', 'models/gemini-3-pro-preview', 'models/gemini-3-pro-image-preview', 'models/nano-banana-pro-preview', 'models/gemini-robotics-er-1.5-preview', 'models/gemini-2.5-computer-use-preview-10-2025', 'models/embedding-001', 'models/text-embedding-004', 'models/gemini-embedding-exp-03-07', 'models/gemini-embedding-exp', 'models/gemini-embedding-001', 'models/aqa', 'models/imagen-4.0-generate-preview-06-06', 'models/imagen-4.0-ultra-generate-preview-06-06'] [상세] 작업기간 : 2025년 11월 21일 ~ 25일 [주요기능] 제목 쉬운 편집 본문 쉬운 편집 카테고리 및 태그 쉬운 편집 태그 검색 카테고리 검색 키워드 검색 AI 글내용제안받기 기능(구글 api 키 필요)
이온디
이온디 10개월 전
작업기간 : 2024년 6월~8월제작 : 이온디(개발, 퍼블리싱 담당)사용한 XE 모듈누리고 모듈 패키지제작개요 : 누리고 모듈을 이용한 지역 프로그램 결제 및 관리자 확인 프로그램 본 프로젝트는 XE/라이믹스 기반 누리고 쇼핑몰 모듈을 활용한 로컬 프로그램 예약 기능 구현 제작사례을 통해 혁신적인 구매 경험과 효율적인 상거래 생태계 구축을 목적으로 기획되었습니다. 사용자 행동 분석 기반의 개인화 서비스와 최적화된 구매 프로세스를 통해 고객 만족도와 전환율 향상을 실현합니다. 모바일 우선 설계와 … 작업기간 : 2024년 6월~8월제작 : 이온디(개발, 퍼블리싱 담당)사용한 XE 모듈누리고 모듈 패키지제작개요 : 누리고 모듈을 이용한 지역 프로그램 결제 및 관리자 확인 프로그램 본 프로젝트는 XE/라이믹스 기반 누리고 쇼핑몰 모듈을 활용한 로컬 프로그램 예약 기능 구현 제작사례을 통해 혁신적인 구매 경험과 효율적인 상거래 생태계 구축을 목적으로 기획되었습니다. 사용자 행동 분석 기반의 개인화 서비스와 최적화된 구매 프로세스를 통해 고객 만족도와 전환율 향상을 실현합니다. 모바일 우선 설계와 다채널 통합 전략을 바탕으로 언제 어디서나 일관된 쇼핑 경험을 제공하며, 지속 가능한 디지털 커머스 성장을 견인합니다.
이온디
이온디 10개월 전
프로젝트 개요 클라이언트: Designsori (디자인소리) 기간: 2025년 역할: XE 스킨 디자인 리뉴얼, 퍼블리싱 사용 기술: XE, HTML5, CSS3, 반응형 웹 URL: designsori.com 무엇을 만들었나 국내 디자인 미디어 플랫폼 Designsori의 XE 기반 사이트 디자인 리뉴얼 프로젝트입니다. 기존 XE 플랫폼과 데이터를 그대로 유지하면서 스킨 전체를 새로 제작하여 완전히 새로운 사이트를 구현했습니다. 핵심 작업 내용 XE 스킨 전면 재제작: 목록, 상세, … 프로젝트 개요 클라이언트: Designsori (디자인소리) 기간: 2025년 역할: XE 스킨 디자인 리뉴얼, 퍼블리싱 사용 기술: XE, HTML5, CSS3, 반응형 웹 URL: designsori.com 무엇을 만들었나 국내 디자인 미디어 플랫폼 Designsori의 XE 기반 사이트 디자인 리뉴얼 프로젝트입니다. 기존 XE 플랫폼과 데이터를 그대로 유지하면서 스킨 전체를 새로 제작하여 완전히 새로운 사이트를 구현했습니다. 핵심 작업 내용 XE 스킨 전면 재제작: 목록, 상세, 검색 등 전체 템플릿을 현대적인 레이아웃으로 재설계 반응형 적용: 모바일 환경에서도 콘텐츠가 자연스럽게 보이도록 구성 데이터 유지: 기존 XE DB 구조와 게시물 그대로 유지하며 스킨만 교체
이온디
이온디 10개월 전
프로젝트 개요 클라이언트: ASIADESIGNPRIZE (아시아디자인프라이즈) 기간: 2025년 역할: XE 스킨 디자인 리뉴얼, 퍼블리싱 사용 기술: XE, HTML5, CSS3, 반응형 웹 URL: asiadesignprize.com 무엇을 만들었나 아시아권 디자인 어워드 플랫폼 ASIADESIGNPRIZE의 XE 기반 사이트 디자인 리뉴얼 프로젝트입니다. 수상작 갤러리, 심사위원 소개 등 어워드 운영 구조는 그대로 유지하면서 전체 비주얼을 새롭게 교체했습니다. 핵심 작업 내용 어워… 프로젝트 개요 클라이언트: ASIADESIGNPRIZE (아시아디자인프라이즈) 기간: 2025년 역할: XE 스킨 디자인 리뉴얼, 퍼블리싱 사용 기술: XE, HTML5, CSS3, 반응형 웹 URL: asiadesignprize.com 무엇을 만들었나 아시아권 디자인 어워드 플랫폼 ASIADESIGNPRIZE의 XE 기반 사이트 디자인 리뉴얼 프로젝트입니다. 수상작 갤러리, 심사위원 소개 등 어워드 운영 구조는 그대로 유지하면서 전체 비주얼을 새롭게 교체했습니다. 핵심 작업 내용 어워드 사이트 스킨 재제작: 수상작 갤러리, 심사위원 소개 등 각 섹션 템플릿 재설계 반응형 적용: 모바일·태블릿 환경 전체 대응 XE 데이터 연동 유지: 기존 게시물, 카테고리 구조 그대로 활용
이온디
이온디 1년 전
프로젝트 개요 클라이언트: 닥터디자이너 작업 유형: 서비스 플랫폼 퍼블리싱 사용 기술: HTML5, CSS3, JavaScript 작업 연도: 2019년 작업 내용 디자이너와 클라이언트를 연결하는 닥터디자이너 플랫폼의 퍼블리싱 작업을 진행했습니다. 서비스 소개, 포트폴리오, 의뢰 흐름에 맞는 화면 구성에 집중했습니다. 주요 작업 서비스 메인 및 서브 페이지 퍼블리싱 반응형 웹 구현 UI 컴포넌트 설계 및 구현 프로젝트 개요 클라이언트: 닥터디자이너 작업 유형: 서비스 플랫폼 퍼블리싱 사용 기술: HTML5, CSS3, JavaScript 작업 연도: 2019년 작업 내용 디자이너와 클라이언트를 연결하는 닥터디자이너 플랫폼의 퍼블리싱 작업을 진행했습니다. 서비스 소개, 포트폴리오, 의뢰 흐름에 맞는 화면 구성에 집중했습니다. 주요 작업 서비스 메인 및 서브 페이지 퍼블리싱 반응형 웹 구현 UI 컴포넌트 설계 및 구현
이온디
이온디 1년 전
프로젝트 개요 클라이언트: 에어모니터 작업 유형: 기업 홈페이지 구축 사용 기술: XE CMS, HTML5, CSS3 작업 연도: 2024년 작업 내용 공기질 모니터링 솔루션 기업 에어모니터의 홈페이지를 제작했습니다. 제품 소개와 데이터 시각화 섹션을 중심으로 구성하며, 기술 기업의 신뢰감을 주는 디자인 톤을 적용했습니다. 주요 작업 기업 홈페이지 전체 퍼블리싱 제품 소개 및 기능 안내 페이지 구성 반응형 레이아웃 구현 프로젝트 개요 클라이언트: 에어모니터 작업 유형: 기업 홈페이지 구축 사용 기술: XE CMS, HTML5, CSS3 작업 연도: 2024년 작업 내용 공기질 모니터링 솔루션 기업 에어모니터의 홈페이지를 제작했습니다. 제품 소개와 데이터 시각화 섹션을 중심으로 구성하며, 기술 기업의 신뢰감을 주는 디자인 톤을 적용했습니다. 주요 작업 기업 홈페이지 전체 퍼블리싱 제품 소개 및 기능 안내 페이지 구성 반응형 레이아웃 구현
이온디
이온디 1년 전
프로젝트 개요 클라이언트: 진담 작업 유형: 기업 홈페이지 구축 사용 기술: XE CMS, HTML5, CSS3 작업 연도: 2023년 작업 내용 진담 기업 홈페이지를 XE CMS 기반으로 구축했습니다. 서비스 소개와 회사 정보를 효과적으로 전달하는 구조로 설계했습니다. 주요 작업 XE 기반 전체 퍼블리싱 서비스 소개 페이지 구성 반응형 레이아웃 적용 프로젝트 개요 클라이언트: 진담 작업 유형: 기업 홈페이지 구축 사용 기술: XE CMS, HTML5, CSS3 작업 연도: 2023년 작업 내용 진담 기업 홈페이지를 XE CMS 기반으로 구축했습니다. 서비스 소개와 회사 정보를 효과적으로 전달하는 구조로 설계했습니다. 주요 작업 XE 기반 전체 퍼블리싱 서비스 소개 페이지 구성 반응형 레이아웃 적용
이온디
이온디 1년 전
프로젝트 개요 클라이언트: 엔글링크 작업 유형: 서비스 플랫폼 구축 사용 기술: XE CMS, HTML5, CSS3, jQuery 작업 연도: 2018년 작업 내용 엔글링크 서비스 플랫폼을 XE CMS 기반으로 구축했습니다. XE의 회원/게시판 구조를 활용하여 서비스 핵심 기능을 구현하고, 사용자 경험에 맞는 커스텀 스킨을 개발했습니다. 주요 작업 XE 기반 커스텀 스킨 개발 회원 관련 기능 커스터마이징 반응형 웹 구현 서비스 특화 UI 컴포넌트 구현 프로젝트 개요 클라이언트: 엔글링크 작업 유형: 서비스 플랫폼 구축 사용 기술: XE CMS, HTML5, CSS3, jQuery 작업 연도: 2018년 작업 내용 엔글링크 서비스 플랫폼을 XE CMS 기반으로 구축했습니다. XE의 회원/게시판 구조를 활용하여 서비스 핵심 기능을 구현하고, 사용자 경험에 맞는 커스텀 스킨을 개발했습니다. 주요 작업 XE 기반 커스텀 스킨 개발 회원 관련 기능 커스터마이징 반응형 웹 구현 서비스 특화 UI 컴포넌트 구현
이온디
이온디 1년 전
프로젝트 개요 클라이언트: LIGAwards 작업 유형: 어워드 플랫폼 구축 사용 기술: XE CMS, HTML5, CSS3 작업 연도: 2024년 작업 내용 디자인 어워드 플랫폼 LIGAwards를 XE CMS 기반으로 구축했습니다. 수상작 갤러리, 참가 신청, 심사 결과 발표 등 어워드 특화 기능을 구현했습니다. 주요 작업 XE 기반 어워드 플랫폼 구축 수상작 갤러리 및 상세 페이지 구성 참가 신청 폼 구현 반응형 레이아웃 적용 프로젝트 개요 클라이언트: LIGAwards 작업 유형: 어워드 플랫폼 구축 사용 기술: XE CMS, HTML5, CSS3 작업 연도: 2024년 작업 내용 디자인 어워드 플랫폼 LIGAwards를 XE CMS 기반으로 구축했습니다. 수상작 갤러리, 참가 신청, 심사 결과 발표 등 어워드 특화 기능을 구현했습니다. 주요 작업 XE 기반 어워드 플랫폼 구축 수상작 갤러리 및 상세 페이지 구성 참가 신청 폼 구현 반응형 레이아웃 적용
이온디
이온디 1년 전
프로젝트 개요 클라이언트: 우리동 작업 유형: 서비스 홈페이지 구축 사용 기술: XE CMS, HTML5, CSS3 작업 연도: 2024년 작업 내용 우리동 서비스 홈페이지를 구축했습니다. 지역 상권 정보를 제공하는 서비스 특성에 맞게 검색 중심의 UI 구조로 설계했습니다. 주요 작업 서비스 홈페이지 전체 퍼블리싱 XE 기반 커스텀 스킨 개발 반응형 레이아웃 구현 프로젝트 개요 클라이언트: 우리동 작업 유형: 서비스 홈페이지 구축 사용 기술: XE CMS, HTML5, CSS3 작업 연도: 2024년 작업 내용 우리동 서비스 홈페이지를 구축했습니다. 지역 상권 정보를 제공하는 서비스 특성에 맞게 검색 중심의 UI 구조로 설계했습니다. 주요 작업 서비스 홈페이지 전체 퍼블리싱 XE 기반 커스텀 스킨 개발 반응형 레이아웃 구현
이온디
이온디 1년 전
프로젝트 개요 클라이언트: 퀘스트투어 작업 유형: 여행 서비스 홈페이지 구축 사용 기술: XE CMS, HTML5, CSS3 작업 연도: 2023년 작업 내용 퀘스트투어의 여행 서비스 홈페이지를 제작했습니다. 상품 소개와 예약 흐름을 직관적으로 안내하는 UI 구조로 설계했습니다. 주요 작업 서비스 홈페이지 전체 퍼블리싱 여행 상품 목록/상세 페이지 구성 반응형 레이아웃 적용 프로젝트 개요 클라이언트: 퀘스트투어 작업 유형: 여행 서비스 홈페이지 구축 사용 기술: XE CMS, HTML5, CSS3 작업 연도: 2023년 작업 내용 퀘스트투어의 여행 서비스 홈페이지를 제작했습니다. 상품 소개와 예약 흐름을 직관적으로 안내하는 UI 구조로 설계했습니다. 주요 작업 서비스 홈페이지 전체 퍼블리싱 여행 상품 목록/상세 페이지 구성 반응형 레이아웃 적용
이온디
이온디 1년 전
프로젝트 개요클라이언트: 메모핏 작업 유형: 서비스 홈페이지 구축 사용 기술: XE CMS, HTML5, CSS3 작업 연도: 2022년 작업 내용메모핏 서비스 홈페이지를 구축했습니다. 서비스 소개와 핵심 기능 안내를 중심으로 구성하며, 직관적인 UI 흐름을 설계했습니다. 주요 작업서비스 홈페이지 전체 퍼블리싱 기능 소개 섹션 구성 반응형 레이아웃 적용 프로젝트 개요클라이언트: 메모핏 작업 유형: 서비스 홈페이지 구축 사용 기술: XE CMS, HTML5, CSS3 작업 연도: 2022년 작업 내용메모핏 서비스 홈페이지를 구축했습니다. 서비스 소개와 핵심 기능 안내를 중심으로 구성하며, 직관적인 UI 흐름을 설계했습니다. 주요 작업서비스 홈페이지 전체 퍼블리싱 기능 소개 섹션 구성 반응형 레이아웃 적용
이온디
이온디 1년 전
프로젝트 개요 클라이언트: 잇싸 작업 유형: 서비스 플랫폼 퍼블리싱 사용 기술: XE CMS, HTML5, CSS3, jQuery 작업 연도: 2019년 작업 내용 잇싸 서비스 플랫폼의 퍼블리싱 작업을 담당했습니다. 사용자 간 거래 흐름에 맞는 UI를 구성하고, XE 기반 커스텀 스킨으로 서비스 특성에 맞게 개발했습니다. 주요 작업 메인 및 서브 페이지 퍼블리싱 XE 커스텀 스킨 개발 반응형 레이아웃 구현 프로젝트 개요 클라이언트: 잇싸 작업 유형: 서비스 플랫폼 퍼블리싱 사용 기술: XE CMS, HTML5, CSS3, jQuery 작업 연도: 2019년 작업 내용 잇싸 서비스 플랫폼의 퍼블리싱 작업을 담당했습니다. 사용자 간 거래 흐름에 맞는 UI를 구성하고, XE 기반 커스텀 스킨으로 서비스 특성에 맞게 개발했습니다. 주요 작업 메인 및 서브 페이지 퍼블리싱 XE 커스텀 스킨 개발 반응형 레이아웃 구현
이온디
이온디 1년 전
사용하는 웹솔루션 WordPress, XE, Rhymix, 그누보드, 카페24, 라이믹스, 제로보드, 워드프레스 사용하는 웹솔루션 WordPress, XE, Rhymix, 그누보드, 카페24, 라이믹스, 제로보드, 워드프레스
이온디
이온디 1년 전
프로젝트 개요 클라이언트: 한국외벽공사 작업 유형: 기업 홈페이지 구축 사용 기술: XE CMS, HTML5, CSS3 작업 연도: 2019년 작업 내용 외벽 공사 전문 기업 한국외벽공사의 홈페이지를 제작했습니다. 시공 사례와 회사 소개를 중심으로 구성하며, 건설 업종에 맞는 신뢰감 있는 디자인을 적용했습니다. 주요 작업 기업 홈페이지 전체 퍼블리싱 시공 사례 갤러리 구현 반응형 레이아웃 적용 프로젝트 개요 클라이언트: 한국외벽공사 작업 유형: 기업 홈페이지 구축 사용 기술: XE CMS, HTML5, CSS3 작업 연도: 2019년 작업 내용 외벽 공사 전문 기업 한국외벽공사의 홈페이지를 제작했습니다. 시공 사례와 회사 소개를 중심으로 구성하며, 건설 업종에 맞는 신뢰감 있는 디자인을 적용했습니다. 주요 작업 기업 홈페이지 전체 퍼블리싱 시공 사례 갤러리 구현 반응형 레이아웃 적용
크리미 2년 전
/** * User-set variables (Context::get, Context::set) * * 사용자가 설정한 변수들 (Context::get, Context::set을 통해 설정) * * 이 변수는 사용자가 설정한 변수들을 저장하는데 사용됩니다. 이러한 변수들은 Context::set과 Context::get 메소드를 * 통해 설정되고 가져올 수 있습니다. * * @var object|null */ pr… /** * User-set variables (Context::get, Context::set) * * 사용자가 설정한 변수들 (Context::get, Context::set을 통해 설정) * * 이 변수는 사용자가 설정한 변수들을 저장하는데 사용됩니다. 이러한 변수들은 Context::set과 Context::get 메소드를 * 통해 설정되고 가져올 수 있습니다. * * @var object|null */ private static $_user_vars = NULL; /** * Singleton instance * 싱글톤 인스턴스 * * 이 변수는 클래스의 단일 인스턴스를 저장합니다. 싱글톤 패턴은 클래스가 오직 하나의 인스턴스만을 가지도록 보장하며 * 전역적으로 접근 가능한 점을 제공합니다. * * @var self */ private static $_instance; /** * Initialization, it sets DB information, request arguments and so on. * 초기화에서는 DB 정보, 요청 인수 등을 설정합니다. * * @return void */ public static function init() { // Prevent calling init() twice. if(self::$_init_called) { return; } self::$_init_called = true; // Obtain a singleton instance if not already given. if(self::$_instance === null) { self::$_instance = self::getInstance(); } // Load system configuration. self::loadDBInfo(); // Set information about the current request. self::_checkGlobalVars(); self::setRequestMethod(); if (in_array(self::$_instance->request_method, array('GET', 'POST', 'JSON'))) { $method = $_SERVER['REQUEST_METHOD'] ?? 'GET'; $request = Rhymix\Framework\Router::parseURL($method, RX_REQUEST_URL, Rhymix\Framework\Router::getRewriteLevel()); self::$_current_request = $request; self::setRequestArguments($request->args); } else { self::$_current_request = new Rhymix\Framework\Request; self::setRequestArguments(); } self::setUploadInfo(); // If Rhymix is installed, get virtual site information. if(self::isInstalled()) { if (PHP_SAPI === 'cli') { self::set('_default_url', $default_url = config('url.default')); if (!defined('RX_BASEURL')) { define('RX_BASEURL', parse_url($default_url, PHP_URL_PATH)); } } $site_module_info = ModuleModel::getDefaultMid() ?: new stdClass; $site_timezone = (isset($site_module_info->settings->timezone) && $site_module_info->settings->timezone !== 'default') ? $site_module_info->settings->timezone : null; self::set('site_module_info', $site_module_info); self::set('_default_timezone', $site_timezone); self::set('_default_url', self::$_instance->db_info->default_url = self::getDefaultUrl($site_module_info, RX_SSL)); self::set('_http_port', self::$_instance->db_info->http_port = $site_module_info->http_port ?: null); self::set('_https_port', self::$_instance->db_info->https_port = $site_module_info->https_port ?: null); self::set('_use_ssl', self::$_instance->db_info->use_ssl = ($site_module_info->security === 'none' ? 'none' : 'always')); } else { $site_module_info = new stdClass; $site_module_info->domain = $_SERVER['HTTP_HOST']; $site_module_info->security = RX_SSL ? 'always' : 'none'; $site_module_info->settings = new stdClass; $site_module_info->is_default_replaced = true; self::set('site_module_info', $site_module_info); } // Redirect to SSL if the current domain requires SSL. if (!RX_SSL && PHP_SAPI !== 'cli' && $site_module_info->security !== 'none' && !$site_module_info->is_default_replaced) { $ssl_url = self::getDefaultUrl($site_module_info, true) . RX_REQUEST_URL; self::setCacheControl(0); header('Location: ' . $ssl_url, true, 301); exit; } // Load language support. $enabled_langs = self::loadLangSelected(); $set_lang_cookie = false; self::set('lang_supported', $enabled_langs); if($lang_type = self::get('l')) { if($_COOKIE['lang_type'] !== $lang_type) { $set_lang_cookie = true; } } elseif(isset($_COOKIE['lang_type']) && $_COOKIE['lang_type']) { $lang_type = $_COOKIE['lang_type']; } elseif(config('locale.auto_select_lang') && count($enabled_langs) > 1 && isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { $ua_locale = Rhymix\Framework\UA::getLocale(); if (substr($ua_locale, 0, 2) !== 'zh') { $ua_locale = substr($ua_locale, 0, 2); } if (isset($enabled_langs[$ua_locale])) { $lang_type = $ua_locale; $set_lang_cookie = true; } } $lang_type = preg_replace('/[^a-zA-Z0-9_-]/', '', $lang_type ?? ''); if ($set_lang_cookie) { Rhymix\Framework\Cookie::set('lang_type', $lang_type, ['expires' => 365, 'path' => \RX_BASEURL]); } if(!$lang_type || !isset($enabled_langs[$lang_type])) { if(isset($site_module_info->settings->language) && $site_module_info->settings->language !== 'default') { $lang_type = self::$_instance->db_info->lang_type = $site_module_info->settings->language; } else { $lang_type = self::$_instance->db_info->lang_type = config('locale.default_lang'); } } if(!$lang_type || !isset($enabled_langs[$lang_type])) { $lang_type = self::$_instance->db_info->lang_type = 'ko'; } $lang = Rhymix\Framework\Lang::getInstance($lang_type); $lang->loadDirectory(RX_BASEDIR . 'common/lang', 'common'); $lang->loadDirectory(RX_BASEDIR . 'modules/module/lang', 'module'); self::setLangType(self::$_instance->lang_type = $lang_type); self::set('lang', self::$_instance->lang = $lang); // Set global variables for backward compatibility. $GLOBALS['oContext'] = self::$_instance; $GLOBALS['__Context__'] = &self::$_user_vars; $GLOBALS['_time_zone'] = config('locale.default_timezone'); $GLOBALS['lang'] = &$lang; // set session handler if(self::isInstalled() && config('session.use_db')) { $oSessionModel = SessionModel::getInstance(); $oSessionController = SessionController::getInstance(); ini_set('session.serialize_handler', 'php'); session_set_save_handler( array($oSessionController, 'open'), array($oSessionController, 'close'), array($oSessionModel, 'read'), array($oSessionController, 'write'), array($oSessionController, 'destroy'), array($oSessionController, 'gc') ); } // start session if (\PHP_SAPI !== 'cli') { if (self::$_current_request->getRouteOption('enable_session')) { session_cache_limiter(''); Rhymix\Framework\Session::checkSSO($site_module_info); Rhymix\Framework\Session::start(false); } if (self::$_current_request->getRouteOption('cache_control')) { if (!session_cache_limiter()) { self::setCacheControl(0); } } } // start output buffer if (\PHP_SAPI !== 'cli') { ob_start(); } // set authentication information in Context and session if (self::isInstalled()) { if (Rhymix\Framework\Session::getMemberSrl()) { MemberController::getInstance()->setSessionInfo(); } else { self::set('is_logged', false); self::set('logged_info', false); } } // start debugging Rhymix\Framework\Debug::isEnabledForCurrentUser(); // set locations for javascript use $current_url = $request_uri = self::getRequestUri(); if (isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] === 'GET' && self::$_current_request->args) { if ($query_string = http_build_query(self::$_current_request->args)) { $current_url .= '?' . $query_string; } } if (strpos($current_url, 'xn--') !== false) { $current_url = Rhymix\Framework\URL::decodeIdna($current_url); } if (strpos($request_uri, 'xn--') !== false) { $request_uri = Rhymix\Framework\URL::decodeIdna($request_uri); } self::set('current_url', $current_url); self::set('request_uri', $request_uri); // set mobile status self::set('m', Mobile::isFromMobilePhone() ? 1 : 0); // If the site is locked, display the locked page. if(config('lock.locked')) { self::enforceSiteLock(); } } /** * Obtain a singleton instance of Context. * Context의 싱글톤 인스턴스를 얻습니다. * * @return object Instance */ public static function getInstance() { if(self::$_instance === null) { // Create a singleton instance and initialize static properties. // 싱글톤 인스턴스를 생성하고 정적 속성을 초기화합니다. self::$_instance = new Context(); self::$_oFrontEndFileHandler = self::$_instance->oFrontEndFileHandler = new FrontEndFileHandler(); self::$_user_vars = self::$_user_vars ?: new stdClass; } return self::$_instance; } /** * Return key's value * 키의 값을 반환 * * 이 메소드는 변수의 키를 통해 그 값을 가져오는 정적 메소드입니다. * 먼저 키가 비어 있는지 확인하고, 비어 있으면 에러를 발생시킵니다. * 그 다음 사용자가 설정한 변수들 중에서 키를 확인하고, 찾으면 그 값을 반환합니다. * 사용자 변수에 없으면 인스턴스 변수에서 확인합니다. * 두 곳 모두에 키가 없으면 null을 반환합니다. * * @param string $key 가져올 변수의 키. * @return mixed 찾은 경우 변수의 값, 그렇지 않으면 null. */ public static function get($key) { // 제공된 키가 비어 있는지 확인합니다. 비어 있다면 사용자 경고를 발생시키고 반환합니다. if(empty($key)) { trigger_error('Called Context::get() with an empty key', \E_USER_WARNING); return; } // 키가 사용자 설정 변수에 존재하는지 확인하고, 찾으면 그 값을 반환합니다. if(isset(self::$_user_vars->{$key})) { return self::$_user_vars->{$key}; } // 사용자 설정 변수에 없으면 인스턴스 변수에서 키가 존재하는지 확인합니다. elseif(isset(self::$_instance->{$key})) { return self::$_instance->{$key}; } // 두 곳 모두에 키가 없으면 null을 반환합니다. else { return null; } } /** * Set a context value with a key * * @param string $key Key * @param mixed $val Value * @param mixed $replace_request_arg * @return void */ public static function set($key, $val, $replace_request_arg = false) { if(empty($key)) { trigger_error('Called Context::set() with an empty key', \E_USER_WARNING); return; } self::$_user_vars->{$key} = $val; if($replace_request_arg || isset(self::$_current_request->args[$key])) { if($val === NULL || $val === '') { unset(self::$_current_request->args[$key]); } else { self::$_current_request->args[$key] = $val; } } }
이온디
이온디 2년 전
프로젝트 개요 클라이언트: 클린에어테크 작업 유형: 기업 홈페이지 XE 기반 구축 사용 기술: XE CMS, HTML5, CSS3 작업 연도: 2024년 작업 내용 공기청정 환경 솔루션 기업 클린에어테크의 홈페이지를 XE CMS 기반으로 구축했습니다. 제품 소개와 기술 인증 내용을 효과적으로 전달하는 레이아웃을 적용했습니다. 주요 작업 XE 기반 기업 홈페이지 구축 제품 소개 및 기술 인증 페이지 구성 반응형 레이아웃 구현 프로젝트 개요 클라이언트: 클린에어테크 작업 유형: 기업 홈페이지 XE 기반 구축 사용 기술: XE CMS, HTML5, CSS3 작업 연도: 2024년 작업 내용 공기청정 환경 솔루션 기업 클린에어테크의 홈페이지를 XE CMS 기반으로 구축했습니다. 제품 소개와 기술 인증 내용을 효과적으로 전달하는 레이아웃을 적용했습니다. 주요 작업 XE 기반 기업 홈페이지 구축 제품 소개 및 기술 인증 페이지 구성 반응형 레이아웃 구현
이온디
이온디 2년 전
바른뉴트리 라이믹스 기반 누리고 쇼핑몰 스킨 작업 고객명 : 약사이다 공동작업자 : 김승희(디자이너) [카페24 스킨] 카페24 디자인센터 (cafe24.com) Cafe24 Store 피씨버전 : SomeFood (cafe24.com) 모바일버전 : https://ecudemo213671.cafe24.com/m [작업URL] shop.jslocal.org 바른뉴트리 - 사이트 잠금 상태입니다. (jslocal.org) [작업상태] 라이믹스 기반 누리고 쇼핑몰 스킨 세팅완료 레이아웃 제… 바른뉴트리 라이믹스 기반 누리고 쇼핑몰 스킨 작업 고객명 : 약사이다 공동작업자 : 김승희(디자이너) [카페24 스킨] 카페24 디자인센터 (cafe24.com) Cafe24 Store 피씨버전 : SomeFood (cafe24.com) 모바일버전 : https://ecudemo213671.cafe24.com/m [작업URL] shop.jslocal.org 바른뉴트리 - 사이트 잠금 상태입니다. (jslocal.org) [작업상태] 라이믹스 기반 누리고 쇼핑몰 스킨 세팅완료 레이아웃 제작 중 https://ecudemo213671.cafe24.com/m" style="height: 432px;">https://ecudemo213671.cafe24.com/m # 20240122 잔금 입금완료 전자세금계산서 발급 # 20231006 전자세금계산서 발급 설치파일 /layouts/el_nutri cashpay couponsms currency cympusadmin cympuser epay epos inipaymobile inipaystandard kcp keyword ncart nmileage nproduct nstore nstore_digital nstore_digital_contents paynoty paypal store_review store_search textmessage
이온디
이온디 4년 전
구현내용 : 신고하기를 새창이 아닌 모달레이어로 구현 작업방법 : 기존 신고하기 새창의 소스를 그대로 복사해서, 게시판 스킨 내부 글보기 페이지, 코멘트 페이지에 삽입함. url만 XE 코드에 맞게 삽입함. 수정한 코드 경로 modules/board/skins/assets/css/report.scss modules/board/skins/assets/js/board.js modules/board/skins/eden_feed/components/article/article.html modules… 구현내용 : 신고하기를 새창이 아닌 모달레이어로 구현 작업방법 : 기존 신고하기 새창의 소스를 그대로 복사해서, 게시판 스킨 내부 글보기 페이지, 코멘트 페이지에 삽입함. url만 XE 코드에 맞게 삽입함. 수정한 코드 경로 modules/board/skins/assets/css/report.scss modules/board/skins/assets/js/board.js modules/board/skins/eden_feed/components/article/article.html modules/board/skins/eden_feed/components/comment/comment.html modules/board/skins/eden_feed/_header.html board.js jQuery(function($) { const btnReportDocument = $(".btn-report-document"); const btnReportComment = $(".btn-report-comment"); const modalWinDocument = $(".modal-wrap-document"); const modalWinComment = $(".modal-wrap-comment"); const btnClose = $(".btn-close"); btnReportDocument.on('click', function(){ modalWinDocument.addClass('active'); }); btnReportComment.on('click', function(){ console.log("코멘트열기"); $(this).next(".modal-wrap-comment").addClass('active'); // modalWinComment.addClass('active'); }); btnClose.on('click', function(){ modalWinDocument.removeClass('active'); modalWinComment.removeClass('active'); }); // $(".modal-wrap.active").not(".modal.modal-view").on("click", function(){ // $(this).removeClass('active'); // }) $('html').on('click', function(e){ //모달창 개수 // var modal = $(e.target).parents('.mark').length; //켜짐여부 var hasClass = $(e.target).hasClass('active'); // console.log($(e.target)) // console.log(modal) // var modal = $(e.target).length; if(hasClass){ // console.log('외부이프문') if(!$(e.target).hasClass('.modal-view')){ // console.log('내부이프문') // console.log($(e.target).parent('.mark').hasClass('on')) $('.modal-wrap-document').removeClass('active'); $('.modal-wrap-comment').removeClass('active'); $('body').css('overflow',''); }else{ // console.log('내부이프문2') } // console.log('켜짐'); // console.log(e.target); }else { // console.log('맞음'); // console.log(e.target); } }); }); article.html <div class="modal-wrap-document"> <div class="modal modal-view"> <div class="modal-header"> <div class="title">신고하기</div> <div class="btn-close"><i class="ion ion-md-close"></i></div> </div> <div class="modal-body"> <load target="../../ruleset/insertDeclare.xml" /> <form action="./" method="post" id="for_document"> <input type="hidden" name="error_return_url" value="{getUrl('','document_srl',$document_srl,'status','error')}"> <input type="hidden" name="mid" value=""> <input type="hidden" name="ruleset" value="insertDeclare"> <input type="hidden" name="module" value="document"> <input type="hidden" name="act" value="procDocumentDeclare"> <input type="hidden" name="target_srl" value="{$document_srl}"> <input type="hidden" name="success_return_url" value="{getUrl('','document_srl', $document_srl,'status','success')}"> <input type="hidden" name="xe_validator_id" value="modules/document/tpl/1"> <div class="x_modal-body x_form-horizontal" style="max-height:none"> <blockquote> <section class="target_article"> <div class="item"> <div class="label">작성자</div> <div class="text">{$oDocument->getNickName()}</div> </div> <div class="item"> <div class="label">제목</div> <div class="text">{$oDocument->getTitle()}</div> </div> </section> </blockquote> <div class="x_control-group"> <label class="x_control-label" for="message_option">사유선택</label> <div class="x_controls"> <select name="message_option" id="message_option"> <option loop="$lang->improper_document_reasons => $key,$text" value="{$key}">{$text}</option> <textarea name="declare_message" id="declare_message"></textarea> <p>{$lang->about_improper_document_declare}</p></div> </div> </div> <div class="x_modal-footer"> <span class="x_btn-group x_pull-right"> <button type="submit" class="x_btn x_btn-primary">{$lang->cmd_submit}</button> </span> </div> </form> <script cond="$XE_VALIDATOR_MESSAGE && $XE_VALIDATOR_ID == 'modules/document/tpl/1'"> alert("{$XE_VALIDATOR_MESSAGE}"); // window.close(); </script> <script cond="$XE_VALIDATOR_MESSAGE && $XE_VALIDATOR_ID == 'modules/comment/tpl/1'"> alert("{$XE_VALIDATOR_MESSAGE}"); // window.close(); </script> </div> </div> </div> comment.html <div class="btn-report-comment">신고</div> <div class="modal-wrap-comment"> <div class="modal modal-view"> <div class="modal-header"> <div class="title">신고하기</div> <div class="btn-close"><i class="ion ion-md-close"></i></div> </div> <div class="modal-body"> <load target="../../ruleset/insertDeclare.xml" /> <form action="./" method="post" id="for_comment"> <input type="hidden" name="error_return_url" value="{getUrl('','document_srl',$comment->get('document_srl'),'comment_srl',$comment->comment_srl,'status','error')}"> <input type="hidden" name="mid" value="index"> <input type="hidden" name="ruleset" value="insertDeclare"> <input type="hidden" name="module" value="comment"> <input type="hidden" name="act" value="procCommentDeclare"> <input type="hidden" name="target_srl" value="{$comment->comment_srl}"> <input type="hidden" name="success_return_url" value="{getUrl('','document_srl',$comment->get('document_srl'),'comment_srl',$comment->comment_srl,'status','success')}"> <input type="hidden" name="xe_validator_id" value="modules/comment/tpl/1"> <!-- <div class="x_modal-header">--> <!-- <h1>불량 댓글 신고 </h1>--> <!-- </div>--> <div class="x_modal-body x_form-horizontal" style="max-height:none"> <blockquote> <section class="target_article"> <div class="item"> <div class="label">댓글내용</div> <div class="text">{$comment->getContent(false)}</div> </div> </section> </blockquote> <div class="x_control-group"> <label class="x_control-label" for="message_option">신고 이유</label> <div class="x_controls"> <select name="message_option" id="message_option"> <option value="advertisement">본문 주제나 흐름에 맞지 않는 광고 글입니다.</option> <option value="theme">주제에 맞지 않는 글입니다.</option> <option value="bad_word">과도한 욕설을 담고 있습니다.</option> <option value="violence">폭력적인 내용을 담고 있습니다.</option> <option value="racism">인종차별적인 내용을 담고 있습니다.</option> <option value="pornography">음란물을 포함하고 있습니다.</option> <option value="privacy">민감한 개인정보가 노출 되어있습니다.</option> <option value="others">기타(직접작성)</option> </select> <textarea name="declare_message" id="declare_message"></textarea> <p>댓글을 신고하신 이유를 간단히 적어서 제출해주시면 관리자 검토 후 조치하겠습니다.</p><p> </p></div> </div> <div class="x_modal-footer"> <span class="x_btn-group x_pull-right"> <button type="submit" class="x_btn x_btn-primary">등록</button> </span> </div> </div> </form> </div> </div> </div> header.html <load target="../assets/css/report.min.css" /> report.scss $line-color:#eee; .btn-report-document,.btn-report-comment{ display:inline-block; margin-right: 10px; font-size: 13px !important; line-height: 1.2em !important; color: #999; cursor: pointer; } .modal-wrap-document, .modal-wrap-comment{ background: rgba(0,0,0,.5); //display: flex; align-items: center; justify-content: center; width: 100vw; height: 100vh; position: fixed; left: 0; right: 0; top: 0; z-index: 999; bottom: 0; display: none; &.active{ display: flex; } } // 신고하기 .modal.modal-view{ display:block !important; width: 21rem; height: 25rem; background:#fff; position: initial; border: 1px solid #444; box-shadow: 4px 4px 8px rgba(0,0,0,0.1); .modal-header{ border-bottom: 1px solid $line-color; .title{ } .btn-close{ cursor: pointer; i{ font-size: 24px; } } } .modal-body{ padding: 0; select, textarea{ margin-top: 2px; width: 100%; } .target_article{ display: flex; flex-direction: column; gap: .5rem; padding: .5rem; border-bottom: 1px solid $line-color; .item{ display: flex; .label{ color: #aaa; border-right: 1px solid #ddd; width: 6rem; } .text{ padding-left: 1rem; } } font-size: 13px; } .x_control-group{ padding: .5rem; .x_controls{ p{ font-size: 12px; color: #aaa; } } } .x_modal-footer{ padding: 0 .5rem; .x_btn-group{ .x_btn{ width: 100%; background: #ff5d6b; border: 0; height: 40px; color: #fff; border-radius: 3px; } } } } }