Php Modx:getCollection查询不工作
在我的processor类中,我有一条语句,它从db表中获取所有项目,并将它们格式化以显示。此方法不起作用并在getCollection调用时停止Php Modx:getCollection查询不工作,php,modx,modx-revolution,xpdo,Php,Modx,Modx Revolution,Xpdo,在我的processor类中,我有一条语句,它从db表中获取所有项目,并将它们格式化以显示。此方法不起作用并在getCollection调用时停止 class GlobalLinkSettingsProcessor extends modObjectGetListProcessor{ public function initialize() { return parent::initialize(); } public function process
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
,并且运行良好,因此我认为这与模型声明无关。我可以很容易地使用上面的第二种方法,因为它似乎有效,但我想使用最好的方法
第一种方法有什么问题
第一种方法是在Modx处理器中实现SQL的正确方法吗?还是有更好的办法 因为你做错了!看看吧。正确的方法是这样的:
<?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;
}
}
因为你做错了!看看吧。正确的方法是这样的:
<?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;
}
}
我们可以更轻松地完成这项任务
@Vasis是正确的,但我们可以使用基本prepareRow方法,而不是重新加载迭代方法:
getData方法返回一个对象列表,然后转到iterate方法(在该方法中,我们可以检查对象是否可访问,并根据需要更改这些对象的列表)。如果您无法访问某些对象,我们将更改列表。它转到outputArray方法,但第二个参数对它来说仍然很旧。所以你应该再数一数
这是一个很好的解决方案,但您尝试获取存储在对象字段中的数据。所以,在我的处理器版本中,后迭代方法将无法用于进一步扩展。但谁在乎呢?:)
附言:关于你的处理器的第一个版本。modObjectGetList处理器已准备好获取集合。所以您不必使用getcollection方法。只需向其添加适当的classKey属性。
另一种方法是在modProcessor扩展中。它为您提供了一个基本结构。但是你可以自己做东西。我们可以让这项任务简单一点
@Vasis是正确的,但我们可以使用基本prepareRow方法,而不是重新加载迭代方法:
getData方法返回一个对象列表,然后转到iterate方法(在该方法中,我们可以检查对象是否可访问,并根据需要更改这些对象的列表)。如果您无法访问某些对象,我们将更改列表。它转到outputArray方法,但第二个参数对它来说仍然很旧。所以你应该再数一数
这是一个很好的解决方案,但您尝试获取存储在对象字段中的数据。所以,在我的处理器版本中,后迭代方法将无法用于进一步扩展。但谁在乎呢?:)
附言:关于你的处理器的第一个版本。modObjectGetList处理器已准备好获取集合。所以您不必使用getcollection方法。只需向其添加适当的classKey属性。
另一种方法是在modProcessor扩展中。它为您提供了一个基本结构。但是你可以做你自己的东西
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']);
}