Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

글수정시 첨부파일 삭제하면 확장변수가 무조건 삭제되는 버그 (패치포함) #722

Closed
sejin7940 opened this issue May 16, 2014 · 2 comments
Assignees
Milestone

Comments

@sejin7940
Copy link
Contributor

두가지 방법 중
XE 코드의 의도에 맞게 수정하시는게 나을듯해서
굳이 Full Request 처리 안 하고, 증상과 원인과 해결방법을 적어드립니다
검토해보시고, XE 에 맞는 수정방법 대로 적용해주세요. (중요한 버그인듯하네요)

** 증상 :
등록된 게시물 수정 화면에서 기존에 첨부된 파일을 하나 이상 삭제하고 저장하지 않고
새로고침하거나 다른 페이지로 이동하면 xe_document_extra_vars 테이블의 해당 문서와 연결된 모든 데이터가 삭제됩니다.

** 원인 :
updateUploaedCount 에서 updateDocument 함수로 넘어가는데
이 때 $obj->{'extra_vars'.$idx} 값들이 안 넘어갑니다
앞선 updateUploaedCount 에서, $oldDocument->variables 에서 확장변수 값이 제대로 안 넘어가기 때문이죠

** 궁금한 점 :
단순히 파일을 삭제한건데.. 왜 굳이 updateDocument 함수로 넘어가게 했을까요?
이렇게 넘어가면 불필요하게 확장변수를 다 삭제하고 다시 저장하는 걸 비롯해 글자체의 update 과정을 전부 다시 거치게 되는데
last_update (최종 수정일) 을 갱신하기 위해서인가요?
트리거의 연결이라고 보기도 그렇고, 실제로도 꽤 비효율적인듯한데..

해결방법이 updateDocument 형태를 따를건지에 따라 조정될듯합니다.

해결방법 #1 과 해결방법 #2 를 모두 기재해두니

XE 개발진에서 검토해보시고 둘 중 하나의 형태로 수정하면 될듯합니다.

** 해결방법 #1 :

기존의 updateDocument 형태를 그대로 따르는 경우

document/document.controller.php 에서 updateDocument 함수에서

// Remove all extra variables
바로 위에 아래문구 추가
if(Context::get('act')!='procFileDelete') {

// Update the category if the category_srl exists.
바로 위에 } 를 추가

** 해결방법 #2 :

updateDocument 로 가지 않고 그냥 바로 query 를 통해 uploaded_count 를 차감하는 방법

  1. document/document.controller.php 에서
    updateUploaedCount 를 통째로 교체

public function updateUploaedCount($documentSrlList)
{
$oDocumentModel = getModel('document');
$oFileModel = getModel('file');

if(is_array($documentSrlList))
{
$documentSrlList = array_unique($documentSrlList);
foreach($documentSrlList AS $key=>$documentSrl)
{
$fileCount = $oFileModel->getFilesCount($documentSrl);

$args->document_srl = $documentSrl;
$args->uploaded_count = $fileCount;
$output = executeQuery('document.updateUploadedCount', $args);
}
}
}

  1. document/queries/updateUploadedCount.xml 추가

< query id="updateUploadedCount" action="update">
< tables>
< table name="documents" />
</ tables>
< columns>
< column name="uploaded_count" var="uploaded_count" />
</ columns>
< conditions>
< condition operation="equal" column="document_srl" var="document_srl" filter="number" notnull="notnull" />
</ conditions>
</ query>

@akasima
Copy link
Member

akasima commented Jul 14, 2014

해결방법 1로 처리했습니다. :)

@akasima akasima closed this as completed Jul 14, 2014
@devflow
Copy link
Contributor

devflow commented Jul 17, 2014

해결방법 2를 사용해야할듯합니다..
확장변수가 있는 게시물을 옮길때 같은 상황이 발생합니다...

해결방법2를 사용하니 확장변수와 첨부파일이 있을 때 게시물을 이동하게되면 확장변수가 모두 사라지는 현상이 발생했던게 잘 이동이 됩니다.

확인 부탁드립니다 @akasima @sejin7940

@ghost ghost modified the milestones: 1.8.0, 1.7.9 Dec 10, 2014
sejin7940 added a commit to sejin7940/xe-core that referenced this issue Dec 10, 2014
xpressengine/xe-core#722   이슈에서 방법#1  로 수정한 형태인데..
이 형태도 문제가 조금 있네요.   act=procFileDelete  일때에만 해당 문제가 해결되며..

deleteFile  함수를 직접적으로 쓰는 모든 경우..  해결이 되지 않는다.
예를들어,  관리자페이지에서 파일  에서 파일삭제하는 경우라든지..
게시글 이동 하는 경우라든지에는..   여전히 문제가 생겨서..

xpressengine/xe-core#722   이슈를 다른 보다 확실한 방법으로 보완하고
이 이슈에의해 적용한 방법은 다시 삭제해서 원래 형태로 되돌린다.
sejin7940 added a commit to sejin7940/xe-core that referenced this issue Dec 10, 2014
파일 삭제 시  사용자정의 지워지는 걸 막기 위해
xpressengine/xe-core#722   이슈에서 제시한 삭제법 대신에 이 PR 방법이 더 확실하고 범용적이다.

파일삭제할때, 해당 글번호를 이용해 확장변수 값을 추출해서 전부 updateDocument 로 직접 전달하게 변경했다.
이렇게 하면  사용자정의가 삭제되지 않고 그대로 다시 저장이 된다.


해당 이슈의 상세 원인은...

$oFileController->deleteFile($val->file_srl); 가 실행되서 기존폴더의 파일을 삭제하게 되는데..

file.controller.php 에서 deleteFile 함수 끝부분에 보면 $oDocumentController->updateUploaedCount 함수 실행된다.
(사실 글이동시에는 논리적으로는 이 부분이 실행될 필요가 없다.)

어쨋든 updateUploaedCount 함수 실행되면서, 그 내부의 updateDocument 가 실행된다.

그런데 이 updateDocument 내부에서는
확장변수가 있는 구조라면, 무조건 확장변수 전체를 지우고, $obj->extra_vars1 같은 형태로 확장변수 값을 받아서 다시 저장된다.

글 수정시에는 확장변수 값이 전부 전달이 되기에 $obj->extra_vars1 형태에서는 문제가 없는데..
파일삭제를 통할 경우에는,  updateDocument($oldDocument, $newDocumentObject);    형태로
$newDocumentObject 값이 전달되는데  이 값은 DB 칼럼 값을 기반으로 넘기는데, 
extra_vars1 등은 칼럼의 변수 값들이 아니여서 (예전 1.4 때에서는 변수였지만. 1.7 에서는 별도 DB를 쓰기에)
결국 빈 값이 전달된다.



따라서 이를 해결하기 위해서는
updateUploadedCount 함수에서, 사용자정의값을 미리 구해서 $newDocumentObject 에 값을 넣어 직접 전달을 해야만한다
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants