我在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中字段的名称,area 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>发布于 2013-02-20 09:45:55
我对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); }
如果任何人看到任何问题或更好的方式来放置我的代码,请让我知道!我现在的新问题是,一旦它被保存,如果我去编辑列表,它会清除我过去的条目并保存新的条目。如果有人知道这个函数,我将不得不编写以显示当前列表,并在编辑时添加到列表中,这将是很棒的。请给出一些示例代码。
发布于 2013-02-20 05:44:10
对于concrete5块,您可能会遇到两种不同的情况:
如果您讨论的是情况#1,则需要在控制器的save()方法中放入一些自定义代码。如果您讨论的是第二种情况,您需要在控制器中创建自己的操作方法,并且需要在view.php文件中实际拥有一个<form>。
更新:根据您添加到问题中的示例代码,以下是解决方案:您的数据可以返回到服务器的唯一方法是通过表单POST。<li>元素不是表单字段,因此其中的数据不会随表单一起发布。因此,在将新的<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()方法,该方法将从这些隐藏字段中获取所有数据,组合它们并将它们放入您在db.xml文件中声明的"features“字段中:
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>发布于 2013-02-20 02:51:07
您不会将内容从视图传递到控制器。控制器在视图之前执行,因此您只需在控制器之间传递。
尝试使用以下命令访问从jquery传递到应用程序的内容
$this->getRequest()->getParam('yourParametersName');在控制器内部。
卢西恩
https://stackoverflow.com/questions/14948181
复制相似问题