Как в своем модуле сохранить выставленный чекбокс при создании или редактирование ноды

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

Аватар пользователя iNFerNo iNFerNo 12 декабря 2012 в 22:21

код в моем модуле

<?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;

}

?>

при повторном редактирование... флажок не сохранен... подскажите как сохранять....

Комментарии

Аватар пользователя boatsman boatsman 13 декабря 2012 в 13:46

ну, дело Ваше, хотя по представленному коду я не вижу смысла в заморочках с отдельной обработкой и хранением checkbox'а. Ближе к телу, я бы создал таблицу в базе данных, по submit'у делаем db_insert или если нода уже существует, то db_update, в hook_form_alter соответственно опять же проверяем новая нода или нет (isset($form[''#node']->nid)), если новая, ставим '#default_value' => 0, если нет делаем db_select и полученное значение (0 или 1) подставляем в #default_value. Как-то так.

Аватар пользователя boatsman boatsman 13 декабря 2012 в 14:09

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

Аватар пользователя iNFerNo iNFerNo 13 декабря 2012 в 14:35

Так в коде там во вкладке выводится чекбокс (там где опубликовать, на главную... ) это же где то хранится... так и мне хочется свое еще одно условие... которое в будущем хочется вытащить в рулесы.

Аватар пользователя volocuga@drupal.org volocuga@drupal.org 13 декабря 2012 в 22:06
<?php

function mymodule_node_submit($node$form, &$form_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');                
    }

    

variable_set('mymodule_checkbox_state'$state);
    
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, это не надо, не к месту

Аватар пользователя iNFerNo iNFerNo 13 декабря 2012 в 22:17

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

Аватар пользователя iNFerNo iNFerNo 13 декабря 2012 в 22:18

"gorr" wrote:
модуль fieldgroup и поле чекбокс.

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

Аватар пользователя boatsman boatsman 13 декабря 2012 в 22:54

volocuga[at]drupal.org я может чего не понимаю, но вот я создал условно node 1 (не отметил чекбокс), потом создал node 2 (отметил чекбокс), а потом решил отредактировать node 1. По идее чекбокс там не отмечен, а у Вас он появится отмеченным, если я ничего не путаю. т.е. у Вас одна переменная на все случаи жизни ноды. Как человек потом узнает где (в какой ноде) был отмечен чекбокс, а где нет?

Аватар пользователя volocuga@drupal.org volocuga@drupal.org 13 декабря 2012 в 23:47

"boatsman" wrote:
если я ничего не путаю. т.е. у Вас одна переменная на все случаи жизни ноды. Как человек потом узнает где (в какой ноде) был отмечен чекбокс, а где нет?

Общий вопрос от iNFerNo (см. заголовок топика) - общий ответ на него же. nid нужно где то хранить, очевидно в виде массива, где ключ - nid ноды, value - всё остальное

Аватар пользователя boatsman boatsman 13 декабря 2012 в 23:58

а Вы вообще переписку-то читали? и какой же это общий ответ? это прямой указание использовать variables. и непонятно зачем их вообще использовать, если плюс к этому надо еще где-то хранить nid и value.

Аватар пользователя volocuga@drupal.org volocuga@drupal.org 14 декабря 2012 в 1:00

Вы хотите использовать каждую переменную для каждой ноды? Smile а если их 100000?

Можно обходится ОДНОЙ переменной

<?php

$states 

= array(
  
'123' => 1// Нода с id 123, чекбокс отмечен
  
'456' => 0,
  
'276' => 1,
  
'231' => 0,
);

variable_set('mymodule_checkbox_state'$states);

?>

насчёт использования variables, так это самый простой способ сохранить что либо и легко получить назад без доп запросов к БД, так как все variables загружаются в $conf при бутстрапе друпала

Аватар пользователя boatsman boatsman 14 декабря 2012 в 1:29

Разговор слепого с глухим. Smile Я вообще НЕ ХОЧУ использовать переменные. Smile А из-вашего последнего примера, кстати о птичках, если нод сто тысяч, то Вы что - будете такого размера массив в переменной держать??? Плюс это добро еще и грузится будет при каждой загрузке страницы? Призываю Вас еще раз перечитать переписку с самого изначального вопроса iNFerNo. Не трудно увидеть, что я предлагал вариант с отдельной таблицей, если уж очень хочется держать все это отдельно, но мое мнение, что не надо заморачиваться, надо просто сделать поле ноды и настроить его вывод в форме.

Аватар пользователя boatsman boatsman 14 декабря 2012 в 1:28

iNFerNo вобщем вот, что хочу сказать, мое мнение - надо делать поле. Вариант от volocuga[at]drupal.org тоже, ессно, имеет право на существование. Но по мне, все равно проще поле.

Аватар пользователя volocuga@drupal.org volocuga@drupal.org 14 декабря 2012 в 1:32

«Разговор слепого с глухим»

"iNFerNo" wrote:
"orion76" написал(а):

variable_set

это я знаю, а как это использовать в какой функции...

дык Инферно спросил как использовать variable_set, я и отписал, всего то :). Я зарёкся не отвечать в топиках Инферно, но сегодня чёрт дёрнул Smile

Аватар пользователя iNFerNo iNFerNo 14 декабря 2012 в 8:41

Кстати, хоть и написано так

<?phpfunction mymodule_node_submit($node, $form, &$form_state)  {
  if ($node->type === 'news') {
?>

а чекбокс везде во всех типах нод появляется... чойто?

Аватар пользователя iNFerNo iNFerNo 14 декабря 2012 в 8:42

"<a href="mailto:volocuga@drupal.org">volocuga@drupal.org</a>" wrote:
Я зарёкся не отвечать в топиках Инферно, но сегодня чёрт дёрнул :)

Это не хорошее решение так как пока я не доделаю себе сайт я вопросы буду задавать и задавать, на которые ответа в сети не нахожу на др сайтах и блогах.

Аватар пользователя iNFerNo iNFerNo 14 декабря 2012 в 8:53

"boatsman" wrote:
iNFerNo вобщем вот, что хочу сказать, мое мнение - надо делать поле. Вариант от volocuga[at]drupal.org тоже, ессно, имеет право на существование. Но по мне, все равно проще поле.

самописные модули же не создают поле программно, а именно как волокуда добавляют поля в вертикальное меню...

ксти воспользовался вариантом 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;
}
?>

добавляет поле в таб вертикальный типа материала.

вопрос а свой таб можно создать чтобы его туда закинуть то?

Аватар пользователя iNFerNo iNFerNo 14 декабря 2012 в 9:07

а еще не понятно, как для конкретной node_form код выше приспособить... изменить
это? if (isset($form['#node_edit_form']) && $form['#node_edit_form'] === true):

Аватар пользователя gorr gorr 14 декабря 2012 в 14:17

<?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 для определения типа материала.

Аватар пользователя iNFerNo iNFerNo 14 декабря 2012 в 14:32

спасибо.

я форм_ид пробую проверять нифига

if ($form_id == 'news_node_form') {

+ сюда весь коды выше...

}

и показывает по старому...

Аватар пользователя gorr gorr 14 декабря 2012 в 14:50

"iNFerNo" wrote:
я форм_ид пробую проверять нифига

Вставь в самом начале функции строчку:
drupal_set_message($form_id);
и проверь так ли называется форма.

Аватар пользователя boatsman boatsman 15 декабря 2012 в 6:43

"iNFerNo" wrote:
самописные модули же не создают поле программно
Ну так и смотрели бы в код этих самых "самописных" модулей. Там все расписано - чего вопросы задавать?

Аватар пользователя boatsman boatsman 15 декабря 2012 в 6:53

"<a href="mailto:volocuga@drupal.org">volocuga@drupal.org</a>" wrote:
дык Инферно спросил как использовать variable_set, я и отписал, всего то

да все нормуль, познакомились, вежливо поломали копья о variables Smile Есть у меня некий вялотекущий прожект и Вы с variables навели на мега-мысль Smile Так что говорю - спасибо! Smile

Аватар пользователя boatsman boatsman 15 декабря 2012 в 7:11

"iNFerNo" wrote:
может так drupal_set_message(print_r ($form_id));
"iNFerNo" wrote:
может так drupal_set_message(print_r ($form_id));
Что Вы тычетесь как "котенок вслепую". Drupal славен своим API, докой и комментами к нему, идем на http://api.drupal.org/api/drupal/includes%21bootstrap.inc/function/drupa..., что там в параметрах - string! Так нафига к нему еще и print_r применять, плюс на кой Вам print_r, если $form_id - это строка обычная?

Аватар пользователя Orion76 Orion76 15 декабря 2012 в 8:38

по идее, тут наверное правильнее и для тех кто в танке -проще использовать hook_field_extra_fields и все Что к нему прилагается...

Аватар пользователя boatsman boatsman 15 декабря 2012 в 8:49

братан, буду тебе сильно благодарен, если пояснишь мне и общественности hook_field_extra_fields. В доке читаем "Field UI's "Manage fields" and "Manage display" pages let users re-order fields...". Как это применимо к данной ситуации? Нам тут не переставлять в выводе поля надо...

Аватар пользователя boatsman boatsman 15 декабря 2012 в 9:13

Камрады, в любом случае хранения отдельного значения надо озаботится о его удалении, например удаляем ноду. Что делать, как вопрошает известный класиик - Чернышевский? Кстати, наберите в гугле "что делать", поржете Smile Но ближе к нашим баранам, если нода удаляется, то нам нужно озаботиться об удалении значения чекбокса, соответстующего этой ноде, в любом Вашем варианте. Что-то мне подсказывает, что iNFerNo хочет не этого.

Аватар пользователя iNFerNo iNFerNo 15 декабря 2012 в 21:30

"gorr" wrote:
drupal_set_message($form_id);

так ничего не выводит...

<?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']); 
  }

}
?>

Аватар пользователя volocuga@drupal.org volocuga@drupal.org 15 декабря 2012 в 22:38

"iNFerNo" wrote:
так ничего не выводит...

"iNFerNo" wrote:
mymodule_form_node_form_alter(&$form, &$form_state) {

drupal_set_message($form_id);

Разуй глаза и посмотри, откуда у тебя берётся $form_id. Ниоткуда

Аватар пользователя Orion76 Orion76 15 декабря 2012 в 22:58

"boatsman" wrote:
братан, буду тебе сильно благодарен, если пояснишь мне и общественности hook_field_extra_fields

все очень просто
добавляем свою таблицу для хранение значения экстра-поля
в хуках hook_node_xxxxx описываем соответствующие действия..
а хук hook_field_extra_fields позволят нам "визуально" управлять о отображением поля...

кстати...именно так реализовано поле тайтл стандартной ноды...

или проще костылей нагородить для привязки своей таблицы к ноде?

зы....хотя в данном случае проще просто стандартно добавить поле... и не париться..

Аватар пользователя boatsman boatsman 16 декабря 2012 в 0:34

"orion76" wrote:
все очень просто

Smile

"orion76" wrote:
или проще костылей нагородить для привязки своей таблицы к ноде?

т.е. есть стандартные механизмы добавления, редактирования и удаления? это, интересно, какие? hook_field_extra_fields позволяет тупо визуально передвигать свое поле (читай менять его вес) в настройках вывода ноды. Ты о чем вообще? Как этот хук решает проблему хранения собственного значения? Как это хук решает проблему привязки собственного значения к ноде?

"orion76" wrote:
зы....хотя в данном случае проще просто стандартно добавить поле... и не париться..

Smile

Аватар пользователя Orion76 Orion76 16 декабря 2012 в 10:51

"boatsman" wrote:
т.е. есть стандартные механизмы добавления, редактирования и удаления? это, интересно, какие?

извиняюссь...былл уверен, что вы в танке...
hook_node_load, hook_node_update,hook_node_delete

Аватар пользователя gorr gorr 16 декабря 2012 в 11:15

"iNFerNo" wrote:
так ничего не выводит...

volocuga верно заметил, что у тебя в объявлении функции 3-ий аргумент отсутствует, должно быть так:

function ModuleName_form_node_form_alter(&$form, &$form_state, $form_id) {

Аватар пользователя iNFerNo iNFerNo 16 декабря 2012 в 12:58

"gorr" wrote:
function ModuleName_form_node_form_alter(&$form, &$form_state, $form_id) {

спасибо. но название формы такая какую я и вводил

news_node_form

Аватар пользователя iNFerNo iNFerNo 16 декабря 2012 в 13:12

еще один момент.. в эту же функцию нужно прописывать условия на доступ к этопо му полю по роли...

я к то му что если поле не доступно... таб не должен тоже появляться...

Аватар пользователя iNFerNo iNFerNo 16 декабря 2012 в 16:43

как правильно посмотреть
'#access' => user_access('administer nodes'), //если надо ограничить доступ

формы...

я выставил что кастомный вариант доступа к полю. добавил роли пермишенс... (но он там полу русский полу англиский)

как увидеть верное словосочетание... что бы оно сработало.