질문/조언질답게시판
Extra Form
PHP PHP 7.4
CMS Rhymix 2.x

코알못이 기존 모듈을 참고해가며 만들고 있다보니 모르는 부분이 넘 많네요...ㅜ

 

phpspreadsheet 를 이용하여 엑셀파일을 읽는 부분까지는 어찌저찌해서 구현하였는데

그값을 뷰페이지에 넘겨주는것을 몰라 이렇게 글을 올립니다.

 

 

<form enctype="multipart/form-data" action="./" method="POST" id="" class="form">
<div class="x_control-group">
<input type="hidden" name="module" value="excelimport" />
<input type="hidden" name="act" value="procExcelimportAdminExcelUpload" />
<input name="uploadedfile" type="file" required="required" />
<input type="submit" value="엑셀파일 업로드 실행" />
</div>
</form>


<table class="excle_table">
......
생략
......

 

 

public function procExcelimportAdminExcelUpload()
{

$args = Context::getRequestVars();
               
               .......생략...........

               $spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($inputFileName);
               $spreadData = $spreadsheet-> getActiveSheet()->toArray();
               var_dump($spreadData);exit; //데이터값 출력 확인

             

 

$spreadData 값을 어떻게 넘겨하는건가요?

조언 부탁드립니다. 감사합니다.

 

 

 

 

  • profile
    Context::set 함수로 설정해두면 템플릿에서 불러올 수 있습니다.

    예)
    Context::set('excel', $spreadData); 한 뒤 템플릿에서 $excel 변수로 사용
    물론 템플릿에서 적절히 해당 변수 가공해서 출력해야 합니다.
  • profile profile
    $spreadData = $spreadsheet-> getActiveSheet()->toArray();
    Context::set('excel', $spreadData);

    코드 작성 후
    importexcel.html 화일에 <pre>{print_r($excel)}</pre> 확인했으나 값이 않나오네요.

    ~view.php
    function dispMobileinfoAdminExcel() {
    $this->setTemplateFile('importexcel');
    }

    조언 감사합니다.
  • profile profile
    Context::set은 controller에서 view로 데이터를 전달하는 데 사용할 수 없습니다만...
  • profile profile
    proc에서 출력하지 않는 한 view에서 바로 표시할 수 없습니다. 즉 setTemplateFile을 proc에서 실행해야 합니다.

    물론 새로고침시 오작동 등 각종 문제점이 발생하니 정석은 아래 댓글대로 분리하는겁니다. 별도 DB 저장후 다시 저장하는게 곤란하다면 세션변수에 저장해 두었다가 view에서 세션변수의 내용을 출력하는 식으로 구현해도 됩니다.
  • profile profile

    네. 당연히 안되죠. 저는 된다고 적은 적 없습니다. 정석은 MVC 패턴 따라서 구현하는게 맞지만... 처음부터 알려드리면 이해하시기 힘들것 같아 proc에서 출력할수 있도록 답변 드린겁니다.

  • profile profile
    DB저장 후 view에서 출력되도록 할려고 합니다.
    답변감사합니다.
  • profile

    controller에서는 HTML을 직접 출력하지 않는 것이 불문율입니다.

    새로고침시 경고창이 뜨는 것은 물론, 보안상으로도 안 좋은 점이 많기 때문입니다.

    엑셀 데이터든 그걸 처리한 결과든 일단 어딘가에 저장해 두고,

    view 화면으로 리다이렉트한 후에 거기서 다시 읽어오도록 해야겠지요.

    Post/Redirect/Get이라고 아주 잘 정립된 디자인 패턴입니다.

    https://en.wikipedia.org/wiki/Post/Redirect/Get

  • profile profile
    뭔가 막막하지만......^^
    조언 감사합니다.
  • profile profile

    저런 데이터 들여오기 기능을 구현할 때는
    들여온 데이터를 controller에서 일단 모두 정리하여 DB에 집어넣고,
    view에서 그 DB를 다시 불러오는 형식으로 구현하는 것이 일반적입니다.
    어차피 DB에 저장하려고 들여오는 것일 테니까요.

    개발 도중 controller가 제대로 작동하고 있는지 확인하는 용도로는

    이미 하고 계신 것처럼 var_dump + exit으로도 충분하고요.

  • profile profile

    엑셀데이터를 읽어들여 view 에 먼저 뿌린 후
    일괄등록이라는 액션을 주었을때 DB에 입력하려고 했었습니다. ^^

    조언해주신대로 DB생성으로 방향을 바꾸어 보겠습니다.(잘될지 모르겠지만..ㅜ ^^)

  • profile profile
    아, 그렇군요. 중간에 view를 한 번 거쳐서 가려면 상당히 복잡해집니다.
    controller → view → controller → view로 여러 번 왔다갔다하거나,
    DB에 저장하지 않고 데이터만 반환하는 중간 단계의 로직을 따로 만들어야 할 테니...
    그냥 임시로라도 DB에 저장해두고 보여주는 편이 훨씬 깔끔하지요.
  • profile profile
    먼가 깔끔한거 같이 않아서 액션을 주었을때 DB에 입력하려했었는데 그게 복잡하고 번거로운 방법이었나 보군요.
  • profile profile
    이거 정말 할거임? 위험할 수도 있는데? 라고 반드시 확인을 받아야 하는 상황이 아니라면
    최소한의 클릭으로 작업을 마칠 수 있는 방법이 사용자도 편하고 개발하기도 편하죠. ㅎㅎ