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