0 Пользователей и 1 Гость просматривают эту тему.
  • 26 Ответов
  • 4291 Просмотров
*

Messir

  • Давно я тут
  • 532
  • 73 / 0
  • могу укусить:)
Доброго времени суток!
Назрела одна проблемка. Используется модуль входа VirtueMart, после логина можно отредактировать профиль и просмотреть историю заказов. До нынешнего момента все устраивало, но теперь надо почти всю информацию, доступную для редактирования, сделать только для чтения. Т.е, чтобы пользователь мог сменить только пароль. Остальное чтобы он мог видеть, но редактировать не мог...
Нашел файл, который выводит эту информацию - account.billing.tpl.php, в нем вот эту секцию, которая выводит пользовательские поля:
Код
  <?php
ps_userfield::listUserFields( $fields, $skip_fields, $db );
?>
Но на большее не хватает ума... Подскажите, как можно сделать поля "только для чтения". Через свойства полей, заполняемых пользователем не вариант. В этом случае через админку тоже нельзя редактировать, а надо, чтобы админ мог менять любую информацию.

Буду рад любым подсказкам.
*

fsv

  • Moderator
  • 2767
  • 403 / 2
\administrator\components\com_virtuemart\classes\ps_userfield.php
/**
* This is the most important part of this file
* Here we print the field & its contents!
*/
перед стр.398
default:
вставить

Код
case 'используемое поле ДЛЯ ЧТЕНИЯ 1':
case 'используемое поле ДЛЯ ЧТЕНИЯ 2':
case 'используемое поле ДЛЯ ЧТЕНИЯ ...':
case 'используемое поле ДЛЯ ЧТЕНИЯ N':
if ( $page == "account.shipto" || $page == "account.billing" ) {
$maxlength = $field->maxlength ? 'maxlength="'.$field->maxlength.'"' : '';
echo '<input type="text" id="'.$field->name.'_field" name="'.$field->name.'" size="'.$field->size.'" value="'. ($db->sf($field->name, true, false)?$db->sf($field->name, true, false):'').'" class="inputbox" '.$maxlength .' readonly="readonly" />';
} else {
/* тут вариант этих полей не для чтения:
- если есть "особый" вариант, перечисленный ДО "default:", то его вставить тут, а выше закомментировать
- если нет, то повторить то, что выше, за исключением readonly="readonly" */
}
Т.е, чтобы пользователь мог сменить только пароль.
если бы не это, то просто дискетку убрать, и пусть играется с полями...

ну это так, первое, что на ум пришло, не проверял, естественно.
Веб-разработка: заказ. Только новая объемная разработка. Качественно, дорого.
*

Messir

  • Давно я тут
  • 532
  • 73 / 0
  • могу укусить:)
Вставил такой код:
Код
/* Запрещаем пользователям редактировать свои данные */

case 'email':
case 'username':
case 'company':
case 'first_name':
case 'last_name':
case 'middle_name':
case 'city':
case 'phone_1':
case 'phone_2':
case 'fax':
case 'vm_regc':
case 'vm_blocked':
case 'vm_datablocked':
if ( $page == "account.shipto" || $page == "account.billing" ) {
$maxlength = $field->maxlength ? 'maxlength="'.$field->maxlength.'"' : '';
echo '<input type="text" id="'.$field->name.'_field" name="'.$field->name.'" size="'.$field->size.'" value="'. ($db->sf($field->name, true, false)?$db->sf($field->name, true, false):'').'" class="inputbox" '.$maxlength .' readonly="readonly" />';
} else {
/* тут вариант этих полей не для чтения:
- если есть "особый" вариант, перечисленный ДО "default:", то его вставить тут, а выше закомментировать
- если нет, то повторить то, что выше, за исключением readonly="readonly" */
$maxlength = $field->maxlength ? 'maxlength="'.$field->maxlength.'"' : '';
echo '<input type="text" id="'.$field->name.'_field" name="'.$field->name.'" size="'.$field->size.'" value="'. ($db->sf($field->name, true, false)?$db->sf($field->name, true, false):'').'" class="inputbox" '.$maxlength .'/>';
}
Теперь все поля продублировались, причем в одном поле можно редактировать данные, а в другом, как и требуется, нельзя.
И попутно назрел еще один вопрос:
поля    vm_regc, vm_blocked, и vm_datablocked нужны только в админке (для служебной информации), вот их бы в идеале сделать скрытыми на страничке пользователя.
« Последнее редактирование: 05.09.2013, 09:21:47 от Messir »
*

fsv

  • Moderator
  • 2767
  • 403 / 2
Теперь все поля продублировались, причем в одном поле можно редактировать данные, а в другом, как и требуется, нельзя.
код всей функции listUserFields засуньте под спойлер, сначала внесите след.изменения:

поля    vm_regc, vm_blocked, и vm_datablocked нужны только в админке (для служебной информации), вот их бы в идеале сделать скрытыми на страничке пользователя.
Код
case 'vm_regc':
case 'vm_blocked':
case 'vm_datablocked':
if ( $page == "account.shipto" || $page == "account.billing" ) {
$maxlength = $field->maxlength ? 'maxlength="'.$field->maxlength.'"' : '';
echo '<input type="text" id="'.$field->name.'_field" name="'.$field->name.'" size="'.$field->size.'" value="'. ($db->sf($field->name, true, false)?$db->sf($field->name, true, false):'').'" class="inputbox" '.$maxlength .'  style="display:none;" />';
} else {
$maxlength = $field->maxlength ? 'maxlength="'.$field->maxlength.'"' : '';
echo '<input type="text" id="'.$field->name.'_field" name="'.$field->name.'" size="'.$field->size.'" value="'. ($db->sf($field->name, true, false)?$db->sf($field->name, true, false):'').'" class="inputbox" '.$maxlength .'/>';
}
Веб-разработка: заказ. Только новая объемная разработка. Качественно, дорого.
*

Messir

  • Давно я тут
  • 532
  • 73 / 0
  • могу укусить:)
Ну изменения внес, не знаю, правильно ли, код функции под спойлером:
Спойлер
[свернуть]
*

fsv

  • Moderator
  • 2767
  • 403 / 2
break;  после каждого case: забыл, добавьте.
Веб-разработка: заказ. Только новая объемная разработка. Качественно, дорого.
*

Messir

  • Давно я тут
  • 532
  • 73 / 0
  • могу укусить:)
Супер, все работает, огромное спасибо!
*

Messir

  • Давно я тут
  • 532
  • 73 / 0
  • могу укусить:)
А можно обнаглеть окончательно?)))))
Неактуальные для пользователя поля скрыл, но их названия (Title) все равно выводятся, вот как бы и их убрать, чтобы глупых вопросов не задавали?
*

fsv

  • Moderator
  • 2767
  • 403 / 2
Неактуальные для пользователя поля скрыл, но их названия (Title) все равно выводятся, вот как бы и их убрать, чтобы глупых вопросов не задавали?
после
Код
$delimiter++;
  continue;
  }
оберните условием код:

Код
if ( $page != "account.shipto" && $page != "account.billing"  ) {

                  echo '<div id="'.$field->name.'_div" class="formLabel ';
  if (stristr($missing,$field->name)) {
  echo 'missing';
  }
  echo '">';
       echo '<label for="'.$field->name.'_field">'.$field->title.'</label>';
       if( isset( $required_fields[$field->name] )) {
        echo '<strong>* </strong>';
       }
      echo ' </div>

}
« Последнее редактирование: 05.09.2013, 23:25:17 от fsv »
Веб-разработка: заказ. Только новая объемная разработка. Качественно, дорого.
*

Messir

  • Давно я тут
  • 532
  • 73 / 0
  • могу укусить:)
Обернул, получил ошибку:
Код
Parse error: syntax error, unexpected T_IF, expecting T_FUNCTION in **************\administrator\components\com_virtuemart\classes\ps_userfield.php on line 833
в 833 строке код:
Код
if (!defined('VM_ALLOW_EXTENDED_CLASSES') && file_exists(dirname(__FILE__).'/../virtuemart.cfg.php')) {
если же перенести закрывающую скобку ниже, т.е.
Код
if ( $page != "account.shipto" && $page != "account.billing"  ) {

                  echo '<div id="'.$field->name.'_div" class="formLabel ';
    if (stristr($missing,$field->name)) {
    echo 'missing';
    }
    echo '">';
        echo '<label for="'.$field->name.'_field">'.$field->title.'</label>';
        if( isset( $required_fields[$field->name] )) {
        echo '<strong>* </strong>';
        }
      echo ' </div>


      <div class="formField" id="'.$field->name.'_input">'."\n";
}
то ошибка исчезает, но названия все равно присутствуют на страничке.
*

fsv

  • Moderator
  • 2767
  • 403 / 2
ну да, я порвал строку, на бегу отвечал. а если так:
Код
  echo ' </div>';
}
'<div class="formField" id="'.$field->name.'_input">'."\n";
Веб-разработка: заказ. Только новая объемная разработка. Качественно, дорого.
*

Messir

  • Давно я тут
  • 532
  • 73 / 0
  • могу укусить:)
ну да, я порвал строку, на бегу отвечал. а если так:
Код
  echo ' </div>';
}
'<div class="formField" id="'.$field->name.'_input">'."\n";
так расползается шаблон, как будто пропадает один из дивов
*

fsv

  • Moderator
  • 2767
  • 403 / 2
div пропадает, да. Но что-то я сразу не с того начал. Надо же скрыть не для всех полей, а только для трех.
Сейчас некогда, потом посмотрю. Но если вкратце, то в условии - проверка на страницу и вид поля, для этих трех - стиль display:none; } else { вариант дефолтный
Или на jQuery несколько строк в шаблоны ЛК - по селекторам скрывать.
Веб-разработка: заказ. Только новая объемная разработка. Качественно, дорого.
*

fsv

  • Moderator
  • 2767
  • 403 / 2
Посмотрел. Скрыл label скрытых полей. В результате на их месте дырка. И отрицательный margin-top не помогает, потому что после каждого поля идет перевод строки (стр.540 - <br style="clear:both;" />'; ). Результат в прикрепленном файле (изменения выделены - стр.297,351-357,362-363,368-371,405-426), только это не результат.

Попробовал на jQuery, получилось нормально.
1) ps_userfield.php , добавить в форму идентификатор
стр.287
Код
echo '<form action="'. $mm_action_url .basename($_SERVER['PHP_SELF']).'" method="post" name="adminForm" id="adminForm">';
2) Вставить в требуемые шаблоны (account.billing.tpl.php, account.shipto.tpl.php) или по условию текущей страницы в шаблон Joomla:

Код
<script type="text/javascript">
jQuery(function($) {
var hiddenDivs = [ "address_1", "city" ]; // перечисляем name скрываемых полей
var readonlyDivs = [ "first_name", "last_name" ]; // перечисляем name полей "только для чтения"
$("#adminForm div").each(function() {
if ( $(this).attr("id") ) {
if ( $.inArray($(this).attr("id").replace("_input", ""), hiddenDivs)!= -1 ) {
$(this).hide().prev("div").hide().end().next("br").hide();
}
if ( $.inArray($(this).attr("id").replace("_input", ""), readonlyDivs)!= -1 ) {
$(this).children(".inputbox").attr("readonly","readonly");
}
}
});
});
</script>
« Последнее редактирование: 07.09.2013, 00:52:01 от fsv »
Веб-разработка: заказ. Только новая объемная разработка. Качественно, дорого.
*

Messir

  • Давно я тут
  • 532
  • 73 / 0
  • могу укусить:)
глупый вопрос - а все изменения, сделанные до этого (указанные в постах выше) убрать? Т.е вернуть файл в исходный вид, или они актуальны?

Update:
Разобрался, все работает просто изумительно!
« Последнее редактирование: 07.09.2013, 14:06:45 от Messir »
*

fsv

  • Moderator
  • 2767
  • 403 / 2
Разобрался, все работает просто изумительно!
Ну и отлично.
Для тех, кто придет после нас:
а все изменения, сделанные до этого (указанные в постах выше) убрать? Т.е вернуть файл в исходный вид?
Да, убрать. За исключением добавления id в форму.
Веб-разработка: заказ. Только новая объемная разработка. Качественно, дорого.
*

Messir

  • Давно я тут
  • 532
  • 73 / 0
  • могу укусить:)
Дико извиняюсь, что поднимаю давнюю тему, но вот как бы теперь подобную фишку прикрутить к ВМ2? Попробовал по аналогии - что то не получилось...
*

fsv

  • Moderator
  • 2767
  • 403 / 2
как бы теперь подобную фишку прикрутить к ВМ2? Попробовал по аналогии - что то не получилось...
дайте ссылку на нужную страницу. сегодня посмотреть не смогу, возможно, завтра.
Веб-разработка: заказ. Только новая объемная разработка. Качественно, дорого.
*

Messir

  • Давно я тут
  • 532
  • 73 / 0
  • могу укусить:)
дайте ссылку на нужную страницу. сегодня посмотреть не смогу, возможно, завтра.
Сайт на локалке, попробую объяснить на пальцах... Собираюсь перейти со связки J1.5+VM 1.1.9 на связку J2.5+VM 2.6.14. Благодаря Вашей помощи в старой версии скрыл и закрыл от редактирования нужные поля. В новой версии пользователю будет доступен пункт меню "Профиль", по которому будет выводиться информация из профиля ВМ, вот как бы по аналогии с ВМ 1.1.9 скрыть ненужные поля, которые нужны только для админа?
*

fsv

  • Moderator
  • 2767
  • 403 / 2
Сайт на локалке, попробую объяснить на пальцах...
Работа с DOM. У меня сейчас нет под рукой. Закиньте на бесплатный какой-нить хостинг, ссылку в личку.
Это, если не смущает, что в исходном коде все останется (как и ранее). Иначе, надо php ковырять.
Веб-разработка: заказ. Только новая объемная разработка. Качественно, дорого.
*

fsv

  • Moderator
  • 2767
  • 403 / 2
Это, если не смущает, что в исходном коде все останется (как и ранее).
На этот раз удалил, а не скрыл.
Согласно вашей ссылки:
Код: javascript
jQuery(function($) {
var removeFields = [ "address_2", "fax" ], // перечисляем name удаляемых полей
   readonlyFields = [ "company", "middle_name" ]; // перечисляем name полей "только для чтения"
$("#adminForm input").each(function() {
if ( $(this).attr("id") ) {
if ( $.inArray($(this).attr("id").replace("_field", ""), removeFields)!= -1 ) {
$(this).closest("tr").remove();
}
if ( $.inArray($(this).attr("id").replace("_field", ""), readonlyFields)!= -1 ) {
$(this).attr("readonly","readonly");
}
}
});
});
Веб-разработка: заказ. Только новая объемная разработка. Качественно, дорого.
*

Messir

  • Давно я тут
  • 532
  • 73 / 0
  • могу укусить:)
Огромное спасибо! Все работает просто шикарно!
*

Messir

  • Давно я тут
  • 532
  • 73 / 0
  • могу укусить:)
Возникла небольшая проблема - добавил поле с типом "textarea", оно не хочет прятаться от пользователя))))). Подскажите, как его победить?
*

fsv

  • Moderator
  • 2767
  • 403 / 2
добавил поле с типом "textarea"
где? по недавней ссылке ничего не нашел.
Веб-разработка: заказ. Только новая объемная разработка. Качественно, дорого.
*

Messir

  • Давно я тут
  • 532
  • 73 / 0
  • могу укусить:)
где? по недавней ссылке ничего не нашел.
да по ссылке там уже другой тест крутится))) это я уже на рабочем локальном сайте добавляю. Тогда чуть позже верну тот тестовый сайт, просто думал, что сразу какие-то мысли появятся)))
*

fsv

  • Moderator
  • 2767
  • 403 / 2
вслепую - попробуйте
Код
$("#adminForm input, #adminForm textarea").each(function() {
Веб-разработка: заказ. Только новая объемная разработка. Качественно, дорого.
*

Messir

  • Давно я тут
  • 532
  • 73 / 0
  • могу укусить:)
вслепую - попробуйте
Код
$("#adminForm input, #adminForm textarea").each(function() {
Да Вы, Уважаемый, провидец!))))
Сработало, спасибки))))
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться