2012-06-30 2 views
1

CakePHP에서 트리 동작 문제를 시작하는 데 문제가 있습니다. lft, rghtparent_id 열로 테이블을 설정했습니다.CakePHP 트리 동작 문제 - 첫 번째 항목

다른 사람이 parent_id 열로 참조 할 수있는 첫 번째 항목을 추가하고 있습니다. 그러나 추천은 내가 원하는대로 작동하지 않습니다.

첫 번째 항목이 예상대로 데이터베이스에 추가됩니다. parent_id을 지정하지 않으면이 열의 데이터베이스 값이 NULL이됩니다. lftrght 열도 값으로 NULL이됩니다. 그게해야 할 일인지 확실하지 않습니다.

초기 항목 다음에 새 항목을 추가하려고하면 저장이 실패합니다.

lftrght 열을 첫 번째 항목에서는 1, 11, 2으로 설정하려고 시도했지만 행운이 없습니다.

여기 뭔가 잘못 되었나요?

+0

SOLVED! $ model-> save() 메소드를 호출 할 때, 데이터를 보내고 (추가시) ID를 보내면 Behavior가 작동하는 것으로 나타났습니다. 그래서, 나는 그것과 ID를 보내는 것을 생략하고 지금은 작동합니다. (ID를 보낸 이유는 이전 테이블에서 데이터를 가져 오기 때문이었습니다). – Magnus

답변

1

분명히 lft와 rght를 설정하고 싶지는 않습니다. 그것들은 프레임 워크에 의해 처리됩니다. 문서가 지정하는대로 기본값이 null입니까?

나는 Tree Behavior를 사용할 때 항상 parent_id을 설정하고 CakePHP는 parent id를 기반으로 트리 구조를 자동으로 처리합니다. 브랜치 내에서 항목을 이동해야하는 경우 해당 동작의 다른 기능을 사용하여 수행 할 수 있습니다.

parent_id 만 설정하고 저장하십시오. 작동하지 않는지 알려주세요.

+0

답변 주셔서 감사합니다, 그러나 방금 해결했습니다. $ model-> save() 메소드를 호출 할 때, 데이터를 보내고 (추가시) ID를 보내면 Behavior가 작동하는 것으로 나타났습니다.그래서, 나는 그것과 ID를 보내는 것을 생략하고 지금은 작동합니다. (ID를 보낸 이유는 이전 테이블에서 데이터를 가져 오기 때문이었습니다). – Magnus

+0

NULL 및 parent_id에 머리를 주셔서 감사합니다. – Magnus

+0

이 동작은 레코드 생성시 트리 값을 설정하고 이후에 API 함수를 사용하기 때문에 발생합니다. ID를 전달하는 경우 Cake는 사용자가 구체적으로 말하지 않는 한 어느 시점에서 트리를 변경하고 싶지 않을 것이라고 생각했을 것입니다. 다행 이네. –

0

재미 있지만 이것은 Cake PHP의 문서화되지 않은 부분입니다. docuamntation은 parent_id를 "null"로 설정하는 데 필요한 트리의 최상위 요소를 말합니다. 당신이 재주문을 호출하는 경우 (300)

그래서 TreeBehavior 라인 주위에

if ($id === null && $Model->id) { 
     $id = $Model->id; 
    } elseif (!$id) { 
     $id = null; 
    } 

: 당신이 편집에 elemet을 저장할 때 재주문 아이들을 찾고 흥미로운 조건이 있기 때문에 는하지만, 재주문하지 작동 id => null이고 $ Model-> id이면 실제 트리 항목은 재정렬 될 것입니다. 그것은 틀렸어. 왜냐하면 내가 최상위 범주 항목에서 주문 필드를 변경했기 때문에 나는 나무 전체를 재정렬하고 싶다. 나는 그것이 일종의 버그라고 생각한다.

id => ''를 비워두면 전체 트리가 재정렬됩니다. 그게 니가 원하는거야. 당신이 당신의 상위 트리 항목을 편집하고 순서를 변경하고자 할 때 당신은 당신의 나무의 전체 순서를 변경한다 => ''

 if(!empty($this->data['WebshopCategory']['parent_id'])){ 
      $this->reorder (array('id' => $this->data['WebshopCategory']['parent_id'], 'field' => 'ordered', 'order' => 'ASC', 'verify' => true)); 
     }else{ 
      $this->reorder (array('id'=>'', 'field' => 'ordered', 'order' => 'ASC', 'verify' => true)); 
     } 

ID로 재주문를 호출해야합니다. 참고 : 트리 항목이 많으면 저장 속도가 느려지므로 주문 필드가 변경되었는지 확인해야합니다.