Extra Form
PHP PHP 7.3
CMS XpressEngine

이전 질문에 이어 질문드립니다 (https://xetown.com/questions/1232967)

 

이전에 플로팅 애드온 실행 시점이 파싱모듈이 유튜브를 표출하기 전이라 동작하지 않을수도 있다고 하셔서

애드온 출력이 언제 이뤄지는지 확인해보니

현재는 애드온 출력이 

if($called_position == 'before_display_content'

되있었습니다

"모든 처리가 끝난 후 결과값을 출력하기 바로 직전인 DisplayHandler::printContent()에서 호출됩니다. 일반적으로 이 시점은 HTML/JSON/XMLRPC 출력 직전이며 출력 직전에 HTML/JSON/XMLRPC 의 변조를 하기 위할때 사용할 수 있습니다. 예를 들어 회원들의 포인트에 따른 레벨 아이콘등을 결과물에 추가할 수 있습니다."

 

라고 하는데 애드온 실행 시점을 페이지가 로드된 후, 결과값을 출력 한 이후 같은건없을까요? after_display_content 를 사용해보려고 했는데 존재하지 않는다더군요

  • profile
    파싱과 결과 로딩 이후에 플로팅 애드온의 js를 추가 실행하도록 하는 것도 방법일 겁니다.
    ajax success나 complete 이후 시점에 플로팅 동작을 실행하게끔 하는 거죠.
    (유튜브도 그렇게 될 수 있는지는 가물가물..)

    아니면 링크 파싱 자체를 본문 출력이 아니라 본문 입력 단계에서 실행하도록 하는 것이 가장 근본적인 해결책일 텐데, 근본적 해결책인 만큼 전혀 다른 모듈로 제작을 해야겠죠;;;;
  • profile ?
    아~ 무슨말씀인지 이해는 갑니다 임베디드 파싱모듈에 유튜브 처리완료이후 js를 로드시키라는 말씀이신가요?
  • ? profile
    네, 맞습니다 :)
  • profile
    참고로 링크 파싱 모듈과 플로팅 비디오 애드온 모두 js에 의존하는 것이기 때문에(플로팅 비디오도 js 맞을 걸요?), 애드온 호출 시점은 그다지 안 중요할 것 같습니다.
    js 처리 시간이 비디오 관련 태그를 옮겨오는 것에 비해 링크를 파싱하는 시간이 더 걸리는 문제로 보이거든요.
    즉, 문제를 해결하려면 파싱 이후에 js를 별도로 돌려주는 쪽으로 접근해야 할 것으로 생각합니다.
  • profile ?
    parserlink/tpl/js/ap_parser.js

    322번째줄 function getYoutube(i) 안에

    function getYoutube(i) {
    var regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/;
    var matches = urls[i].match(regExp);
    if (matches) {
    var yt_id = matches[7];
    var yt_list = urls[i].match('(list=[a-zA-Z0-9\-\_]+&?)');
    yt_list = yt_list ? '?' + yt_list[0] : '';
    var yt_cnt = $('#' + prefix + cnt + i),
    yt_load = $('#' + prefix + load + i);
    var _yt_frame = '<img id="' + yt_id + '" src="https://i.ytimg.com/vi/' + yt_id + '/mqdefault.jpg" style="display: none;">';
    _yt_frame += '<iframe allowfullscreen="" frameborder="0" src="https://www.youtube.com/embed/' + yt_id + yt_list + '"></iframe>';
    yt_cnt.html(_yt_frame);
    var yt_frame = yt_cnt.children('iframe');
    yt_frame.css({'width': '100%'});
    $(yt_cnt.children('img#' + yt_id)).on('load', function () {
    var ratio = this.height / this.width;
    yt_frame.css({'height': yt_frame.width() * ratio});
    $(window).on('resize', function () {
    yt_frame.css('height', yt_frame.width() * ratio);
    });
    });
    yt_cnt.css({'max-width': ap_parser_youtube_max, 'border': 'none'}).fadeIn('slow');
    yt_load.hide();
    if (ap_parser_link_text == 'delete') {
    var p = yt_cnt.parent('.' + container).prev('p');
    if (p.text().indexOf(urls[i]) != -1) {
    if (p.text() == urls[i]) p.remove();
    else p.html(p.text().replace(urls[i], ''));
    }
    }
    } else getPreview(i);
    *추가부분
    $('head').append('<script src=\'floating_player.js\'><\/script>');
    }

    이렇게하면 맞을까요?
  • ? profile
    1. 일단 '추가부분'의 위치가 if(matches) { ... } 조건문 안쪽으로 append 되어야 할 것 같습니다. 다만, 그렇게 해도 된다는 확신은 없는데요.

    2. '추가부분'의 내용으로 스크립트가 (재)실행되는 게 아니라 head에 '추가'만 되는 것 같거든요. 그리고 js 파일의 경로도 저렇게 해도 되는지 모르겠습니다.
  • profile ?
    도움 정말감사합니다. 조금더 생각해보니 정상적으로 동작합니다 ㅠㅠ 이런기쁨주셔서 정말 감사합니다
  • profile ?
    동작이 잘 되는줄 알았는데 문제가하나있습니다 ㅠㅠ 기능은 정상적으로 동작하나 유튜브 동영상 주소를 게시글에 적고, 적은게시글이 동영상으로 변환되면 영상크기가 플로팅 동영상 크기만큼 줄어듭니다 .. 이것만 해결하면 될것같은데 하루종일 만져봐도 해결되지가 않습니다 ㅠㅠ 혹시 이거관련해서도 조언받을수 있을까요?
  • ? profile
    글쎄요. 그런 문제라면 영상을 플로팅해주는 애드온의 소스도 봐야 하고 직접 시연도 해봐야 할 것 같은데요;;; 링크 파싱으로 임베드한 영상의 사이즈가 반응형이어서 그런 걸까요. 암튼 그 이상은 저도 감을 잘 못잡겠네요ㅜㅜ
  • profile ?
    그렇군요 ㅠㅠ 다 잘 넘겼는데 이문제때문에 다시 되돌려야겠네요 ㅠㅠ 어찌되었건, 도와주셔서 정말 감사했습니다