외부페이지에서 조건문 실행
CMS/프레임워크 | Rhymix 2.0 |
---|---|
개발 언어 | PHP 7.0 |
https://xetown.com/questions/658703
일전에 외부페이지에서 include 하는 질문을 남기고 답변을 얻었습니다.
기존에는 외부페이지내에서 include를 했을때 해당 include 파일에서 조건문이 실행이 되었었습니다.
그런데 어느순간 <span cond="Mobile::isMobileCheckByAgent()"> 이런 조건문이 실행이 안된다는 걸 알았습니다.
제작하는 홈페이지에서 외부페이지로 문서를 만드는데, 간혹 외부페이지마다 동일한 내용이 들어가는 경우에 별도로 특정파일을 만들어 놓고 include 해서 사용하는데 해당 문서에 조건문을 사용하는 경우가 있습니다.
그런데 그 조건문이 먹히질 않네요.
혹시 이 문제를 해결 할 수 있는 방법이 없을가요?
외부문서에서 다른 문서 include는 되는데 다른문서에 작성된 조건문이 실행이 안되는 상황입니다.
똑띠
Lv. 6
댓글 12
따라서 XE가 실행된상태에서 html 파일을 템플릿에서 처리 해줘야 정상적으로 동작합니다.
어떤 부분에서 어떻게 인클루드 시켰는지 코드를 확인하지 못하면 도움이 어려울 수 있겟습니다.
한가지 팁을 드리자면.. html 을 인클루드 할 예정이라면 그냥 스킨 또는 레이아웃스킨에서 html 파일에 적절한 위치에 <include taget="~~~~경로" /> 하는게 XE에서는 정석입니다.
<?php include(_XE_PATH_.'/문서경로')?> 이 코드를 사용하고 있습니다.
외부문서에선 해석이되는데 외부문서에서 include한 문서에 조건문같은게들어 가면 인식을 안해서.
로그인 전, PC환경
<?
if($logged_info){
echo "로그인 ";
}else{
echo "로그인전 ";
}
?>
결과 : 로그인전
<?
if(!Mobile::isMobileCheckByAgent()){
echo " pc ";
}
?>
결과 : pc
<!--@if($logged_info)-->
로그인
<!--@else-->
로그인전
<!--@end-->
결과 : 로그인 로그인전
<img class="zbxe_widget_output" widget="jdh_banner" widget_cache="10" skin="mobileSlider" module_srls="154" thumbnail_type="ratio"
shuffling="false" mouseoverstop="true" thumbnail_width="300" thumbnail_height="195" shown_image_num="1" flowing_images_num="11" controls="auto"
sliding_effect="easeInOutQuad" mouse_wheel="true" border_color="transparent" title_visibility="true" title_length="100" title_color="transparent" />
결과 : 위젯코드 정상 작동
--------------
php문은 작동을 하는데 템플릿문법이 해석이 안되는것 같네요.
그런데 위젯코드는 또 작동을 합니다.
Rhymix 2.0.22 버전에서 테스트 한것입니다.
php문은 작동을 해서 코드는 변경해서 사용중입니다.
로그인
<!--@else-->
로그인전
<!--@end-->
결과 : 로그인 로그인전
이건 당연할 수 있습니다.
$logged_info 는 빈값일때 stdClass를 반환시킬 수 있는데 해당 값은 빈값이더라도 ($logged_info) == true 가 되거든요.
그렇기 때문에 로그인 채크에는
Context::get('is_logged') 를 써서 채크 하는게 맞습니다.
템플릿 문법이 작동하지 않아서, if문과 상관없이 "로그인 로그인전"이 출력되었다는 말씀이 아닐까요?
<!--@if($logged_info)-->, <!--@else--> 같은 것이 php의 if문이 아니라 html 주석으로 그냥 출력이 되어버렸다는 것 같습니다
템플릿 문법이 작동되었다면 $logged_info 값과 상관없이 "로그인" 혹은 "로그인전"만 출력이 되었을테고요
어쨌던.. 로그인채크할때엔 $logged_info 는 쓰지 않는게 좋습니다 :)
결국은 외부페이지 로딩 방식을 어떻게 하셨느냐에 따라 템플릿이 재대로 실행안된것으로 보여지네요..
답변 감사합니다. 말씀하신것처럼 $logged_info는 따로 사용은 하지 않고 그냥 체크용으로 찍어본거라..
{@$a='체크'}
<!--@if($a=='체크')-->
체크성공
<!--@else-->
체크실패
<!--@end-->
이런식으로 찍어봐도 동일하게 템플릿 문법이 작동을 하지 않고 체크성공 체크실패 이런식으로 모두 출력이 됩니다.
외부문서는 별다른 내용이 없습니다.
예를들어 외부문서 하나를 만들고 a.html 이란 파일을 외부문서에서 불러옵니다.
http://도메인주소/atest // 외부페이지 mid값 atest
a. html 파일엔 <?php include(_XE_PATH_.'/newpage/b.html')?> 이 코드를 넣어서 b.html 파일을 불러옵니다.
b.html 파일엔 단순히
{@$a='체크'}
<!--@if($a=='체크')-->
체크성공
<!--@else-->
체크실패
<!--@end-->
이 코드값으로 체크를 해 봅니다.
a.html 파일과 b.html 파일은 동일하게 newpage 폴더에 위치하고 있습니다.
a.html 파일에선
{@$a='체크'}
<!--@if($a=='체크')-->
체크성공
<!--@else-->
체크실패
<!--@end-->
이 코드를 넣어서 테스트 하면 템플릿 문법이 적용됩니다. 체크성공만 찍히죠.
그런데 a.html에서 불러오는 b.html 파일에선 템플릿 문법이 적용이 안된다는 뜻입니다.
아..참고로 이전에는 b.html에서도 템플릿 문법이 적용되었습니다.
위젯 페이지 abcd
이렇게 해버리고
layouts/name/layout.html 에서
<!--@if($mid == 'A')-->
<include target="a.html" />
<!--@elseif($mid == 'B')-->
<include target="a.html" />
...
<!--@end-->
이런식으로 하는게 훨신 더 나을것 같네요.
어차피 보안적인 부분때문에 외부 문서는 차단될 가능성도 있고.. 저희가 옵션을 풀어드리긴 했지만, 결과적으로 템플릿 언어가 굳이 필요한 상황이라면 외부 문서 기능을 안쓰고도 똑같이 구현이 가능하거든요.
적절하게 {$content} 가 나오는 부분에 적절하게 로딩될 수 있도록 하고, 거기 안에서 필요한 템플릿 언어를 맘껏 쓰시는건 어떨까요?
그렇게 하면
a.html 안에 추가적으로 몇개 더 include 시키더라도 문제 없거든요.
그리고 템플릿 html 파일에서 include 할때에는 <include target="a.html" /> 를 쓰시고, <?php 와 같은 항목은 아에 쓰지 마세요.
와...진짜 바보짓 했네요..ㅠ.ㅠ
답변 감사합니다. 마지막 문구 <?php 사용하지 말라는 댓글 보고 외부페이지에 include 문을 변경 하고 해결했습니다.
이전에 외부페이지에서 inclue 문이 먹히질 않다보니 계속 inlude 문을 <?php로 시작하는 형태로 해서 그렇네요.
a.html 파일에서 include 할때 <include target 형태로 변경하니 b.html에서도 템플릿 문법이 작동합니다. ㅡㅡ;;
눈에 뭐가 씌였는지...ㅡㅡ;;;
처음 댓글부터 그렇게 답변을 주셨는데 머리에 선입견이 박혀 이전 경험으로 안된다고만 생각을 하고 자꾸 엉둥한데서 답을 찾으려고 했나 봅니다.
참고 오랫동안 답변 주셔서 감사합니다. 아..반성하게 되는 하루네요.