2014-05-15 8 views
1

내 프로세서 클래스 안에는 db 테이블의 모든 프로젝트를 가져 와서 표시되도록 포맷하는 문이 있습니다. 이 메서드 이 작동하지 않고이 발생하고 getCollection 호출이 중단됩니다. 내가 ManagerProjects을 절약하고 잘 작동하는 최초의 유사한 방법을 사용Modx : getCollection 쿼리가 작동하지 않습니다.

class GlobalLinkSettingsProcessor extends modObjectGetListProcessor{ 

    public function initialize() { 
     return parent::initialize(); 
    } 

    public function process() { 
     $leadersql = "SELECT * FROM `modx_manager_projects`"; 
     $query = $this->modx->query($leadersql); 
     $project_names = array(); 
     while ($row = $query->fetch(PDO::FETCH_ASSOC)) { 
      $projects = unserialize($row['manager_projects']); 
      foreach($projects as $short_code => $project) { 
       $project_names[] = array('project_name' => $project, 'project_short_code' => $short_code); 
      } 
     }; 
     return '{"total":' . count($project_names) . ',"results":' . $this->modx->toJSON($project_names) . ',"success":true}'; 
    } 
... 
} 

을, 그래서 나는 그것을 함께 할 수 있다고 생각하지 않습니다

class GlobalLinkSettingsProcessor extends modObjectGetListProcessor{ 

    public function initialize() { 
     return parent::initialize(); 
    } 

    public function process() { 
     $result = $this->modx->getCollection('ManagerProjects'); 
     $project_names = array(); 
     foreach ($result as $row) { 
      $projects = unserialize($row->get('manager_projects')); 
      foreach($projects as $short_code => $project) { 
       $project_names[] = array('project_name' => $project, 'project_short_code' => $short_code); 
      } 
     } 
     return '{"total":' . count($project_names) . ',"results":' . $this->modx->toJSON($project_names) . ',"success":true}'; 
    } 
... 
} 

일반 SQL 를 사용하여이 코드는 작동합니까 모델 선언. 위의 두 번째 방법을 사용하기 때문에 쉽게 사용할 수 있지만 최선의 방법을 사용하고 싶습니다.

첫 번째 방법의 문제점은 무엇입니까?

첫 번째 방법은 Modx 프로세서에서 SQL을 구현하는 적절한 방법입니까? 아니면 더 좋은 방법이 있습니까?

답변

2

잘못했기 때문에! 그냥 this을 참조하십시오. 이를 수행하는 올바른 방법은 다음과 같습니다.

<?php 
class GlobalLinkSettingsProcessor extends modObjectGetListProcessor{ 
    public $classKey = 'ManagerProjects'; 

    public function iterate(array $data) { 
     $list = array(); 
     $list = $this->beforeIteration($list); 
     $this->currentIndex = 0; 
     /** @var xPDOObject|modAccessibleObject $object */ 
     foreach ($data['results'] as $object) { 
      if ($this->checkListPermission && $object instanceof modAccessibleObject && !$object->checkPolicy('list')) continue; 
      $projects = unserialize($object->get('manager_projects')); 
      foreach($projects as $short_code => $project) { 
       $objectArray = array('project_name' => $project, 'project_short_code' => $short_code); 
       if (!empty($objectArray) && is_array($objectArray)) { 
        $list[] = $objectArray; 
        $this->currentIndex++; 
       } 
      } 
     } 
     $list = $this->afterIteration($list); 
     return $list; 
    } 

} 
3

우리는이 작업을 좀 더 쉽게 할 수 있습니다.

@Vasis 오른쪽하지만 우리는 기본을 대신 반복 처리를 방법을 다시로드의 prepareRow 방법을 사용할 수 있습니다

<?php 
class GlobalLinkSettingsProcessor extends modObjectGetListProcessor{ 
    public $classKey = 'ManagerProjects'; 
    protected $projects = array(); 

    public function prepareRow(xPDOObject $object) { 
     $_projects = unserialize($object->get('manager_projects')); 
     foreach($_projects as $short_code => $project) { 
      $this->projects[] = array('project_name' => $project, 'project_short_code' => $short_code); 
     } 
     return parent::prepareRow($object); 
    } 

    public function outputArray(array $array,$count = false) { 
     $count = count($this->projects); 
     return parent::outputArray($this->projects,$count); 
    } 
} 
return 'GlobalLinkSettingsProcessor'; 

우리가 modx '기능'중 하나를 볼 수 있습니다. modObjectGetListProcessor과정 방법에서 우리는이를 볼 수 있습니다

public function process() { 
    $beforeQuery = $this->beforeQuery(); 
    if ($beforeQuery !== true) { 
     return $this->failure($beforeQuery); 
    } 
    $data = $this->getData(); 
    $list = $this->iterate($data); 
    return $this->outputArray($list,$data['total']); 
} 

GetData의 방법은 객체의 목록을 반환하고 우리가 개체에 액세스 할 수 있는지 확인하고 변경할 수 있습니다 으로 반복 방법 (에 간다 요구시 이러한 객체의 목록). 일부 오브젝트에 액세스 할 수없는 경우 목록이 변경됩니다. 그리고 그것은 outputArray 메쏘드로갑니다. 그러나 두번째 매개 변수는 여전히 오래된 것입니다. 그래서 다시 계산해야합니다.

이것은 해결책이지만 개체의 필드에 저장된 데이터를 가져 오려고했습니다. 따라서 afterIteration 메서드는 내 버전의 프로세서에서 더 이상 사용할 수 없습니다. 하지만 누가 신경 쓰냐? :)

P .: 첫 번째 프로세서 버전 정보. modObjectGetList 프로세서가 컬렉션을 가져올 준비가되었습니다. 따라서 getcollection 메소드를 사용하지 않아야합니다. 그냥 classKey 속성을 추가하십시오. 또 다른 방법은 modProcessor 확장입니다. 그것은 당신에게 기본 구조를 제공합니다. 그러나 당신은 당신 자신의 물건을 만들 수 있습니다.