1

プロセッサ クラス内に、db テーブルからすべてのプロジェクトを取得し、それらをフォーマットして表示するステートメントがあります。このメソッドは機能せず、getCollection 呼び出しで停止します。

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 を使用するこのコードは機能します。

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}';
    }
...
}

保存ManagerProjectsして正常に動作する最初の方法と同様の方法を使用しているため、モデル宣言とは関係ないと思います。上記の2番目の方法は機能しているように見えるので簡単に使用できますが、最良の方法を使用したいと思います。

最初の方法の何が問題になっていますか?

最初の方法は、Modx プロセッサで SQL を実装する適切な方法ですか? それとももっと良い方法がありますか?

4

2 に答える 2

3

このタスクを少し簡単に行うことができます。

@Vasis は正しいですが、iterateメソッドをリロードする代わりに基本の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 の「機能」の 1 つが表示されます。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メソッドはオブジェクトのリストを返し、 iterateメソッドに進みます(オブジェクトがアクセス可能かどうかを確認し、必要に応じてこれらのオブジェクトのリストを変更できます)。一部のオブジェクトにアクセスできない場合は、変更されたリストが表示されます。そしてoutputArrayメソッドに行きますが、2番目のパラメータはまだ古いです。したがって、それらをもう一度カウントする必要があります。

これは解決策ですが、オブジェクトのフィールドに格納されているデータを取得しようとしました。したがって、私のバージョンのプロセッサでは、afterIterationメソッドをさらに拡張することはできません。しかし、誰が気にしますか?:)

PS: プロセッサの最初のバージョンについて。modObjectGetListプロセッサは、コレクションを取得する準備ができています。したがって、 getcollectionメソッドを使用する必要はありません。それに適切なclassKeyプロパティを追加するだけです。別の方法はmodProcessor拡張です。それはあなたに基本構造を与えます。しかし、あなたはあなた自身の種類のものを作ることができます。

于 2014-05-16T17:50:14.787 に答える
2

やり方が間違ってるから!これを見てください。それを行う正しい方法は、次のようなものです。

<?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;
    }

}
于 2014-05-15T18:43:36.857 に答える