Новости Joomla

Как тестировать Joomla PHP-разработчику? Компонент Patch tester.

👩‍💻 Как тестировать Joomla PHP-разработчику? Компонент Patch tester.Joomla - open source PHP-фреймворк с готовой админкой. Его основная разработка ведётся на GitHub. Для того, чтобы международному сообществу разработчиков было удобнее тестировать Pull Requests был создан компонент Patch Tester, который позволяет "накатить" на текущую установку Joomla именно те изменения, которые необходимо протестировать. На стороне инфраструктуры Joomla для каждого PR собираются готовые пакеты, в которых находится ядро + предложенные изменения. В каждом PR обычно находятся инструкции по тестированию: куда зайти, что нажать, ожидаемый результат. Тестировщики могут предположить дополнительные сценарии, исходя из своего опыта и найти баги, о которых сообщить разработчику. Или не найти, и тогда улучшение или исправление ошибки быстрее войдёт в ядро Joomla. Напомню, что для того, чтобы PR вошёл в ядро Joomla нужны минимум 2 положительных теста от 2 участников сообщества, кроме автора. Видео на YouTubeВидео на VK ВидеоВидео на RuTubeКомпонент на GitHub https://github.com/joomla-extensions/patchtester@joomlafeed#joomla #php #webdev #community

Вышел релиз Revo PageBuilder Toolkit for YOOtheme Pro 1.6

Вышел релиз Revo PageBuilder Toolkit for YOOtheme Pro 1.6.2PageBuilder Toolkit - это специализированный плагин для конструктора страниц Yootheme Pro, содержит набор различных утилит для ускорения процесса работы и отладки макета, множественные улучшения в интерфейсе, включая поддержку dark mode, подсказки, быстрая смена разрешения в окне просмотра и много чего еще.v.1.6.2 Что нового?- Индикатор статусов: теперь не просто показывает состояние запросов, но и делает автоматические попытки их отправки при кратковременных сбоях в сети, а если это не помогло, то переводит конструктор в ручной режим, что позволяет сохранит макет и настройки темы прежде чем вы потеряете все, что было сделано с момента последнего сохранения- Подсветка ошибок в макете: плагин анализирует код страницы и может автоматически подсвечивать data атрибуты с кучей мусора, которые попадают в код страницы при копипасте из Figma в TinyMCE (пригодится для старых макетов, в текущей работе плагин сам очищает код мусора). Также есть подсветка семантических ошибок сборки - дубли h1 тега на странице и вложенных друг в друга заголовков.- Улучшена поддержка будущего релиза Yootheme Pro 5 и редактора CodeMirror 6Плагин для русскоязычных пользователей доступен в каталоге расширений SovMart и распространяется за символическую плату (100р). Разработчики Joomla расширений и партнеры автора могут получить плагин бесплатно.Для работы плагина необходим конструктор страниц Yootheme Pro.Разработчик плагина - участник нашего сообщества Александр Судьбинов (@alexrevo), член официальной группы поддержки Yootheme Pro. Страница расширенияОписание на сайте автора@joomlafeed#joomla #yootheme

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

Wester

  • Захожу иногда
  • 180
  • 4 / 1
На странице подтверждения заказа VirtueMart выводит адрес доставки пустым, хотя согласно шаблону, должен выводить выбранный адрес доставки  :(
Подскажите где подкрутить.

Joomla 1.5.14
VirtueMart 1.1.3

\components\com_virtuemart\themes\default\templates\checkout\get_final_confirmation.tpl
Код
// Begin with Shipping Address
if (!ps_checkout::noShipToNecessary ()) {

$db->query ("SELECT * FROM #__{vm}_user_info WHERE user_info_id='".strip_tags ($_REQUEST['ship_to_info_id'])."'");
$db->next_record ();

echo '<tr><td valign="top"><strong>'.$VM_LANG->_('PHPSHOP_ADD_SHIPTO_2'). ":</strong></td>";
echo '<td>';
echo vmFormatAddress ( array ('name' => $db->f ("first_name")." ".$db->f ("last_name"),
        'address_1' => $db->f ("address_1"),
        'address_2' => $db->f ("address_2"),
        'state' => $db->f ("state"),
        'zip' => $db->f ("zip"),
        'city' => $db->f ("city"),
        'country' => $db->f ('country')
        ), true );

echo "</td></tr>";
}

« Последнее редактирование: 14.08.2009, 16:39:07 от Wester »
*

Wester

  • Захожу иногда
  • 180
  • 4 / 1
У всех работает?
*

Wester

  • Захожу иногда
  • 180
  • 4 / 1
Пишет "Адрес доставки:*пусто*", кто-нибудь исправил?
*

Wester

  • Захожу иногда
  • 180
  • 4 / 1
*

Wester

  • Захожу иногда
  • 180
  • 4 / 1
*

beagler

  • Moderator
  • 3276
  • 392 / 4
  • https://alorisman.ru/
в ps_checout.php закомментировать следующие строки (у меня 712-713)
Код
		$q .= "INNER JOIN #__{vm}_country c ON (i.country=c.country_3_code) ";
$q .= "LEFT JOIN #__{vm}_state s ON (i.state=s.state_2_code AND s.country_id=c.country_id) ";

*

Wester

  • Захожу иногда
  • 180
  • 4 / 1
ps_checkout.php*
Что-то не получается (  Просто пропадает страна и регион в адресе доставки, но на странице подтвердить заказ поле адрес доставки все равно пустое...
*

Wester

  • Захожу иногда
  • 180
  • 4 / 1
Так вроде из базы данных берет?
ro_basket.php
Код
<?php
if ( !defined ( '_VALID_MOS' ) && !defined ( '_JEXEC' ) ) die ( 'Direct Access to '.basename (__FILE__).' is not allowed.' );
/**
* This is the read-only version of the BASKET handler.
* It displays all products and all totals. Product quantities can't be
* changed on this page.
*
* @version $Id: ro_basket.php 1589 2008-12-08 20:27:20Z soeren_nb $
* @package VirtueMart
* @subpackage html
* @copyright Copyright (C) 2004-2008 soeren - All rights reserved.
* @license http://www.gnu.org/copyleft/gpl.html GNU/GPL, see LICENSE.php
* VirtueMart is free software. This version may have been modified pursuant
* to the GNU General Public License, and as distributed it includes or
* is derivative of works licensed under the GNU General Public License or
* other free or open source software licenses.
* See /administrator/components/com_virtuemart/COPYRIGHT.php for copyright notices and details.
*
* http://virtuemart.net
*/
mm_showMyFileName ( __FILE__ );

require_once (CLASSPATH. 'ps_product.php' );
$ps_product = new ps_product;
require_once (CLASSPATH. 'ps_checkout.php' );
$ps_checkout = new ps_checkout;
require_once (CLASSPATH . 'ps_shipping_method.php' );

global $weight_total, $total, $tax_total, $order_tax_details, $discount_factor, $order_total;

/* make sure this is the checkout screen */
if ($cart["idx"] == 0) {
echo $VM_LANG->_('PHPSHOP_EMPTY_CART');
$checkout = False;
}
else {
$checkout = True;
$payment_method_id = vmGet ( $_REQUEST, "payment_method_id" );
$total = 0;
// Added for the zone shipping module
$vars["zone_qty"] = 0;
$weight_total = 0;
$weight_subtotal = 0;
$tax_total = 0;
$shipping_total = $shipping_tax = 0;
$order_total = 0;
$coupon_discount = vmGet ( $_SESSION, 'coupon_discount', 0 );
$coupon_discount_before=$coupon_discount_after=$payment_discount_before=$payment_discount_after=$tax=$shipping=false;
$product_rows = Array ();

for ($i=0;$i<$cart["idx"];$i++) {
// Added for the zone shipping module
$vars["zone_qty"] += $cart[$i]["quantity"];

if ($i % 2) $product_rows[$i]['row_color'] = "sectiontableentry2";
else $product_rows[$i]['row_color'] = "sectiontableentry1";

// Get product parent id if exists
$product_parent_id=$ps_product->get_field ($cart[$i]["product_id"],"product_parent_id");

// Get flypage for this product
$flypage = $ps_product->get_flypage ($cart[$i]["product_id"]);

// Build URL based on whether item or product
if ($product_parent_id) {
$url = $sess->url (URL .basename ($_SERVER['PHP_SELF']). "?page=shop.product_details&flypage=$flypage&product_id=$product_parent_id");
}
else {
$url = $sess->url (URL . basename ($_SERVER['PHP_SELF'])."?page=shop.product_details&flypage=$flypage&product_id=" . $_SESSION['cart'][$i]["product_id"]);
}

$product_rows[$i]['product_name'] = "<a href=\"$url\"><strong>"
. shopMakeHtmlSafe ($ps_product->get_field ($_SESSION['cart'][$i]["product_id"], "product_name"))
. "</strong></a><br />"
. $ps_product->getDescriptionWithTax ( $_SESSION['cart'][$i]["description"], $_SESSION['cart'][$i]["product_id"] );

// Display attribute values if this an item
$product_rows[$i]['product_attributes'] = "";
if ($product_parent_id) {
$db_detail=$ps_product->attribute_sql ($cart[$i]["product_id"],$product_parent_id);
while ($db_detail->next_record ()) {
$product_rows[$i]['product_attributes'] .= "<br />" . $db_detail->f ("attribute_name"). "<br />";
$product_rows[$i]['product_attributes'] .= $db_detail->f ("attribute_value");
}
}
$product_rows[$i]['product_sku'] = $ps_product->get_field ($cart[$i]["product_id"], "product_sku");

/* Product PRICE */
$my_taxrate = $ps_product->get_product_taxrate ($cart[$i]["product_id"], $weight_subtotal);
$tax = $my_taxrate * 100;

$price = $ps_product->get_adjusted_attribute_price ($cart[$i]["product_id"], $cart[$i]["description"]);
$price['product_price'] = $GLOBALS['CURRENCY']->convert ( $price['product_price'], $price['product_currency'] );
if ( $auth["show_price_including_tax"] == 1 ) {
$product_price = $price["product_price"] * ($my_taxrate+1);
} else {
$product_price = $price["product_price"];
}
$product_price = round ( $product_price, 5 );
$product_rows[$i]['product_price'] = $GLOBALS['CURRENCY_DISPLAY']->getFullValue ($product_price);

/* Quantity Box */
$product_rows[$i]['quantity'] = $cart[$i]["quantity"];

/* WEIGHT CALCULATION */
$weight_subtotal = ps_shipping_method::get_weight ($cart[$i]["product_id"]) * $cart[$i]['quantity'];
$weight_total += $weight_subtotal;

/* SUBTOTAL CALCULATION */
$subtotal = $product_price * $cart[$i]["quantity"];

$total += $subtotal;
$product_rows[$i]['subtotal'] = $GLOBALS['CURRENCY_DISPLAY']->getFullValue ($subtotal);
if (!empty ($my_taxrate) && MULTIPLE_TAXRATES_ENABLE=='1') {
if ( $auth["show_price_including_tax"] == 1 ) {
eval ( "\$message = \"".$VM_LANG->_('PHPSHOP_INCLUDING_TAX')."\";" );
$product_rows[$i]['subtotal'] .= "&nbsp;".$message;
}
else {
$product_rows[$i]['subtotal'] .= "&nbsp;(+ $tax% ".$VM_LANG->_('PHPSHOP_CART_TAX').")";
}
}

// UPDATE CART / DELETE FROM CART
$action_url = $_SERVER['SERVER_PORT']=="443" ? SECUREURL : URL . basename ($_SERVER['PHP_SELF']);
$product_rows[$i]['update_form'] = "<input type=\"hidden\" name=\"page\" value=\"". $page ."\" />
        <input type=\"hidden\" name=\"func\" value=\"cartUpdate\" />
        <input type=\"hidden\" name=\"product_id\" value=\"". $_SESSION['cart'][$i]["product_id"] ."\" />
        <input type=\"hidden\" name=\"Itemid\" value=\"". $sess->getShopItemid ()."\" />
        <input type=\"hidden\" name=\"description\" value=\"". $cart[$i]["description"]."\" />
        <input type=\"image\" name=\"update\" title=\"". $VM_LANG->_('PHPSHOP_CART_UPDATE')."\" src=\"". IMAGEURL ."ps_image/edit_f2.gif\" value=\"". $VM_LANG->_('PHPSHOP_UPDATE')."\" />
      </form>";
$product_rows[$i]['delete_form'] = "<form action=\"$action_url\" method=\"post\" name=\"delete\" />
        <input type=\"hidden\" name=\"option\" value=\"com_virtuemart\" />
        <input type=\"hidden\" name=\"page\" value=\"". $page ."\" />
        <input type=\"hidden\" name=\"Itemid\" value=\"". $sess->getShopItemid ()."\" />
        <input type=\"hidden\" name=\"func\" value=\"cartDelete\" />
        <input type=\"hidden\" name=\"product_id\" value=\"". $_SESSION['cart'][$i]["product_id"] ."\" />
        <input type=\"hidden\" name=\"description\" value=\"". $cart[$i]["description"]."\" />
      <input type=\"image\" name=\"delete\" title=\"". $VM_LANG->_('PHPSHOP_CART_DELETE')."\" src=\"". IMAGEURL ."ps_image/delete_f2.gif\" value=\"". $VM_LANG->_('PHPSHOP_CART_DELETE')."\" />
      </form>";
} // End of for loop through the Cart

$total = $total_undiscounted = round ($total, 5);
$subtotal_display = $GLOBALS['CURRENCY_DISPLAY']->getFullValue ($total);


if ($_REQUEST["page"] == "checkout.index" && !empty ($_POST["do_coupon"])) {
/* process the coupon */

/* make sure they arent trying to run it twice */
if (@$_SESSION['coupon_redeemed'] == true) {
$vmLogger->warning ( $VM_LANG->_('PHPSHOP_COUPON_ALREADY_REDEEMED',false) );
}
else {
require_once ( CLASSPATH . "ps_coupon.php" );
$vars["total"] = $total;
ps_coupon::process_coupon_code ( $vars );
}
}

// DISCOUNT
$discount_word = ' ';
$payment_discount_display = '0';
$payment_discount = $ps_checkout->get_payment_discount ($payment_method_id, $total);
if ( PAYMENT_DISCOUNT_BEFORE == '1') {
if ( $payment_discount != 0.00 ) {
$payment_discount_before = true;
if ( $payment_discount > 0.00 ) {
$discount_word = $VM_LANG->_('PHPSHOP_PAYMENT_METHOD_LIST_DISCOUNT');
}
else {
$discount_word = $VM_LANG->_('PHPSHOP_FEE');
}

$total -= $payment_discount;
$payment_discount_display = $GLOBALS['CURRENCY_DISPLAY']->getFullValue ($payment_discount-($payment_discount*2));
}
// COUPON DISCOUNT
$coupon_display = '';
if ( PSHOP_COUPONS_ENABLE=='1' && @$_SESSION['coupon_redeemed']==true ) {
$total -= $_SESSION['coupon_discount'];
$coupon_discount_before = true;
$coupon_display = "- ".$GLOBALS['CURRENCY_DISPLAY']->getFullValue ( $_SESSION['coupon_discount'] );
}
}
/* SHOW SHIPPING COSTS */
if ( !empty ($shipping_rate_id) && !ps_checkout::noShippingMethodNecessary () && !is_null ($ps_checkout->_SHIPPING) ) {
$shipping = true;
$vars["weight"] = $weight_total;
$shipping_total = round ( $ps_checkout->_SHIPPING->get_rate ( $vars ), 5 );
$shipping_taxrate = $ps_checkout->_SHIPPING->get_tax_rate ();

// When the Shipping rate is shown including Tax
// we have to extract the Tax from the Shipping Total
if ( $auth["show_price_including_tax"] == 1 ) {
$shipping_tax = round ( $shipping_total- ($shipping_total / (1+$shipping_taxrate)), 5);
}
else {
$shipping_tax = round ( $shipping_total * $shipping_taxrate, 5);
}
$shipping_display = $GLOBALS['CURRENCY_DISPLAY']->getFullValue ($shipping_total);
}
else {
$shipping_total = 0;
$shipping_display = "";
}
/* SHOW TAX */
if (!empty ($_REQUEST['ship_to_info_id']) || $auth["show_price_including_tax"] == 1) {
$tax = true;

if ( ($weight_total != 0 || TAX_VIRTUAL=='1') && $total > 0 ) {
$order_taxable = $ps_checkout->calc_order_taxable ($vars);
$vars['payment_discount'] = $payment_discount;
$tax_total = $ps_checkout->calc_order_tax ($order_taxable, $vars);
} else {
$tax_total = 0;
}
if ( $auth['show_price_including_tax']) {
$tax_total *= $discount_factor;
}
$tax_total += $shipping_tax;
$tax_total = round ( $tax_total, 5 );
$tax_display = $GLOBALS['CURRENCY_DISPLAY']->getFullValue ($tax_total);

$tax_display .= ps_checkout::show_tax_details ( $order_tax_details );
}

if ( PAYMENT_DISCOUNT_BEFORE != '1') {
if ( $payment_discount != 0.00 ) {
$payment_discount_after = true;
if ( $payment_discount > 0.00 ) {
$discount_word = $VM_LANG->_('PHPSHOP_PAYMENT_METHOD_LIST_DISCOUNT');
}
else {
$discount_word = $VM_LANG->_('PHPSHOP_FEE');
}
$total -= $payment_discount;
$payment_discount_display = $GLOBALS['CURRENCY_DISPLAY']->getFullValue ($payment_discount-($payment_discount*2));
}
// COUPON DISCOUNT
$coupon_display = '';
if ( PSHOP_COUPONS_ENABLE=='1' && @$_SESSION['coupon_redeemed']==true ) {
$total -= $_SESSION['coupon_discount'];
$coupon_discount_after = true;
$coupon_display = "- ".$GLOBALS['CURRENCY_DISPLAY']->getFullValue ( $_SESSION['coupon_discount'] );
}
}

// Attention: When show_price_including_tax is 1,
// we already have an order_total including the Tax!
if ( $auth["show_price_including_tax"] == 0 ) {
$order_total += $tax_total;
$total_undiscounted += $tax_total;
}
$order_total += $shipping_total + $total;
$total_undiscounted += $shipping_total;

/* check if the minimum purchase order value has already been reached */
if (round ($_SESSION['minimum_pov'], 2) > 0.00) {
if ($total_undiscounted >= $GLOBALS['CURRENCY']->convert ( $_SESSION['minimum_pov'] ) ) {
// OKAY!
define ('_MIN_POV_REACHED', '1');
}
} else
define ('_MIN_POV_REACHED', '1');

$order_total_display = $GLOBALS['CURRENCY_DISPLAY']->getFullValue ($order_total);

$tpl = new $GLOBALS['VM_THEMECLASS']();
$tpl->set_vars ( Array (
'product_rows' => $product_rows,
'subtotal_display' => $subtotal_display,
'discount_word' => $discount_word,
'payment_discount_before' => $payment_discount_before,
'payment_discount_after' => $payment_discount_after,
'payment_discount_display' => $payment_discount_display,
'coupon_discount_before' => $coupon_discount_before,
'coupon_discount_after' => $coupon_discount_after,
'coupon_display' => $coupon_display,
'shipping' => $shipping,
'shipping_display' => $shipping_display,
'tax' => $tax,
'tax_display' => $tax_display,
'order_total_display' => $order_total_display,
));

if ( $auth["show_price_including_tax"] == 1) {
$basket_html = $tpl->fetch ( 'basket/ro_basket_b2c.html.php');
}
else {
$basket_html = $tpl->fetch ( 'basket/ro_basket_b2b.html.php');
}

}
?>
И так к слову зачем нужен файл ro_basket_b2b.html.php?
« Последнее редактирование: 14.08.2009, 16:41:34 от Wester »
*

beagler

  • Moderator
  • 3276
  • 392 / 4
  • https://alorisman.ru/
*

Wester

  • Захожу иногда
  • 180
  • 4 / 1
А с пустым адресом что делать? не выводит и все ((
*

Wester

  • Захожу иногда
  • 180
  • 4 / 1
...ага... оформление заказа в 2 шага - 1 .... 2 - подтведить заказ

[вложение удалено Администратором]
« Последнее редактирование: 14.08.2009, 18:21:22 от Wester »
*

Wester

  • Захожу иногда
  • 180
  • 4 / 1
нет  >:( Может быть сама функция не правильно написана (в 1 посту)
« Последнее редактирование: 14.08.2009, 20:29:44 от Wester »
*

Wester

  • Захожу иногда
  • 180
  • 4 / 1
уже пробывал не помагает..
*

beagler

  • Moderator
  • 3276
  • 392 / 4
  • https://alorisman.ru/
*

Wester

  • Захожу иногда
  • 180
  • 4 / 1
Цитировать
а в {vm}_user_info есть адрес с таким user_info_id
Это в базе данных искать?
На странице подтверждения заказа:
$vars: ship_to_info_id => c5821315791756c6f74b27077a5797b3
*

Wester

  • Захожу иногда
  • 180
  • 4 / 1
Есть!
*

Wester

  • Захожу иногда
  • 180
  • 4 / 1
при выборе 1 варианта (по умолчанию): "ИМЯ ФАМИЛИЯул. Елецкая77115583МоскваRUS"
при выборе 2 варианта выводит: "77115583RUS"

Код
// Begin with Shipping Address
//if (!ps_checkout::noShipToNecessary ()) {

$db->query ("SELECT * FROM #__{vm}_user_info WHERE user_info_id='".strip_tags ($_REQUEST['ship_to_info_id'])."'");
$db->next_record ();

echo '<tr><td valign="top"><strong>'.$VM_LANG->_('PHPSHOP_ADD_SHIPTO_2'). ":</strong></td>";
echo '<td>';
echo $db->f ("first_name")." ".$db->f ("last_name"). $db->f ("address_1"). $db->f ("address_2").$db->f ("state"). $db->f ("zip"). $db->f ("city").$db->f ('country');

echo "</td></tr>";
//}
*

Wester

  • Захожу иногда
  • 180
  • 4 / 1
Ну я так понял приехал я с этим вопросом никуда ))) beagler, подскажи еще че-нить, еще +1 поставлю ))
*

beagler

  • Moderator
  • 3276
  • 392 / 4
  • https://alorisman.ru/
посмотри как в list_shipto_addresses.tpl.php адреса выводятся

:) плюс на хлеб не намажешь.
*

Wester

  • Захожу иногда
  • 180
  • 4 / 1
Там все ясно... а как решить проблему не понимаю)
list_shipto_addresses.tpl.php

ЗЫ Понимаю, и в холодильник не поставишь...  ;)
« Последнее редактирование: 17.08.2009, 10:39:50 от beagler »
*

Wester

  • Захожу иногда
  • 180
  • 4 / 1
А почему я не могу вывести страну и регион (все остальное работает) на странице подтверждения >:(
echo $db->f ("country_name"). ", ";
echo $db->f ("state_name"). ", ";
тоже самое работает на странице выбора адреса (list_shipto_addresses.tpl.php)...  ?
*

Wester

  • Захожу иногда
  • 180
  • 4 / 1
Да, если это убрать то пропадает везде страна и регион
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Для одного товара несколько активных цен!

Автор RodrigeZ

Ответов: 7
Просмотров: 6914
Последний ответ 24.04.2017, 01:22:33
от VIPersone
Как настроить уведомление о новом заказе?

Автор mrfruze

Ответов: 5
Просмотров: 5538
Последний ответ 02.03.2015, 14:58:59
от redsowet
Не работает авторизация на сайте

Автор ranaza

Ответов: 4
Просмотров: 1532
Последний ответ 10.12.2012, 15:38:18
от dstavropolskij
При регистрации не сообщает что email или логиl

Автор SMVVK

Ответов: 0
Просмотров: 1488
Последний ответ 01.10.2012, 20:14:55
от SMVVK
[РЕШЕНО]Не выводятся доступные варианты о

Автор SMVVK

Ответов: 1
Просмотров: 1488
Последний ответ 07.01.2012, 13:05:12
от SMVVK