Jump to content

  • You cannot start a new topic
  • You cannot reply to this topic

Обновление Модуля 4.0.3 - 4.2.2 Rate Topic   - - - - -

 
  • alex-pro
  • Advanced Member
  • Trial users
  • Join Date: 07-Nov 13
  • 95 posts

Posted 16 October 2014 - 11:10 AM #1

Здраствуйте,

есть модуль из-за которого cs-cart зависает, уходит в бесконечный цикл.

модуль отвечает за выбор метода доставки.
сам выбор и его сохранение работает.

ни из-за него не работают коды купонов, из-за него cs-cart зависает на этом моменте.

модуль был разработан для версии 4.0.3 но стабильно работал до 4.1.1
сейчас на версии 4.2.2 работает, но убивает обработку купонов.


вдруг чтото поменялось, хуки, классы, я был бы очень благодарен

init.php
<?
if (!defined('BOOTSTRAP')) { die('Access denied'); }
fn_register_hooks(
'pre_place_order'
);
?>
func.php
use Tygh\Registry;
if (!defined('BOOTSTRAP')) { die('Access denied'); }

function fn_get_smarto_locs($what){
  $avs_settings = Registry::get('addons.avs');
  $found_flag = false;
  foreach ($avs_settings as $key => $value) {
    if($value == $what){
	  return fn_avs_get_locations("http://tmp.example.com/cscart/xml/".$key.".xml");
    }//if($value == $what)
    if($found_flag==true) break;
  }//foreach
  /*if($found_flag==false)
    return false;*/
}
function fn_avs_pre_place_order(&$cart, $allow, $product_groups) {
    /* hook is defined in app/functions/fn.cart.php and registered in addon init.php */
    /* saves Post24/SmartPOST/Cargobus/DPD/etc pick-up point to order details */
    /* it would not work for Multi-Vendor Edition, as product_group is hardcoded and only 1 shipping method per order is allowed */
    if(isset($_SESSION['avs_location_token'])) {
	  $cart['product_groups'][0]['chosen_shippings'][0]['avs_location'] = $_SESSION['avs_location_token'];
	  unset($_SESSION['avs_location_token']);
  }
}//fn_avs_pre_place_order
//Will get first group that will be shown in shippings
function fn_avs_get_first_group($shippng_id){
  $avs_settings = Registry::get('addons.avs');
  foreach ($avs_settings as $key => $value) {
    if($value == $shippng_id){
	  return $avs_settings[$key."_sf"];
    }//if($value == $shippng_id)
  }//foreach
  return false;
}//fn_avs_get_first_group
function fn_avs_get_locations($file){  
    $xml_original_path = $file;
    $doc = new DOMDocument();
				   
    $ch = curl_init($xml_original_path);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
    $xml = curl_exec($ch);
    curl_close($ch);
    //If xml is not bad
    if($doc->loadXML($xml)){
	  $places = $doc->getElementsByTagName("place");
	  $locations = array();
	  foreach($places as $place){
	    $active = $place->getElementsByTagName("active")->item(0)->nodeValue;
	    if($active != 1) continue;
	    $id = $place->getElementsByTagName("place_id")->item(0)->nodeValue;
	    $name = $place->getElementsByTagName("name")->item(0)->nodeValue;
	    $city = $place->getElementsByTagName("city")->item(0)->nodeValue;
	    $address = $place->getElementsByTagName("address")->item(0)->nodeValue;
	    $opened = $place->getElementsByTagName("opened")->item(0)->nodeValue;
	    $group_id = $place->getElementsByTagName("group_id")->item(0)->nodeValue;
	    $group_name = $place->getElementsByTagName("group_name")->item(0)->nodeValue;
	    $description = $place->getElementsByTagName("description")->item(0)->nodeValue;
	    $locations[$group_id]["items"][$id] = array(
		  "id" => $id,
		  "name" => $name,
		  "city" => $city,
		  "address" => $address,
		  "opened" => $opened,
		  "group_id" => $group_id,
		  "group_name" => $group_name,
		  "description" => $description);
	    $locations[$group_id]["group_name"] = $group_name;
	  }
	  if($file!='http://tmp.example.com/cscart/xml/post24_et.xml' && $file!='http://tmp.example.com/cscart/xml/smartpost_fi.xml')
	    ksort($locations);
	  } else
		  $errors[count($errors)] = "- bad xml file"; //die if its bad
    return $locations;
}


 
  • dbazhenov
  • Senior Member
  • Authorized Reseller
  • Join Date: 15-May 12
  • 6446 posts

Posted 16 October 2014 - 11:48 AM #2


Честно, космос какой то, можно весь код ?

Посмотрите как сделан модуль rus_pickup .

 
  • alex-pro
  • Advanced Member
  • Trial users
  • Join Date: 07-Nov 13
  • 95 posts

Posted 17 October 2014 - 12:48 PM #3

Модуля rus_pickup я не могу найти, у меня международная версия.

Весь код это и есть, там еще несколько шаблонов с хуками, для вывода методов доставки.

Как я уже писал из за модуля CS-Cart уходил в бесконечный цикл при POST и GET запросах
checkout.checkout.apply_coupon
и
checkout.delete_coupon

Выходы были только заккоментить в fn.common.php - return fn_dispatch(); и поставить просто return;
Но из за этого запросы доходили, но обрывались, приходилось страницу вручную обновлять.

Другой вариант я нашел, это изменить POST запрос, в promotion_coupon.tpl
убрал - <input type="hidden" name="redirect_url" value="{$config.current_url}" />
и о чудо, купон применялся и сразу же отображался...

к сожалению с GET delete_coupon такого не происходит, приходится вручную обновлять.

ps. еще заметил что apply_coupon посылает запрос checkout.checkout.apply_coupon а не допустим checkout.apply_coupon

 
  • dbazhenov
  • Senior Member
  • Authorized Reseller
  • Join Date: 15-May 12
  • 6446 posts

Posted 17 October 2014 - 02:16 PM #4


Где вызываются функции fn_avs_get_first_group и fn_avs_get_locations

Не вижу ничего что могло бы изменится изза версии.

 
  • alex-pro
  • Advanced Member
  • Trial users
  • Join Date: 07-Nov 13
  • 95 posts

Posted 18 October 2014 - 01:19 PM #5

Где вызываются функции fn_avs_get_first_group и fn_avs_get_locations

Не вижу ничего что могло бы изменится изза версии.

fn_avs_get_first_group вызывается в var/themes_repository/theme/templates/addons/avs/hooks/checkout/shipping_rates.override.tpl
Строка 85.

{if $display == "show"}
	<div class="step-complete-wrapper">
{/if}
	<div id="shipping_rates_list">
		{foreach from=$product_groups key="group_key" item=group name="spg"}
			{* Group name *}
			{if !"ULTIMATE"|fn_allowed_for || $product_groups|count > 1}
				<span class="vendor-name">{$group.name}</span>
			{/if}
			{* Products list *}
			{if !"ULTIMATE"|fn_allowed_for || $product_groups|count > 1}
				<ul class="bullets-list">
					{foreach from=$group.products item="product"}
						{if !(($product.is_edp == 'Y' && $product.edp_shipping != 'Y') || $product.free_shipping == 'Y')}
							<li>
								{if $product.product}
									{$product.product nofilter}
								{else}
									{$product.product_id|fn_get_product_name}
								{/if}
							</li>
						{/if}
					{/foreach}
				</ul>
			{/if}
			{* Shippings list *}
			{if $group.shippings && !$group.all_edp_free_shipping && !$group.all_free_shipping && !$group.free_shipping && !$group.shipping_no_required}
				{if $display == "select"}
					<p>
						<select id="ssr_{$company_id}" name="shipping_ids[{$company_id}]" {if $onchange}onchange="{$onchange}"{/if}>
				{/if}
				{foreach from=$group.shippings item="shipping"}


					{if $cart.chosen_shipping.$group_key == $shipping.shipping_id}
						{assign var="checked" value="checked=\"checked\""}
						{assign var="selected" value="selected=\"selected\""}
						{assign var="strong_begin" value="<strong>"}
						{assign var="strong_end" value="</strong>"}
					{else}
						{assign var="checked" value=""}
						{assign var="selected" value=""}
						{assign var="strong_begin" value=""}
						{assign var="strong_end" value=""}
					{/if}
					{if $shipping.delivery_time}
						{assign var="delivery_time" value="(`$shipping.delivery_time`)"}
					{else}
						{assign var="delivery_time" value=""}
					{/if}
					{if $shipping.rate}
						{capture assign="rate"}{include file="common/price.tpl" value=$shipping.rate}{/capture}
						{if $shipping.inc_tax}
							{assign var="rate" value="`$rate` ("}
							{if $shipping.taxed_price && $shipping.taxed_price != $shipping.rate}
								{capture assign="tax"}{include file="common/price.tpl" value=$shipping.taxed_price class="nowrap"}{/capture}
								{assign var="rate" value="`$rate` (`$tax` "}
							{/if}
							{assign var="inc_tax_lang" value=__('inc_tax')}
							{assign var="rate" value="`$rate``$inc_tax_lang`)"}
						{/if}
					{else}
						{assign var="rate" value=__("free_shipping")}
					{/if}
					{if $display == "radio"}
						{*Post24, Post24Latvia, Post24Lithuania, SmartPost, SmartPostFinland, Cargobus*}
						{assign var="avs_shippings" value=$shipping.shipping_id|fn_get_smarto_locs}

						{if $avs_shippings!=false}
							{assign var="show_first_group" value=$shipping.shipping_id|fn_avs_get_first_group}
							<p class="shipping-options-method">
								<input type="radio" class="valign" id="sh_{$group_key}_{$shipping.shipping_id}" name="shipping_ids[{$group_key}]" value="{$shipping.shipping_id}" onclick="fn_calculate_total_shipping_cost();" {$checked} />
								<label for="sh_{$group_key}_{$shipping.shipping_id}" class="valign">{$shipping.shipping} {$delivery_time} - {$rate nofilter} </label> <br />
									<select id="{$shipping.shipping_id}" name="avs_location_token_{$shipping.shipping_id}" onchange="fn_push_parent();">
										{assign var="counter" value=0}
										{foreach from=$avs_shippings key="group_id" item="group"}
											{if $group.group_name == $show_first_group}
											<optgroup label="{$group.group_name}">
											{foreach from=$group.items key="id" item="item"}
											  <option value="{$item.name} ({$item.address}, {$group.group_name})" title="{$item.description} ({$item.opened})" {if $counter==0}selected="selected"{/if}>{$item.name} ({$item.address})</option>
											{/foreach}
											</optgroup>
											{/if}
											{assign var="counter" value=$counter+1}
										{/foreach}
										{foreach from=$avs_shippings key="group_id" item="group"}
											{if $group.group_name != $show_first_group}
											<optgroup label="{$group.group_name}">
											{foreach from=$group.items key="id" item="item"}
											  <option value="{$item.name} ({$item.address}, {$group.group_name})" title="{$item.description} ({$item.opened})" {if $cart.shipping.$shipping_id.location_id == $item.id}selected="selected"{/if}>{$item.name} ({$item.address})</option>
											{/foreach}
											</optgroup>
											{/if}
										{/foreach}
								  </select>
							</p>
						{else}
							<p class="shipping-options-method">
								<input type="radio" class="valign" id="sh_{$group_key}_{$shipping.shipping_id}" name="shipping_ids[{$group_key}]" value="{$shipping.shipping_id}" onclick="fn_calculate_total_shipping_cost();" {$checked} />
								<label for="sh_{$group_key}_{$shipping.shipping_id}" class="valign">{$shipping.shipping} {$delivery_time} - {$rate nofilter}</label>
							</p>
						{/if}
				
					{elseif $display == "select"}
						<option value="{$shipping.shipping_id}" {$selected}>{$shipping.shipping} {$delivery_time} - {$rate nofilter}</option>
					{elseif $display == "show"}
							<p>
								{$strong_begin}{$rate.name} {$delivery_time} - {$rate nofilter}{$strong_begin}
							</p>
					{/if}
				{/foreach}
				{if $display == "select"}
						</select>
					<p>
				{/if}
				{if $smarty.foreach.spg.last && !$group.all_edp_free_shipping && !($group.all_free_shipping || $group.free_shipping)}
					<p class="shipping-options-total">{__("total")}:&nbsp;{include file="common/price.tpl" value=$cart.display_shipping_cost class="price"}</p>
				{/if}
			{else}
				{if $group.all_free_shipping}
					 <p>{__("free_shipping")}</p>
				{elseif $group.all_edp_free_shipping || $group.shipping_no_required }
					<p>{__("no_shipping_required")}</p>
				{else}
					<p class="error-text">
						{if $display == "show"}
							<strong>{__("text_no_shipping_methods")}</strong>
						{else}
							{__("text_no_shipping_methods")}
						{/if}
					</p>
				{/if}
			{/if}
		{foreachelse}
			<p>
				{if !$cart.shipping_required}
					{__("no_shipping_required")}
				{elseif $cart.free_shipping}
					{__("free_shipping")}
				{/if}
			</p>
		{/foreach}
	<!--shipping_rates_list--></div>

{if $display == "show"}
	</div>
{/if}

сама структура шаблонов такая:
var/themes_repository/theme/templates/addons/avs/hooks/checkout/order_confirmation.pre.tpl
var/themes_repository/theme/templates/addons/avs/hooks/index/scripts.post.tpl
var/themes_repository/theme/templates/addons/avs/hooks/index/styles.post.tpl
var/themes_repository/theme/templates/addons/avs/hooks/orders/totals.pre.tpl
var/themes_repository/theme/templates/addons/avs/orders/totals.pre.tpl
но в них вызываются либо стили либо они пустые с одной-2 вызовами функций, я пробывал их убирать они не влияют на модуль.

 
  • dbazhenov
  • Senior Member
  • Authorized Reseller
  • Join Date: 15-May 12
  • 6446 posts

Posted 19 October 2014 - 09:09 AM #6

var/themes_repository/theme/templates/addons/avs/hooks/index/scripts.post.tpl
var/themes_repository/theme/templates/addons/avs/hooks/index/styles.post.tpl
var/themes_repository/theme/templates/addons/avs/hooks/orders/totals.pre.tpl
var/themes_repository/theme/templates/addons/avs/orders/totals.pre.tpl


Это хранилище, эти файлы переносятся в папку design/themes/ при установке модуля. Проверьте соответствующие файлы в папке design .

var/themes_repository/theme/templates/addons/avs/hooks/checkout/shipping_rates.override.tpl


override - полностью перезаписывает новый шаблон старым, его адаптировать.

Чините файл:
design/theme/templates/addons/avs/hooks/checkout/shipping_rates.override.tpl

Шаблоны на checkout немного изменились, добавились новые хуки. Сейчас можно реализовать без override .

Кроме того:

$ch = curl_init($xml_original_path);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
$xml = curl_exec($ch);

Можно заменить на

$xml = fn_get_contents($xml_original_path);

Для http запросов к различным сервисам, лучше использовать стандартный класс Http :

<?php

use Tygh\Http;

if (!defined('BOOTSTRAP')) { die('Access denied'); }


// GET
$content = Http::get($url, $data);

// POST
$response = Http::post($url, $data);

// $data - массив с параметрами запроса.