Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » В помощь вебмастеру » Динамическое добавление форм для заполнения virtuemart 2

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2

Открыть новую тему     Написать ответ в эту тему

denism301



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Суть в следующем:
Делаю выбор типа покупателя (частник/юр.лицо) при регистрации юзера, как сделать так, чтобы при выборе юр.лица появлялись дополнительные поля (ИНН, КПП и т.п.)
Выбор типа покупателя я сделал типа radio

Всего записей: 67 | Зарегистр. 17-03-2013 | Отправлено: 00:00 28-02-2014
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
denism301
не знаю насчет VM, но, к примеру,
http://jsfiddle.net/K55tL/
написано с помощью jQuery, так как проще.. но без проблем пишется и на чистом js
 

Код:
<input type='radio' name='switch[]' value='1'> 1
<input type='radio' name='switch[]' value='2'> 2
<div class='hidden'>
    Спрятанные поля
</div>

 

Код:
.hidden {display: none;}

 

Код:
$('input[name^=switch]').change(function() {
   if ($(this).val() == 2)
       $('.hidden').show();
    else
       $('.hidden').hide();
});


----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 00:07 28-02-2014
denism301



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
сделал так:
 

Код:
<input type="radio" name="type_user" id="type_userorganisation" value="organisation" readonly="readonly" class="required">
<label for="type_userorganisation" id="type_userorganisation-lbl" class="radiobtn">Юридическое лицо</label>
<input type="radio" name="type_user" id="type_userprivate_person" value="private_person" readonly="readonly" class="required">
<label for="type_userprivate_person" id="type_userprivate_person-lbl" class="radiobtn">Физическое лицо</label>
<div class='company'>
....
</div>

 
 

Код:
<?php
            $('input[name^=type_user]').change(function() {
                if ($(this).val() == 'organisation')
                    $('.company').show();
                else
                    $('.company').hide();
            });
        ?>

 
появляется ошибка:  
Parse error: syntax error, unexpected '(', expecting T_VARIABLE or '$' in путь к файлу с кодом on line 91
 
строка 91 это
Код:
$('input[name^=type_user]').change(function() {

Всего записей: 67 | Зарегистр. 17-03-2013 | Отправлено: 20:04 11-03-2014 | Исправлено: denism301, 20:09 11-03-2014
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
denism301
вы разницу между PHP и javascript знаете ?)

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 23:48 11-03-2014
denism301



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
с предыдущим разобрался.
надо было код скрипта заключать не в

Код:
<?php ?>

а в  

Код:
<script></script>

 
осталось понять, как скрыть поле label данном случае:

Код:
<input type="radio" onclick="update_form();" name="virtuemart_paymentmethod_id" id="payment_id_6" value="6" checked="checked" style="display: inline-block;">
<label for="payment_id_6"><span class="vmpayment"><span class="vmpayment_name">Безналичный расчет</span><span class="vmpayment_description">Только для юридических лиц</span></span></label>

Я сделал так:

Код:
var company_field = [".company_name", ".company_address", ".inn", ".kpp", ".okpo", ".bank_name", ".bik", ".rasschetny_schet", ".korrespondentsky_schet", "#company_name_field", "#company_address_field", "#inn_field", "#kpp_field", "#okpo_field", "#bank_name_field", "#bik_field", "#rasschetny_schet_field", "#korrespondentsky_schet_field", "#payment_id_6"];
            $('input[name^=type_user]').change(function() {  
                if ($(this).val() == 'organisation') {
                    for (var i=0; i<=19; i++) {
                        $(company_field[i]).show();  
                    }
                    $('label for="payment_id_6"').show();
                }
                else {
                    for (var i=0; i<=19; i++) {
                        $(company_field[i]).hide();  
                    }
                    $('label for="payment_id_6"').hide();
                }
            });

 
поле input скрывается, label остается.
заключить данный кусок кода в div не получится, т.к. он генерируется скриптом.

Всего записей: 67 | Зарегистр. 17-03-2013 | Отправлено: 23:52 11-03-2014
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
denism301
зачем возиться с каждым полем, не проще скрыть родителя?

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 00:21 12-03-2014
denism301



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
было бы хорошо, если бы было все так просто. родитель общий для полей, которые надо скрывать и которые не надо

Всего записей: 67 | Зарегистр. 17-03-2013 | Отправлено: 19:10 12-03-2014
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
denism301
ну добавьте к нужным элементам css класс, тогда
$('.имя_класса').hide();
или
$('.имя_класса').show();
 
можно аналогичное и на чистом js написать

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 21:04 12-03-2014
denism301



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Cheery
разобрался и завернул в класс элемент.
возникла такая сложность: когда поля не скрыты, они должны быть обязательны к заполнению, соответственно, когда скрыты, то нет.
обязательность заполнения устанавливается в таблице БД.
для того, чтобы ее менять, я написал такой запрос:

Код:
var company_field = [".org_company_name", ".org_company_address", ".org_inn", ".org_kpp", ".org_okpo", ".org_bank_name", ".org_bik", ".org_rasschetny_schet", ".org_korrespondentsky_schet", ".payment_type_2", "#org_company_name_field", "#org_company_address_field", "#org_inn_field", "#org_kpp_field", "#org_okpo_field", "#org_bank_name_field", "#org_bik_field", "#org_rasschetny_schet_field", "#org_korrespondentsky_schet_field"];
            $db = &JFactory::getDBO();
            $query = $db->getQuery(true);
            $('input[name^=type_user]').change(function() {  
                if ($(this).val() == 'organisation') {
                    for (var i=0; i<=19; i++) {
                        $(company_field[i]).show();  
                    }
                    $('.payment_type_1').hide();
                    $query->update('bfmlc_virtuemart_userfields');
                    $query->set('required=1');
                    $query->where('name LIKE \org\_%');
                    $db->setQuery($query);
                    if (!$db->query()) {
                        JError::raiseError(500, $db->detErrorMsg());
                    }
                }
                else {
                    for (var i=0; i<=19; i++) {
                        $(company_field[i]).hide();  
                    }
                    $('.payment_type_1').show();
                    $query->update('bfmlc_virtuemart_userfields');
                    $query->set('required=0');
                    $query->where('name LIKE \org\_%');
                    $db->setQuery($query);
                    if (!$db->query()) {
                        JError::raiseError(500, $db->detErrorMsg());
                    }
                }
            });

 
вроде как все правильно, но, почему-то не работает

Всего записей: 67 | Зарегистр. 17-03-2013 | Отправлено: 19:27 14-03-2014 | Исправлено: denism301, 19:31 14-03-2014
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
denism301

Цитата:
вроде как все правильно, но, почему-то не работает

у вас короткая память? сказал же выше - не путайте js и php
 

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

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

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 21:35 14-03-2014
denism301



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
почему-то скрипт отказывается работать на хостинге.
FireBug на хостинге выдает такую ошибку:
 

Код:
TypeError: $(...) is null
$('input[name^=type_user]').change(function() {

 
На денвере все ок. В чем может быть причина?

Всего записей: 67 | Зарегистр. 17-03-2013 | Отправлено: 22:25 10-05-2014
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
denism301

Цитата:
В чем может быть причина?

не подгружается, к примеру, jquery библиотека.
или перекрывается чем то еще подгружаемым на странице (например mootools)

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 23:05 10-05-2014 | Исправлено: Cheery, 23:05 10-05-2014
denism301



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
с помощью чего можно диагностировать проблему?

Всего записей: 67 | Зарегистр. 17-03-2013 | Отправлено: 23:23 10-05-2014
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
denism301
в логе ошибок браузера об этом должно быть сказано.
либо дайте ссылку.

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 00:01 11-05-2014
denism301



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ссылка
При выборе пункта "Юр. лицо" должны появиться дополнительные поля

Всего записей: 67 | Зарегистр. 17-03-2013 | Отправлено: 10:18 11-05-2014
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
denism301
у вас грузятся 2 разные версии jQuery - это может привести к конфликту.
перепишите, но вместо $( используйте jQuery(

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 20:27 11-05-2014
denism301



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Cheery
Спасибо, заработало!
Но появилась такая проблемка: в Opera и Google Chrome работает только один раз, т.е. если открыть страницу, кликнуть на юр.лицо, поля откроются, потом, если кликнуть на физ.лицо, то скроются. После чего, до следующей перезагрузки страницы скрипт не работает. Я подозреваю, что они кешируют таблицу стилей и берут оттуда.
Как это можно вылечить?
 
в FireFox и IE все ок

Всего записей: 67 | Зарегистр. 17-03-2013 | Отправлено: 12:04 12-05-2014
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
denism301
ну, у вас там изначально еще ругается на  

Код:
window.addEvent


Цитата:
Uncaught TypeError: Cannot read property 'value' of null  

видимо window переопределена
 
хотя это только read-only объект
http://anhnguyen.me/2010/02/the-interesting-javascript-window-object/
 
ну и зачем так то?  

Код:
                    for (var i=0; i<=company_field.length; i++) {
                        jQuery(company_field[i]).show();  
 

добавьте просто нужным элементам какой то класс и все.


----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 21:41 12-05-2014
denism301



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Cheery
не получится класс добавить. поля генерируются скриптом.
единственное, что можно, это как-то по маске класса скрывать. У них у всех общее в названии вхождение org
но, с другой стороны у самого поля объекту присвоен id, метке (label) присвоен точно такой же класс
 
но, к сожалению, моих знаний скриптов не хватает написать такую конструкцию. буду рад подсказке.
 
Добавлено:
функция window.addEvent была дважды определена... поправил. но ничего не изменилось. как не работало в Chrome и Opera, так и не работает

Всего записей: 67 | Зарегистр. 17-03-2013 | Отправлено: 11:53 13-05-2014
denism301



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ошибок в скриптах нет.в консоли opera, если пощелкать между юр.лицом и физ.лицом, то видно, что свойство display меняется. но поля не отображаются...
 
Добавлено:
разобрался. задал скорость изменения (поставил 0) и все заработало.

Всего записей: 67 | Зарегистр. 17-03-2013 | Отправлено: 11:23 14-05-2014
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2

Компьютерный форум Ru.Board » Интернет » В помощь вебмастеру » Динамическое добавление форм для заполнения virtuemart 2


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru