2011-10-30 6 views
2

저는 현재 CakePHP의 초보자이며 CakePHP 1.3으로 놀았지만 최근에는 CakePHP 2.0이 출시되었습니다.CakePHP 2.0 오브젝트가 아닌 배열

지금까지 나는 그것을 좋아하지만 유일한 것은 객체를 반환하지 않는다는 사실입니다. 오히려 그냥 배열을 반환합니다. 나는 $ post [ 'Post'] [ 'id']를해야한다는 것이 거의 의미가 없다는 것을 의미합니다. (제 의견으로는) $ post-> id를 사용하는 것이 훨씬 더 실용적입니다.

이제 Google에서 this 링크를 발견 한 후 양식 클래스를 사용할 때 정의되지 않은 색인에 대한 오류가 발생했습니다. 이는 배열 버전이 아니라 객체화된 버전을 얻고 있기 때문입니다. 나는 블로그 자습서 다음입니다

은 (이미 1.3 아래를 따라했지만 2.0 다시 그 위에가는)

그래서, 누군가는 Form 클래스 방해하지 않고이를 달성하는 방법을 알고?

호쉬

답변

2

추가 개체 바를 만들 수 있습니다. 이 방법을 사용하면 Cake의 자동화 기능을 방해하지 않지만 $ modelNameObj-> id와 같은 형식을 사용하여 데이터에 액세스 할 수 있습니다. 형식입니다.

먼저 AppController.php가 없으면/app/controller에 만듭니다. 그런 다음 beforeRender() 함수를 만듭니다. 이렇게하면 Cake의 표준 명명 규칙에서 데이터를 찾을 것이고 추가로 객체 바를 생성 할 것입니다.

<?php 
App::uses('Controller', 'Controller'); 

class AppController extends Controller { 

    public function beforeRender() { 

    parent::beforeRender(); 

    // camelcase plural of current model 
    $plural = lcfirst(Inflector::pluralize($this->modelClass)); 

    // create a new object 
    if (!empty($this->viewVars[$plural])) {  
     $objects = Set::map($this->viewVars[$plural]); 
     $this->set($plural . 'Obj', $objects);  
    } 

    // camelcase singular of current model 
    $singular = lcfirst(Inflector::singularize($this->modelClass));  

    // create new object 
    if (!empty($this->viewVars[$singular])) {  
     $object = Set::map($this->viewVars[$singular]); 
     $this->set($singular . 'Obj', $object); 
    } 
    } 
} 

는 그런 다음보기에 당신은 너무 같은 개체에 액세스 할 수 있습니다

index.ctp

$productsObj; 

view.ctp

$productObj->id; 

모든 우리가 ' 다시 'Obj'를 추가하는 중입니다. o Cake가 이미 제공 할 변수 이름. 일부 예를 매핑 :

제품 ->$ productsObj

ProductType ->$ productTypesObj

나는이 완벽하지 않지만 그것은 본질적으로 당신이 원하는 것을 달성 할 모든에서 사용할 것 알고 귀하의 모델 중.

+0

이것이 효과가 있습니다. 감사! 그것은 아마 당신이 말한 것처럼 완벽하지는 않지만, 어떻게 든 필요하다면이 방법으로 배열과 객체 버전 모두에 접근 할 수 있습니다! 감사합니다 –

0

나는 또한 내 머리에 시간이 질문에 커플을 달렸다. 이제는 몇 가지 Cake 기반 응용 프로그램을 사용하여 객체를 사용하는 것보다 배열을 사용하여 더 편리하게 결과 세트를 분기 및 병합 (am, in_array 등) 할 수있는 이점을 확인했습니다. $ Post-> id 형식은 구문 구문이 달콤한 설탕이지만 배열에 비해 실질적인 이점은 아닙니다.

+0

귀하의 의견을 소중히 여기지만, 실제로 내 질문에 대답하지 않습니다 :/ –

+0

그냥 잘못 생각하려고합니다. 연관 배열은 갈 길입니다. – sibidiba

0

공용 속성을 반복하고 (ReflectionClass::getProperties 참조) 배열에 저장하고 배열을 반환하는 함수를 작성할 수 있습니다.

클래스에 액세스 할 수있는 경우 ArrayAccess Interface을 구현하고 개체로 배열에 쉽게 액세스 할 수 있습니다.

PS : 미안 해요, 내가 CakePHP를 사용한 적이 있지만 나는 기존의 숫자가있다 모즈가 제안 아이디어를 좋아하지 동안 변환이 프레임 워크 특정 문제

2

을 할 필요가 없습니다 객체에 배열 생각 이 문제에 대한 해결책.

내가 찾은 가장 빠른 것은 https://github.com/kanshin/CakeEntity입니다.하지만 2.x에서 리팩터링해야 할 수도 있습니다. 이미 2.x 분기 나 포크가있을 수도 있지만 보이지는 않습니다.

+0

거기에 2입니다.0 브랜치는 파일 이름 등의 CakePHP 2.0 규칙으로 업데이트되었습니다. – brism

3

거의 알려지지 않은 사실 : 케이크는 객체 또는 객체의 속성으로 반환합니다.

// In your View: 
    debug($this->viewVars); 

Shwoing $thisviewVars 재산는 컨트롤러 액션에서 $this->set('key', $variable) 또는 $this->set(compact('data', 'for', 'view'))에 해당 뷰 오브젝트입니다 :배열는 구문 설탕입니다.

Keystrokes를 위해 $Post->id에 스쿼시 문제가있는 이유는 Cake입니다. Cake는 무거운 리프터가되도록 설계 되었기 때문에 내장 된 ORM은 엄청나게 강력하고 피할 수 없으며 자동 콜백, 자동 데이터 전달, 쿼리 생성 등과 같은 무한대의 무한대 관련 테이블을 처리하기위한 것입니다. 다차원 배열의 기본 깊이는 find 메소드에서 여러 개의 연관된 모델 (예를 들어)이있는 $ Post를 두 개 이상 사용하자마자 어레이를 믹스에 도입 했으므로 피할 수는 없습니다.

다른 find 메서드는 서로 다른 깊이의 배열을 반환합니다. 생성 된 컨트롤러 코드에서 볼 때 $this->set('posts', $this->paginate()); -보기는 $this->set('post', $this->Post->read(null, $id));을 사용하고 편집은 $this->set을 사용하여 전혀 찾을 수 없음 - $this->data = $this->Post->read(null, $id);을 할당 함을 볼 수 있습니다.

FWIW, Set::map은 아마 undefined index 오류를 던집니다. (추측) 편집 작업을 매핑하려고했기 때문에, amirite? 기본적으로 편집 동작은 $this->set을 사용하여 연관된 모델 찾기를보기로 설정합니다. $ this-> read 결과는 $this->data으로 대신 전송됩니다. 이것이 아마도 Set :: map이 실패한 이유입니다. 어느 쪽이든, 당신은 여전히 ​​$Post[0]->id 또는 $Post->id (사용 방법을 찾는 방법에 따라 다름)을 목표로 삼 으려합니다. 이는별로 개선되지 않습니다.

다음은 이러한 작업에 대한 설정 :지도() 속성 깊이의 몇 가지 일반적인 예이다 :

// In posts/index.ctp 
    $Post = Set::map($posts); 
    debug($Post); 
    debug($Post[0]->id); 

    // In posts/edit/1 
    debug($this-viewVars); 
    debug($this->data); 

    // In posts/view/1 
    debug($this-viewVars); 
    $Post = Set::map($post); 
    debug($Post->id); 

http://api13.cakephp.org/class/controller#method-Controllerset

http://api13.cakephp.org/class/model#method-Modelread

http://api13.cakephp.org/class/model#method-ModelsaveAll

HTH.