终极目标
是制作像Magento提供的东西 - 基本上是一个逻辑构建器,并且正如Stackoverflow上的这篇文章所示:jQuery (or any web tool) Nested Expression Builder到目前为止,我已经使jQuery构建了一个树并获取了我希望构建器的数据使用,检查和设置。现在我只需解析检查并将其添加到我正在制作的脚本中的各个位置 - 但我不确定如何动态处理它以便执行这些检查,这将导致某些操作发生/数据被更改自动。
也许我们可以调用这个动态表达式处理?
原帖
原谅我,我知道我想做什么,但不知道该怎么做 - 所以我正在寻找一些灵感。我已经允许生成一个多维数组,并且该数组将包含某些“命令”和逻辑函数,当条件为真时,它将被执行。
在它最基本的形式中,数组将包含一组if语句,如果语句为真,那么将进入下一个数组项并向下一级,如果它是假的,那么你会继续到没有孩子的下一个数组项目(一个未婚的兄弟姐妹,我想我们可以称之为)。一旦没有任何东西可以处理,因为没有什么是真的,那么什么都不会发生。
我想,也许通过XML来“提供”数据的最佳方式 - 尽管这是可能的,我的意思是继续深入,否则就会下降,基本上直到有真正的条件?
基本上,数组采用以下形式(虽然我不是100%确定我已正确编写它,但我认为它看起来是正确的:s):
[0][0] => array('function' => 'if', 'check' => 'day', 'condition' => 'equals', 'value' => '3');
[0][1][0] => array('function' => 'set', 'name' => 'date_day', 'value' => 'wednesday');
[1][0] => array('function' => 'if', 'check' => 'day', 'condition' => 'equals', 'value' => '4');
[1][1][0] => array('function' => 'set', 'name' => 'date_day', 'value' => 'thursday');
所以上面会是 - 如果day = 3,那么将date_day设置为星期三;否则如果day = 4,则将date_day设置为星期四
我认为这对应于(虽然我不知道你是否可以使用子项目):
<items>
<item>
<function>if</function>
<check>day</check>
<condition>equals</condition>
<value>3</value>
<item>
<function>set</function>
<name>date_day</name>
<value>wednesday</value>
</item>
</item>
<item>
<function>if</function>
<check>day</check>
<condition>equals</condition>
<value>4</value>
<item>
<function>set</function>
<name>date_day</name>
<value>thursday</value>
</item>
</item>
</items>
这基本上会在某种函数中产生以下语句:
function ($current_data){
LOOP
if(FUNCTION == "if"){
if(CHECK CONDITION VALUE){
**go to next item deeper in the chain**
} else {
**go to sibling item**
}
} else if(FUNCTION == "set"){
define(NAME, VALUE);
}
ENDLOOP
}
我知道上面的内容可以使用date()
函数完成,但这是一个非常基本的例子。另一个例子可能涉及检查输入的颜色是否为红色,如果是,则根据此颜色设置某些内容,否则如果是蓝色则执行其他操作。另一个可能是如果点击美国国旗,则将模板设置为美国访客。关键是它基本上可以完成任何操作并进行检查并给出结果 - 基本上就像编程一样 - 但函数数据是通过PHP或XML输入的
我确信必须有一些可以实现这一目标的东西,但我不知道是否准确地开始,所以任何帮助都会很棒 - 是的我知道可能存在一些安全问题,但我计划在检查checks
,conditions
,values
等是否安全时进行检查(因此需要将其考虑在内)。
非常感谢!
答案 0 :(得分:0)
除了JSON与XML之外,这是我如何处理该数组...
$array = xmldecode($xml);
$resultFound = false;
$i = 0;
while(!$resultFound && $i < count($array)) {
if (myFunction($array[$i]) {
$resultFound = true;
}
$i++;
}
if (!$resultFound) {
// error condition
}
function myFunction($array) {
$function = $array[0]['function'];
switch($function) {
case 'if':
$checkVariable = $array[0]['check'];
$condition = $array[0]['condition'];
$checkValue = $array[0]['value'];
switch($checkVariable)
case 'day':
switch($condition) {
case 'equals':
if (GLOBAL_DAY == $checkValue) {
return myFunction($array[1]);
} else {
return false;
}
break;
case 'less than':
if (GLOBAL_DAY < $checkValue) {
return myFunction($array[1]);
} else {
return false;
}
break;
}
break;
}
break;
case 'set':
$setVariable = $array[0]['name'];
$setValue = $array[0]['value'];
switch($setVariable) {
case 'date_day':
GLOBAL_DATE_DAY = $setValue;
return true;
break;
}
break;
}
}
答案 1 :(得分:0)
你的问题与表单验证非常相似,所以我会看一些流行的jQuery表单验证插件或像CakePHP这样的MVC框架。这些通常都有最常见验证规则的库存构建块,用户可以轻松地将它们放在一起并传递特定参数以涵盖大多数场景。
您的问题和这些示例之间的显着差异是表单验证框架针对开发人员,因此如果他们需要将多个规则粘合在一起以形成更复杂的规则,他们可以简单地编写自定义函数。但是,通过执行以下操作,您仍然可以实现适用于所有用例的98%的内容:
$offers = array(
'pet feed sale' => array(
'category' => array(1, 2, 3)
'total' => '>100',
'weekday' => array('mon', 'wed')
'set' => array(
'discount' => 80
'shipping' => 0
)
),
'medication sale' => array(
'category' => 4
'date' => '2012-1-28',
'set' => array(
'discount' => 50
)
)
);
如果用户需要应用更复杂的定价结构,那么他们可以将“宠物饲料销售”规则分为3个优惠,一个用于狗粮,一个用于猫食,一个用于鱼食。可能会有更多的重复,但它比完整的解析器更容易实现。
此外,大多数非程序员可能比复杂的逻辑和控制流更好地处理重复。