Q&A

게시판 $oDocument->getContent 아래 위에 php 코드 삽입하기

2023.09.13 09:03
134
0
CMS/프레임워크 Rhymix 2.1
개발 언어 PHP 7.4

여기 윗줄

{$oDocument->getContent(~~~~
여기 아랫줄

 

 

여기에 애드온에서 php 코드를 추가하려고 합니다.

 

str_replace를 써서 추가 해봤는데

str_replace를 쓰기엔 이미 php 가 처리된 직후라서 의미가 없네요.

 

애드온에서 저부분에 코드를 추가하는 방법이 있을까요?

 

감사합니다.

톰캣 Lv. 11
시대의 흐름에 뒤떨어지지 않도록 아주 천천히지만 노력하고 있습니다.

댓글 15

  • 2023.09.13 10:08 #1785103
    애드온에서 실행한다음 수정된 값을 따로 불러들여서 보여주면 안되나요?
  • 2023.09.13 10:29 #1785106
    if 문으로 예가 눌러졌을땐 {$oDocument->getContent(fa~~
    else로 구분을 해놓아버려서요.
  • 2023.09.13 13:13 #1785134

    애드온에서

    if($~~~)
    {
    $DocumentContent = $oDocument->getContent(false);
    }
    else
    {
    $DocumentContent = $oDocument->getContent();
    }

    Context::set('DocumentContent', $DocumentContent);

    템플릿에서

    <!--@if($DocumentContent)-->
    {$DocumentContent}
    <!--@else-->
    원래코드
    <!--@end-->

    일케 하면 안되나요?

     

    이렇게 하라고 말씀드린거라..ㅠ;

  • 2023.09.13 14:16 #1785149
    답변감사합니다

    <!--@if($DocumentContent)-->
    {$DocumentContent}
    <!--@else-->
    원래코드
    <!--@end-->

    애드온에서 이 작업을 하고싶은건데
    사용자들이 게시판 글읽기스킨코드를 수정하는거면 애드온의 의미가 없을것 같아요ㅜㅜ
  • 2023.09.13 15:11 #1785157

    애매하게 말씀하지말고 어떤애드온인지 어떻게 만들건데 어떤 페이지에서 어떤 조건일때 어떻게 하고 싶다. 이걸 설명해주세요..

    질문 자꾸 애매하게 하시니.. 뭐 그 애매한 것에서 방법을 간구 해서 드리는건데.. 이것도 아니고 저것도 아니라 하시면.. 답변만 길어지니까 최대한 제가 공지사항에도 적어드린게 진짜 그냥 아이디어 다 내놓더라도 정확하게 알 수 잇도록 설명 해달라는거예요..

     

    애초에 스킨에서 저렇게 조건이 필요한경우 애드온에서 님이 원하는 조건대로 if문만 잘 만들어두면 똑같이 동작하는 코드일껏 같아요..; 다른게시판 영향도 안갈거고요..

  • 2023.09.14 00:26 #1785192

    아래글의 연장선이며

    https://xetown.com/questions/1785020

     

    코드라고해도 별게 없습니다.
    다만 이 코드가 게시판 글읽기에 들어가야한다는 점입니다.

     

    제가 혼자쓰는거면 그냥 이대로 써도되지만 애드온을 만들어 배포하려면 글읽기 스킨을 수정할수 없으니

    애드온으로 글읽기페이지 코드를 고치지 않고 만들어주고싶은 상황입니다.

    아래글에 달아주신 첨부 갯수는 애드온에서 잘작동확인하여 이것과 잘 조합하여쓰려고하고있습니다.

    <!--@if (isset($_POST['confirm_over_data']) && $_POST['confirm_over_data'] == '예')-->
        {$oDocument->getContent(false)}
    <!--@else-->

        <div id="data_usage_warning">
        <p>데이터 경고 안내문</p>
        <p>그래도 열람 하시겠습니까?</p>
        <div class="data_btn_container">
        <form method="post">
        <button type="submit" name="confirm_over_data" value="예" class="yes_btn">예</button>
        </form>
        <a href="이전페이지의URL"><button class="no_btn">아니요</button></a>
        </div>
        </div>
    <!--@end-->

  • 2023.09.14 05:33 #1785317

    이래서 정확하게 예시 말하라는겁니다.

    님이 원하시는 부분 (replace부분만)만 구현한겁니다.

     

    게시글 읽기 항목일때 내용을 바꾸게 되는건데 저기에 HTML 태그 들어가게 하거나 아니면 원문 들어가게 하면 됩니다.

     

    원문 들어갈때 제가 그냥 $matchs[6] 이걸로 리턴 시키도록 해놧을텐데 이거 쓰지마시고 $oDocument 를 Context::get() 함수로 가져와서 $oDocument->getContent(false); 을 그냥 리턴 시키면 됩니다. (그냥 리턴만 시키고 뭐 하면 마지막에 내용 빈것으로만 나오기에 구현에 주의하시기  바랍니다.)

     

    라이믹스 기준으로 동작하고, 해당 코드 사용시 GPL v2 라이선스 필요합니다.

     

    코드 설명 대략적으로 해드리면 글 읽기항목에 <div class="document_문서번호_맴버번호"></div> 이런 기준으로 태그가 들어가는데 그 태그 안에 보통 내용이 들어가게 됩니다. 그 내용을 그냥 callback 함수를 이용해서 바꿔치기 시키는 겁니다.

     

    그 바꿔치기는 그 회원 확장 정보 출력 애드온에서 가져왔어요.

     

    옵션은 귀찮아서 그냥 위 애드온꺼를 그냥 쭉 긁어왔으니.. 잘 조물 조물 해보세요.

     

    아래 구현한 게시글내용대로 버튼 달아보고 그 값을 받아 넘겼을때 정확하게 폼제출한대로 주소창 변경하게 만들면 구현 난이도는 쉬울겁니다.

     

    test.zip

  • 2023.09.14 08:58 #1785448
    https://xetown.com/download/1785441
    람보님 덕분에 완성된 애드온으로 공개할 수 있게 되었습니다.

    감사합니다.
  • 2023.09.14 05:54 #1785328
    아 참.. 위 애드온 사용시.. 제가 $output이라고 callback함수쪽이랑 그 아래 if문 안에도 선언 햇을텐데 그걸 $output 말고 다른 단어로 사용하시는걸 추천드립니다.
  • 2023.09.14 06:39 #1785336
    감사합니다 성공했습니다.

    output 이걸 다른걸로 바꾸니 안되는것같은데

    조금 더 연구해서 공개해보겠습니다.
    거의 밥을 입에다 떠다 넣어주셨네요 ㅠㅠ 항상 감사드립니다. 람보님
  • 2023.09.14 06:41 #1785343
    이럴때! 답변주시는 방법은

    $output 이라는 코드를 바꿧는데 그 바꾼 부분에 있는 위아래 2줄씩 같이 드래그 복사 해서 남기세요.
    그래야 ㅋㅋㅋ 보고 답변을 하죠..ㅋㅋㅋㅋ 어디부분 수정한지 모르니까 그런 상황을 최대한 알려주세요 ㅋㅋ
  • 2023.09.14 06:48 #1785346

    if($called_position != "before_display_content" || Context::get('act') == 'dispPageAdminContentModify' || Context::getResponseMethod() != 'HTML' || isCrawler())
    {
        return;
    }

    require_once __DIR__ . '/test.lib.php';

    $temp_output = preg_replace_callback('!<(div)([^\>]*)document_([0-9]+)_([0-9]+)([^\>]*)>(.*?)\<\/(div)\>!is', 'replaceFunction', $output22);
    if($temp_output)
    {
        $output22 = $temp_output;
    }
    unset($temp_output);


    로 바꿨습니다!! 

     

    이렇게 다른 용어로 바꾸면 본문이 바로 떠버립니다!

     

     

    아무리 봐도 output 이부분은 다른걸로 바꾸면 안될것같은데 ㅠㅠ

  • 2023.09.14 07:06 #1785361
    넵 바꾸면 안될것 같네요 다시 생각해보니

    일반적으로 $output 변수자체가 애드온에서 동작하기로는 다음 애드온 실행때까지 그 변수를 활용할수있도록 구현되는 방식이라... 중복되지 않도록 처리하는건데.. 그게 바뀌면 안될 수 있겠네요
  • 2023.09.14 07:07 #1785364

     

    <!--BeforeDocument()-->
    <!--BeforeDocument()-->

    이거랑

    <!--AfterDocument()-->

    <!--AfterDocument()-->

     

    class="document_ 토대로 매치해서 거기다가 본문을 한번더 넣어주는걸로 대체했으니

    저 주석이 두개 나오는것 외에는 아주 완벽한 동작을합니다.(아무 문제도아님ㅋㅋ)

     

     

    저는 

    <!--BeforeDocument()--> 이거 기준으로 아래 위로 넣는걸 연구했으니 될턱이 없었네요 ㅋㅋㅋㅋ

  • 2023.09.14 07:04 #1785357
    preg_replace_callback는 변환되고도 php가 실행가능
    str_replace는 실행되고 나서 변환이라 php 실행 불가능인 셈인것 같네요