Вопросform fieldset- изменить по умолчанию установленное значение collapsed

Здраствуйте! В первую очередь хотелось по благодарить, за Ваш не легий труд! Успехов!
Ну и суть вопроса:- уже неделю не могу сообразить решение моей задачи..
Есть элементы формы:

$form['name1'] = array(
        '#type' => 'textarea',
        '#description' => 'name1',        
        '#weight' => 1, 
        );
$form['name2'] = array(
        '#type' => 'textarea',
        '#description' => 'name2',        
        '#weight' => 2, 
        );
$form['submit'] = array(
        '#type' => 'submit',
        '#value' => 'Предпросмотр',
        // Элемент ajax
        '#ajax' => array(
          //callback-функция
          'callback' => 'preview_form_ajax',
          'wrapper' => 'fc-form',   
        ),
        '#weight' => 3,
      );
$fieldsets = array('name1', 'name2', 'submit');
 
    $form['spoiler'] = array(
        '#type' => 'fieldset',
        '#title' => 'Добавить описание',
        '#collapsible' => true,
        '#collapsed' => true,
        '#weight' => 4,
    );
 
    foreach ($fieldsets as $name)
    {
        $form['spoiler'][$name] = $form[$name];
        unset($form[$name]);
    }

и фукция отправки ч\з ajax

function preview_form_ajax($form, &$form_state) {  
$markup_value= 'bla bla bla';
 $form['result'] = array(
        '#markup' => $markup_value,
        '#weight' => 30,        
      );
      return $form;
    }

По умолчанию стоит '#collapsed' => true, форма свернута.
После отправки формы, скрипт отрабатывается и выводится значение $markup_value= 'bla bla bla';
Вопрос: Как сделать чтоб после отправки оставить форму в развернутом положении. и вывести результат $markup_value.
пробовал добавлять значения #ajax['method'] 'after', 'append', 'before', 'prepend' не помогает
рискно предположить что срабатывает function form_process_fieldset

if (!empty($element['#collapsed'])) {
      $element['#attributes']['class'][] = 'collapsed';
    }

но print_r($element['#collapsed']); ни чего не находит((
Одна надежда на Вас подскажите как решить.

Комментарии

Аватар пользователя Spleshka
Spleshka написал:

Прошу прощения за задержку с ответом, был крайне занят.

function preview_form_ajax($form, &$form_state) {  
  $markup_value= 'bla bla bla';
  $form['result'] = array(
    '#markup' => $markup_value,
    '#weight' => 30,        
  );
  $form['spoiler']['#collapsed'] = FALSE;
  return $form;
}
25.01.2012 03:16
Аватар пользователя fil.diesel
fil.diesel написал:

Спасибо, что откликнулись! Задавал подобный вопрос у Вас и на drupal.ru, в общем с двух рессурсов вы первый ответели. Ваш метод решения пробовал, почему то не срабатывает(( почемуто метод аякса в друпале обусловлен перерисовкой формы, после удачного срабатывания субмита. вот когда в форму добавляешь форм_сет_эрор, и он срабатывает форма остается развернутой!!
Единственно, что пока приходит в голову так это у филдсета выставить ид и в зависимости от положения филдсета изменить значение например класса у какого нибудь элемента например на "yes" или "no"...
В итоге получается по умолчанию у нас филдсет свернут - то есть у элемента значение "yes"
пишем функцию на jQuery, и проверяем если "yes" то выставляем значения коллабсета труе, далее меняем флаг
и при следующей перерисовки форма должна загрузиться развернутой!!!
но это только мои предположения... сейчас пишу с телефона, возможности потестить нет(( как опробую обязательно отпишусь.....вух.. настрочил)))

25.01.2012 06:19
Аватар пользователя Spleshka
Spleshka написал:

Мой метод должен срабатывать. Покажите, пожалуйста, полностью функции создания формы и её обработки на аяксе. Можете заодно почитать статью об обновнении форм на AJAX в Drupal 7.

25.01.2012 13:50
Аватар пользователя fil.diesel
fil.diesel написал:

Спасибо за помощь! Нашел ошибку

$form['spoiler']['result'] = array(
		'#markup' => $markup_value,
		'#weight' => 30,		
	  );
	   $form['spoiler']['#collapsed'] = FALSE;   
	  return $form;

Оказывается form 'result' нужно было добавить к 'spoiler'...
Еще раз огромное спасибо!!! Без Вас бы не сообразил)

25.01.2012 14:12
Аватар пользователя Spleshka
Spleshka написал:

всегда пожалуйста :)

25.01.2012 14:27
Аватар пользователя fil.diesel
fil.diesel написал:

эх погорячился теперь сворачивается вся форма( наверно все таки прийдется прибегнуть к помощи jquery
посмотрите может у вас получится

function messages_error($messages){
		$html = '<div class="messages error">
		<h2 class="element-invisible">Предупреждение</h2>
		'.$messages.'</div>';
		return $html;
	}
	function preview_form_ajax($form, &$form_state) {  
 
	  $name1=    check_plain($form_state['values']['name1']);
      $name2=     check_plain($form_state['values']['name2']);
 
 
	  if ($name1    ==''){
	                           $message =  'Не заполнено name1';
                               $massiv['error'][]=$message; 
							   form_set_error('name1', $message);							   
							   }
	  if ($name2     ==''){
	                           $message = 'Не заполнено name2';
	                           $massiv['error'][]=$message; 
	                           form_set_error('name2', $message);
	                           }
	  $form_error='';
	  $form_error.='<ul>';
	  foreach ($massiv['error'] as $value_error) {
         $form_error .= '<li>'.$value_error.'</li>';
      }
	  $form_error.='<ul>';
	  $form_errors= messages_error($form_error);
 
 
	 $description_table ='<h3>Предпросмотр</h3>';
 
	  if(isset($massiv['error'])){
	  $markup_value=$form_errors;
	  }else{
	  $markup_value=$description_table;
	  }
	  $form['spoiler']['result'] = array(
		'#markup' => $markup_value,
		'#weight' => 30,
 
	  );
	  $form['spoiler']['#collapsed'] = FALSE;	   
	  return $form;
	}
 
function fc_form($form, &$form_state) {
	  $form = array();
 
$form['name1'] = array(
        '#type' => 'textfield',
        '#description' => 'name1',        
        '#weight' => 1, 
        );
$form['name2'] = array(
        '#type' => 'textarea',
        '#description' => 'name2',        
        '#weight' => 2, 
        );
$form['submit'] = array(
        '#type' => 'submit',
        '#value' => 'Предпросмотр',
        // Элемент ajax
        '#ajax' => array(
          //callback-функция
          'callback' => 'preview_form_ajax',
          'wrapper' => 'fc-form',   
        ),
        '#weight' => 3,
      );
$fieldsets = array('name1', 'name2', 'submit');
 
    $form['spoiler'] = array(
        '#type' => 'fieldset',
        '#title' => 'Добавить описание',
        '#collapsible' => true,
        '#collapsed' => true,
        '#weight' => 4,
    );
 
    foreach ($fieldsets as $name)
    {
        $form['spoiler'][$name] = $form[$name];
        unset($form[$name]);
    }
	return $form;
} 
 
function module_bar3_page($argument){
	  $out = drupal_render(drupal_get_form('fc_form'));
      return $out;
}
25.01.2012 16:07
Аватар пользователя Spleshka
Spleshka написал:

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

/**
 * Page callback for bar3 page
 */
function module_bar3_page($argument){
  $fc_form = drupal_get_form('fc_form');
  return render($fc_form);
}
 
/**
 * Form for bar3 page
 */
function fc_form($form, $form_state) {
 
  $form['#prefix'] = '<div id="fc-form-ajax-wrapper">';
  $form['#suffix'] = '</div>';
 
  $form['spoiler'] = array(
    '#type' => 'fieldset',
    '#title' => 'Добавить описание',
    '#collapsible' => true,
    '#collapsed' => true,
  );
 
  $form['spoiler']['name1'] = array(
    '#type' => 'textfield',
    '#description' => 'name1',        
  );
 
  $form['spoiler']['name2'] = array(
    '#type' => 'textarea',
    '#description' => 'name2',        
  );
 
  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => 'Предпросмотр',
    '#ajax' => array(
      'callback' => 'preview_form_ajax',
      'wrapper' => 'fc-form-ajax-wrapper',   
    ),
  );
 
  return $form;
}
 
/**
 * Ajax callback for FC FORM
 */
function preview_form_ajax($form, &$form_state) {  
 
  $name1 = check_plain($form_state['values']['name1']);
  $name2 = check_plain($form_state['values']['name2']); 
 
  $errors = array();
  if (!$name1) {
    $message  =  'Не заполнено name1';
    $errors[] = $message; 
    form_set_error('name1', $message);                 
  }
 
  if (!$name2) {
    $message  = 'Не заполнено name2';
    $errors[] = $message; 
    form_set_error('name2', $message);
  }
 
  if ($errors) {
    $markup_value = '<div class="messages error">' . theme('item_list', array('items' => $errors)) . '</div>';
  }
  else { 
    $markup_value ='<h3>Предпросмотр</h3>';
  }
 
  $form['spoiler']['result'] = array(
    '#markup' => $markup_value,
    '#weight' => 30, 
  );
 
  $form['spoiler']['#collapsed'] = FALSE;
 
  return $form;
}

И вам очень не помешает внимательно прочитать про стандарты кодирования.

25.01.2012 17:16
Аватар пользователя fil.diesel
fil.diesel написал:

Эх... все равно не срабатывет((
за ссылку спасибо познавательно.
В общем пришел к одному решению. Не знаю на сколько правильно но работает))
добавляем js

   drupal_add_js('
jQuery(window).load(Drupal.verify_collapsed = function() { 
     if (jQuery("#edit-spoiler").hasClass("collapsed")) { 
        alert("филдсет свернут");		
      }else{
	  alert("филдсет развернут");
      setTimeout(function() {
	  //alert("филдсет был свернут 0 сек назад");
      jQuery("#edit-spoiler").removeClass("collapsed");
      }, 0);	  
 
	  }   
});', array('type' => 'inline', 'scope' => 'header', 'weight' => 10));

и в функцию модуля preview_form_ajax

    $markup_value .='<script type="text/javascript">
<!--//--><![CDATA[//><!--
      Drupal.verify_collapsed();
//--><!]]>
</script>';

тогда все работает на ура))
p/s к филсету нужно добавить '#id'=>'edit-spoiler',
одна загвоздка. приоритет исполнения скрипта не могу выставить( поэтому пришлось повесить таймаут..

26.01.2012 17:56
Аватар пользователя Spleshka
Spleshka написал:

Я не верю, что не срабатывает. Вы можете показать сайт в Интернете и предоставить к нему доступ?

26.01.2012 18:10
Аватар пользователя fil.diesel
fil.diesel написал:

он на локалке пока. Проверял обработанный Вами код все рано не работает. я так понял это баг какойто, если есть ошибка в форме срабатывет

if ($('.error' + anchor, $fieldset).length) {
        $fieldset.removeClass('collapsed');
      }

в collapse.js а если нет и аяксе указан 'method' => 'replace', он просто пррерисовывает форму и добавляет результат обработки аякса! а так как в форме укзан '#collapsed' => true, то форма и загружается всегда свернутой(

26.01.2012 18:23
Аватар пользователя Spleshka
Spleshka написал:

Нет, друпал полностью перерисовывает форму с учётом изменений, внесённых в форму при обработке её аяксом.

27.01.2012 02:46
Аватар пользователя fil.diesel
fil.diesel написал:

Хм... странно все это! Не пойму это только у меня так?
А как у Вас обрабытывается код? Пробовали запускать?

27.01.2012 03:49
Аватар пользователя fil.diesel
fil.diesel написал:

В итоге сделал как и описывал во втором посте работает на ура!

$form['spoiler'] = array(
    '#type' => 'fieldset',
    '#title' => '<span id="press-spoiler" class="true">Добавить описание</span>',
    '#collapsible' => true,
    '#collapsed' => true,
    '#id'=>'edit-spoiler',
	'#attached' => array(       
	  'js' => array(         
		 'file' => drupal_get_path('module', 'banknotes') . '/fc_form.js',
         ),
	   ),	
  );

javascript fc_form.js

(function ($) {
 
Drupal.behaviors.fc_form = {
    attach: function(context, settings) {
      if (jQuery("#edit-spoiler").hasClass("collapsed") && jQuery("#press-spoiler").hasClass("false")) {
        jQuery("#edit-spoiler").removeClass("collapsed");
      }
	  if (jQuery("#edit-spoiler").hasClass("collapsed") && jQuery("#press-spoiler").hasClass("true")) {
        jQuery("#press-spoiler").removeClass("true").addClass("false");
      }
 
 
    }
}
 
})(jQuery);
27.01.2012 13:55
Аватар пользователя Spleshka
Spleshka написал:

Ладно, сделали - и хорошо. Но я бы на вашем месте разобрался, почему не работает как надо.

27.01.2012 14:23
Аватар пользователя fil.diesel
fil.diesel написал:

Я уже и drupal переустанавливал, аналогичная ситуация! При правильно заполненных полях филсет сворачивается. и все тут...
А Вы пробовали запускать? Как у Вас обрабытывается код?

27.01.2012 14:44
Аватар пользователя Spleshka
Spleshka написал:

Проверил. На удивление, не работает. Всё меняется, кроме состояния филдсета. Надо будет на д.орг написать, что такой баг имеется.

27.01.2012 16:20
Аватар пользователя fil.diesel
fil.diesel написал:

фух ну слава богу! А то я уж начал думать, что руки то у меня, не под клавиатуру заточены))
Спасибо за помощь!

27.01.2012 16:32

Комментировать