Arrays 将张贴的多个阵列转换为codeigniter';s插入批处理样式
我正在尝试使用Codeigniter创建多语言形式 我有一个POST数组,如下所示:Arrays 将张贴的多个阵列转换为codeigniter';s插入批处理样式,arrays,forms,codeigniter,batch-file,multilingual,Arrays,Forms,Codeigniter,Batch File,Multilingual,我正在尝试使用Codeigniter创建多语言形式 我有一个POST数组,如下所示: Array ( [title] => Array ( [en] => English Title [de] => German Title ) [url] => Array ( [en] => English URL [de] => German URL ) ) 我想将
Array
(
[title] => Array
(
[en] => English Title
[de] => German Title
)
[url] => Array
(
[en] => English URL
[de] => German URL
)
)
我想将其转换为codeigniterinsert\u batch('tablename',$data)
格式,如:
Array
(
[0] => Array
(
[lang] => en
[title] => English Title
[url] => English URL
)
[1] => Array
(
[lang] => de // Assuming user didn't fill `_de` labeled input fields.
[title] =>
[url] =>
)
)
数据库中存储的数据如下:
|id|lang| title | url |
|--|----|---------------|-------------|
| | en | English Title | English URL |
---------------------------------------
我怎样才能做到这一点?我需要将post数组转换为insert\u batch
的数据数组样式。上面,array[1]
只包含前缀为lang
的asde
。所以array[1]
对我来说是空的。因此,我还需要从final$data
中删除空数组
在下面,您将找到查看文件
<div id="tabs">
<?php echo form_open('controller/post_target',array('name'=>'add_page')); ?>
<ul>
<?php foreach($lang_data as $r):?>
<li><a href="#tab_<?=$r->lang;?>"><?=$r->name;?></a></li>
<?php endforeach; ?>
</ul>
<?php foreach($query_lang as $r):?>
<div id="tab_<?=$r->lang;?>">
<?php echo form_label('Page Title','title'); ?>
<?php
$attr1 = array('name' => 'title[' . $r->lang . ']');
echo form_input($attr1);
$attr2 = array(name' => 'url[' . $r->lang . ']');
echo form_input($attr2);
?>
</div>
<?php endforeach; ?>
<?php echo form_submit('submit','Save'); ?>
<?php echo form_close(); ?>
</div>
您可以创建一些函数来实现这一点。由于lang
属性具有特殊的行为(与title或url不同),因此我认为最好在数组中定义语言
我在下面创建了两个函数,第一个函数将输入数据转换为批插入所需的格式,第二个函数删除空行(lang
),因为它将始终被设置
我建议您使用要翻译的字段手动设置$data,不要传递整个$\u POST
值。您可能会在将来添加其他未翻译的输入,我建议使用白名单机制来翻译所有输入,而不是黑名单(取消提交按钮)
更新
添加$fields参数作为已翻译字段的列表
$langs = array_keys($post["title"]);
$batch = array();
foreach ($langs as $lang) {
$tmp = array();
$tmp["title"] = $post["title"][$lang];
$tmp["url"] = $post["url"][$lang];
$batch[] = $tmp;
}
我想,你也可以这样做:
未经测试,也未检查帖子结构中的任何错误。它工作得非常好。我在模型中添加了函数,然后它就工作了。你介意我问你更多关于白名单而不是unset['submitBuyyonName']的问题吗?在将来的情况下,使用白名单的想法有一些好处,在这种情况下,您可能会添加新字段,而这些字段不是来翻译表单中的(例如,一个标记url为活动的复选框)。另一个方面涉及到安全性:您需要从提交的表单中提取所需的值,而不是将所有内容保存到数据库中。如果您有任何问题,请随时向Hanks寻求帮助。复选框正是我昨天评论的原因:)也许我应该提出一个新的问题,但基本上,如果你有时间的话,基本功能应该是如何白名单选定的数组元素。再次谢谢。嗨。我更新了代码,并在函数为插入准备数据中添加了参数$fields
。此参数应包含一个包含要转换的字段的数组,以便忽略其他字段(如复选框或提交值)。这就是我所说的创建一个包含要翻译的字段的白名单的意思。我希望它能帮你大忙。非常感谢您的贡献@mazzucci。谢谢您的回复。。。马祖奇的方式给了我更多的家的感觉。
$data = prepare_data_for_insert($data, array('title', 'url'), array('en', 'de'));
var_dump($data);
$data = remove_empty_rows($data, array('lang'));
var_dump($data);
function prepare_data_for_insert($data, $fields, $langs) {
$result = array();
$i = 0;
// foreach language defined
foreach ($langs as $lang) {
// set the languge
$result[$i]['lang'] = $lang;
// foreach field that we want to translate
foreach ($fields as $field) {
// set the value for the current language
$result[$i][$field] = $data[$field][$lang];
}
$i++;
}
return $result;
}
function remove_empty_rows($data, $ignore_fields = array()) {
$result = array();
// result
foreach ($data as $item) {
$has_values = false;
foreach ($item as $key => $value) {
// check if the key is ignored
if (in_array($key, $ignore_fields)) {
continue;
}
// if a value was set
if ($value != '') {
// the array has values
$has_values = true;
// don't search for other values
break;
}
}
// if the array has values
if ($has_values) {
// save the row in the result
$result[] = $item;
}
}
return $result;
}
$langs = array_keys($post["title"]);
$batch = array();
foreach ($langs as $lang) {
$tmp = array();
$tmp["title"] = $post["title"][$lang];
$tmp["url"] = $post["url"][$lang];
$batch[] = $tmp;
}