код в моем модуле
<?php
function mymodule_node_submit($node, $form, &$form_state) {
if ($node->type === 'news') {
if ($form_state['values']['checkbox_example']===1):
drupal_set_message('Вы отметили флажок!');
else:
drupal_set_message('Вы не отметили флажок!');
endif;
}
}
function
mymodule_form_node_form_alter(&$form, &$form_state) {
if (isset(
$form['#node_edit_form']) && $form['#node_edit_form'] === TRUE):
$form['options']['checkbox_example'] = array(
'#type' => 'checkbox',
'#title' => "Флажок",
'#default_value' => 0,
'#access' => user_access('administer nodes') ? TRUE : FALSE,
);
endif;
}
?>
при повторном редактирование... флажок не сохранен... подскажите как сохранять....
Комментарии
variable_set
а вот это
'#default_value' => 0
Вы зачем прописываете? Естественно у Вас всегда checkbox не отмечен.
ну то что изначально он не отмеченный... каким то он должен быть при создании и редактирование ноды.
это я знаю, а как это использовать в какой функции...
а Вы его(checkbox) принципиально полем ноды не хотите делать?
ну да. не хочу я поле. с полем все понятно.
и что его можно перенести в любую вкладку...
ну, дело Ваше, хотя по представленному коду я не вижу смысла в заморочках с отдельной обработкой и хранением checkbox'а. Ближе к телу, я бы создал таблицу в базе данных, по submit'у делаем db_insert или если нода уже существует, то db_update, в hook_form_alter соответственно опять же проверяем новая нода или нет (isset($form[''#node']->nid)), если новая, ставим '#default_value' => 0, если нет делаем db_select и полученное значение (0 или 1) подставляем в #default_value. Как-то так.
опять же не забываем про удаление ноды. соответственно реализуем hook_node_delete.
т.е. проще создать поле и перенести его в любой таб ноды (административный?) или создать свой таб... ?
в первоначальном вопросе не было ни слова по поводу вкладок. Вы бы задачу пояснили... Пока я не вижу никакого смысла в хранении простого checkbox'а отдельно от ноды.
Так в коде там во вкладке выводится чекбокс (там где опубликовать, на главную... ) это же где то хранится... так и мне хочется свое еще одно условие... которое в будущем хочется вытащить в рулесы.
модуль fieldgroup и поле чекбокс.
<?php function mymodule_node_submit($node, $form, &$form_state) {
variable_set('mymodule_checkbox_state', $state);
if ($node->type === 'news') {
$text = t('Checkbox is not selected');
$state = 0;
if ($form_state['values']['checkbox_example']) {
$state = 1;
$text = t('Checkbox is selected');
}
drupal_set_message($text);
}
}
function
mymodule_form_node_form_alter(&$form, &$form_state) {if (isset(
$form['#node_edit_form']) && $form['#node_edit_form'] === TRUE){$form['options']['checkbox_example'] = array(
'#type' => 'checkbox',
'#title' => t('Flag'),
'#default_value' => variable_get('mymodule_checkbox_state', 0),
'#access' => user_access('administer nodes') ? TRUE : FALSE,
);
}
} ?>
ЗЫ: у тебя в впримере if else написан в виде вставки в html, это не надо, не к месту
Спасибо.
А что необходимо делать с этим модулем что бы этот чекбокс пропал в рулесы туда же где... и опубликовть/неопубликовать, нна главную, закрепить...
это не то. там вертикальные табы другие создаются.. отдельно от этих админных...
volocuga[at]drupal.org я может чего не понимаю, но вот я создал условно node 1 (не отметил чекбокс), потом создал node 2 (отметил чекбокс), а потом решил отредактировать node 1. По идее чекбокс там не отмечен, а у Вас он появится отмеченным, если я ничего не путаю. т.е. у Вас одна переменная на все
случаи жизниноды. Как человек потом узнает где (в какой ноде) был отмечен чекбокс, а где нет?Общий вопрос от iNFerNo (см. заголовок топика) - общий ответ на него же. nid нужно где то хранить, очевидно в виде массива, где ключ - nid ноды, value - всё остальное
а Вы вообще переписку-то читали? и какой же это общий ответ? это прямой указание использовать variables. и непонятно зачем их вообще использовать, если плюс к этому надо еще где-то хранить nid и value.
Вы хотите использовать каждую переменную для каждой ноды? а если их 100000?
Можно обходится ОДНОЙ переменной
<?php
$states
= array('123' => 1, // Нода с id 123, чекбокс отмечен
'456' => 0,
'276' => 1,
'231' => 0,
); variable_set('mymodule_checkbox_state', $states); ?>
насчёт использования variables, так это самый простой способ сохранить что либо и легко получить назад без доп запросов к БД, так как все variables загружаются в $conf при бутстрапе друпала
Разговор слепого с глухим. Я вообще НЕ ХОЧУ использовать переменные. А из-вашего последнего примера, кстати о птичках, если нод сто тысяч, то Вы что - будете такого размера массив в переменной держать??? Плюс это добро еще и грузится будет при каждой загрузке страницы? Призываю Вас еще раз перечитать переписку с самого изначального вопроса iNFerNo. Не трудно увидеть, что я предлагал вариант с отдельной таблицей, если уж очень хочется держать все это отдельно, но мое мнение, что не надо заморачиваться, надо просто сделать поле ноды и настроить его вывод в форме.
iNFerNo вобщем вот, что хочу сказать, мое мнение - надо делать поле. Вариант от volocuga[at]drupal.org тоже, ессно, имеет право на существование. Но по мне, все равно проще поле.
«Разговор слепого с глухим»
дык Инферно спросил как использовать variable_set, я и отписал, всего то :). Я зарёкся не отвечать в топиках Инферно, но сегодня чёрт дёрнул
Кстати, хоть и написано так
<?phpfunction mymodule_node_submit($node, $form, &$form_state) {
if ($node->type === 'news') {
?>
а чекбокс везде во всех типах нод появляется... чойто?
Это не хорошее решение так как пока я не доделаю себе сайт я вопросы буду задавать и задавать, на которые ответа в сети не нахожу на др сайтах и блогах.
самописные модули же не создают поле программно, а именно как волокуда добавляют поля в вертикальное меню...
ксти воспользовался вариантом gorr - юзать группы полей вертикальные думал мало ли может туда куда надо пихнет поля, а нет свои вертикальные создал в отрыве от настроечных, жаль... добавили бы фичу выводить в настройках-вертикальных табах...
--
Подскажите, вот есть решение
<?php
/**
* Регистрируем крючок hook_form_FORM_ID_alter().
*/
function ModuleName_form_node_form_alter(&$form, &$form_state, $form_id) {
if (isset($form['#node_edit_form']) && $form['#node_edit_form'] === true):
$form['options']['field_checkbox_example'] = $form['field_checkbox_example']; // - помещаем поле в вертикальную вкладку.
hide($form['field_checkbox_example']); // - избавляемся от дубля, скрывая его.
endif;
}
?>
добавляет поле в таб вертикальный типа материала.
вопрос а свой таб можно создать чтобы его туда закинуть то?
а еще не понятно, как для конкретной node_form код выше приспособить... изменить
это? if (isset($form['#node_edit_form']) && $form['#node_edit_form'] === true):
<?php
/**
* Регистрируем крючок hook_form_FORM_ID_alter().
*/
function ModuleName_form_node_form_alter(&$form, &$form_state, $form_id) {
if (isset($form['#node_edit_form']) && $form['#node_edit_form'] === true) {
$form['my_tab'] = array(
'#type' => 'fieldset',
'#access' => user_access('administer nodes'), //если надо ограничить доступ
'#title' => t('My important information'),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
'#group' => 'additional_settings',
'#attributes' => array(
'class' => array('node-form-mytab'),
),
);
$form['my_tab']['field_checkbox_example'] = $form['field_checkbox_example']; // - помещаем поле в вертикальную вкладку.
unset($form['field_checkbox_example']); // - избавляемся от дубля, скрывая его.
}
}
?>
так должно сработать.
Проверять $form_id для определения типа материала.
спасибо.
я форм_ид пробую проверять нифига
if ($form_id == 'news_node_form') {
+ сюда весь коды выше...
}
и показывает по старому...
Вставь в самом начале функции строчку:
drupal_set_message($form_id);
и проверь так ли называется форма.
так формы типов материалов всегда называются машинное_имя_типа_материала_node_form
но я попробую
может так drupal_set_message(print_r ($form_id));
но так выводит единицу
Нет, так как я написал что выводит?
да все нормуль, познакомились, вежливо поломали копья о variables Есть у меня некий вялотекущий прожект и Вы с variables навели на мега-мысль Так что говорю - спасибо!
по идее, тут наверное правильнее и для тех кто в танке -проще использовать hook_field_extra_fields и все Что к нему прилагается...
братан, буду тебе сильно благодарен, если пояснишь мне и общественности hook_field_extra_fields. В доке читаем "Field UI's "Manage fields" and "Manage display" pages let users re-order fields...". Как это применимо к данной ситуации? Нам тут не переставлять в выводе поля надо...
Камрады, в любом случае хранения отдельного значения надо озаботится о его удалении, например удаляем ноду. Что делать, как вопрошает известный класиик - Чернышевский? Кстати, наберите в гугле "что делать", поржете Но ближе к нашим баранам, если нода удаляется, то нам нужно озаботиться об удалении значения чекбокса, соответстующего этой ноде, в любом Вашем варианте. Что-то мне подсказывает, что iNFerNo хочет не этого.
имя, сестра, имяполе, мужик, полетак ничего не выводит...
<?phpfunction mymodule_form_node_form_alter(&$form, &$form_state) {
drupal_set_message($form_id);
if (isset($form['#node_edit_form']) && $form['#node_edit_form'] === true) {
$form['my_tab'] = array(
'#type' => 'fieldset',
'#access' => user_access('administer nodes'),
'#title' => t('My important information'),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
'#group' => 'additional_settings',
'#attributes' => array(
'class' => array('node-form-mytab'),
),
);
$form['my_tab']['field_year'] = $form['field_year']; // - помещаем поле в вертикальную вкладку.
hide($form['field_year']);
}
}
?>
Разуй глаза и посмотри, откуда у тебя берётся $form_id. Ниоткуда
все очень просто
добавляем свою таблицу для хранение значения экстра-поля
в хуках hook_node_xxxxx описываем соответствующие действия..
а хук hook_field_extra_fields позволят нам "визуально" управлять о отображением поля...
кстати...именно так реализовано поле тайтл стандартной ноды...
или проще костылей нагородить для привязки своей таблицы к ноде?
зы....хотя в данном случае проще просто стандартно добавить поле... и не париться..
т.е. есть стандартные механизмы добавления, редактирования и удаления? это, интересно, какие? hook_field_extra_fields позволяет тупо визуально передвигать свое поле (читай менять его вес) в настройках вывода ноды. Ты о чем вообще? Как этот хук решает проблему хранения собственного значения? Как это хук решает проблему привязки собственного значения к ноде?
извиняюссь...былл уверен, что вы в танке...
hook_node_load, hook_node_update,hook_node_delete
volocuga верно заметил, что у тебя в объявлении функции 3-ий аргумент отсутствует, должно быть так:
function ModuleName_form_node_form_alter(&$form, &$form_state, $form_id) {
спасибо. но название формы такая какую я и вводил
news_node_form
Вроде все получилось. Не туда просто условие... прописывал...
еще один момент.. в эту же функцию нужно прописывать условия на доступ к этопо му полю по роли...
я к то му что если поле не доступно... таб не должен тоже появляться...
как правильно посмотреть
'#access' => user_access('administer nodes'), //если надо ограничить доступ
формы...
я выставил что кастомный вариант доступа к полю. добавил роли пермишенс... (но он там полу русский полу англиский)
как увидеть верное словосочетание... что бы оно сработало.