【问题标题】:PHP: How to serve customized content based on hundreds of user options?PHP:如何根据数百个用户选项提供定制内容?
【发布时间】:2016-03-18 15:43:10
【问题描述】:

我正在处理一个很长很长的用户表单,然后会导致自定义显示。

最终的显示必须逐段进行策划,以适应用户的输入。

我的第一次尝试全是if 语句:

if($input_a && $input_b && $input_c !== $input_d) :

   echo result;

   if($input_a === 'example') :

      return false;

   endif;

   if($input_b !== 'example') :

      echo $input_c * $input_d;

   endif;

endif;

这变得非常混乱,尤其是当我不得不在 JS 和 PHP 之间传递这个逻辑的结果时。

我的下一个尝试是根据一些输入为每个用户构建一个自定义字符串(“x”表示没有输入):

$code = array('x', 'x', 'x', 'x', 'x', 'x');

if($input_a && $input_b && $input_c !== $input_d) :

   $code[0] = 1;
   $code[1] = 1;

   if($input_a === 'example') :

      $code[2] = 1;

   else:

      $code[2] = 0;

   endif;

   if($input_b !== 'example') :

      $code[3] = 1;

   else :

      $code[3] = 0

   endif;

else :

     $code[0] = 0;
     $code[1] = 0;

endif;

因此,在上面的字符串中,字符串的内容类似于'01x0'。现在我可以根据用户的输入为用户分配此代码。在逻辑的进一步推进中,我可以检查这段代码来决定是提供某些内容块还是隐藏其他内容。

如果我想检查第一个和第四个输入是否匹配,但不关心第二个和第三个,我可以这样做:

// 'x' is a placeholder for code items I don't care about
$result_option = '1xx1';

$pattern = '/[' . $code[0] . 'x][' . $code[1] . 'x][' . $code[2] . 'x]/';

if(preg_match($pattern, $result_option) :

   echo $result_option;

endif;

好的,这样就可以了。

但我觉得我在这里重新发明轮子,最终我的代码字符串将有一百个字符长。

有没有更好的方法来提供基于数百个用户选项的定制内容,而不涉及一百个嵌套的if 语句类?

编辑:

所以为了更清楚地了解我想要完成的工作,假设填写表格。他们说他们有房有车,而且负债累​​累。

对于那个用户,我想向他们展示有关处理债务的内容,仅此而已。

另一个用户填写表单。他们说他们租了车,还租了一辆车,而且他们的债务还算适中。

对于该用户,我想显示相同的债务内容,稍作修改,因为他们的债务不那么极端。除此之外,我还想展示有关购买房屋和购买二手车的好处的内容。

每个用户都有唯一的属性组合,并且为每个属性提供自定义内容。

【问题讨论】:

  • 使用数据库,那么你就不需要做检查了——软编码比硬编码好;)
  • 这数百个用户选项如何影响内容的呈现?你能举一些具体的例子吗?
  • 基本上,为用户提供文本内容的帖子。但是逐段文本是根据他们的输入定制的。有些内容是全球性的——所有用户都可以看到,无论他们的输入如何——但大部分内容是个性化的。

标签: javascript php if-statement logic user-input


【解决方案1】:

我同意 Kyle 的观点 - 插入数据库,然后创建一个类来处理查询新数据库记录的数据操作。

举个简单的例子:

  1. 用户在页面上的表单中输入所有数据
  2. 用户提交表单
  3. 在随后的页面上,您要做的第一件事是在 MySQL 表中创建一个新记录(或多个记录)并获取新创建的 ID 留作记录
  4. 现在您可以拥有一个类或一组类来处理每个数据点或数据集

我对你的最终目标不是很清楚,但我可能会使用一个模板页面来实例化上面引用的类,并且对于我想要显示的每个数据点,我会调用该对象中的一个函数来完成业务逻辑。它不一定是比直接使用 $_POST 数据更好的解决方案,但对我来说,这种方法可以帮助我在逻辑上以简洁、简化的方式分解任务。 (注意:这应该解决嵌套的 'if's 但可能不会缩短您的代码本身。)

更新: 实际上,我做的事情与您所说的类似,但自定义内容要少得多,并且我使用 .txt 模板文件,然后基本上对其进行解析。 模板(静态):

<p>
Hi {recipientFname},<br>
{senderFname} has nominated you for membership into blah blah. As per your conversation with him, visit the site by following the below URL for your next steps.<br><br>
{choiceLines}
</p>

然后我有一个课程可以完成所有肌肉工作,但重要的部分在这里:

    $arr_tpl_vars = array('{salutation}',
                        '{directMessage}',
                        '{referralMessage}',
                        '{senderFname}',
                        '{parentFname}',
                        '{parentLname}',
                        '{memberFname}',
                        '{memberLname}',
                        '{recipientFname}'
    );
    $arr_tpl_data = array($this->recipient_salutation, 
                        $directMessage, 
                        $referralMessage, 
                        $this->sender_fname, 
                        $this->parent_fname, 
                        $this->parent_lname, 
                        $this->memberFname, 
                        $this->memberLname, 
                        $recipFname);
    $msg = str_replace($arr_tpl_vars, $arr_tpl_data, $msg_tmpl);

使用上面的代码,我基本上加载了模板,将要查找的字符串数组提供给它(所有可替换的内容都用 {string} 表示),然后函数替换所有内容。

在您的情况下,我将定义要在业务逻辑功能中使用的文本(例如:$this->recipient)...

【讨论】:

  • 所以最终的结果是自定义的文本内容。用户看到一页文本,但文本本身是根据他们的输入进行个性化的。有些人可能会看到建议一种行动方案的文字,而另一些人可能会看到另一种行动方案。由于变量很多,因此该文本内容可能有 100 个不同的可能实例。
  • 我认为使用数据库很有意义,但我认为我仍然想念它如何帮助逻辑。无论我是从 $_POST 还是从数据库中提取数据,我仍然需要根据每个数据点来整理最终内容。
  • 查看更新以回答上面的问题 - 我认为它可能会回答您的需求,DB 或没有 DB。
猜你喜欢
  • 2022-10-14
  • 2022-01-11
  • 2014-08-19
  • 2022-11-23
  • 1970-01-01
  • 1970-01-01
  • 2013-02-16
  • 2022-12-18
  • 1970-01-01
相关资源
最近更新 更多