问题
I have nodes keeping a picture. There is a task to provide an ability to select a type and a size of the picture in every node for further downloading to the end user device. To do this, I want to attach a form under every node to allow user select a type and a size they need. After user select it and put submit-button I want to process user's request, to generate the picture they need on the server side and make somehow his browser to download it. But I have no idea how to achieve this because I don't understand a mechanism of client-server exchange in Drupal 7. I know basic Form API, but it does not help me. So, what can you advice?
EDIT 1
This is a source code of my module testmodule.module
<?php
function testmodule_custom_form($form, &$form_state) {
$form=array();
$form['image_types'] = array(
'#type' => 'radios',
'#title' => t('Select image type to download'),
'#options' => array(0 => t('SVG'), 1 => t('PNG'), 2 => t('ICON')),
);
$form['image_sizes'] = array(
'#type' => 'radios',
'#title' => t('Select image size'),
'#options' => array(0 => t('100x100'), 1 => t('200x200')),
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Download'),
);
return $form;
}
function testmodule_custom_form_submit($form, &$form_state) {
drupal_set_message('IT WORKS!!!');
}
function testmodule_node_view($node, $view_mode, $langcode) {
if($node->type === 'article') {
$my_form = drupal_get_form('testmodule_custom_form', $node);
$node->content['attached_form'] = array(
'#markup' => drupal_render($my_form),
'#weight' => 99,
);
}
}
function testmodule_node_presave($node) {
$node->body[$node->language][0]['format'] = 'full_html';
if ($node->field_image_svg[$node->language])
{
$file = file_load($node->field_image_svg[$node->language][0]['fid']);
$image = new Imagick(drupal_realpath($file->uri));
$image->setImageFormat("png");
$destination = 'public://pngimages/'.$file->filename.'.png';
$image->writeImage(drupal_realpath($destination));
$data = file_get_contents(drupal_realpath($destination));
$file = file_save_data($data, $destination, FILE_EXISTS_REPLACE);
$node->field_image[$node->language][0] = (array)$file;
}
}
?>
回答1:
One way to do this is to create a custom module with a form callback function.
Code sample:
function YOUR_MODULE_custom_form($form, &$form_state) {
// your form controls and inputs go here
}
function YOUR_MODULE_custom_form_submit($form, &$form_state) {
// your form submission handler.
// your image resizing logic and any other logic should go here
}
Then in order to attach this form to nodes, create a hook_node_view implementation.
function YOUR_MODULE_node_view($node, $view_mode, $langcode)
{
if($node->type === 'YOUR_CONTENT_TYPE') {
$my_form = drupal_get_form('YOUR_MODULE_custom_form', $node);
$node->content['your_attached_form'] = array(
'#markup' => drupal_render($my_form),
'#weight' => 99,
);
}
}
Hope this gets you started. I highly recommend taking your time getting familiar with Drupal form API and creating custom modules, that would make your life a lot easier :).
回答2:
An alternative approach that I generally prefer, is to use programatic blocks with defaults.
I've implements one in your code and cleaned up a few items to bring better into line with coding standards.
/**
* Implements hook_form().
*/
function testmodule_custom_form($form, &$form_state) {
$form = array();
$form['image_types'] = array(
'#type' => 'radios',
'#title' => t('Select image type to download'),
'#options' => array(0 => t('SVG'), 1 => t('PNG'), 2 => t('ICON')),
);
$form['image_sizes'] = array(
'#type' => 'radios',
'#title' => t('Select image size'),
'#options' => array(0 => t('100x100'), 1 => t('200x200')),
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Download'),
);
return $form;
}
/**
* Implements hook_form_submit().
*/
function testmodule_custom_form_submit($form, &$form_state) {
drupal_set_message('IT WORKS!!!');
}
/**
* Implements hook_block_info().
*/
function testmodule_block_info() {
$blocks = array();
$blocks['image_download'] = array(
'info' => t('Node - Image download'),
'status' => 1,
'region' => 'content',
'visibility' => BLOCK_VISIBILITY_LISTED,
'pages' => 'node/*',
'cache' => DRUPAL_CACHE_PER_PAGE,
'weight' => 1,
);
return $blocks;
}
/**
* Implements hook_block_view().
*/
function testmodule_block_view($delta = '') {
$n = menu_get_object();
if (!$n || $n->type != 'only_particular_content_type') {
return FALSE;
}
if ($delta == 'image_download') {
return array(
'content' => drupal_get_form('testmodule_custom_form'),
);
}
return FALSE;
}
/**
* Implements hook_node_presave().
*/
function testmodule_node_presave($node) {
$node->body[$node->language][0]['format'] = 'full_html';
$field_image_svg = field_get_items('node', $node, 'field_image_svg');
if (!$field_image_svg) {
return;
}
$file = file_load($field_image_svg[0]['fid']);
$image = new Imagick(drupal_realpath($file->uri));
$image->setImageFormat("png");
$destination = 'public://pngimages/'.$file->filename.'.png';
$image->writeImage(drupal_realpath($destination));
$data = file_get_contents(drupal_realpath($destination));
$file = file_save_data($data, $destination, FILE_EXISTS_REPLACE);
$node->field_image[$node->language][0] = (array)$file;
}
来源:https://stackoverflow.com/questions/27012655/working-with-forms-in-drupal-7