[решено]Проблема при динамически отображаемом div

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

Аватар пользователя Positiff Positiff 14 марта 2011 в 21:30

На странице есть div со свойством display:none:

При выборе переключателя этот блок показывается пользователю. Код следующий:
$form['cat_fset']['category'] = array(
'#type' => 'radios',
'#prefix' => '
function doBlock(id) {
document.getElementById(id).style.display = "block";
}',
'#required' =>TRUE,
'#default_value' => $category,
'#options' => lot_get_category_list(1),
'#attributes' => array('onClick' => 'doBlock("lmi")'),
);

Все отлично работает - но если например при оправке формы возникла какая то ошибка, то этот блок скрывается, и поле в котором возникла ошибка не видно.

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

Комментарии

Аватар пользователя Ильич Рамирес Санчес Ильич Рамирес Санчес 14 марта 2011 в 22:48

Quote:

<?php'#prefix' => '
function doBlock(id) {
document.getElementById(id).style.display = "block";
}',?>


jQuery попробуйте Smile
drupal_add_js + внешний фйлик + прописывание событий на загрузке событий.
вот такой инлайн JS - зло. неизвестно как он себя вести будет.
"Positiff" wrote:
'onClick' => 'doBlock("lmi")')

не делайте так Smile
visualjquery.com - памятка. сделайте через JQuery всю событийку.
да, я понимаю дорога длинная, зато потом все будет проще.

Аватар пользователя Positiff Positiff 15 марта 2011 в 0:07

Спасибо за совет Smile Я вообще в душе люблю когда все сделано как правильно Smile
Просто вообще не понимаю что за зверь jquery, но разобраться похоже стоит.
Может есть где примеры простые разобранные как оно все работает?

Был бы премного благодарен, если бы вы помогли бы с моим примером.
Хотя бы как показать поле 2 при выборе значение из поля - радио 1

Заранее спасибо

Аватар пользователя Ильич Рамирес Санчес Ильич Рамирес Санчес 15 марта 2011 в 0:23

visualjquery.com - там есть как события обрабатывать Smile
довольно устаревшая памятка но вам хватит.
мне примеров никто не давал Smile

"Positiff" wrote:
Был бы премного благодарен, если бы вы помогли бы с моим примером.
Хотя бы как показать поле 2 при выборе значение из поля - радио 1

писать код за вас мне неинтересно Smile
как пример http://drupal.org/project/advimage там есть обработка событий на jquery. посмотрите Smile
ориентиры я дал Smile

Аватар пользователя Positiff Positiff 15 марта 2011 в 22:03

Долго читал мануалы... смысл понял.
Не совсем понял - обязательно ли делать отдельный файл?
Нельзя ли просто вставить также в префикс к элементу:

        $form['cat_fset']['category'] = array(
        '#type' => 'radios',
        '#prefix' => '<script type="text/javascript">
                  $("#cat").click( function()
                  {
                      $("#lmi").css("style","block");
                  });
                 </script><div class="category-select">'
,
        '#suffix' => '</div><div class="clear"></div>',
        '#required' =>TRUE,
        '#default_value' => $category,
        '#options' => lot_get_category_list(1),
        '#attributes' => array('id' => 'cat'),

Чем плохо, кроме того что у меня не работает ? Smile

Вообще вопрос изначальный это не решает.
Проблема в том что при возникновении форма полностью не перестраивается. И нужно просто понять как в таком случае сделать исходный div изначально видимым?

Аватар пользователя Ильич Рамирес Санчес Ильич Рамирес Санчес 15 марта 2011 в 22:09

"Positiff" wrote:
Нельзя ли просто вставить также в префикс к элементу:

событие должно прописываться когда модель документа(Document Object Model) будет готова повле его загрузки Smile
при разборе inline javascript вот эта штука $("#cat") ничего не захватит Smile
#cat еще не готов ибо. нет его. не построился Smile

ты все пытаешься сделать не особо напрягаясь Smile
не получится Smile

Аватар пользователя Positiff Positiff 15 марта 2011 в 22:22

Сделал файл lot_create.js. Код следующий:

$(document).ready(function(){
        $("#cat").click( function()
                  {
                      $("#lmi").css("style","block");
                  });
});

Положил в подпапку модуля js

Теперь нужно подключить:

drupal_add_js(drupal_get_path('module', 'lot') . '/lot_create.js');

Куда правильно вставлять эту строку?

Как проверить что файл подключился?

Аватар пользователя Positiff Positiff 15 марта 2011 в 23:05

Смотрю код страницы
Вижу запись, то есть файл подключился похоже

<script type="text/javascript" src="/sites/all/modules/lot_module/lot_create.js?M"></script>

Но блок не показывается.. - почему не пойму

Аватар пользователя Positiff Positiff 15 марта 2011 в 23:20

Нашел пару косяков - теперь в firebug в списке скриптов появился мой файл. но блог все равно не показывается по клику на радио баттоне.
Как можно отловить что не так. Как можно проверить событие вообще вызывается?
Сейчас вот код такой в файле:

// $Id: lot_create.js,v 1.1.0.0 2010/03/15 18:56:53 optalgin Exp $

$(document).ready(function(){
        $("#cat-radio").click( function()
        {
                $("#lmi").css("style","display:block");
                });
});

Пытаюсь добавить такую строку:

$("cat-radio").css("style","text-decoration:underline");

Чтоб проверить вызывается ли событие - ничего не происходит.
Может быть у меня модуль jquery стоит только стандартный? поэтому не работает видел на форуме где то что нужно какой то более продвинутый модуль

Аватар пользователя Positiff Positiff 15 марта 2011 в 23:53

В итоге получилось показать скрытый блок при помощи jquerн. Теперь может подскажете как его показать при нажатии кнопки submit при наличии ошибок. Как поймать событие?

Спасибо!

Аватар пользователя Ильич Рамирес Санчес Ильич Рамирес Санчес 16 марта 2011 в 0:12

"Positiff" wrote:
при нажатии кнопки submit

.click() туда
доп. класс в css через drupal_add_css() который сделает данный блок видимым в случае ошибок принудительно(если submit проходил)

мужик, у тебя все на руках есть Smile
смелее епта Smile

Аватар пользователя Positiff Positiff 16 марта 2011 в 1:00
$(document).ready(function()
{
    $('#lmi').css('display','none');
         
        $('.category-select').click(function()
        {
                $('#lmi').css('display','block');
        }
        );
}
);

В упор не пойму какое событие надо написать/добавить чтобы поймать случай когда есть ошибки на странице

Аватар пользователя Positiff Positiff 16 марта 2011 в 1:38

В итоге получилось поймать посчитав количество элементов класса messages - код такой:

$(document).ready(function()
{
        $('.category-select').click(function()
        {
                $('#lmi').css('display','block');
        }
        );
        if ($('.messages').length>0)
        {
                $('#lmi').css('display','block');
        }
}
);