Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 28.08.2013, 10:04
Аспирант
Отправить личное сообщение для Round Посмотреть профиль Найти все сообщения от Round
 
Регистрация: 08.04.2012
Сообщений: 49

Ajax и цикл foreach - нужна помощь
Уже сам зациклился с этим аякс-циклом... может кто то свежим глазом глянет и скажет где я накосячил? Please!

В глобальную переменную ($woocommerce) из страницы закидываются данные для "корзины покупок". Мне нужно эти данные выдернуть в цикле и вывести на этой же странице без перезагрузки страницы.

Вот код скрипта:

// Ensure cart contents update when products are added to the cart via AJAX

add_filter('add_to_cart_fragments', 'woocommerce_header_add_to_cart_fragment');
 
function woocommerce_header_add_to_cart_fragment( $fragments ) {
	global $woocommerce;
	
	ob_start();
	
	?>

	<b class="cart-contents"><?php echo sprintf(_n('%d item', '%d items', $woocommerce->cart->cart_contents_count, 'woothemes'), $woocommerce->cart->cart_contents_count);?> - <?php echo $woocommerce->cart->get_cart_total(); ?></b>

<?php 
		foreach ($woocommerce->cart->cart_contents as $cart_item_key => $cart_item) :
			
			$i++;
			if ( $i == 1 ) :				
				$rowclass = ' class="cart_oddrow"';			
			else :
				$rowclass = ' class="cart_evenrow"';
				$i = 0;
			endif;
	
			$_product = $cart_item['data'];
			
			if ($_product->exists() && $cart_item['quantity']>0) :
				echo '<li'.$rowclass.'>';
				
				echo '<div class="dropdowncartproduct">';
				echo '<a href="'.get_permalink($cart_item['product_id']).'">';				
				echo apply_filters('woocommerce_cart_widget_product_title', $_product->get_title(), $_product).'</a>';				
				if ($_product instanceof woocommerce_product_variation && is_array($cart_item['variation'])) :
        			echo woocommerce_get_formatted_variation( $cart_item['variation'] );
   				endif;
				echo '</a>';
				echo '</div>';
				
				echo '<div class="dropdowncartquantity">';				
				echo '<span class="quantity">' .$cart_item['quantity'].' &times; '.woocommerce_price($_product->get_price()).'</span>';
				echo '</div>';
				echo '<div class="clear"></div>';
				
				echo '</li>';
				
			endif;
		endforeach; 

	
	$fragments['.cart-contents'] = ob_get_clean();
	
	return $fragments;
	
}


Косяк в том что новый цикл выводится на странице вместе с предыдущим циклом. Каждый новый цикл добавляется к предыдущему, а не заменяет его.

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

Подскажите где ошибка?

Вот то что лежит на странице:

<div class="span3">

	<b class="cart-contents"><?php echo sprintf(_n('%d item', '%d items', $woocommerce->cart->cart_contents_count, 'woothemes'), $woocommerce->cart->cart_contents_count);?> - <?php echo $woocommerce->cart->get_cart_total(); ?></b>

<?php 
		foreach ($woocommerce->cart->cart_contents as $cart_item_key => $cart_item) :
			
			$i++;
			if ( $i == 1 ) :				
				$rowclass = ' class="cart_oddrow"';			
			else :
				$rowclass = ' class="cart_evenrow"';
				$i = 0;
			endif;
	
			$_product = $cart_item['data'];
			
			if ($_product->exists() && $cart_item['quantity']>0) :
				echo '<li'.$rowclass.'>';
				
				echo '<div class="dropdowncartproduct">';
				echo '<a class="cart-contents" href="'.get_permalink($cart_item['product_id']).'">';				
				echo apply_filters('woocommerce_cart_widget_product_title', $_product->get_title(), $_product).'</a>';				
				if ($_product instanceof woocommerce_product_variation && is_array($cart_item['variation'])) :
        			echo woocommerce_get_formatted_variation( $cart_item['variation'] );
   				endif;
				echo '</a>';
				echo '</div>';
				
				echo '<div class="dropdowncartquantity">';				
				echo '<span class="quantity">' .$cart_item['quantity'].' &times; '.woocommerce_price($_product->get_price()).'</span>';
				echo '</div>';
				echo '<div class="clear"></div>';
				
				echo '</li>';
				
			endif;
		endforeach; 

?>    
    
              </div>
Ответить с цитированием
  #2 (permalink)  
Старый 28.08.2013, 12:05
Аспирант
Отправить личное сообщение для NeVirus Посмотреть профиль Найти все сообщения от NeVirus
 
Регистрация: 09.01.2013
Сообщений: 54

попробуй для foreach и if синтаксис:
foreach () {}

if (){}



ну и я в соседнем вопросе только что спрашивал про такой вывод инфы с сервера ... сказали так не надо

самого аякса я тут кстати у тебя что то и не вижу ...

Последний раз редактировалось NeVirus, 28.08.2013 в 12:31.
Ответить с цитированием
  #3 (permalink)  
Старый 28.08.2013, 12:09
Профессор
Отправить личное сообщение для mta88 Посмотреть профиль Найти все сообщения от mta88
 
Регистрация: 16.05.2013
Сообщений: 229

где здесь javascript и ajax? тут только php
Цитата:
аякс-циклом
это что?
Цитата:
Каждый новый цикл добавляется к предыдущему, а не заменяет его.
а эта фраза что значит?
Цитата:
Подскажите где ошибка?
в днк?
Ответить с цитированием
  #4 (permalink)  
Старый 28.08.2013, 12:20
Аспирант
Отправить личное сообщение для Round Посмотреть профиль Найти все сообщения от Round
 
Регистрация: 08.04.2012
Сообщений: 49

Сообщение от NeVirus Посмотреть сообщение
самого аякса я тут кстати у тебя что то и не вижу ...
Поясню где тут AJAX.

Исходник этого решения на сайте разработчика woocommerce вот ссылка http://docs.woothemes.com/document/s...ontents-total/

Я немного переделал их код, но видимо что то не доделал.

В буфер данные загоняются вот этим - ob_start()

А по поводу этого...
Сообщение от NeVirus Посмотреть сообщение
попробуй для foreach и if синтаксис:
foreach () {}

if (){}
Можете подробнее пояснить?
Ответить с цитированием
  #5 (permalink)  
Старый 28.08.2013, 12:39
Аспирант
Отправить личное сообщение для NeVirus Посмотреть профиль Найти все сообщения от NeVirus
 
Регистрация: 09.01.2013
Сообщений: 54

Цитата:
Можете подробнее пояснить?
у тебя :

foreach ($woocommerce->cart->cart_contents as $cart_item_key => $cart_item) :
+++++
endforeach;


попробуй вместо этого как я предложил... то же самое с "IF".


на счет аякса:
$("тут кнопка отправить").click(function() {
		$.get(
	  		"php/"твой пхп скрипт".php",
	  			{
					param1: x, // тут то что ты отдаешьсерверу
					param2: y
	  			},
	  		AnswerShow     // в эту процедуру ответ уйдет 
		);
		return false;
	});
function AnswerShow(data) {
           // тут режем ответ сервера
}


как то так...

Последний раз редактировалось NeVirus, 28.08.2013 в 13:35.
Ответить с цитированием
  #6 (permalink)  
Старый 28.08.2013, 12:57
Аспирант
Отправить личное сообщение для Round Посмотреть профиль Найти все сообщения от Round
 
Регистрация: 08.04.2012
Сообщений: 49

Сообщение от NeVirus Посмотреть сообщение
как то так...
Я понял.
Спасибо за пояснение.

Если выводить из этой глобальной переменной (global $woocommerce) не в цикле, а просто в одну строку, то этот код работает замечательно:

// Ensure cart contents update when products are added to the cart via AJAX 

add_filter('add_to_cart_fragments', 'woocommerce_header_add_to_cart_fragment');
 
function woocommerce_header_add_to_cart_fragment( $fragments ) {
	global $woocommerce;
	
	ob_start();
	
	?>
	<a class="cart-contents" href="<?php echo $woocommerce->cart->get_cart_url(); ?>" title="<?php _e('View your shopping cart', 'woothemes'); ?>"><?php echo sprintf(_n('%d item', '%d items', $woocommerce->cart->cart_contents_count, 'woothemes'), $woocommerce->cart->cart_contents_count);?> - <?php echo $woocommerce->cart->get_cart_total(); ?></a>
	<?php
	
	$fragments['a.cart-contents'] = ob_get_clean();
	
	return $fragments;
	
}


Я лишь попытался к нему приделать цикл, который выводит не только сумму и общее количество, но ещё и каждый товар - строчка за строчкой.

Вот с циклом у меня и не получилось.

Сообщение от NeVirus Посмотреть сообщение
у тебя :

foreach ($woocommerce->cart->cart_contents as $cart_item_key => $cart_item) :
+++++
endforeach;


попробуй вместо этого как я предложил... то же самое с "IF".
Попробую IF
Ответить с цитированием
  #7 (permalink)  
Старый 26.03.2015, 15:04
Новичок на форуме
Отправить личное сообщение для papab Посмотреть профиль Найти все сообщения от papab
 
Регистрация: 26.03.2015
Сообщений: 1

Round, подскажи, нашел решение? Бьюсь над этой же проблемой
Ответить с цитированием
  #8 (permalink)  
Старый 27.03.2015, 10:22
Аспирант
Отправить личное сообщение для Round Посмотреть профиль Найти все сообщения от Round
 
Регистрация: 08.04.2012
Сообщений: 49

Бородатая проблема, я уже так не работаю. Тот раз решил проблему костылями. Сейчас бы так точно не делал. К сожалению (или к счастью) костыль не сохранился а проект давно уже рефактореный несколько раз.

Для красивого решения нужно использовать API woocommerc.

Подробнее, должно выглядеть примерно так:

Напишите свой обработчик для аякса и используйте цикл из шаблона cart.php

function my_cart_items_loader() {

   ob_start();

   foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) { // этот цикл найдете в cart.php
        $my_cart_items = // здесь ваш шаблон для вывода списка товаров загоните его в переменную
   }

   wp_send_json( $my_cart_items ); //теперь эту переменную передайте в ваш ajax

}


И ajax...

jQuery( function( $ ) {

	// определите событие на которое должен срабатывать
	$( document ).on( 'click', '.my-cart', function() {

		$( '.my-cart-items' ).slideToggle( 'slow' ); // показываем ваш блок со списком товаров

		var data = {
			action: 'woocommerce_my_cart_items_loader', // запрашиваем обработчик
			your_variable: //переменная если таковая нужна обработчику,
		};

		$.post( function( response ) {

			$( 'div.my-cart-items-list' ).replaceWith( response ); // выводим результат 

		});
	});

});


Код не проверял, но думаю что суть решения должна быть понятной.

Последний раз редактировалось Round, 27.03.2015 в 10:26.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Книги по Ajax BaVa Учебные материалы 18 18.08.2013 14:05
Нужна помощь. Artem88 Общие вопросы Javascript 0 13.12.2012 22:22
Страницы на ajax. Нужна помощь профи!!! trafbek AJAX и COMET 0 19.04.2011 15:37
jQuery Ajax Rater Plugin и массив POST - Нужна помощь TROODON jQuery 12 30.12.2009 22:44
НУЖНА ВАША ПОМОЩЬ ПО AJAX PHP master Работа 4 19.01.2009 13:00