XE 게시판 스킨에서 <?php function ... 구문을  사용하는 방법

게시판스킨에서 내가 만든 사용자 함수 사용하기 class myskin_function 라는 글을 참조했습니다.

(이 글에서는 2가지 방법을 소개해드립니다. 첫번째 방법은 위 글에서 설명한 방법이고, 두번째 방법은 간단하게 아랫쪽에 적어두었습니다.)


1. 게시판 스킨 list.html 상단에 function.html 파일을 삽입한다.

(list.html 파일의 경로 : ./modules/board/skins/eb_itssa/list.html )

<include target="assets/inc/function.html" />


2.function.html 내용

{@
$XE_version = __ZBXE_VERSION__;
if(!$XE_version)  $XE_version = __XE_VERSION__;

$var_version = $mi->skin." Skin V4.1.0(".$XE_version."+".phpversion().")";

$linkpath = getUrl('mid',$mid,'pGanjioption',1,'offset',$offset,'pOption',$pOption,'listStyle',$listStyle,'pYear','','pMonth','','pDay','');
$skinpath = $tpl_path;// 스킨 설치 경로지정
$XE_path = getUrl('');
$obj=null;// 클리어 쿼리검색 object
$arr_plan=null;// 전역변수 처럼 작용되어 위젯, 스킨 모두에서 클리어함)

// 해당스킨에 function 디렉토리를 만들고 스킨에서 사용할 공통으로 사용하는 추가 함수 부분 -
if(!class_exists('myskin_function')) : //  사용자 펑션이 있는지 체크
require_once($skinpath.'class.myskin_function.php');
endif;
}

위 파일에서 class.myskin_function.php 파일을 불러오게 됩니다.

function.html 파일의 경로 : ./modules/board/skins/eb_itssa/assets/inc/function.html

class.myskin_function.php 파일의 경로 : ./modules/board/skins/eb_itssa/assets/inc/class.myskin_function.php

(참고로, 참조한 문서에서는 function/ 이라는 디렉토리 안에 넣었는데 저는 assets/inc/ 안에 2개의 파일 모두 넣어놓았습니다. 그래서 참조문서와는 require_once 부분의 경로가 조금 다릅니다.)


3. class.myskin_function.php 내용

<?php
class myskin_function extends BaseObject {
  /**
   * @function:  fn_youtube_install_extra_keys($module_srl)
   * @return: array
   * @brief:회원 확장변수 폼형식 불러오기 C.m.A.
   **/
  function fn_member_extra_form($member_info) {//
    $oMemberModel = &getModel('member');
    $oMemberModel = getModel('member');
    $member_info = get_object_vars($member_info);
    $arr = $oMemberModel->getCombineJoinForm($member_info);
    return $arr;
  }

  function fn_my_function1($str) {
//    ~~~어쩌구 저쩌구 내가 만들 함수들~~~
        return $tag;
    }

  function fn_my_function2($str) {
//    ~~~어쩌구 저쩌구 내가 만들 함수들~~~
        return $tag;
    }
  function sum($arg1, $arg2){
    echo $arg1 + $arg2;
  }
} // end of class

?>

간단하게 function sum 이라는 함수를 추가해봤습니다. 


4. list.html 에서의 사용방법

참조한 문서에서는 

{myskin_function::sum(6,4)}

이렇게 사용한다고 되어있는데 저렇게 작성하면 아래 오류가 뜹니다.


 Error #0 "Non-static method myskin_function::sum() cannot be called statically" in D:\Wnmp\nginx-bins\default\www\rx\files\cache\template\modules\board\skins\eb_itssa\list.html.php on line 73
D:\Wnmp\nginx-bins\default\www\rx\common\framework\debug.php:681

이 오류는 다음 글에서 수정 방법이 나와있습니다.

https://blog.wplauncher.com/non-static-method-should-not-be-called-statically/


1-1) 잘못 작성한 예

$subscribers = ServiceClass::getSubscribers();

1-2) 올바른 작성방법

$service = new ServiceClass();
$subscribers = $service->getSubscribers();


위 글에서 알려준 수정방법을 따르면 아래와 같이 수정하면 됩니다.


2-1) 잘못 작성한 방법, 수정 전

{myskin_function::sum(6,4)}

2-2) 올바른 작성방법, 수정 후

{@
$service = new myskin_function();
$sum = $service->sum(6,4);
}
{$sum}




질문1. list.html에서 바로 <?php ... ?> 를 사용할 수는 없을까요? 왜 복잡하게 function.html 파일과 class.myskin_function.php 파일을 별도로 작성한 걸까요?

바로 list.html 파일에서 제가 원하는 반복되는 글 출력 부분에 일반적인 <?php function sum()... ?> 코드를 작성하게 되면 아래와 같은 오류가 뜹니다.


 PHP Fatal Error: Cannot redeclare fu_price_format() (previously declared in D:\Wnmp\nginx-bins\default\www\rx\files\cache\template\modules\board\skins\eb_itssa\list.html.php:75) in D:\Wnmp\nginx-bins\default\www\rx\files\cache\template\modules\board\skins\eb_itssa\list.html.php on line 75 D:\Wnmp\nginx-bins\default\www\rx\common\framework\debug.php:681

위 오류는 

https://blog.edit.kr/entry/Fatal-error-Cannot-redeclare-%EB%A9%94%EC%84%9C%EB%93%9C%EB%AA%85-previously-declare%EC%9D%98-%ED%95%B4%EA%B2%B0%EB%B0%A9%EB%B2%95

이 글에서보면 중복으로 function fu_price_format()을 호출해서라는데, 아마 제가 잘못 작성해서겠죠?;;

list에서 글이 반복되는데 저 함수를 호출해서 그럴 겁니다;;


# 첫번째 방법





# 두번째 방법

반대로 list.html 에서 php 구문을 그대로 사용하는 방법은 아래와 같습니다.

<?php
function fu_price_format($price)
{
    if($price>=10000)
{
$man = $price/10000;
$man = round($man,1);
$result = $man."만";
}

else{
$result=$price;
}



return $result;
}
?>


그리고 조회수를 출력하는 부분에서 

<?=fu_price_format($__Context->document->get('readed_count'))?>

이렇게 적어주시면 됩니다.



 
댓글은 로그인 사용자만 작성 가능합니다. 로그인하기