#0 290개의 스레드 ✕ 해제
이온디
이온디 4주 전
학습 목표 디자인 토큰의 개념 이해 Figma Dev Mode에서 정확한 CSS 값 추출 SCSS 변수 시스템 구축 디자인-퍼블 불일치 방지 1. 왜 디자인 토큰이 필요한가? Figma MCP의 한계 Figma MCP는 레이아웃 구조를 빠르게 가져오는 데 탁월하지만, 정밀한 수치를 정확히 추출하는 데는 한계가 있습니다. 잘 가져오는 것 못 가져오는 것 레이아웃 구조 (Flexbox, Grid) 정확한 font-size 색상 값 (HEX, RGB)… 학습 목표 디자인 토큰의 개념 이해 Figma Dev Mode에서 정확한 CSS 값 추출 SCSS 변수 시스템 구축 디자인-퍼블 불일치 방지 1. 왜 디자인 토큰이 필요한가? Figma MCP의 한계 Figma MCP는 레이아웃 구조를 빠르게 가져오는 데 탁월하지만, 정밀한 수치를 정확히 추출하는 데는 한계가 있습니다. 잘 가져오는 것 못 가져오는 것 레이아웃 구조 (Flexbox, Grid) 정확한 font-size 색상 값 (HEX, RGB) line-height, letter-spacing 대략적인 크기 margin/padding 정밀 값 요소 순서 border-radius 세부 값 실제 사례: lllayer_kda 프로젝트 프롬프트: 피씨 이 1개의 디자인을 Figma에서 구현하세요. @https://www.figma.com/design/... 결과: - ✅ 구조는 맞음 (섹션 배치, Flexbox) - ❌ 글자 크기가 다름 (48px → 40px로 잘못 해석) - ❌ 간격이 다름 (80px → 60px로 잘못 적용) - ❌ 정렬이 안 맞음 원인: AI가 디자인을 "추론"하여 값을 생성하기 때문 2. 디자인 토큰이란? 디자인 시스템의 가장 작은 단위로, 재사용 가능한 값들의 모음입니다. Typography 토큰 토큰명 설명 예시 값 font-family 폰트 종류 'Pretendard', sans-serif font-size-h1 제목1 크기 64px font-size-h2 제목2 크기 48px font-size-body 본문 크기 16px font-weight-bold 굵은 글씨 700 line-height-normal 기본 행간 1.5 letter-spacing-tight 자간 (좁음) -0.02em Spacing 토큰 토큰명 값 용도 spacing-xs 4px 아이콘-텍스트 간격 spacing-sm 8px 작은 요소 간격 spacing-md 16px 기본 패딩 spacing-lg 24px 섹션 내 간격 spacing-xl 48px 섹션 간 간격 spacing-xxl 80px 대형 섹션 간격 Color 토큰 토큰명 값 용도 color-primary #0066FF 브랜드 메인 color-secondary #6B7280 보조 색상 color-background #FFFFFF 배경 color-surface #F9FAFB 카드 배경 color-text-primary #111827 본문 텍스트 color-text-secondary #6B7280 부제목 텍스트 3. Figma에서 토큰 추출하기 방법 1: Dev Mode 활용 (가장 정확) Figma에서 요소 선택 우측 Inspect 패널 확인 CSS 값 복사 Dev Mode에서 보이는 값: font-size: 64px line-height: 76.8px (= 1.2) letter-spacing: -1.28px (= -0.02em) 방법 2: Figma Variables 활용 디자이너가 Variables로 정의한 경우: # Claude 프롬프트 이 Figma 파일의 디자인 토큰(Variables)을 추출해주세요. @https://www.figma.com/design/... 또는 MCP 도구 직접 호출: get_variable_defs nodeId="xxx" 방법 3: 디자이너에게 스펙 문서 요청 디자이너에게 다음 항목을 요청하세요: [ ] Typography 스펙 (H1~H6, Body, Caption 등) [ ] Spacing 스펙 (4px 배수 권장) [ ] Color 팔레트 [ ] Breakpoint 정의 4. SCSS 변수 시스템 구축 _variables.scss 예시 // ====================== // Typography // ====================== $font-family-primary: 'Pretendard', -apple-system, BlinkMacSystemFont, sans-serif; $font-family-secondary: 'Noto Sans KR', sans-serif; // Font Sizes $font-size-h1: 64px; $font-size-h2: 48px; $font-size-h3: 32px; $font-size-h4: 24px; $font-size-body: 16px; $font-size-caption: 14px; $font-size-small: 12px; // Font Weights $font-weight-light: 300; $font-weight-regular: 400; $font-weight-medium: 500; $font-weight-semibold: 600; $font-weight-bold: 700; // Line Heights $line-height-tight: 1.2; $line-height-snug: 1.3; $line-height-normal: 1.5; $line-height-relaxed: 1.6; $line-height-loose: 1.8; // Letter Spacing $letter-spacing-tight: -0.02em; $letter-spacing-normal: 0; $letter-spacing-wide: 0.05em; // ====================== // Spacing // ====================== $spacing-xs: 4px; $spacing-sm: 8px; $spacing-md: 16px; $spacing-lg: 24px; $spacing-xl: 48px; $spacing-xxl: 80px; $spacing-3xl: 120px; // ====================== // Breakpoints // ====================== $breakpoint-mobile: 360px; $breakpoint-tablet: 768px; $breakpoint-pc: 1920px; $breakpoint-wide: 3440px; // Inner Width (Container) $inner-width-mobile: 324px; $inner-width-tablet: 688px; $inner-width-pc: 1720px; $inner-width-wide: 2590px; // ====================== // Colors // ====================== $color-primary: #0066FF; $color-primary-dark: #0052CC; $color-secondary: #6B7280; $color-background: #FFFFFF; $color-surface: #F9FAFB; $color-border: #E5E7EB; $color-text-primary: #111827; $color-text-secondary: #6B7280; $color-text-muted: #9CA3AF; // ====================== // 반응형 Mixin // ====================== @mixin mobile { @media (max-width: #{$breakpoint-tablet - 1px}) { @content; } } @mixin tablet { @media (min-width: $breakpoint-tablet) and (max-width: #{$breakpoint-pc - 1px}) { @content; } } @mixin pc { @media (min-width: $breakpoint-pc) { @content; } } @mixin wide { @media (min-width: $breakpoint-wide) { @content; } } 변수 사용 예시 // _typography.scss .page-title { font-family: $font-family-primary; font-size: $font-size-h1; font-weight: $font-weight-bold; line-height: $line-height-tight; letter-spacing: $letter-spacing-tight; color: $color-text-primary; @include tablet { font-size: $font-size-h2; } @include mobile { font-size: $font-size-h3; } } .section { padding: $spacing-xxl 0; @include mobile { padding: $spacing-xl 0; } } .container { max-width: $inner-width-pc; margin: 0 auto; padding: 0 $spacing-lg; @include wide { max-width: $inner-width-wide; } @include tablet { max-width: $inner-width-tablet; } @include mobile { max-width: $inner-width-mobile; padding: 0 $spacing-md; } } 5. 워크플로우 개선 Before (기존 방식) 1. Figma URL 제공 ↓ 2. "이 디자인을 구현하세요" ↓ 3. 결과 확인 → 수치가 안 맞음 ↓ 4. "글자 크기 48px로 수정해주세요" ↓ 5. "간격 80px로 수정해주세요" ↓ 6. 반복... (비효율) After (토큰 기반 방식) 1. 프로젝트 시작 시 디자인 토큰 정의 ↓ 2. _variables.scss 파일 생성 ↓ 3. Figma URL + 토큰 명시 프롬프트 ↓ 4. 결과물 일관성 확보 (수정 최소화) 6. 실습: lllayer_kda 토큰 정의 Step 1: Figma에서 값 추출 피그마 Dev Mode에서 확인할 항목: Typography - [ ] Title (H1~H4) 폰트 사이즈 - [ ] Body text 폰트 사이즈 - [ ] Caption 폰트 사이즈 - [ ] Font weight 종류 - [ ] Line height 값 Spacing - [ ] 섹션 간 간격 - [ ] 컨테이너 패딩 - [ ] 요소 간 간격 Layout - [ ] Container max-width (브레이크포인트별) - [ ] Grid gap Step 2: _variables.scss 작성 파일 위치: layouts/lllayer_kda/assets/css/_variables.scss // lllayer_kda 디자인 토큰 // Figma Dev Mode에서 추출한 정확한 값 // Typography $font-size-hero: 120px; // 메인 타이틀 $font-size-h1: 64px; $font-size-h2: 48px; $font-size-h3: 32px; $font-size-h4: 24px; $font-size-body: 18px; $font-size-caption: 14px; // ... (프로젝트에 맞게 커스터마이즈) Step 3: 기존 SCSS에 변수 적용 Before (하드코딩) .hero-title { font-size: 64px; line-height: 1.2; margin-bottom: 48px; } After (변수 사용) .hero-title { font-size: $font-size-h1; line-height: $line-height-tight; margin-bottom: $spacing-xl; } Step 4: 검증 브라우저 개발자 도구 열기 Computed 탭에서 실제 적용된 값 확인 Figma Dev Mode의 값과 1:1 비교 7. 프롬프트 템플릿 (토큰 기반) 기본 템플릿 작업경로: layouts/lllayer_kda/assets/pages/_about_english.html SCSS경로: layouts/lllayer_kda/assets/css/components/_about.scss ## 디자인 토큰 (반드시 준수) ### Typography | 요소 | font-size | line-height | font-weight | |-----|-----------|-------------|-------------| | H1 | 64px | 1.2 | 700 | | H2 | 48px | 1.3 | 600 | | H3 | 32px | 1.4 | 600 | | Body | 18px | 1.6 | 400 | | Caption | 14px | 1.5 | 400 | ### Spacing | 용도 | 값 | |-----|-----| | Section gap | 80px | | Inner gap | 48px | | Container padding | 24px | ### Breakpoints | 디바이스 | 뷰포트 | Inner width | |---------|--------|-------------| | Wide | 3440px | 2590px | | PC | 1920px | 1720px | | Tablet | 768px | 688px | | Mobile | 360px | 324px | 피씨 이 1개의 디자인을 Figma에서 구현하세요. **위 토큰 값을 정확히 적용해주세요.** @https://www.figma.com/design/...?node-id=XXX 상세 템플릿 (복잡한 페이지용) 작업경로: layouts/lllayer_kda/assets/pages/_service.html ## 디자인 토큰 ### Hero Section - 타이틀: 120px / 1.0 / 700 / letter-spacing: -0.03em - 서브타이틀: 24px / 1.5 / 400 - Section padding: 160px 0 ### Content Section - Section title: 48px / 1.3 / 600 - Body text: 18px / 1.8 / 400 - Card gap: 24px - Section gap: 120px ### SCSS 변수 파일 layouts/lllayer_kda/assets/css/_variables.scss 파일의 변수를 사용하세요. 하드코딩된 px 값 대신 $font-size-*, $spacing-* 변수를 사용해주세요. 피씨 이 1개의 디자인을 Figma에서 구현하세요. @https://www.figma.com/design/...?node-id=XXX [PC 스크린샷 첨부] 8. 핵심 포인트 요약 토큰 먼저, 퍼블 나중 프로젝트 시작 시 디자인 토큰부터 정의하세요. 디자이너와 협업 Typography/Spacing 스펙을 요청하세요. 디자이너가 Figma Variables를 사용하면 더 좋습니다. SCSS 변수 필수 하드코딩 금지. 모든 값은 변수로 관리하세요. 프롬프트에 토큰 명시 AI가 정확한 값을 적용하도록 명시하세요. 체크리스트 프로젝트 시작 시: - [ ] 디자이너에게 Typography 스펙 받기 - [ ] Spacing 시스템 정의 (4px 배수 권장) - [ ] Color 팔레트 정리 - [ ] Breakpoint 정의 파일 생성: - [ ] _variables.scss 파일 생성 - [ ] style.scss에 @import '_variables' 추가 작업 시: - [ ] 하드코딩 대신 변수 사용 - [ ] 프롬프트에 토큰 표 명시 검증: - [ ] 브라우저에서 Computed 값 확인 - [ ] Figma Dev Mode와 1:1 비교 - [ ] 반응형 브레이크포인트별 검증 참고 자료 Figma Dev Mode 가이드 Figma Variables 사용법 Design Tokens 커뮤니티 그룹
이온디
이온디 5개월 전
예전에 제가 건의드렸던 내용이라고 기진님이 그랬던거 같은데, 어떤 내용인지 제가 기억이 안나서 여기 질문드려봅니다. (자꾸 비슷한 내용을 말씀드리는걸 보면 그 때 그 제안드린 내용을 기진님이 약간 오해하신게 아닌가 싶은 생각이긴 한데, 어쨌든;;) 템플릿 작업을 하다보면 종종 이런 오류가 있더라구요. Error #0 "Undefined constant "doc"" in layouts/el_d1/assets/pages/qna.blade.php on line 360… 예전에 제가 건의드렸던 내용이라고 기진님이 그랬던거 같은데, 어떤 내용인지 제가 기억이 안나서 여기 질문드려봅니다. (자꾸 비슷한 내용을 말씀드리는걸 보면 그 때 그 제안드린 내용을 기진님이 약간 오해하신게 아닌가 싶은 생각이긴 한데, 어쨌든;;) 템플릿 작업을 하다보면 종종 이런 오류가 있더라구요. Error #0 "Undefined constant "doc"" in layouts/el_d1/assets/pages/qna.blade.php on line 360 이런 식으로 자바스크립트에서 사용한 변수 때문에 발생하는 오류인데, ${doc.nick_name} 이걸 PHP 템플릿 문법으로 오인해서 해석하는 건데, 그 때 깃헙 이슈 남길 때, 비슷하게 남긴 건 기억이 나는데, 매번 수락된 적이 없다가 그 이슈만은 수락이 됐던거 같아서 응?했던 기억이 나는데 조금 제가 의도했던 거랑은 약간 달랐던거 같기도 한데, 크게 당시에는 중요하게 여기지 않아서 그렇구나하고 넘어 갔던 이슈였던 걸로 기억을 하는데요. [잘못된 방법] @${'{'}doc.nick_name} $ 앞에 @를 붙여서 @${doc.nick_name} [추천하는 방법] @verbatim 으로 감쌈. (O) ${ doc.title } (O) ${'doc'}.title // 하지만 이건 실용적이지 않음 제가 남겼던 이슈인데 github에서 어떤 이슈였는지 못 찾겠어서 ㅠㅠ 이 이슈를 남기기 전이었던거 같은데, https://github.com/rhymix/rhymix/issues/2597 https://github.com/rhymix/rhymix/issues/2404 아니면 제가 이 내용을 제 기억이 잘못 기억하고 있던건지. -_-; 제가 문제가 있는 부분이 이건데, 제가 깃헙 이슈를 어떻게 사용하는지 잘 몰라서 그런데 혹시 관련 글을 어떻게 찾아보면 좋을지 아시는 분 계신가요.
이온디
이온디 6개월 전
<style> @import url('https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css'); .page { max-width: 800px; margin: 0 auto; padding: 60px 50px; } … <style> @import url('https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css'); .page { max-width: 800px; margin: 0 auto; padding: 60px 50px; } @media print { .page { padding: 40px; } .page-break { page-break-before: always; } } /* Header */ .header { text-align: center; margin-bottom: 50px; padding-bottom: 40px; border-bottom: 3px solid #2563eb; } .logo { width: 120px; margin-bottom: 20px; } .header h1 { font-size: 32px; font-weight: 700; color: #1a1a1a; margin-bottom: 10px; } .header .subtitle { font-size: 18px; color: #2563eb; font-weight: 500; } .header .company { margin-top: 20px; font-size: 14px; color: #666; } /* Section */ .section { margin-bottom: 45px; } .section h2 { font-size: 22px; font-weight: 700; color: #1a1a1a; margin-bottom: 20px; padding-bottom: 10px; border-bottom: 2px solid #e5e7eb; } .section h3 { font-size: 18px; font-weight: 600; color: #374151; margin: 25px 0 15px 0; } .section p { margin-bottom: 15px; color: #374151; } /* Problem List */ .problem-list { list-style: none; padding: 0; } .problem-list li { padding: 12px 0 12px 30px; position: relative; border-bottom: 1px solid #f3f4f6; } .problem-list li:before { content: "⚠️"; position: absolute; left: 0; } /* Comparison Table */ .comparison-table { width: 100%; border-collapse: collapse; margin: 20px 0; } .comparison-table th, .comparison-table td { padding: 15px; text-align: left; border: 1px solid #e5e7eb; } .comparison-table th { background: #f8fafc; font-weight: 600; color: #1a1a1a; } .comparison-table td:last-child { background: #eff6ff; color: #1e40af; font-weight: 500; } /* Highlight Box */ .highlight-box { background: linear-gradient(135deg, #eff6ff 0%, #dbeafe 100%); border-left: 4px solid #2563eb; padding: 25px; margin: 25px 0; border-radius: 0 8px 8px 0; } .highlight-box p { margin: 0; font-size: 16px; color: #1e40af; font-weight: 500; } /* Speed List */ .speed-list { list-style: none; padding: 0; display: grid; grid-template-columns: repeat(3, 1fr); gap: 15px; margin: 20px 0; } .speed-list li { background: #f0fdf4; padding: 15px; border-radius: 8px; text-align: center; border: 1px solid #bbf7d0; } .speed-list li strong { color: #15803d; } /* Demo Table */ .demo-table { width: 100%; border-collapse: collapse; margin: 20px 0; } .demo-table th, .demo-table td { padding: 15px; text-align: left; border-bottom: 1px solid #e5e7eb; } .demo-table th { font-weight: 600; width: 30%; } .demo-table a { color: #2563eb; text-decoration: none; } /* Pricing Card */ .pricing-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; margin: 25px 0; } .pricing-card { border: 2px solid #e5e7eb; border-radius: 12px; padding: 25px; text-align: center; } .pricing-card.featured { border-color: #2563eb; background: #eff6ff; } .pricing-card h4 { font-size: 16px; color: #374151; margin-bottom: 10px; } .pricing-card .price { font-size: 28px; font-weight: 700; color: #1a1a1a; margin-bottom: 15px; } .pricing-card .price span { font-size: 14px; font-weight: 400; color: #666; } .pricing-card ul { list-style: none; padding: 0; text-align: left; font-size: 14px; } .pricing-card ul li { padding: 8px 0; padding-left: 20px; position: relative; } .pricing-card ul li:before { content: "✓"; position: absolute; left: 0; color: #2563eb; font-weight: bold; } /* Process */ .process-steps { display: flex; justify-content: space-between; margin: 30px 0; position: relative; } .process-steps:before { content: ""; position: absolute; top: 25px; left: 50px; right: 50px; height: 2px; background: #e5e7eb; } .process-step { text-align: center; position: relative; z-index: 1; } .process-step .number { width: 50px; height: 50px; background: #2563eb; color: #fff; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-weight: 700; font-size: 18px; margin: 0 auto 10px; } .process-step .label { font-size: 13px; color: #374151; } /* CTA Box */ .cta-box { background: #1e40af; color: #fff; padding: 35px; border-radius: 12px; text-align: center; margin: 30px 0; } .cta-box h3 { color: #fff; font-size: 22px; margin-bottom: 15px; } .cta-box p { color: #bfdbfe; margin-bottom: 10px; } /* About */ .about-list { list-style: none; padding: 0; } .about-list li { padding: 10px 0 10px 30px; position: relative; } .about-list li:before { content: "•"; position: absolute; left: 10px; color: #2563eb; font-size: 20px; } /* Contact */ .contact-box { background: #f8fafc; padding: 30px; border-radius: 12px; text-align: center; } .contact-box h3 { margin-bottom: 20px; } .contact-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 15px; text-align: left; max-width: 500px; margin: 0 auto; } .contact-item { display: flex; align-items: center; gap: 10px; } .contact-item .icon { width: 24px; text-align: center; } .contact-item a { color: #2563eb; text-decoration: none; } /* Footer */ .footer { margin-top: 50px; padding-top: 20px; border-top: 1px solid #e5e7eb; text-align: center; font-size: 13px; color: #9ca3af; } </style> <div class="page"> <!-- Header --> <div class="header"> <img src="https://eond.com/files/attach/images/441847/2fd362f6524a9e817a49c35d52ff2f9d.svg" alt="EOND Logo" class="logo"> <h1>XE 사이트 현대화 제안서</h1> <div class="subtitle">React 기반 프론트엔드 전환 솔루션</div> <div class="company">이온디(EOND) · XE 전문 개발</div> </div> <!-- Problem Section --> <div class="section"> <h2>문제 인식</h2> <p>XE 기반 사이트를 오래 운영하셨다면 이런 고민이 있으실 겁니다.</p> <ul class="problem-list"> <li>페이지 이동할 때마다 <strong>전체 새로고침</strong>으로 인한 느린 체감 속도</li> <li><strong>모바일 환경</strong>에서의 불편한 사용자 경험</li> <li>"XE는 옛날 기술"이라는 <strong>이미지 문제</strong></li> <li>그렇다고 <strong>데이터 이전</strong>하며 플랫폼 바꾸기엔 부담</li> </ul> </div> <!-- Solution Section --> <div class="section"> <h2>솔루션: XE + React</h2> <p><strong>기존 XE 구조는 그대로, 프론트엔드만 현대화합니다.</strong></p> <table class="comparison-table"> <thead> <tr> <th>구분</th> <th>기존 XE</th> <th>React 전환 후</th> </tr> </thead> <tbody> <tr> <td>페이지 전환</td> <td>매번 새로고침</td> <td><strong>즉시 전환 (SPA)</strong></td> </tr> <tr> <td>체감 속도</td> <td>클릭마다 대기</td> <td><strong>앱처럼 빠름</strong></td> </tr> <tr> <td>모바일 경험</td> <td>기본 반응형</td> <td><strong>네이티브 앱 수준</strong></td> </tr> <tr> <td>기술 이미지</td> <td>레거시 PHP</td> <td><strong>최신 React 스택</strong></td> </tr> </tbody> </table> <h3>왜 가능한가?</h3> <ul class="about-list"> <li>자체 개발한 <strong>XE REST API 모듈</strong> 활용</li> <li>XE 데이터베이스/관리자 기능 <strong>100% 유지</strong></li> <li>프론트엔드만 React로 교체하는 <strong>비파괴적 전환</strong></li> </ul> </div> <!-- Speed Section --> <div class="section"> <h2>체감 속도 차이</h2> <p>React 기반 SPA(Single Page Application)의 특성상:</p> <div class="highlight-box"> <p>초기 로딩 1회 후, 이후 페이지 전환은 거의 즉시 이루어집니다.</p> </div> <ul class="speed-list"> <li>게시판 목록 → 글 상세<br><strong>즉시</strong></li> <li>카테고리 이동<br><strong>즉시</strong></li> <li>검색 결과 표시<br><strong>즉시</strong></li> </ul> <p>기존 XE처럼 매번 서버에서 HTML을 받아오는 방식이 아니라,<br>필요한 데이터만 API로 받아와 화면을 갱신하기 때문입니다.</p> </div> <!-- Demo Section --> <div class="section"> <h2>라이브 데모</h2> <p>실제 React로 전환된 XE 사이트를 직접 체험해보세요.</p> <table class="demo-table"> <tr> <th>메인 사이트</th> <td><a href="https://eond.com">https://eond.com</a></td> </tr> <tr> <th>블로그</th> <td><a href="https://eond.com/blog">https://eond.com/blog</a></td> </tr> <tr> <th>포트폴리오</th> <td><a href="https://eond.com/portfolio">https://eond.com/portfolio</a></td> </tr> </table> <p><strong>직접 클릭해보시면 속도 차이를 체감하실 수 있습니다.</strong></p> </div> <div class="page-break"></div> <!-- Pricing Section --> <div class="section"> <h2>서비스 구성 및 가격</h2> <div class="pricing-grid"> <div class="pricing-card"> <h4>React 스킨 패키지</h4> <div class="price">50만원<span>~</span></div> <ul> <li>React 레이아웃 스킨</li> <li>React 게시판 스킨</li> <li>React 통합검색 스킨</li> <li>설치 가이드 제공</li> </ul> </div> <div class="pricing-card featured"> <h4>전체 사이트 전환</h4> <div class="price">300만원<span>~</span></div> <ul> <li>XE REST API 모듈</li> <li>React 풀 커스터마이징</li> <li>디자인 반영/신규</li> <li>설치 및 세팅 완료</li> <li>유지보수 안내</li> </ul> </div> <div class="pricing-card"> <h4>API 모듈 단독</h4> <div class="price">200만원<span>~</span></div> <ul> <li>XE REST API 모듈</li> <li>API 문서 제공</li> <li>자체 개발팀용</li> </ul> </div> </div> </div> <!-- Process Section --> <div class="section"> <h2>진행 프로세스</h2> <div class="process-steps"> <div class="process-step"> <div class="number">1</div> <div class="label">문의 및 상담</div> </div> <div class="process-step"> <div class="number">2</div> <div class="label">사이트 분석</div> </div> <div class="process-step"> <div class="number">3</div> <div class="label">견적 안내</div> </div> <div class="process-step"> <div class="number">4</div> <div class="label">개발</div> </div> <div class="process-step"> <div class="number">5</div> <div class="label">검수 및 인도</div> </div> </div> </div> <!-- CTA Section --> <div class="cta-box"> <h3>무료 사이트 진단</h3> <p>관심이 있으시다면, 먼저 현재 사이트를 무료로 분석해드립니다.</p> <p>현재 사이트 속도 측정 · React 전환 시 개선 포인트 · 예상 견적 및 일정</p> </div> <!-- About Section --> <div class="section"> <h2>이온디(EOND) 소개</h2> <ul class="about-list"> <li>XE 기반 디지털 제품 <strong>500개 이상</strong> 제작/판매</li> <li>XE 커뮤니티 <strong>15년 이상</strong> 활동</li> <li>React + XE REST API <strong>자체 개발</strong></li> </ul> </div> <!-- Contact Section --> <div class="contact-box"> <h3>연락처</h3> <div class="contact-grid"> <div class="contact-item"> <span class="icon">🌐</span> <a href="https://eond.com">eond.com</a> </div> <div class="contact-item"> <span class="icon">📧</span> <a href="mailto:eond@eond.com">eond@eond.com</a> </div> <div class="contact-item"> <span class="icon">📞</span> <span>0507-1433-0311</span> </div> <div class="contact-item"> <span class="icon">💼</span> <a href="https://eond.com/services">서비스 안내</a> </div> </div> </div> <!-- Footer --> <div class="footer"> © 2024 EOND. All rights reserved. </div> </div>
이온디
이온디 7개월 전
1. Error #0 "Object of class stdClass could not be converted to string" in modules/ncenterlite/ncenterlite.controller.php on line 1083 설명 ``` 1083 - if(isset(self::$_skip_acts[strval(Context::get('act'))])) 1083 + $act = Context::get('act'); 1084 + if($… 1. Error #0 "Object of class stdClass could not be converted to string" in modules/ncenterlite/ncenterlite.controller.php on line 1083 설명 ``` 1083 - if(isset(self::$_skip_acts[strval(Context::get('act'))])) 1083 + $act = Context::get('act'); 1084 + if($act && is_string($act) && isset(self::$_skip_acts[$act])) ``` 2. TypeError #0 "strtolower(): Argument #1 ($string) must be of type string, stdClass given" in modules/vote/vote.controller.php on line 525 설명 ``` 525 - if(Context::getResponseMethod() != 'HTML' || strpos(strtolower(Context::get('act')), 'admin') !== false) return; │ │ 525 + $act = Context::get('act'); │ │ 526 + if(Context::getResponseMethod() != 'HTML' || (is_string($act) && strpos(strtolower($act), 'admin') !== false)) return; ``` > 525번 라인에서 Context::get('act')가 stdClass 객체를 반환하는데, strtolower() 함수에 직접 전달해서 발생한 오류입니다. > 두 모듈에서 공통적으로 Context::get('act')가 stdClass 객체를 반환하는 상황이 발생하고 있습니다. 이는 easyxe 모듈에서 방어적 코딩으로 추가한 > $module_info->act = $module_info->act ?? new stdClass(); 코드와 관련이 있을 수 있습니다. 3. Error #0 "Object of class stdClass could not be converted to string" in addons/consultation_request/consultation_request.addon.php on line 448 설명 ``` 448 - $debug_log .= "act: " . Context::get('act') . "\n"; │ │ 448 + $act = Context::get('act'); │ │ 449 + $debug_log .= "act: " . (is_string($act) ? $act : 'non-string') . "\n"; ``` <수정방법> 변경 내용 기존 코드 (오류 발생): $debug_log .= "act: " . Context::get('act') . "\n"; 수정된 코드 (안전한 처리): $act = Context::get('act'); $debug_log .= "act: " . (is_string($act) ? $act : 'non-string') . "\n"; 수정 이유 1. 변수 분리: $act = Context::get('act') 변수에 먼저 저장 2. 타입 검증: is_string($act) 체크로 문자열인지 확인 3. 조건부 출력: 문자열이면 그대로, 아니면 'non-string' 출력 🔍 근본 원인 분석 패턴: 여러 모듈/애드온에서 Context::get('act')가 stdClass 객체를 반환하는 문제가 발생하고 있습니다. 추정 원인: easyxe 모듈에서 추가한 방어적 코딩: $module_info->act = $module_info->act ?? new stdClass(); //eond 이 코드가 $module_info->act를 stdClass로 설정하고, 이것이 Context::get('act')에 영향을 줄 수 있습니다. 권장사항: - 현재 각 오류를 개별적으로 수정하고 있지만 - 근본적으로는 easyxe 모듈의 방어적 코딩 부분을 재검토할 필요가 있습니다 이제 consultation_request 애드온에서 "Object of class stdClass could not be converted to string" 오류가 발생하지 않습니다. > 이건 다른 모듈들의 문제가 아니라 easyxe 모듈에서 방어적 코드가 원론적인 문제 아닌가? ⏺ 네, 정확한 지적입니다! 🎯 근본 원인 easyxe 모듈의 방어적 코딩이 문제의 원인입니다: // easyxe.controller.php:389 $module_info->act = $module_info->act ?? new stdClass(); //eond 이 코드가 act 값을 stdClass 객체로 설정하면서, 다른 모든 모듈들이 Context::get('act')를 호출할 때 문자열 대신 stdClass 객체를 받게 되는 것입니다. 🔧 올바른 해결 방법 개별 모듈들을 수정하는 것이 아니라, easyxe 모듈의 방어적 코딩을 수정해야 합니다: ⏺ Read(easyxe.controller.php) ⎿ Read 10 lines (ctrl+o to expand) ⏺ Update(easyxe.controller.php) ⎿ Updated easyxe.controller.php with 1 addition and 1 removal 386 { 387 return new BaseObject(); 388 } 389 - $module_info->act = $module_info->act ?? new stdClass(); //eond 389 + $module_info->act = $module_info->act ?? ''; //eond - 빈 문자열로 초기화 390 if(in_array($module_info->act, $except_act_list)) 391 { 392 return new BaseObject(); 변경 내용 문제가 있던 코드: $module_info->act = $module_info->act ?? new stdClass(); //eond 수정된 코드: $module_info->act = $module_info->act ?? ''; //eond - 빈 문자열로 초기화 왜 이렇게 수정해야 하는가? 1. act는 본래 문자열 값이어야 함 (예: 'dispBoardContent', 'dispPageIndex' 등) 2. stdClass 객체로 초기화하면 다른 모든 모듈에서 타입 오류 발생 3. 빈 문자열('')로 초기화하면 문자열 함수들이 정상 동작 🔄 이전 수정사항들 되돌리기 이제 근본 원인을 해결했으므로, 개별 모듈들의 임시 수정사항들을 원래대로 되돌려도 됩니다: 1. ncenterlite 모듈의 타입 체크 2. vote 모듈의 타입 체크 3. consultation_request 애드온의 타입 체크 이들은 모두 임시 방편이었고, 이제 근본 원인이 해결되었습니다. 결론: 맞습니다. 다른 모듈들의 문제가 아니라 easyxe 모듈의 방어적 코딩이 원인이었습니다.
청아 8개월 전
※ 부산과학기술대학교 DX-SPARK AI·DX - 교육명 : AI활용 경영정보 및 DATA 시각화 - 교육 목표 ▶ 기업 보유 데이터를 활용한 경영 의사결정 역량 강화 ▶ POWER BI를 중심으로 한 데이터 실무 역량 실습 ▶ 기업 실제 데이터를 활용한 프로젝트 수행 ▶ 즉시 업무 적용 가능한 대시보드 제작 능력 배양 - 교육 과정 ▶ 데이터 수집 및 전처리 기법 학습 ▶ Power BI를 활용한 대시보드 제작 실습 ▶ 화승 기업 실무 프로젝트 집중 진행 ▶ 개별 기업 … ※ 부산과학기술대학교 DX-SPARK AI·DX - 교육명 : AI활용 경영정보 및 DATA 시각화 - 교육 목표 ▶ 기업 보유 데이터를 활용한 경영 의사결정 역량 강화 ▶ POWER BI를 중심으로 한 데이터 실무 역량 실습 ▶ 기업 실제 데이터를 활용한 프로젝트 수행 ▶ 즉시 업무 적용 가능한 대시보드 제작 능력 배양 - 교육 과정 ▶ 데이터 수집 및 전처리 기법 학습 ▶ Power BI를 활용한 대시보드 제작 실습 ▶ 화승 기업 실무 프로젝트 집중 진행 ▶ 개별 기업 맞춤형 대시보드 개발 - 교육 일정 : 9/27(토), 10/11(토), 10/18(토), 10/25(토) 09:00~14:00 - 교육 장소 : 부산과학기술대학교 실습실 - 신청 방법 : https://edu.ggumeasy.com/?pn=product.view&cuid=&pcode=A6871-T6547-P6497
이온디
이온디 1년 전
라이믹스 레거시 모듈 에러 Error #0 "Call to a member function toBool() on null" in modules/document/document.item.php on line 1002 라이믹스 콘텐츠 모듈에 접속하려는데 해당 오류가 발생함 https://eond.com/xemarket/461285?search_keyword=%EB%A7%88%EC%9D%B4%EB%A1%9C%EA%B7%B8&search_target=title_content 접속하려는 주소는 이와… 라이믹스 레거시 모듈 에러 Error #0 "Call to a member function toBool() on null" in modules/document/document.item.php on line 1002 라이믹스 콘텐츠 모듈에 접속하려는데 해당 오류가 발생함 https://eond.com/xemarket/461285?search_keyword=%EB%A7%88%EC%9D%B4%EB%A1%9C%EA%B7%B8&search_target=title_content 접속하려는 주소는 이와 같음 https://eond.com/xemarket/461285 이 게시물만 유독 그럼. 다른 게시물은 접근 됨. 무슨 문제일까 해당 오류 메시지는 toBool() 메서드를 호출하려는데, 호출 대상이 null인 경우 발생하는 에러입니다. 🔍 가능한 원인잘못된 데이터 참조 document.item.php 파일의 1002번째 줄에서 특정 변수를 toBool()로 변환하려고 하는데, 그 변수가 null일 가능성이 큽니다.해당 변수는 DocumentItem 객체 또는 관련 속성일 가능성이 높습니다.문서 데이터 누락 특정 게시물(해당 오류가 발생하는 게시물)의 데이터가 손상되었거나, 일부 필드가 누락되었을 가능성이 있습니다.모듈/애드온 충돌 특정 문서에서만 발생한다면, 해당 문서에서만 작동하는 애드온이나 확장 기능이 문제를 일으킬 수 있습니다.🛠 해결 방법1️⃣ 로그를 활용한 디버깅해당 파일(modules/document/document.item.php)에서 1002번째 줄 위에 아래 코드를 삽입하여 어떤 변수가 null인지 확인하세요. Rhymix의 데이터베이스에서 문제가 발생한 문서의 데이터를 확인해보세요. sql 복사편집 SELECT * FROM rx_document WHERE document_srl = '461285'; 만약 특정 필드가 NULL이면, 정상적인 값으로 수정합니다.3️⃣ 캐시 재생성관리자 페이지 → 고급 설정 → 캐시파일 재생성files/cache/ 폴더 삭제 후 다시 생성4️⃣ 문제 게시물 재저장관리자에서 해당 게시물을 편집하고 다시 저장해 보세요.혹은 새 게시물로 동일한 내용을 작성한 뒤 비교하여 차이점을 확인하세요.5️⃣ 확장 기능(애드온, 위젯, 모듈 등) 비활성화특정 게시물에서만 발생한다면, 해당 게시물에서만 적용되는 애드온이 있을 가능성이 있음.관리자로 로그인 후 애드온 및 확장 기능을 비활성화한 뒤 다시 확인.
이온디
이온디 1년 전
우리알림 - 대량 Email 시스템 https://eond.com/450416 보고된 에러 목록 1) Server Error Error #0 "Class "Object" not found" in modules/mailing/mailing.class.php on line 7 우리알림 - 대량 Email 시스템 https://eond.com/450416 보고된 에러 목록 1) Server Error Error #0 "Class "Object" not found" in modules/mailing/mailing.class.php on line 7
이온디
이온디 1년 전
contents 모듈에서 카테고리 사용안함으로 체크하고 게시물 업로드해도 위와 같은 오류 발생함. 에러 SQLSTATE[42S02] : Base table or view not found : 1146 Table 'eond.rx_contents_category' doesn't exit 에러 Error #0 "Attempt to assign property "skin" on null" in modules/contents/contents.model.php on line 23 1 contents 모듈에서 카테고리 사용안함으로 체크하고 게시물 업로드해도 위와 같은 오류 발생함. 에러 SQLSTATE[42S02] : Base table or view not found : 1146 Table 'eond.rx_contents_category' doesn't exit 에러 Error #0 "Attempt to assign property "skin" on null" in modules/contents/contents.model.php on line 23 1
이온디
이온디 1년 전
오류 1. 처음 생성시 발생하는 오류(1) 2. 처음 생성시 발생하는 오류(2) 3. 구매하기를 누르면 발생하는 오류 '생성' 버튼을 눌렀을 때 발생하는 오류. 에러 TypeError #0 "Rhymix\Modules\Extravar\Models\Value::__construct(): Argument #1 ($module_srl) must be of type int, null given, called in /Users/eond/PhpstormProjects/imdar/modules/conte… 오류 1. 처음 생성시 발생하는 오류(1) 2. 처음 생성시 발생하는 오류(2) 3. 구매하기를 누르면 발생하는 오류 '생성' 버튼을 눌렀을 때 발생하는 오류. 에러 TypeError #0 "Rhymix\Modules\Extravar\Models\Value::__construct(): Argument #1 ($module_srl) must be of type int, null given, called in /Users/eond/PhpstormProjects/imdar/modules/contents/contents.model.php on line 77" in modules/extravar/models/Value.php on line 91 modules/extravar/models/Value.php:91 이 오류는 Value 클래스의 생성자에 null 값이 전달되었을 때 발생하는 타입 에러입니다. module_srl은 정수(int) 타입이어야 하는데, null이 전달되었네요.문제를 해결하기 위해 다음과 같이 코드를 수정해보시는 것을 추천드립니다: contents.model.php // ... existing code ... // line 77 근처 $extra_vars = new Value($module_srl ?? 0); // null 대신 기본값 0 사용 // ... existing code ... 또는 Value 객체를 생성하기 전에 module_srl 값을 확인하는 방법도 있습니다: contents.model.php // ... existing code ... if ($module_srl === null) { $module_srl = 0; // 또는 적절한 기본값 } $extra_vars = new Value($module_srl); // ... existing code ... 이 수정사항은:null 값이 전달되는 것을 방지합니다항상 정수값이 전달되도록 보장합니다TypeError 예외가 발생하는 것을 막아줍니다실제 사용 사례에 따라 0 대신 다른 적절한 기본값을 사용하실 수도 있습니다. 문제 원인 content.model.php:77 $module_srl 이 값이 넘어와야하는데 NULL로넘어오고 있음 해결방법 1. getDefaultListConfig 함수가 실행되는 모든 파일 찾는다. 2. 해당 함수가 실행되기 이전에 exit(); 함수를 실행해서, 어떤 파일에서 오류가 발생하는지 찾는다. contents.admin.view.php:289 $oContentsModel = getModel('contents'); Context::set('extra_vars', $oContentsModel->getDefaultListConfig($this->module_info->module_srl)); 여기서 $this->module_info->module_srl 값을 불러오지 못하는 문제가 있음. 제안 // module_srl이 없는 경우 새로운 콘텐츠판 등록 상태이므로 module_srl = 0으로 설정 $module_srl = $this->module_info->module_srl ? $this->module_info->module_srl : 0; Context::set('extra_vars', $oContentsModel->getDefaultListConfig($module_srl)); (2) 1번 문제 해결 후 발생한 오류. TypeError #0 "Rhymix\Modules\Extravar\Models\Value::__construct(): Argument #1 ($module_srl) must be of type int, null given, called in /Users/eond/PhpstormProjects/imdar/modules/contents/contents.model.php on line 67" in modules/extravar/models/Value.php on line 91 contents.model.php:64 문제(1)에서처럼 신규 생성 시 $module_srl 값이 NULL 이므로, NULL일때 $module_srl = 0; 으로 지정함. 문제3. 구매하기를 누르면 위 에러가 나오는데 확인한번 부탁드리겠습니다~ TypeError #0 "count(): Argument #1 ($value) must be of type Countable|array, null given" in modules/contents/contents.controller.php on line 982 해당 문제는 업로드가 됐으나 제대로 해당 문서에 연결이 되지 않는 문제 확인됨. 재업로드를 통해 일단 해당 문제는 해결됐으나 원래 오류는 파악 안됨 문제4. 구매하기를 누르면 발생하는 오류 AJAX communication error while requesting contents.procContentsPurchase 200 parsrerror (parsererror) array(1){ [0]=> object(stdClass)#597 (23){ ["file_srl"]=> int(472907) ...계속
이온디
이온디 1년 전
발생한 에러 Error #0 "Call to a member function get() on null" in layouts/el_basic2/layout.html on line 770 기존코드 {@ $args = new stdClass(); $args->order_type = "asc"; $args->list… 발생한 에러 Error #0 "Call to a member function get() on null" in layouts/el_basic2/layout.html on line 770 기존코드 {@ $args = new stdClass(); $args->order_type = "asc"; $args->list_count = 5; $args->member_srl = $logged_info->member_srl; $oDocumentModel = &getModel('document'); $output = $oDocumentModel->getDocumentList($args); } <ul cond="$output->data"> <li loop="$output->data=>$key,$val"> <a href="{getUrl('', 'mid', $val->get('module_srl'), 'document_srl', $val->get('document_srl'))}"> <span class="title">{$val->get('title')?$val->get('title'):$oDocument->get('title')}</span> <span class="date">{$val->get('regdate')?zDate($val->get('regdate'), "Y-m-d"):zDate($oDocument->get('regdate'), "Y-m-d")}</span> </a> </li> </ul> 변경된 코드 {@ $args = new stdClass(); $args->order_type = "asc"; $args->list_count = 5; $args->member_srl = $logged_info->member_srl; $oDocumentModel = &getModel('document'); $output = $oDocumentModel->getDocumentList($args); } <ul cond="$output && $output->data"> <li loop="$output->data=>$key,$val" cond="$val"> {@ $oDocument = $oDocumentModel->getDocument($val->get('document_srl')); } <a href="{getUrl('', 'mid', $val->get('module_srl'), 'document_srl', $val->get('document_srl'))}"> <span class="title">{$val->get('title') ?: ($oDocument ? $oDocument->get('title') : '제목 없음')}</span> <span class="date">{$val->get('regdate') ? zDate($val->get('regdate'), "Y-m-d") : ($oDocument ? zDate($oDocument->get('regdate'), "Y-m-d") : '')}</span> </a> </li> </ul> 문제 원인 $oDocument 변수가 정의되지 않음 $oDocument->get('title')을 사용하려면 $oDocument 변수가 정의되어 있어야 함. 해결 방법 $oDocument 변수를 할당하는 코드가 없으므로 getDocument($val->get('document_srl'))로 가져와야 함. $oDocument = $oDocumentModel->getDocument($val->get('document_srl')); 또는 oDocument 부분을 제거하고 $val->get('title')만 사용. 수정 사항 요약 $output->data가 null인지 확인 (cond="$output && $output->data")loop 내부에서 $val이 null인지 확인 (cond="$val")$oDocument 변수를 getDocument()로 가져옴null 체크 후 기본값 설정 ('제목 없음' 추가)
이온디
이온디 1년 전
[code] <div class="search-wrap"> <form cond="$grant->view" action="{getUrl()}" method="get" onsubmit="return procFilter(this, search)" no-error-return-url="true"> <input type="hidden" name="vid" value="{$vid}" /> <input type="hidden" name="mid" value="{$mid}"… [code] <div class="search-wrap"> <form cond="$grant->view" action="{getUrl()}" method="get" onsubmit="return procFilter(this, search)" no-error-return-url="true"> <input type="hidden" name="vid" value="{$vid}" /> <input type="hidden" name="mid" value="{$mid}" /> <input type="hidden" name="category" value="{$category}" /> <select name="search_target"> @foreach($search_option as $key => $val) @switch($val) @case("제목") {{ $val = "페트이름" }} @break @case("내용") {{ $val = "페트설명" }} @break @default {{ $val = "페트이름+페트설명" }} @endswitch @if(in_array($key, ['title_content', 'title', 'content'])) <option value="{$key}" selected="selected"|cond="$search_target==$key">{$val}</option> @endif @endforeach </select> <input type="text" name="search_keyword" value="{escape($search_keyword, false)}" title="{$lang->cmd_search}" placeholder="검색어를 입력하세요" /> <button type="submit" class="hide" onclick="xGetElementById('board_search').submit();return false;">{$lang->cmd_search}</button> @if($last_division) <a href="{getUrl('page',1,'document_srl','','division',$last_division,'last_division','')}" class="btn">{$lang->cmd_search_next}</a> @endif </form> <!--<form action=""> <select name="search_target"> <option loop="$search_option=>$key,$val" value="{$key}" selected="selected"|cond="$search_target==$key">{$val}</option> </select> <input type="text" placeholder="검색어"> <button type="submit">검색</button> </form>--> </div> [css] .search-wrap{ display: flex; align-items: center; justify-content: flex-end; form{ display: flex; gap: 5px; max-width: 400px; width: 100%; select, input, button{ height: 40px; font-size: 14px; border-radius: 5px; border: 1px solid #dedede; padding: 0 5px; box-sizing: border-box; max-width: 135px; } input[type='text']{ flex: auto; max-width: 100%; } button[type='submit']{ background-color: #0c1c2e; border-color: #0c1c2e; color: #fff; width: 80px; font-weight: bold; } } }
이온디
이온디 1년 전
TypeError #0 "count(): Argument #1 ($value) must be of type Countable|array, null given" in modules/contents/contents.controller.php on line 982 포인트충전 스킨 레이아웃 미적용 현상 TypeError #0 "Rhymix\Modules\Extravar\Models\Value::__construct(): Argument #1 ($module_srl) must be of type … TypeError #0 "count(): Argument #1 ($value) must be of type Countable|array, null given" in modules/contents/contents.controller.php on line 982 포인트충전 스킨 레이아웃 미적용 현상 TypeError #0 "Rhymix\Modules\Extravar\Models\Value::__construct(): Argument #1 ($module_srl) must be of type int, null given, called in /Users/eond/PhpstormProjects/rx/modules/contents/contents.model.php on line 77" in modules/extravar/models/Value.php on line 72 #버그 #버그대잔치 참조 https://xetown.com/thirdparties/191983#comment_1857544 https://eond.com/xemarket/dispContentsAdminGrantInfo http://localhost/rx/index.php?module=admin&act=dispContentsAdminInsertContents
이온디
이온디 1년 전
오류내용 1. Error #0 "Attempt to assign property "member_menu_name" on null" in modules/pointhistory/pointhistory.class.php on line 199 객체를 먼저 선언하지 않고 속성을 추가하려 하고 있습니다. 오래된 자료에서 종종 사용하던 코딩 방식이나 최근 PHP에서는 허용되지 않으니, 에러 메시지에 포함된 파일명과 줄 번호를 참고하여 수정하세요. modules/pointhistory/pointhistory… 오류내용 1. Error #0 "Attempt to assign property "member_menu_name" on null" in modules/pointhistory/pointhistory.class.php on line 199 객체를 먼저 선언하지 않고 속성을 추가하려 하고 있습니다. 오래된 자료에서 종종 사용하던 코딩 방식이나 최근 PHP에서는 허용되지 않으니, 에러 메시지에 포함된 파일명과 줄 번호를 참고하여 수정하세요. modules/pointhistory/pointhistory.class.php:199 수정방법 $config = getModel('module')->getModuleConfig('pointhistory'); if (!$config) $config = new stdClass();설명 pointhistory.class.php 199라인 윗쪽에 if(!$config) $config = new stdClass() 부분을 추가해주시면 됩니다. 전체를 새로 다운받기 위해서는 아래 자료를 다운받아주세요. https://github.com/Waterticket/rx-module-pointhistory https://github.com/Waterticket/rx-module-pointhistory">https://github.com/Waterticket/rx-module-pointhistory
한취센 1년 전
자립준비청년 디지털진로지원 취업실전캠프 자립준비청년을 대상으로 진로 설계, 직무 교육, 인턴십 연계를 통한 자립 역량 강화 지원을 목적으로 과학기술정보통신부가 주최, 정보통신산업진흥원이 주관하여 한국디지털융합진흥원, 강릉과학산업진흥원, 한국취업센터가 운영하는 취업 실전 캠프 및 인턴 연계 사업에 참여할 자립준비청년들을 모집하고 있습니다. <모집내용> - 신청기간: ~2024.10.06(일) 20:00까지 - 모집인원: 최대 30명 (단체 신청 가능) - 캠프일정: 2024.10.14(… 자립준비청년 디지털진로지원 취업실전캠프 자립준비청년을 대상으로 진로 설계, 직무 교육, 인턴십 연계를 통한 자립 역량 강화 지원을 목적으로 과학기술정보통신부가 주최, 정보통신산업진흥원이 주관하여 한국디지털융합진흥원, 강릉과학산업진흥원, 한국취업센터가 운영하는 취업 실전 캠프 및 인턴 연계 사업에 참여할 자립준비청년들을 모집하고 있습니다. <모집내용> - 신청기간: ~2024.10.06(일) 20:00까지 - 모집인원: 최대 30명 (단체 신청 가능) - 캠프일정: 2024.10.14(월)~16(수) / 2박 3일 * 숙소 및 식사, 차비 등 100% 전체 무료 / 캠프 시 취업역량강화 교육 및 인턴기업 공유 진행 - 프로그램: 입사지원서 교육, 면접스킬 훈련 및 스피치 교육, 현직자 네트워킹 및 강릉투어 등 - 캠프장소: 강릉 오죽한옥마을 (개별 숙소 제공, 센터 내 담당자 동행 가능 및 무료) <자격요건 및 혜택> 1) 자격요건: 자립준비청년 (1989년생~2005년생) - 예비 자립준비청년: 아동복지시설 또는 위탁 가정 거주자 (고등학생 미포함) - 자립준비청년: 아동복지시설 또는 위탁 가정에서 퇴소한 자 (청소년 쉼터 입퇴소자 포함) 2) 혜택 - 캠프참여 혜택: 전 과정 무료 - 교통지원: 서울역, 잠실역 경유 셔틀버스 운영 / 지방 거주 교육생 교통비 실비 지원 등 - 인턴십 연계 (참가자 대상 월 최대 250만원 2개월 지급 등) <신청하기> - 신청링크: https://www.flagup.kr/page/digital5.php?slide=3 * 사전 신청자가 많은 경우, 조기 종료될 수 있으니 많은 참여바랍니다. <문의하기> - 문의처: 한국취업센터 운영본부 - 메일: info@k-jobc.co.kr - 연락처: 02-6956-5981, 02-6956-5980 - 카카오톡: https://open.kakao.com/o/sHWbvBFd
이온디
이온디 1년 전
서버 오류Error #0 "Using $this when not in object context" in modules/nproduct/nproduct.item.php on line 94 modules/nproduct/nproduct.item.php:94 서버 오류Error #0 "Using $this when not in object context" in modules/nproduct/nproduct.item.php on line 94 modules/nproduct/nproduct.item.php:94
이온디
이온디 1년 전
서버 오류Error #0 "Non-static method nproductItem::printPrice() cannot be called statically" in modules/ncart/skins/nutri/ordercomplete.html on line 30 modules/ncart/skins/nutri/ordercomplete.html:30 서버 오류Error #0 "Non-static method nproductItem::printPrice() cannot be called statically" in modules/ncart/skins/nutri/ordercomplete.html on line 30 modules/ncart/skins/nutri/ordercomplete.html:30
이온디
이온디 1년 전
서버 오류Error #0 "Undefined constant "crop"" in modules/ncart/skins/nutri/reviewform.html on line 68 문자열을 따옴표로 감싸지 않아서 발생하는 오류입니다. 오래된 자료에서 종종 사용하던 문법이나 최근 PHP에서는 허용되지 않으니, 에러 메시지에 포함된 파일명과 줄 번호를 참고하여 수정하세요. modules/ncart/skins/nutri/reviewform.html:68 서버 오류Error #0 "Undefined constant "crop"" in modules/ncart/skins/nutri/reviewform.html on line 68 문자열을 따옴표로 감싸지 않아서 발생하는 오류입니다. 오래된 자료에서 종종 사용하던 문법이나 최근 PHP에서는 허용되지 않으니, 에러 메시지에 포함된 파일명과 줄 번호를 참고하여 수정하세요. modules/ncart/skins/nutri/reviewform.html:68
이온디
이온디 1년 전
Error #0 "Attempt to assign property "zip" on null" in modules/ncart/ncart.controller.php on line 355 객체를 먼저 선언하지 않고 속성을 추가하려 하고 있습니다. 오래된 자료에서 종종 사용하던 코딩 방식이나 최근 PHP에서는 허용되지 않으니, 에러 메시지에 포함된 파일명과 줄 번호를 참고하여 수정하세요. Error #0 "Attempt to assign property "zip" on null" in modules/ncart/ncart.controller.php on line 355 객체를 먼저 선언하지 않고 속성을 추가하려 하고 있습니다. 오래된 자료에서 종종 사용하던 코딩 방식이나 최근 PHP에서는 허용되지 않으니, 에러 메시지에 포함된 파일명과 줄 번호를 참고하여 수정하세요.
이온디
이온디 1년 전
서버 오류Error #0 "Non-static method nproductItem::formatMoney() cannot be called statically" in modules/ncart/skins/nutri/orderitems.html on line 183 modules/ncart/skins/nutri/orderitems.html:183 서버 오류Error #0 "Non-static method nproductItem::formatMoney() cannot be called statically" in modules/ncart/skins/nutri/orderitems.html on line 183 modules/ncart/skins/nutri/orderitems.html:183
이온디
이온디 1년 전
TypeError #0 "Rhymix\Framework\Mail::setFrom(): Argument #1 ($email) must be of type string, null given, called in /home/eond/web/shop.eond.com/public_html/modules/advanced_mailer/advanced_mailer.controller.php on line 35" in modules/advanced_mailer/advanced_mailer.controller.php… TypeError #0 "Rhymix\Framework\Mail::setFrom(): Argument #1 ($email) must be of type string, null given, called in /home/eond/web/shop.eond.com/public_html/modules/advanced_mailer/advanced_mailer.controller.php on line 35" in modules/advanced_mailer/advanced_mailer.controller.php on line 35 (via common/framework/Mail.php on line 129)