Extra Form
PHP PHP 7.0
CMS Rhymix 2.0

https://xetown.com/questions/658703 

일전에 외부페이지에서 include 하는 질문을 남기고 답변을 얻었습니다.

 

기존에는 외부페이지내에서 include를 했을때 해당 include 파일에서 조건문이 실행이 되었었습니다.

그런데 어느순간 <span cond="Mobile::isMobileCheckByAgent()"> 이런 조건문이 실행이 안된다는 걸 알았습니다.

 

제작하는 홈페이지에서 외부페이지로 문서를 만드는데, 간혹 외부페이지마다 동일한 내용이 들어가는 경우에 별도로 특정파일을 만들어 놓고 include 해서 사용하는데 해당 문서에 조건문을 사용하는 경우가 있습니다.

 

그런데 그 조건문이 먹히질 않네요.

혹시 이 문제를 해결 할 수 있는 방법이 없을가요?

 

외부문서에서  다른 문서 include는 되는데 다른문서에 작성된 조건문이 실행이 안되는 상황입니다.

 

 

 

  • profile
    cond="Mobile::isMobileCheckByAgent()" 는 모든 html에서 가능한게 아니라 XE 또는 라이믹스의 템플릿 핸들러에서만 처리가 가능합니다.

    따라서 XE가 실행된상태에서 html 파일을 템플릿에서 처리 해줘야 정상적으로 동작합니다.

    어떤 부분에서 어떻게 인클루드 시켰는지 코드를 확인하지 못하면 도움이 어려울 수 있겟습니다.

    한가지 팁을 드리자면.. html 을 인클루드 할 예정이라면 그냥 스킨 또는 레이아웃스킨에서 html 파일에 적절한 위치에 <include taget="~~~~경로" /> 하는게 XE에서는 정석입니다.
  • profile ?
    네..레이아웃에선 <include taget="~~~~경로" /> 이코드가 먹히는데 외부페이지 내에선 해당코드가 먹히질 않아
    <?php include(_XE_PATH_.'/문서경로')?> 이 코드를 사용하고 있습니다.
  • profile
    몇 달 전 보안패치로 외부페이지 내 템플릿 문법 사용이 제한되었습니다. 안전한 문법이라고 확신하신다면 해당 페이지 설정에서 템플릿 문법 해석 기능을 켜보세요.
  • profile ?
    네.템플릿 문법 해석은 켜져 있습니다.
    외부문서에선 해석이되는데 외부문서에서 include한 문서에 조건문같은게들어 가면 인식을 안해서.
  • ?
    외부문서에서 include한 문서에 아래와 같이 php문, 템플릿코드, 위젯코드를 실행시켜 보았습니다.
    로그인 전, 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문은 작동을 해서 코드는 변경해서 사용중입니다.
  • ? profile
    <!--@if($logged_info)-->
    로그인
    <!--@else-->
    로그인전
    <!--@end-->

    결과 : 로그인 로그인전

    이건 당연할 수 있습니다.

    $logged_info 는 빈값일때 stdClass를 반환시킬 수 있는데 해당 값은 빈값이더라도 ($logged_info) == true 가 되거든요.

    그렇기 때문에 로그인 채크에는
    Context::get('is_logged') 를 써서 채크 하는게 맞습니다.
  • profile profile

    템플릿 문법이 작동하지 않아서, if문과 상관없이 "로그인 로그인전"이 출력되었다는 말씀이 아닐까요?

    <!--@if($logged_info)-->, <!--@else--> 같은 것이 php의 if문이 아니라 html 주석으로 그냥 출력이 되어버렸다는 것 같습니다

     

    템플릿 문법이 작동되었다면 $logged_info 값과 상관없이 "로그인" 혹은 "로그인전"만 출력이 되었을테고요

  • profile profile
    아 그럴 수 있겠네요.

    어쨌던.. 로그인채크할때엔 $logged_info 는 쓰지 않는게 좋습니다 :)

    결국은 외부페이지 로딩 방식을 어떻게 하셨느냐에 따라 템플릿이 재대로 실행안된것으로 보여지네요..
  • profile ?
    네..맞습니다. 템플릿 문법이 작동하지 않는다는 의미입니다.
  • profile ?

    답변 감사합니다. 말씀하신것처럼 $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에서도 템플릿 문법이 적용되었습니다. 

  • ? profile
    외부페이지의 경우 그냥 mid에 따라 레이아웃에서 처리하는게 어떨까 싶은데요.

    위젯 페이지 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 와 같은 항목은 아에 쓰지 마세요.
  • profile ?

    와...진짜 바보짓 했네요..ㅠ.ㅠ
    답변 감사합니다. 마지막 문구 <?php 사용하지 말라는 댓글 보고 외부페이지에 include 문을 변경 하고 해결했습니다.
    이전에 외부페이지에서 inclue 문이 먹히질 않다보니 계속 inlude 문을 <?php로 시작하는 형태로 해서 그렇네요.

    a.html 파일에서 include 할때 <include target 형태로 변경하니 b.html에서도 템플릿 문법이 작동합니다. ㅡㅡ;;
    눈에 뭐가 씌였는지...ㅡㅡ;;;
    처음 댓글부터 그렇게 답변을 주셨는데 머리에 선입견이 박혀 이전 경험으로 안된다고만 생각을 하고 자꾸 엉둥한데서 답을 찾으려고 했나 봅니다.

    참고 오랫동안 답변 주셔서 감사합니다. 아..반성하게 되는 하루네요.