Пытаюсь разобраться с примером модуля аннотации.
Суть в том, что в hook_nodeapi (annotate_nodeapi) к уже сущестующему контенту добавляет форму для ввода пользователем текста аннотации.
Далее текст аннотации сохраняется в БД (по нажатию submit).
1. добавление формы в примере происходит так:
'#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. Но таким способом это не передается (в функции "переданная" переменная - пустая).
вот сама функция:
// определить 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?
Комментарии
Ага проблемма аналогичная. Пока тоже в поиске. Буду благодарен за возможную помощь.
хотел бы заодно предостеречь от 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.
Даже при полностью отключенном кешировании файлы модуля все равно кешируются.
logicsun, мой hook_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, я его убрал.
В функции-конструкторе первый аргумент $form_state, второй тот который передаете из drupal_get_form(), в вашем случае $node.
penexe, спасибо!
было и не работало:
...
}
решение (стало и работает):
...
}
Не могу добавить значение из текстового поля в БД. Скрипт вносит в БД значения но значение $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.'));
}
Признайтесь, только честно. Вы вообще массив $form_value смотрели?
Он во-первых желательно бы должен называться $form_state, а во вторых $form_value['values']