Php 如何将动态创建的列表传递给控制器以保存到数据库中?

Php 如何将动态创建的列表传递给控制器以保存到数据库中?,php,zend-framework,concrete5,Php,Zend Framework,Concrete5,我在Concrete5工作,对MVC概念还不熟悉。我有一个jquery,它从我视图中的文本框创建一个无序列表。如果您熟悉Concrete5,这是我添加列表的块的视图。它基本上是一个产品的功能列表。此视图需要将列表保存到数据库基文件中。通常,这只需使用保存信息的变量即可完成(也就是说,视图中的所有其他内容都是这样保存的)。我遇到的问题是,我不知道如何使用控制器将无序列表从视图传递到控制器,再传递到数据库,以便保存它。任何帮助和示例代码都将不胜感激。我非常确定我需要在控制器中编写一个php函数来获取

我在Concrete5工作,对MVC概念还不熟悉。我有一个jquery,它从我视图中的文本框创建一个无序列表。如果您熟悉Concrete5,这是我添加列表的块的视图。它基本上是一个产品的功能列表。此视图需要将列表保存到数据库基文件中。通常,这只需使用保存信息的变量即可完成(也就是说,视图中的所有其他内容都是这样保存的)。我遇到的问题是,我不知道如何使用控制器将无序列表从视图传递到控制器,再传递到数据库,以便保存它。任何帮助和示例代码都将不胜感激。我非常确定我需要在控制器中编写一个php函数来获取列表,但我不确定代码是什么

auto.js

$("#addList").click(function() {
    var text = $("#inputList").val() + '<button>x</button>';
    if(text.length){
        $('<li />', {html: text}).appendTo('ul.featureList')
        };
});
$('ul').on('click','button', function(el){
    $(this).parent().remove()
});
$(“#添加列表”)。单击(函数(){
var text=$(“#输入列表”).val()+'x';
如果(文本长度){
$('
  • ',{html:text}).appendTo('ul.featureList') }; }); $('ul')。在('click','button',函数(el)上{ $(this.parent().remove()) });
  • add/edit.php

    <div class="ccm-block-field-group">
    <h2><?php echo t('Features') ?></h2>
    
    
    
    现在,“features”是数据库文件db.xml中字段的名称 区域特征列表是生成列表的位置。我知道需要改变一下才能工作,只是不确定

    <?php echo $form->textarea('features', $features, array());?>
    <input type="test" id="inputList" />
    <button type="button" id="addList">Add</button> 
    <ul class="featureList"></ul>
    </div>
    
    
    添加
    
      view.php

      echo "<h2>{$proName}</h2>";
      echo "{$description}";
      echo "<h3>{$features}</h3>";
      echo "<h2>{$price}</h2>";
      echo "<p>{$priceInfo}</p>";
      
      echo“{$proName}”;
      回显“{$description}”;
      回显“{$features}”;
      回声“{$price}”;
      回声“{$priceInfo}

      ”;
      db.xml

      <field name="features" type="X2"></field>
      

      您不能将内容从视图传递到控制器。控制器在视图之前执行,因此您只能从一个控制器传递到另一个视图

      尝试使用访问从jquery传递到应用程序的内容

      $this->getRequest()->getParam('yourParametersName');
      
      在控制器内部


      Lucian

      对于混凝土5块,您可能会遇到两种不同的情况:

    • 管理员用户正在编辑块(或添加新块),您希望将此数据保存到数据库中
    • 公共用户正在查看块,但块视图本身有一个表单(例如,联系人表单块),您希望在提交公共表单时执行某些操作(例如,向管理员发送通知电子邮件,告知有人已填写表单,或将提交内容存储在数据库中以备将来查看)
    • 如果您讨论的是情况1,则需要在控制器的
      save()
      方法中放入一些自定义代码。如果您讨论的是情况2,那么您需要在控制器中创建自己的操作方法,并且需要在view.php文件中实际有一个

      更新:根据您添加到问题中的示例代码,以下是解决方案: 数据返回服务器的唯一方法是通过表单POST<代码>
    • 元素不是表单字段,因此它们中的数据不会随表单一起发布。因此,在向页面添加新的
    • 元素时,还应添加一个隐藏的表单字段,如下所示:

          var listItemCounter = 0;
      $("#addList").click(function() {
              listItemCounter++;
          var text = $("#inputList").val() + '<button data-id="' + listItemCounter + '">x</button>'; //assign a unique id number to this button, so it knows which hidden field to remove when clicked
          if(text.length){
              $('<li />', {html: text}).appendTo('ul.featureList');
              $('<input type="hidden" name="features[]" value="' + text + '" data-id="' + listItemCounter + '" />').insertAfter('ul.featureList');
          };
      });
      $('ul').on('click','button', function(el){
              $('input[data-id="' + $(this).attr('data-id') + '"]').remove(); //remove the hidden field so it does not get POSTed when user saves
          $(this).parent().remove();
      });
      
      最后,在view.php文件中,您可以转换功能列表(作为一个字符串保存到数据库中,每个项目由一个“换行符”分隔),如下所示:

      
      
      或者,如果要将其作为单独的列表项输出,可以执行以下操作:

      <ul>
      <?php
      $features = explode("\n", $features);
      foreach ($features as $feature) {
          echo '<li>' . $feature . '</li>';
      }
      ?>
      </ul>
      

      我更改了auto.js文件,如下所示。看起来很好用

      var listItemCounter = 0;
      $("#addList").click(function() {
          listItemCounter++;
          var text = $("#inputList").val(); //assign a unique id number to this button, so it knows which hidden field to remove when clicked
          var buttonDataId = text + '<button data-id="' + listItemCounter + '">x</button>';
          if(text.length){
              $('<li />', {html: buttonDataId}).appendTo('ul.featureList');
              $('<input type="hidden" name="features[]" value="' + text + '" data-id="' + listItemCounter + '" />').insertAfter('ul.featureList');
              };
      });
      $('ul').on('click','button', function(el){
          $('input[data-id="' + $(this).attr('data-id') + '"]').remove();//remove the hidden field so it does not get POSTed when user saves
          $(this).parent().remove()
      });
      
      var listItemCounter=0;
      $(“#添加列表”)。单击(函数(){
      listItemCounter++;
      var text=$(“#inputList”).val();//为该按钮指定一个唯一的id号,以便它知道单击时要删除哪个隐藏字段
      var ButtonDaid=文本+x';
      如果(文本长度){
      $('
    • ',{html:buttondaid}).appendTo('ul.featureList'); $('').insertAfter('ul.featureList'); }; }); $('ul')。在('click','button',函数(el)上{ $('input[data id=“”+$(this).attr('data-id')+“]”]).remove();//删除隐藏字段,以便在用户保存时不会将其过帐 $(this.parent().remove()) });
    • 我留下的观点与乔丹·列夫所说的相同。(谢谢!) 然后我将controller.php更改为

      公共函数保存($args){
      $args['features']=内爆(“\n”,$args['features']);//将所有要素项合并为一个字符串,由“换行符”分隔
      父::保存($args);
      }

      如果有人看到任何问题或更好的方式来放置我的代码,请让我知道!
      我现在的新问题是,一旦保存,如果我去编辑列表,它会清除我过去的条目并保存新条目。如果有人知道我必须编写的函数,以显示当前列表,并在编辑时添加到其中,那将是非常棒的。请给出一些示例代码。

      您可以发布您已有的代码吗?如果我看一下并指出您需要更改哪些内容来支持列表,可能会更容易一些。我不确定你需要看每一部分的哪些部分。也许如果你能就页面应该如何交互给出一些建议,我会有更好的理解,并且可以发布相应的代码部分。还有我的控制器、视图、js和添加/编辑php页面。添加/编辑页面将更新视图。这就是我动态生成的列表所在的位置。我需要它来存储所有li值并将其保存到数据库中,以便在加载view.php时显示列表。这是一个非常有用的建议。我要试一试。谢谢。如果你看看我在问题下面的评论,也许你可以很快给我一些建议。我是新手,所以非常感谢您的帮助。谢谢,情况1。我正在创建一个产品块,希望能够在添加/编辑页面内动态填充功能列表。我使用auto.js文件在输入框中创建带有值的
    • 标记。这些
    • 标记和值显示在下面。我需要保存每个
    • +val+
    • ,以便显示它
      <ul>
      <?php
      $features = explode("\n", $features);
      foreach ($features as $feature) {
          echo '<li>' . $feature . '</li>';
      }
      ?>
      </ul>
      
      var listItemCounter = 0;
      $("#addList").click(function() {
          listItemCounter++;
          var text = $("#inputList").val(); //assign a unique id number to this button, so it knows which hidden field to remove when clicked
          var buttonDataId = text + '<button data-id="' + listItemCounter + '">x</button>';
          if(text.length){
              $('<li />', {html: buttonDataId}).appendTo('ul.featureList');
              $('<input type="hidden" name="features[]" value="' + text + '" data-id="' + listItemCounter + '" />').insertAfter('ul.featureList');
              };
      });
      $('ul').on('click','button', function(el){
          $('input[data-id="' + $(this).attr('data-id') + '"]').remove();//remove the hidden field so it does not get POSTed when user saves
          $(this).parent().remove()
      });