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

时间:2013-02-19 01:09:38

标签: php zend-framework concrete5

我在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()
});

添加/ edit.php

<div class="ccm-block-field-group">
<h2><?php echo t('Features') ?></h2>

现在'features'是我的数据库文件db.xml中字段的名称 区域featureList是生成列表的位置。我知道它需要稍微改变才能发挥作用,只是不确定。

<?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>";

db.xml

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

3 个答案:

答案 0 :(得分:1)

对于具体的5块,您可能会遇到两种不同的情况:

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

    更新:根据您添加到问题中的示例代码,以下是解决方案: 您的数据返回服务器的唯一方法是通过表单POST。 <li>元素不是表单字段,因此其中的数据不会使用表单进行POST。因此,当您向页面添加新的<li>元素时,您应添加隐藏的表单字段,如下所示:

        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();
    });
    

    现在,在你的块的controller.php文件中,你需要添加一个save()方法,它将从这些隐藏字段中获取所有数据,将它们组合起来并将它们放入你的“features”字段中在db.xml文件中声明:

    public function save($args) {
        $args['features'] = implode("\n", $args['features']); //combine all feature items into one string, separated by "newline" characters
        parent::save($args);
    }
    

    最后,在你的view.php文件中,你可以转换功能列表(它被保存到数据库中作为一个字符串,每个项目用“换行符”字符分隔),如下所示:

    <?php echo nl2br($features); ?>
    

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

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

答案 1 :(得分:0)

您不会将视图中的内容传递给控制器​​。控制器在视图之前执行,因此您只能从控制器传递到视图。

尝试使用

访问从jquery传递到应用程序的内容
$this->getRequest()->getParam('yourParametersName');

控制器内部。

卢西恩

答案 2 :(得分:0)

我更改了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()
});

我离开的视野与乔丹列夫的视图相同。 (谢谢!) 然后我将controller.php更改为

public function save($args) { $args['features'] = implode("\n", $args['features']);//combine all feature items into one string, separated by "newline" characters parent::save($args); }

如果有人发现任何问题或更好的方法来放置我的代码,请告诉我们! 我现在的新问题是,一旦它被保存,如果我去编辑列表,它会清除我过去的条目并保存新条目。如果有人知道我必须编写的函数来显示当前列表并在编辑时添加它会很棒。请举一些示例代码。