Новости Joomla

Вышли релизы Joomla 6.1 и Joomla 5.4.5: новые возможности и стабильность

Релиз Joomla 6.1.0

Проект Joomla! объявил о доступности Joomla 6.1 [Nyota] — новой минорной версии шестой серии, а также о выпуске релиза исправлений ошибок Joomla 5.4.5. Релиз 6.1 приносит ряд долгожданных функций, повышающих удобство управления контентом и защиту от спама.

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

FeaMor

  • Захожу иногда
  • 76
  • 0 / 0
Добрый день!

Подскажите, как сделать так, чтобы список городов при оформлении заказа был чисто такой, какой и в модуле доставки. Имеется в виду, что всего, допустим, 100 городов, где этот магазин работает и доставкатолько по этим 100 городам и идет, поэтому крайне лишне делать ввод имени города и индекса при оформлении заказа, достаточно брать список этих городов из списка доставок.

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

Смысл такой, что надо упростить форму заказа, чтобы пользователи не вводили индексы, т.к. речь идет о доставки подарков в другие города, а там не каждый знает индексы, и если не убрать этот момент, топользователи уходят на другие сайты с более простым интерфейсом(

Заранее спасибо!
« Последнее редактирование: 21.07.2012, 18:40:15 от FeaMor »
*

FeaMor

  • Захожу иногда
  • 76
  • 0 / 0
Re: Список городов из доставки
« Ответ #1 : 19.07.2012, 21:59:23 »
Я внес изменения на сервере магазина в файле:
administrator/components/com_virtuemart/classes/ps_userfield.php

Код
 ...
...
case 'title':


$ps_html->list_user_title($db->sf('title', true, false), "id=\"title_field\"");
break;


// НАЧАЛО - выпадающий список с выбором городов
case 'city':


$city_all00 = '<select style=width:300px id="'.$field->name.'_field" name="'.$field->name.'">
<option value="">Выбрать</option>
<optgroup label="Города">
<option value="Абаза">Абаза (Республика Хакасия)</option>
<option value="Абакан">Абакан (Республика Хакасия)</option>
...
...
<option value="Ямало-Ненецкий АО">Ямало-Ненецкий АО</option>
<option value="Ярославская область">Ярославская область</option>
</optgroup></select>';
echo str_replace('option value="'.$db->sf("city").'"', 'option value="'.$db->sf("city").'" selected', $city_all00); break;
// КОНЕЦ - выпадающий список с выбором городов



case 'country':
...
...

И теперь у меня выводится список городов, чтобы пользователь не вводил название города сам
теперь куда-то мне надо воткнуть проверку имени города и определение индекса, типа:
Код
если город=Челны, тогда индекс=423800
и так для каждого города. Этот список городов и индексов я собрал, но вот куда и как такую проверку воткнуть?
*

fsv

  • Moderator
  • 2787
  • 413 / 2
Re: Список городов из доставки
« Ответ #2 : 19.07.2012, 22:16:16 »
города можно было сделать:  "Управление полями, заполняемыми пользователем" - Добавить поле "город" - "ниспадающее меню (один выбор)"  (=> у меня такой перевод), и не изменять файл класса.
Веб-разработка: заказ. Только новая разработка.
*

FeaMor

  • Захожу иногда
  • 76
  • 0 / 0
Re: Список городов из доставки
« Ответ #3 : 19.07.2012, 22:21:04 »
Точно, что-то такое можно... Но я боюсь добавлять что-то новое в базу данных. Не могли бы дать конкретный пример куда что писать? Куда именно ввести и как список городов?
А все же потом, как именно присвоить индексы по выбранному городу? Мне нужно, чтобы даже старики могли просто выбрать город, а там где-то само автоматически определиться, какойименно индекс, а потом уже стандартная процедура определения стоимости по индексу
*

fsv

  • Moderator
  • 2787
  • 413 / 2
Re: Список городов из доставки
« Ответ #4 : 19.07.2012, 22:37:33 »
Точно, что-то такое можно... Но я боюсь добавлять что-то новое в базу данных. Не могли бы дать конкретный пример куда что писать? Куда именно ввести и как список городов?

Это не базу ковырять. Это в админке VM. Посмотрите, попробуйте добавить поле.

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

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

FeaMor

  • Захожу иногда
  • 76
  • 0 / 0
Re: Список городов из доставки
« Ответ #5 : 20.07.2012, 02:09:27 »
Я создал дополнительное поле, заполняемое пользователем 'cityall' с типом select, а также создал таблицу 'jos_vm_cityall' в базе, по аналогии с таблицей 'jos_vm_state', в которой есть код страны, имя города и индекс (cityall_id,    country_id,    cityall_name,    zip_1_code,    zip_2_code(на всякий случай второй индекс))
в файле ps_userfield.php создал следующее:
Код
	   			case 'cityall':
    echo $ps_html->dynamic_cityall_lists( "country", "cityall", $db->sf('country', true), $db->sf('cityall', true, false) );
    echo "<noscript>\n";
    $ps_html->list_cityall("cityall", $db->sf('cityall', true, false), "", "id=\"cityall_field\"");
    echo "</noscript>\n";
    break;


а в файле ps_html.php

Код
	function list_cityall($list_name,$selected_item="", $cityall_id="", $extra="") {
global $VM_LANG;

$db = new ps_DB;
$q = 'SELECT country_name, cityall_name, zip_1_code , zip_2_code
FROM #__{vm}_cityall s, #__{vm}_country c
WHERE s.country_id = c.country_id';
if( !empty( $country_id )) {
$q .= ' AND c.country_id='.(int)$country_id;
}
$q .= "\nORDER BY country_name, cityall_name";
$db->query( $q );
$list = Array();
$list["0"] = $VM_LANG->_('PHPSHOP_SELECT');
$list["NONE"] = "not listed";
$country = "";

while( $db->next_record() ) {
if( $country != $db->f("country_name")) {
$list[] = "------- ".$db->f("country_name")." -------";
$country = $db->f("country_name");
}
$list[$db->f("zip_1_code")] = $db->f("cityall_name");
}

$this->dropdown_display($list_name, $selected_item, $list,"","",$extra);
return 1;
}


function dynamic_cityall_lists( $country_list_name, $cityall_list_name, $selected_country_code="", $selected_cityall_code="" ) {
global $vendor_country_3_code, $VM_LANG, $vm_mainframe, $mm_action_url, $page;
$db = new ps_DB;
if( empty( $selected_country_code )) {
$selected_country_code = $vendor_country_3_code;
}

if( empty( $selected_cityall_code )) {
$selected_cityall_code = "originalPos";
} else {
$selected_cityall_code = "'".$selected_cityall_code."'";
}

$db->query( "SELECT c.country_id, c.country_3_code, s.cityall_name, s.zip_1_code
FROM #__{vm}_country c
LEFT JOIN #__{vm}_cityall s
ON c.country_id=s.country_id OR s.country_id IS NULL
ORDER BY c.country_id, s.cityall_name" );

if( $db->num_rows() > 0 ) {
if( !vmIsAdminMode() ) {
$vm_mainframe->addScript( $mm_action_url.'includes/js/mambojavascript.js');
$vm_mainframe->addScript( $mm_action_url.'includes/js/joomla.javascript.js');
}
// Build the State lists for each Country
$script = "<script language=\"javascript\" type=\"text/javascript\">//<![CDATA[\n";
$script .= "<!--\n";
$script .= "var originalOrder = '1';\n";
$script .= "var originalPos = '$selected_country_code';\n";
$script .= "var cityalls = new Array(); // array in the format [key,value,text]\n";
$i = 0;
$prev_country = '';
while( $db->next_record() ) {
$country_3_code = $db->f("country_3_code");
if( $db->f('cityall_name') ) {
// Add 'none' to the list of countries that have states:
if( $prev_country != $country_3_code  && $page == 'tax.tax_form' ) {
$script .= "cityalls[".$i++."] = new Array( '".$country_3_code."',' - ','".$VM_LANG->_('PHPSHOP_NONE')."' );\n";
}
elseif( $prev_country != $country_3_code ) {
$script .= "cityalls[".$i++."] = new Array( '".$country_3_code."','',' -= ".$VM_LANG->_('PHPSHOP_SELECT')." =-' );\n";
}
$prev_country = $country_3_code;

// array in the format [key,value,text]
$script .= "cityalls[".$i++."] = new Array( '".$country_3_code."','".$db->f("zip_1_code")."','".addslashes($db->f("cityall_name"))."' );\n";
}
else {
$script .= "cityalls[".$i++."] = new Array( '".$country_3_code."',' - ','".$VM_LANG->_('PHPSHOP_NONE')."' );\n";
}

}
$script .= "
function changecityallList() {
  var selected_country = null;
  for (var i=0; i<document.adminForm.".$country_list_name.".length; i++)
if (document.adminForm.".$country_list_name."[i].selected)
selected_country = document.adminForm.".$country_list_name."[i].value;
  changeDynaList('".$cityall_list_name."',cityalls,selected_country, originalPos, originalOrder);
 
}
writeDynaList( 'class=\"inputbox\" name=\"".$cityall_list_name."\" size=\"1\" id=\"cityall\"', cityalls, originalPos, originalPos, $selected_cityall_code );
//-->
//]]></script>";

return $script;
}
}

я все делал по аналогии с регионами, т.к. регионы мне не нужны, а вот города нужны.
Не знаю что конкретно за что отвечает, но вот что получилось:
в таблице 'jos_vm_user_info' поле добавилось новое поле 'cityall' и туда записывает нужный мне индекс, если в строчке ставить
Код
					// array in the format [key,value,text]
$script .= "cityalls[".$i++."] = new Array( '".$country_3_code."','".$db->f("zip_1_code")."','".addslashes($db->f("cityall_name"))."' );\n";

или выбранный город, если ставлю
Код
				// array in the format [key,value,text]
$script .= "cityalls[".$i++."] = new Array( '".$country_3_code."','".$db->f("cityall_name")."','".addslashes($db->f("cityall_name"))."' );\n";

но сам город и индекс в полях 'city' и 'zip' не меняется.

Как мне заменять эти поля из моего выбранного города?
наверняка просто где-то что-то добавить), типа в файл 'ps_userfield.php'
Код
	   			case 'zip':
    echo $ps_html->dynamic_cityall_lists( "country", "cityall", $db->sf('country', true), $db->sf('cityall', true, false) );
    echo "<noscript>\n";
    $ps_html->list_cityall("cityall", $db->sf('cityall', true, false), "", "id=\"cityall_field\"");
    echo "</noscript>\n";
    break;
только это не срабатывает и я не знаю почему именно. Со структурой программирования в Joomla вообще не знаком (

Подскажите, как мне сделать так, что бы в таблице 'jos_vm_user_info' менялось не последнее поле 'cityall', а именно 'city' и 'zip'




« Последнее редактирование: 20.07.2012, 02:13:21 от FeaMor »
*

FeaMor

  • Захожу иногда
  • 76
  • 0 / 0
Re: Список городов из доставки
« Ответ #6 : 20.07.2012, 16:29:03 »
Подскажите, как при нажатии кнопки "регистрация" при оформлении заказа или "сохранить данные", выбранный город из добавленного поля вручную сохранялся не только в отдельное поле таблицы jos_vm_user_info, но и заменял поле city в ней.
Какой код и где именно вставить надо?
*

fsv

  • Moderator
  • 2787
  • 413 / 2
Re: Список городов из доставки
« Ответ #7 : 20.07.2012, 19:14:14 »
Подскажите, как при нажатии кнопки "регистрация" при оформлении заказа или "сохранить данные", выбранный город из добавленного поля вручную сохранялся не только в отдельное поле таблицы jos_vm_user_info, но и заменял поле city в ней.

Добавление пользователя - посмотрите в ps_user.php  function add(&$d), выше там также валидация добавления.

Насчет замены города из одного поля в другое. Посмотрел сейчас, наверное, можно было проще:
1. Таблица : jos_vm_userfield , редактирование поля city :  type= select (был text)     -  поле системное, из админки не редактируется и не удаляется
2. Управление полями, заполняемыми пользователем: добавление в city городов (возможно, через  jos_vm_userfield_values будет быстрее), размер поля=0

Много чего наковырял уже. Молодец! (учитывая, что "Со структурой программирования в Joomla вообще не знаком").
Какой модуль доставки используется?
Веб-разработка: заказ. Только новая разработка.
*

FeaMor

  • Захожу иногда
  • 76
  • 0 / 0
Re: Список городов из доставки
« Ответ #8 : 20.07.2012, 19:23:59 »
Модуль доставки использую стандартный один "Standard Shipping Module", остальные отключены

честно говоря, я не понял эту схему, которая проще... Но думаю онане подойдет в любом случае, т.к. через type= select не сделать привязку города к стране, а мне надо именно и привязку к стране и привязку к индексам. Вот я и создал отдельную табличку с этими данными (позже ее уберу и привяжу напрямую с таблицей от модуля доставки, т.к. там и есть все эти данные)

сейчас у меня именно проблема с тем, чтобы заменить город и индекс на основании дополнительного поля городов)
еще есть маленькая проблемка, я полностью взял функцию выбора региона и заменил ее на город, но регионы то изменялись, если выбрать другую страну, а вот города неменяются в зависимости от страны ((
*

fsv

  • Moderator
  • 2787
  • 413 / 2
Re: Список городов из доставки
« Ответ #9 : 20.07.2012, 23:17:38 »
честно говоря, я не понял эту схему, которая проще...

Имелось ввиду не создавать дополнительное поле cityall , а использовать то, что есть - city. Оно "системное", из админки не редактируется, как изменить, написал выше. Тогда не будет вопроса: "как передать значение из cityall в city ?".

Но думаю онане подойдет в любом случае, т.к. через type= select не сделать привязку города к стране, а мне надо именно и привязку к стране и привязку к индексам.

Зачем эти 2 привязки? Только потому, что используете "Standard Shipping Module" , и там эти параметры увязаны ? Или есть другая причина? Если только из-за "Standard Shipping Module", то можно посмотреть на Zone Shipping . Надо будет переделать. Но, кажется, там суммарные переделки будут меньше, чем вы уже накрутили. И, учитывая ваши успехи, думаю вы справитесь.
zone_shipping.php  -  Первоначальную выборку страны можно заменить на город. Далее выбор zone_id не из #__{vm}_country , а из вашей таблицы "город=zone_id", где zone_id лучше заполнить после заполнения #__{vm}_zone_shipping , т.к. далее в коде это связано ($q3).
Веб-разработка: заказ. Только новая разработка.
*

FeaMor

  • Захожу иногда
  • 76
  • 0 / 0
Re: Список городов из доставки
« Ответ #10 : 20.07.2012, 23:54:24 »
Нужен следующий интерфейс:
1) Пользователь выбирает страну
2) В зависимости от страны, изменяется список городов (так же как у встроенного выбора региона) (здесь как раз и нужна привязка к стране)
3) Автоматически из списка городов и их индексов индексов берется индекс и ставится в базу

Глобальных изменений не делаю, только для указания города в оформлении доставки
Сейчас убираю ту дополнительную таблицу ихочу использовать только таблицу от модуля "Standard Shipping Module", там есть и имя города, и страна, и индекс, откуда я хочу их вставлять в адрес доставки. А потом этот же модуль опять прогонит адрес через эту таблицу и оценит стоимость ))

Вот сейчас пробую записать данные в поля city и zip, но пока тщетно... Я не знаю php, чисто на уровне интуиции тыкаюсь )
*

FeaMor

  • Захожу иногда
  • 76
  • 0 / 0
Re: Список городов из доставки
« Ответ #11 : 21.07.2012, 17:52:28 »
Город я сделал!
Полностью заменил штат (он же регион) на сити (он же город) ))
Есть проблема, что список городов не меняется в зависимости от страны, но это много позже...
Каким образом мне теперь присваивать индекс, я не знаю ((
Пытался в файле ps_user.php все запросы поменять на прямые:
Код
UPDATE #__{vm}_user_info SET `zip` = '400000' WHERE #__{vm}_user_info.user_info_id = '62'; /*62 - это мой аккаунт*/
но ни один запрос не сработал, даже echo не работает ни в одних из функций этого файлов. Точно ли надо в этом файле редакцию делать?
Мне надо добавить свой код изменения таблицы бд напрямую тогда, когда человек нажимает "сохранить"/"регистрация" в форме заказа при вводе адреса. Для этого мне нужна конкретная функция, где в самый конец ее я могу такое вставить. Всего то просто взять и заменить значение ячейки из другой таблички...
Подскажите, в какой функции какого файла ковыряться
*

fsv

  • Moderator
  • 2787
  • 413 / 2
Индекс. Возможен следующий вариант. В #__{vm}_user_info пусть пишется реальный индекс покупателя, заполняемый им при регистрации. Он будет использоваться везде, кроме расчета стоимости доставки. Для расчета доставки "условный" индекс, заданный вами для конкретного города, тяните из вашей новой таблицы jos_vm_cityall .
\administrator\components\com_virtuemart\classes\shipping\standard_shipping.php
запрос в стр.44-50
вместо "country,zip" - только city, плюс запрос на zip из новой таблицы по полученному city.
Веб-разработка: заказ. Только новая разработка.
*

FeaMor

  • Захожу иногда
  • 76
  • 0 / 0
Индекс вообще нигде не должен вводиться (
Но мне надо обязательно его ставить в таблицу #__{vm}_user_info, хотя бы для того, чтобы можно было самому видеть что куда...
Поэтому подмену надо осуществлять не на странице доставки, а на странице оформления адреса...
Я так и не смог найти, где именно идет UPDATE таблицы #__{vm}_user_info (( каждый файлик просматриваю, меняю на статичную замену, проверяю, меняю обратно и т.п.
Надо найти функции, которые отвечают за сохранение нового и замену старого адреса... Помогите с ее нахождение, пожалуйста!
*

fsv

  • Moderator
  • 2787
  • 413 / 2
Надо найти функции, которые отвечают за сохранение нового и замену старого адреса...

ps_user.php
function add(&$d)  /*Adds a new User to the CMS and VirtueMart */
function update(&$d)  /*Updates a User Record*/

Цитировать
Поэтому подмену надо осуществлять не на странице доставки, а на странице оформления адреса
Я не предлагал подмену на странице доставки, там мог бы отображаться реальный индекс (если нужен, конечно). Я предложил брать готовое значение из другого источника только для расчета ставки. Т.к. вариант "подменить" при регистрации то, чего еще нет, как-то хлопотнее.
Веб-разработка: заказ. Только новая разработка.
*

FeaMor

  • Захожу иногда
  • 76
  • 0 / 0
ps_user.php
function add(&$d)  /*Adds a new User to the CMS and VirtueMart */
function update(&$d)  /*Updates a User Record*/

Либо руки у меня корявые, либо это не те функции ((( У меня не срабатывает там ничего... Даже когда напрямую написал запрос типа UPDATE #__{vm}_user_info SET `zip` = '400000'

Мне надо, что бы моя маленькая функция по вставке индекса срабатывала при нажатии "Регистрация" у новых пользователей (страница ввода всех данных) и при нажатии "Сохранить" на странице редактировании уже зарегистрированных пользователей на страницах, ссылки на которые я выделил на рисунке


*

FeaMor

  • Захожу иногда
  • 76
  • 0 / 0
Напишите пожалуйста пример, как именно запихнуть в указанные функции свой код..
Просто хотя бы не динамическое определение индекса а обычную какую-нить цифру, типа 123456

Например я вот так вот делаю:
Код
	function update(&$d) {
global $my, $VM_LANG, $perm, $vmLogger;
$ps_vendor_id = $_SESSION["ps_vendor_id"];
$db = new ps_DB;
$timestamp = time();

if (!$this->validate_update($d)) {
return False;
}

// Joomla User Information stuff
if( vmIsJoomla( '1.5', '>=' ) ) {
$this->save();
} else {
$this->saveUser( $d );
}

// Update Bill To

// Get all fields which where shown to the user
$userFields = ps_userfield::getUserFields('account', false, '', true);

$user_id = intval( $d['id'] );

// Building the query: PART ONE
// The first 7 fields are FIX and not built dynamically
$db->query( "SELECT COUNT(user_info_id) AS num_rows
FROM #__{vm}_user_info WHERE user_id='" . $user_id . "'" );
if( $db->f('num_rows') < 1 ) {
// The user is registered in Joomla, but not in VirtueMart; so, insert the bill to information
return $this->add($d);
}
else {
$q = "UPDATE #__{vm}_user_info SET
                                `mdate` = '".time()."',
`zip` = '123456',
                                `perms` = '".$d['perms']."', ";
$fields = array();
$skip_fields = ps_userfield::getSkipFields();
foreach( $userFields as $userField ) {
if( !in_array($userField->name,$skip_fields)) {
$d[$userField->name] = ps_userfield::prepareFieldDataSave( $userField->type, $userField->name, @$d[$userField->name]);
$fields[] = "`".$userField->name."`='".$db->getEscaped($d[$userField->name])."'";
}
}
$fields[] = "`zip`='123456'";
$q .= str_replace( '`email`', '`user_email`', implode( ",\n", $fields ));

$q .= " WHERE user_id=".$user_id." AND address_type='BT'";

// Run the query now!
$db->query($q);
}

if( $perm->check("admin")) {
$vendor_id = $d['vendor_id'];
}
else {
$vendor_id = $ps_vendor_id;
}

$db->query( "SELECT COUNT(user_id) as num_rows FROM #__{vm}_auth_user_vendor WHERE vendor_id='".$vendor_id."' AND user_id='" . $d["user_id"] . "'" );
if( $db->f('num_rows') < 1 ) {
// Insert vendor relationship
$q = "INSERT INTO #__{vm}_auth_user_vendor (user_id,vendor_id)";
$q .= " VALUES ";
$q .= "('" . $d['user_id'] . "','$vendor_id') ";
$db->query($q);
}
else {
// Update the User- Vendor  relationship
$q = "UPDATE #__{vm}_auth_user_vendor set ";
$q .= "vendor_id='".$d['vendor_id']."' ";
$q .= "WHERE user_id='" . $d["user_id"] . "'";
$db->query($q);
}
$db->query( "SELECT COUNT(user_id) as num_rows FROM #__{vm}_shopper_vendor_xref WHERE vendor_id='".$vendor_id."' AND user_id='" . $d["user_id"] . "'" );
if( $db->f('num_rows') < 1 ) {
// Insert Shopper -ShopperGroup - Relationship
$q  = "INSERT INTO #__{vm}_shopper_vendor_xref ";
$q .= "(user_id,vendor_id,shopper_group_id,customer_number) ";
$q .= "VALUES ('".$d['user_id']."', '$vendor_id','".$d['shopper_group_id']."', '".$d['customer_number']."')";
}
else {
// Update the Shopper Group Entry for this user
$q = "UPDATE #__{vm}_shopper_vendor_xref SET ";
$q .= "shopper_group_id='".$d['shopper_group_id']."' ";
$q.= ",vendor_id ='".$vendor_id."' ";
$q .= "WHERE user_id='" . $d["user_id"] . "' ";
}
$db->query($q);

$vmLogger->info( $VM_LANG->_('VM_USER_UPDATED') );

return True;
}

Строчки добавил, они без отступа, оба варианта не работаю. Должно же по сути срабатывать, что в поле ZIP внесется запись 123456?
*

fsv

  • Moderator
  • 2787
  • 413 / 2
Не внимательно посмотрел и не то подсказал. Извиняюсь.
На странице регистрации - функция shopperadd , которой соответствует класс ps_shopper .

Цитировать
Просто хотя бы не динамическое определение индекса а обычную какую-нить цифру, типа 123456

стр.358-366 // The first 7 fields are FIX and not built dynamically
после стр.363 (например)
'mdate' => $timestamp,
вставляете
'zip' => '123456',
« Последнее редактирование: 22.07.2012, 20:55:45 от fsv »
Веб-разработка: заказ. Только новая разработка.
*

FeaMor

  • Захожу иногда
  • 76
  • 0 / 0
Спасибо, вставил в каждую функцию, но иногда не срабатывает почему-то, также вставил в самое начало файла checkout.index.php
подумал, что ничего страшного, если несколько раз подряд запустится одна и та же функция )
« Последнее редактирование: 23.07.2012, 01:42:50 от FeaMor »
*

FeaMor

  • Захожу иногда
  • 76
  • 0 / 0
Теперь вопрос вот в чем, я полностью заменил любое вхождение слова "state" на "city", даже в словосочетаниях (имеются, конечно же, в виду названия переменных) в файле ps_html.php
Было:
Код
	/**
* Creates a drop-down list for states [filtered by country_id]
*
* @param string $list_name The name of the select element
* @param string $selected_item The value of the pre-selected option
* @param int $country_id The ID of a country to filter states from
* @param string $extra More attributes for the select element when needed
* @return HTML code with the drop-down list
*/
function list_states($list_name,$selected_item="", $country_id="", $extra="") {
global $VM_LANG;

$db = new ps_DB;
$q = 'SELECT country_name, state_name, state_3_code , state_2_code
FROM #__{vm}_state s, #__{vm}_country c
WHERE s.country_id = c.country_id';
if( !empty( $country_id )) {
$q .= ' AND c.country_id='.(int)$country_id;
}
$q .= "\nORDER BY country_name, state_name";
$db->query( $q );
$list = Array();
$list["0"] = $VM_LANG->_('PHPSHOP_SELECT');
$list["NONE"] = "not listed";
$country = "";

while( $db->next_record() ) {
if( $country != $db->f("country_name")) {
$list[] = "------- ".$db->f("country_name")." -------";
$country = $db->f("country_name");
}
$list[$db->f("state_2_code")] = $db->f("state_name");
}

$this->dropdown_display($list_name, $selected_item, $list,"","",$extra);
return 1;
}
/**
* Creates a Javascript based dynamic state list, depending of the selected
* country of a country drop-down list (specified by $country_list_name)
*
* @param string $country_list_name The name of the country select list element
* @param string $state_list_name The name for this states drop-down list
* @param string $selected_country_code The 3-digit country code that is pre-selected
* @param string $selected_state_code The state code of a pre-selected state
* @return string HTML code containing the dynamic state list
*/
function dynamic_state_lists( $country_list_name, $state_list_name, $selected_country_code="", $selected_state_code="" ) {
global $vendor_country_3_code, $VM_LANG, $vm_mainframe, $mm_action_url, $page;
$db = new ps_DB;
if( empty( $selected_country_code )) {
$selected_country_code = $vendor_country_3_code;
}

if( empty( $selected_state_code )) {
$selected_state_code = "originalPos";
} else {
$selected_state_code = "'".$selected_state_code."'";
}

$db->query( "SELECT c.country_id, c.country_3_code, s.state_name, s.state_2_code
FROM #__{vm}_country c
LEFT JOIN #__{vm}_state s
ON c.country_id=s.country_id OR s.country_id IS NULL
ORDER BY c.country_id, s.state_name" );

if( $db->num_rows() > 0 ) {
if( !vmIsAdminMode() ) {
$vm_mainframe->addScript( $mm_action_url.'includes/js/mambojavascript.js');
$vm_mainframe->addScript( $mm_action_url.'includes/js/joomla.javascript.js');
}
// Build the State lists for each Country
$script = "<script language=\"javascript\" type=\"text/javascript\">//<![CDATA[\n";
$script .= "<!--\n";
$script .= "var originalOrder = '1';\n";
$script .= "var originalPos = '$selected_country_code';\n";
$script .= "var states = new Array(); // array in the format [key,value,text]\n";
$i = 0;
$prev_country = '';
while( $db->next_record() ) {
$country_3_code = $db->f("country_3_code");
if( $db->f('state_name') ) {
// Add 'none' to the list of countries that have states:
if( $prev_country != $country_3_code  && $page == 'tax.tax_form' ) {
$script .= "states[".$i++."] = new Array( '".$country_3_code."',' - ','".$VM_LANG->_('PHPSHOP_NONE')."' );\n";
}
elseif( $prev_country != $country_3_code ) {
$script .= "states[".$i++."] = new Array( '".$country_3_code."','',' -= ".$VM_LANG->_('PHPSHOP_SELECT')." =-' );\n";
}
$prev_country = $country_3_code;

// array in the format [key,value,text]
$script .= "states[".$i++."] = new Array( '".$country_3_code."','".$db->f("state_2_code")."','".addslashes($db->f("state_name"))."' );\n";
}
else {
$script .= "states[".$i++."] = new Array( '".$country_3_code."',' - ','".$VM_LANG->_('PHPSHOP_NONE')."' );\n";
}

}
$script .= "
function changeStateList() {
  var selected_country = null;
  for (var i=0; i<document.adminForm.".$country_list_name.".length; i++)
if (document.adminForm.".$country_list_name."[i].selected)
selected_country = document.adminForm.".$country_list_name."[i].value;
  changeDynaList('".$state_list_name."',states,selected_country, originalPos, originalOrder);
 
}
writeDynaList( 'class=\"inputbox\" name=\"".$state_list_name."\" size=\"1\" id=\"state\"', states, originalPos, originalPos, $selected_state_code );
//-->
//]]></script>";

return $script;
}
}

Стало:
Код
	function list_citys($list_name,$selected_item="", $country_id="", $extra="") {
global $VM_LANG;

$db = new ps_DB;
$q = 'SELECT country_name, shipping_rate_name, shipping_rate_zip_start , shipping_rate_zip_end
FROM #__{vm}_shipping_rate s, #__{vm}_country c
WHERE CONCAT(c.country_3_code , ";") LIKE s.shipping_rate_country';
if( !empty( $country_id )) {
$q .= ' AND c.country_id='.(int)$country_id;
}
$q .= "\nORDER BY country_name, shipping_rate_name";
$db->query( $q );
$list = Array();
$list["0"] = $VM_LANG->_('PHPSHOP_SELECT');
$list["NONE"] = "not listed";
$country = "";

while( $db->next_record() ) {
if( $country != $db->f("country_name")) {
$list[] = "------- ".$db->f("country_name")." -------";
$country = $db->f("country_name");
}
$list[$db->f("shipping_rate_zip_start")] = $db->f("shipping_rate_name");
}

$this->dropdown_display($list_name, $selected_item, $list,"","",$extra);
return 1;
}

function dynamic_city_lists( $country_list_name, $city_list_name, $selected_country_code="", $selected_city_code="" ) {
global $vendor_country_3_code, $VM_LANG, $vm_mainframe, $mm_action_url, $page;
$db = new ps_DB;
if( empty( $selected_country_code )) {
$selected_country_code = $vendor_country_3_code;
}

if( empty( $selected_city_code )) {
$selected_city_code = "originalPos";
} else {
$selected_city_code = "'".$selected_city_code."'";
}

$db->query( "SELECT c.country_id, c.country_3_code, s.shipping_rate_name, s.shipping_rate_zip_start
FROM #__{vm}_country c
LEFT JOIN #__{vm}_shipping_rate s
ON (CONCAT(c.country_3_code , ';') LIKE s.shipping_rate_country) OR ((s.shipping_rate_country IS NULL) or (s.shipping_rate_country = ''))
ORDER BY c.country_id, s.shipping_rate_name" );

if( $db->num_rows() > 0 ) {
if( !vmIsAdminMode() ) {
$vm_mainframe->addScript( $mm_action_url.'includes/js/mambojavascript.js');
$vm_mainframe->addScript( $mm_action_url.'includes/js/joomla.javascript.js');
}
// Build the State lists for each Country
$script = "<script language=\"javascript\" type=\"text/javascript\">//<![CDATA[\n";
$script .= "<!--\n";
$script .= "var originalOrder = '1';\n";
$script .= "var originalPos = '$selected_country_code';\n";
$script .= "var citys = new Array(); // array in the format [key,value,text]\n";
$i = 0;
$prev_country = '';
while( $db->next_record() ) {
$country_3_code = $db->f("country_3_code");
if( $db->f('shipping_rate_name') ) {
// Add 'none' to the list of countries that have states:
if( $prev_country != $country_3_code  && $page == 'tax.tax_form' ) {
$script .= "citys[".$i++."] = new Array( '".$country_3_code."',' - ','".$VM_LANG->_('PHPSHOP_NONE')."' );\n";
}
elseif( $prev_country != $country_3_code ) {
$script .= "citys[".$i++."] = new Array( '".$country_3_code."','',' -= ".$VM_LANG->_('PHPSHOP_SELECT')." =-' );\n";
}
$prev_country = $country_3_code;

// array in the format [key,value,text]
$script .= "citys[".$i++."] = new Array( '".$country_3_code."','".$db->f("shipping_rate_zip_start")."','".addslashes($db->f("shipping_rate_name"))."' );\n";
}
else {
$script .= "citys[".$i++."] = new Array( '".$country_3_code."',' - ','".$VM_LANG->_('PHPSHOP_NONE')."' );\n";
}

}
$script .= "
function changeCityList() {
  var selected_country = null;
  for (var i=0; i<document.adminForm.".$country_list_name.".length; i++)
if (document.adminForm.".$country_list_name."[i].selected)
selected_country = document.adminForm.".$country_list_name."[i].value;
  changeDynaList('".$city_list_name."',citys,selected_country, originalPos, originalOrder);
 
}
writeDynaList( 'class=\"inputbox\" name=\"".$city_list_name."\" size=\"1\" id=\"city\"', citys, originalPos, originalPos, $selected_city_code );
//-->
//]]></script>";

return $script;
}
}

И теперь у меня выпадающий списокназвания городов не связан с выпадающим списком стран. Имеется в виду, что изначально стоит пара Россия и список российский городов, я могусделать, например, "Угунду", а списокгородов останется российским, но сохранив и зайдя заново для изменения, "Угунда" останется, авот список городов изменится уже для угунды... (под Угундой я подразумеваю любую другую страну). Короче списокгородов не меняется динамически, он меняется только послеперезагрузки... Подскажите, наверняка ошибка очевидная...
*

FeaMor

  • Захожу иногда
  • 76
  • 0 / 0
Что не пробую, результата не дает, видимо как-то неправильно скрипт формируется (( Вряд ли дело в самих данных (города и индексы)
*

FeaMor

  • Захожу иногда
  • 76
  • 0 / 0
Обнаружилась еще одна проблема.
Объясню с самого начала: я создал дополнительное поле при регистрации, которое содержит имена городов, при выборе одного из которых в базу записывается его индекс в доп. поле таблицы jos_vm_user_info. Позже я напрямую в коде присваиваю полям город и индекс в этой же таблице их значения, в соответствии с индексом в доп. поле. Все отлично работает. Но вот проблема: в самом заказе, высылаемом по почте и отображаемом в админке, не отображается имя города, а отображается его индекс ( Каким образом я могу эти значения поменять в создаваемом заказе? И где бы мне можно было бы обновить значения имени города и индекса в самих переменных, которые на протяжении оформления заказа не обновляются сами из БД, ведь я имя переназначаю вручную...
*

FeaMor

  • Захожу иногда
  • 76
  • 0 / 0
Сам не отыскал решение проблемы, подскажите пожалуйста направление хотя бы
*

fsv

  • Moderator
  • 2787
  • 413 / 2
Проблематично что-то конкретное подсказать, не зная всех деталей. А вникать в то, что вы там накрутили, проще с нуля выполнить работу. Мне кажется (писал уже), что вы очень усложнили решение. Города можно было в основном поле, а не в дополнительном. Не надо было бы потом присваивать что-то.
В чем сейчас вопрос? Как писать город в таблицу с заказом? Запись корзины в заказ - ps_checkout.php . Там же и формирование писем.
Запись данных юзера в заказ -  в #__{vm}_order_user_info примерно со стр.1068 - * Insert the User Billto & Shipto Info .
Веб-разработка: заказ. Только новая разработка.
*

FeaMor

  • Захожу иногда
  • 76
  • 0 / 0
Это все в одном файле ps_checkout.php можно сделать?
Спасибочки большое!
А как можно переменную заменить в ходе работы сайта? В смысле, чтобы значения переменных "zip" и "city", которые каждый раз передаются со страницы на страницу оформления заказа (то ли post`ом, то ли еще как-то, сам не знаю), с которых записывается занчения в БД, я мог изменить с каких-либо на свои собственные... Они как-то прямо массивом передаются походу ))
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Как всегда показывать форму ввода данных покупателя при покупке без регистрации?

Автор aikr

Ответов: 1
Просмотров: 1947
Последний ответ 31.10.2013, 13:31:42
от market316
Адрес доставки на странице подтверждения заказа

Автор sa1981

Ответов: 21
Просмотров: 3140
Последний ответ 15.05.2013, 01:29:26
от artlux
Календарь выбора даты и времени доставки заказа

Автор geoyum

Ответов: 0
Просмотров: 2757
Последний ответ 30.08.2012, 12:54:07
от geoyum
поле для ввода номера отправления(трекинг-номера)

Автор rezon

Ответов: 1
Просмотров: 2030
Последний ответ 23.07.2012, 14:09:27
от lin_ka
Адрес доставки -default- в письме. Как поменять слово -default- ?

Автор AnatolyW

Ответов: 2
Просмотров: 2297
Последний ответ 26.04.2012, 22:04:21
от fsv