为什么我简单的“如果”不起作用?的PHP

时间:2018-08-09 13:24:24

标签: php modx

所以,我正在尝试做一个非常简单的事情:检查一个数字是否等于另一个数字-但由于某种原因,它只是不想工作。

$exhibitions = "20,21,24";
$parent = "[[*parent]]";
$id = "[[*id]]";

if ($id == 5) {
    $chunk = "listExhibitions";
}
if (stripos($exhibitions, $parent) == TRUE) {
    $chunk = "Exhibitions";
}
return "[[$" . $chunk . "]]";

这是我要开始工作的第一个“ if”。如果我把!在==之前,然后页面显示“ listExhibitions”块-但是,当id等于5时,我需要这样做。我也尝试在数字周围加上''。另外,当我简单地输出$ id时,数字5也会出现。

我在做什么错了?

2 个答案:

答案 0 :(得分:5)

您所引用的ID仅应在视图中使用。这似乎是一个控制器。尝试这种方式:

$exhibitions = "20,21,24";
$parent = $modx->resource->get('parent');
$id = $modx->resource->get('id');

if ($id == 5) {
    $chunk = "listExhibitions";
}
if (stripos($exhibitions, $parent) == TRUE) {
    $chunk = "Exhibitions";
}
return "[[$" . $chunk . "]]";

答案 1 :(得分:2)

您希望在这里发生的事情是使Modx自动处理您的ID和PARENT占位符,并将它们传递到您的代码段中。 Modx不会为您执行此操作,您要么必须将它们显式地传递到$ scriptProperties数组中,要么〜或〜正如Marvin指出的那样,从modResource对象(这些modx将假定为当前资源)获取这些属性

要显式传递它们,请将占位符添加到您的代码段调用中:

[[~MyCustomSnippet? &id=`[[*id]]` &parent=`[[*parent]]`]]

在这种情况下,Modx将在解析页面,模板或块(无论您碰巧调用了代码段的位置)时填充占位符。

如果您正在处理CURRENT资源的ID和PARENT; Marvin的示例将起作用,尽管我确实相信您必须首先获取当前资源对象。

$resource = $modx->getObject('modResource');

您将不得不检查该文档。 (或对其进行测试)

更新

我们三个人通过聊天解决了问题,并提出了以下解决方案:

通过这种方式调用代码段:

[[!MyCustomSnippet? &id=`[[*id]]`]]

代码段的内容:

<?php

$id = isset($scriptProperties['id']) ? $scriptProperties['id'] : FALSE; // get id passed with snippet

$exhibitions = array(20,21,24);

if(!$id){
    $id = $modx->resource->get('id'); // get the current resource id if it was not passed
}

$resource = $modx->getObject('modResource', $id); // get the resource object

$parent = $modx->resource->get('parent'); // get the parent id from the resource object

$output = '';

if ($id == 5) {
    $chunk = "listExhibitions";
}

if (in_array($parent, $exhibitions)) {
    $chunk = "Exhibitions";
}

$output = $modx->getChunk($chunk);

return $output;

这将使用代码段调用中传递的ID,或者如果未传递ID则假定当前资源,并基于此从资源对象获取父ID。