Php 如何使用AddMore选项在Drupal7Ajax表单中保留和检索图像细节?
我的自定义模块代码:Php 如何使用AddMore选项在Drupal7Ajax表单中保留和检索图像细节?,php,forms,drupal,drupal-7,Php,Forms,Drupal,Drupal 7,我的自定义模块代码: <?php function my_module_menu() { $items = array(); $items['form-example'] = array( 'title' => 'My Module Form', 'description' => 'A form to mess around with.', 'page callback' => 'drupal_get_form',
<?php
function my_module_menu() {
$items = array();
$items['form-example'] = array(
'title' => 'My Module Form',
'description' => 'A form to mess around with.',
'page callback' => 'drupal_get_form',
'page arguments' => array('my_module_form'),
'access callback' => TRUE
);
return $items;
}
function my_module_form($form, &$form_state, $no_js_use = FALSE) {
$form['file'] = array(
'#type' => 'file',
'#title' => t('Image'),
'#description' => t('Upload an image'),
);
$form['menu'] = array(
'#markup' => '<b>Add More:</b>'
);
$form['#tree'] = TRUE;
$form['names_fieldset'] = array(
'#type' => 'fieldset',
'#title' => t('Add more images'),
'#prefix' => '<div id="names-fieldset-wrapper">',
'#suffix' => '</div>',
);
if (empty($form_state['num_names'])) {
$form_state['num_names'] = 1;
}
for ($i = 0; $i < $form_state['num_names']; $i++) {
$form['names_fieldset']['name'][$i][0]= array(
'#title' => t('Image'),
'#type' => 'file',
'#weight' => '5',
'#description' => t('Upload an image'),
);
}
$form['names_fieldset']['add_name'] = array(
'#type' => 'submit',
'#value' => t('Add one more'),
'#submit' => array('my_module_add_more_add_one'),
'#ajax' => array(
'callback' => 'my_module_add_more_callback',
'wrapper' => 'names-fieldset-wrapper',
),
);
if ($form_state['num_names'] > 1) {
$form['names_fieldset']['remove_name'] = array(
'#type' => 'submit',
'#value' => t('Remove one'),
'#submit' => array('my_module_add_more_remove_one'),
'#ajax' => array(
'callback' => 'my_module_add_more_callback',
'wrapper' => 'names-fieldset-wrapper',
),
);
}
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Submit'),
);
$form['#submit'][] = 'my_module_add_more_submit';
if ($no_js_use) {
if (!empty($form['names_fieldset']['remove_name']['#ajax'])) {
unset($form['names_fieldset']['remove_name']['#ajax']);
}
unset($form['names_fieldset']['add_name']['#ajax']);
}
return $form;
}
function my_module_add_more_callback($form, $form_state) {
return $form['names_fieldset'];
}
function my_module_add_more_add_one($form, &$form_state) {
$form_state['num_names']++;
$form_state['rebuild'] = TRUE;
//$form_state['no_redirect'] = TRUE;
}
function my_module_add_more_remove_one($form, &$form_state) {
if ($form_state['num_names'] > 1) {
$form_state['num_names']--;
}
$form_state['rebuild'] = TRUE;
}
function my_module_add_more_submit($form, &$form_state) {
$file = $form_state['values']['file']."<br \>";
$validators = array();
$file = file_save_upload('file', $validators, 'public://uploads');
print_r($file);
exit();
}
看看这篇文章——因为它有一些关于代码中缺少的东西的信息$三角洲$delta是分配给字段值的id,即使您的字段只有一项。转储您创建的文件字段时,您会看到什么?如果您使用“添加一个或多个”按钮获得所有信息以及添加的信息,您可以使用:echo''了解值的正确结构;打印($form_state['values']);echo“”:
您的代码有几个问题
for ($i = 0; $i < $form_state['num_names']; $i++) {
$form['names_fieldset'][$i]['name']= array(
'#title' => t('Image'),
'#type' => 'file',
'#weight' => '5',
'#description' => t('Upload an image'),
// We need this to know which file element this is.
// By default drupal would name all as files[names_fieldset]
'#name' => 'files[names_fieldset_' . $i . '_name]',
);
}
第一个问题是,提交函数只处理第一个上传字段,它实际上被称为“文件”。但对处理其他领域却毫无作用
第二个问题是,它将上传并保存第一个字段,每次你点击“添加一个更多”,这将复制你的上传。如果没有AJAX,您不会遇到这个问题,但是如果您想添加它,您会的
我会作出以下更改:
删除$form['#tree']=TRUE
并将其添加到字段集<代码>$form['names_fieldset']['#tree']=TRUE当然,在您声明字段集之后,代码>
将字段集中文件字段的声明方式(在for
循环中)更改为:
通过这些更改,我们在树中设置了一个表单字段名aware。我们仅在单击“提交”按钮时触发上载,并且仅针对实际添加了文件的表单字段。此外,我们上传使用默认方案,并不总是使用公共方案
当然,代码需要一些消息让用户知道上传了多少文件、名称或任何其他有价值的信息 通过核心文件
模块进行调试可能有助于理解正在发生的事情。对于测试,将文件字段添加到内容类型并上载该文件。看看会发生什么。文件上传得很好。但问题是一个字段集中有多个图像字段。当我对我创建的文件字段进行var_转储(var_dump($form['file']);)时,我无法在整个表单中看到所选图像的任何值。我只能获得字段类型、标题和描述等详细信息。不!在提交函数中不是$form['file'],所有提交的值都处于$form_状态。使用后我得到一个空白页:print_r($form_状态['values']['file']);在表单提交功能中。为什么不试试print\R($form\u state);退出代码>在你的ubmit函数中?您不能使用print_R($form_state['values']['file'],因为您的字段名不是'file',对吗?请查看以下链接:问候。
function my_module_add_more_submit($form, &$form_state) {
if ($form_state['values']['op'] == 'Submit') {
$validators = array();
$files = array();
if (!empty($_FILES['files']['name']['file'])) {
$files[] = file_save_upload('file', $validators, file_default_scheme() . '://uploads');
}
foreach ($form_state['values']['names_fieldset'] as $name => $field) {
if ($name != 'add_name') {
$file_name = implode('_', $form['names_fieldset'][$name]['name']['#parents']);
if (!empty($_FILES['files']['name'][$file_name])) {
$files[] = file_save_upload($file_name, $validators, file_default_scheme() . '://uploads');
}
}
}
}
}