[решено] передача значения переменной в форму

Главные вкладки

Аватар пользователя kaoru kaoru 17 июня 2009 в 16:56

Пытаюсь разобраться с примером модуля аннотации.
Суть в том, что в hook_nodeapi (annotate_nodeapi) к уже сущестующему контенту добавляет форму для ввода пользователем текста аннотации.
Далее текст аннотации сохраняется в БД (по нажатию submit).

1. добавление формы в примере происходит так:

$node->content['annotation_form'] = array(
        '#value' => drupal_get_form('annotate_entry_form', $node),
        '#weight' => 10
);

однако, в API функция drupal_get_form описанна только с одним аргументом: drupal_get_form($form_id).
вопрос: что означает такая странная запись: drupal_get_form('annotate_entry_form', $node)?

2. подозреваю, что таким способом передавалось значение переменной $node в функцию-конструктор формы annotate_entry_form. Но таким способом это не передается (в функции "переданная" переменная - пустая).
вот сама функция:

function annotate_entry_form($node) {
        // определить fieldset
        $form['annotate'] = array(
                '#type' => 'fieldset',
                '#title' => t('Annotations')
        );
        // определить textarea внутри fieldset
        $form['annotate']['note'] = array(
                '#type' => 'textarea',
                '#title' => t('Notes'),
                '#default_value' => isset($node->annotation) ? $node->annotation : '',
                '#description' => t('Make your annotations about THIS!')
        );
        // сохранить id ноды (для удобства)
        $form['annotate']['nid'] = array(
                '#type' => 'value',
                '#value' => $node->nid
        );
        // определить функцию submit
        $form['annotate']['submit'] = array(
                '#type' => 'submit',
                '#value' => t('Написать!')
        );
        return $form;
}

вопрос: как же все таки передать значение переменной $node в функцию-конструктор формы annotate_entry_form?

Комментарии

Аватар пользователя logicsun logicsun 20 июня 2009 в 17:29

Ага проблемма аналогичная. Пока тоже в поиске. Буду благодарен за возможную помощь.

хотел бы заодно предостеречь от 2х других грабель с которыми столкнулся в этом же уроке.

грабли у меня возникли в следующем:

в книге хук меню описывается так

<?php 
function annotate_menu($may_cache) {

 if(

$may_cache){
  
$items[] = array(
    
'path' => 'admin/settings/annotate',
    
'title' => t('Annotate settings'),
    
'description' => t('Change how annotation behave'),
    
'callback' => 'drupal_get_form',
    
'callback arguments' => array('annotate_admin_settings'),
    
'access' => array('administer site configuration'),
  );
 }
  return 
$items;
}
?>

Однако ж работоспособный код у меня, на Русском Друпале 6.6 на самом деле оказался следующий:

<?php 
function annotate_menu($cache=1) {

 if(

$cache){
  
$items['admin/settings/annotate'] = array(
    
'title' => 'Annotate',
    
'description' => t('Change how annotation behave'),
    
'page callback' => 'drupal_get_form',
    
'page arguments' => array('annotate_admin_settings'),
    
'access arguments' => array('administer site configuration'),
  );
 }
  return 
$items;
}
?>

Еще провозился с кешированием модулей.
Важно! что после внесения изменений в файл модуля необходимо очистить кеш на странице
admin/settings/performance.

Даже при полностью отключенном кешировании файлы модуля все равно кешируются.

Аватар пользователя kaoru kaoru 22 июня 2009 в 11:52

logicsun, мой hook_menu:

function annotate_menu() {
        $items['admin/settings/annotate'] = array(
                'title' => t('Annotation settings'),
                'description' => t('Change how annotations behave'),
                'page callback' => 'drupal_get_form',
                'page arguments' => array('annotate_admin_settings'),
                'access arguments' => array('administer site configuration'),
                'type' => MENU_NORMAL_ITEM,
                'file' => 'annotate.admin.inc',
        );
        return $items;
}

в книге, правда, в хук передавался аргумент $may_cache, но посмотрев api.drupal.ru, я его убрал.

Аватар пользователя penexe penexe 20 июня 2009 в 18:19

В функции-конструкторе первый аргумент $form_state, второй тот который передаете из drupal_get_form(), в вашем случае $node.

Аватар пользователя kaoru kaoru 22 июня 2009 в 12:12

penexe, спасибо!

было и не работало:

function annotate_entry_form($node) {
...
}

решение (стало и работает):

function annotate_entry_form($form_state, $node) {
...
}
Аватар пользователя ЕвгенийАнатольевич ЕвгенийАнатольевич 24 марта 2010 в 8:12

Не могу добавить значение из текстового поля в БД. Скрипт вносит в БД значения но значение $note пустое.

/*
* Сохраняем аннотацию в БД
*/
function annotate_entry_form_submit($form_id, $form_values){
global $user;
$nid = $form_values['nid'];
$note = $form_values['note'];
db_query ("DELETE FROM {annotations} WHERE uid = %d and nid = %d", $user->uid, $nid);
db_query ("INSERT INTO {annotations} (uid, nid, note, timestamp) VALUES (%d, %d, '%s', %d)", $user->uid, $nid, $note, time());
drupal_set_message(t('Your annotation was saved.'));
}