Новости Joomla

Joomla 6: Автоматические обновления ядра в Joomla

Joomla 6: Автоматические обновления ядра в Joomla

👩‍💻 Joomla 6: Автоматические обновления ядра в Joomla. В октябрьском номере официального журнала Joomla - Joomla Community Magazine вышла статья David Jardin, где рассказывается о внедрении функционала автоматического обновления ядра Joomla.❓Почему сейчас? Joomla же жила как-то 20 лет без автоматических обновлений?Это оказалась самая востребованная за последнее время от пользователей Joomla функция. Но, основная причина внедрения - проблемы безопасности. Всякий раз, когда в новой версии Joomla устраняется уязвимость, злоумышленники начинают анализировать код, чтобы выяснить, какая именно уязвимость была исправлена. И как только они это выясняют - начинается разработка автоматизированных скриптов для взлома как можно большего количества сайтов. Затем доступы к автоматически взломанным сайтам продаются в профильных чатах и ресурсах "пачками" по несколько сотен тысяч или миллионов сайтов. Ваш сайт могли взломать несколько лет назад, но воспользоваться уязвимостью могут не сразу, а тогда, когда у злоумышленников возникнет необходимость. И только после этого вы может быть узнаете об этом.Анализ патча, понимание проблемы и разработка скрипта требуют времени. И если владелец сайта не обновит его до истечения этого срока, сайт может быть взломан. А хакеры действуют быстро! Для критических, легко эксплуатируемых уязвимостей речь идёт о временном окне в 10–12 часов — и этого времени явно недостаточно, чтобы все успели обновить свои сайты.Здесь выходят на первый план автоматизированные обновления: проект Joomla теперь может активно устанавливать обновления (и, следовательно, исправления безопасности) на сайты, чтобы гарантировать, что сайты действительно обновляются вовремя.🕘 От первых идей до реализации прошло 5 лет. И здесь можно вспомнить, как в Joomla 5.1 внедрили TUF - The Update Framework, позволяющий устанавливать защищённое соединение между сайтом и сервером обновлений и исключает возможность supply chain attack (атаки на цепочку поставок).Об особенностях реализации и требованиях к сайту читаем подробнее в статье на JCM.@joomlafeed#joomla #secutiry #jcm

Первый выпуск журнала NorrNext в честь 20-й годовщины Joomla™

Первый выпуск журнала NorrNext в честь 20-й годовщины Joomla™

Первый выпуск журнала NorrNext в честь 20-й годовщины Joomla™. Интервью с волонтёрами 🎈Ну что, друзья, вот и настал этот долгожданный момент. Мы выпустили первое издание собственного журнала под эгидой NorrNext, который включает в себя интервью с видными деятелями сообщества из разных стран и континентов.Общий нарратив: показать, что нас объединяет (Joomla) и узнать больше о людях, которые вносят свой вклад в развитие платформы в своих сообществах. 20 лет — это много. Давайте же узнаем о коллегах 🎁 Первый цикл включает такие страны, как Австрия, Испания, Латвия, Россия, Румыния, Тайланд, Черногория, Чехия.⚙️ С кем интервью: ✔️ Владимир Елисеев 🇷🇺✔️ Дмитрий Рекун 🇱🇻✔️ Дмитрий Цымбал 🇷🇺✔️ Евгений Сивоконь 🇷🇺 ✔️ Сергей Толкачёв 🇷🇺✔️ Dénes Székely 🇷🇴✔️ Jan Pavelka 🇨🇿✔️ Miljan Vujosevic 🇲🇪✔️ Sergio Iglesias 🇪🇸✔️ Sigrid Gramlinger 🇦🇹✔️ Pisan Chueatchatchai 🇹🇭‼️ Новые интервью будут добавляться до конца декабря 2025. Заходите по ссылке время от времени💡👉 Читать далее

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

graf

  • Захожу иногда
  • 195
  • 0 / 0
Доброго времени, подскажите, как сделать так: Если товара нет в наличии, то в карточке товара, текст кнопки "купить" менялась на "Заказать". Спасибо
*

graf

  • Захожу иногда
  • 195
  • 0 / 0
Данный метод у меня реализован, вот только не убирается class="prod_buttons" ,  при условии что товара нет в наличии, Помогите найти решение Вот код  /components/com_jshopping/templates/ja_tiris/product/product_default.php и страница с карточкой

http://oklim.ru/katalog-produktsii/dlya-konditsionerov/vitamin-c-filtr.html

Заранее СПАСИБО!
Код
<?php $product = $this->product?>
<?php include(dirname(__FILE__)."/load.js.php");?>
<div class="jshop productfull">
<form name = "product" method = "post" action = "<?php print $this->action?>" enctype="multipart/form-data">
  <div class="product-detail-wrap clearfix">  
  

    <!-- Begin: Product image -->    
    
    <div class="product-detail">
<?php if ($this->product->_display_price){?>
    

    <?php }?>

    <?php print $this->product->_tmp_var_bottom_price;?>
    <?php if ($this->product->product_old_price > 0){?>
    <div class="old_price">

        <strong><?php print _JSHOP_OLD_PRICE?> </strong>
<<span class="old_price" id="old_price"><?php print formatprice($this->product->product_old_price)?></span>
    </div>

    <?php }?>
<?php print $this->_tmp_product_html_before_buttons;?>
    <?php if (!$this->hide_buy){?>  

        
    <?php }?>

   <?php print $this->_tmp_product_html_after_buttons;?>
<?php print $this->_tmp_product_html_start;?>
    <?php if ($this->config->display_button_print) print printContent();?>
    <div class="rating-hits">
    <?php include(dirname(__FILE__)."/ratingandhits.php");?>
    </div>
 <div class = "jshop">
     <div class="product-image">
            <?php print $this->_tmp_product_html_before_image;?>            
            <?php if ($product->label_id){?>
                <div class="product_label">
                    <?php if ($product->_label_image){?>
                        <img src="<?php print $product->_label_image?>" alt="<?php print htmlspecialchars($product->_label_name)?>" />
                    <?php }else{?>
                        <span class="label_name"><?php print $product->_label_name;?></span>
                    <?php }?>
                </div>
            <?php }?>
            <?php if (count($this->videos)){?>
                <?php foreach($this->videos as $k=>$video){?>
                    <a style = "display:none" class = "video_full" id = "hide_video_<?php print $k;?>" href = ""></a>
                <?php } ?>
            <?php }?>
            
            <div id='list_product_image_middle' class="product-image">
            <?php if(!count($this->images)){?>
                <img id = "main_image" src = "<?php print $this->image_product_path?>/<?php print $this->noimage?>" alt = "<?php print htmlspecialchars($this->product->name)?>" />
            <?php }?>
            <?php foreach($this->images as $k=>$image){?>
            <a class="lightbox" id="main_image_full_<?php print $image->image_id?>" href="<?php print $this->image_product_path?>/<?php print $image->image_full;?>" <?php if ($k!=0){?>style="display:none"<?php }?>>
                <img id = "main_image_<?php print $image->image_id?>" src = "<?php print $this->image_product_path?>/<?php print $image->image_name;?>" alt="<?php print htmlspecialchars($image->_title)?>" title="<?php print htmlspecialchars($image->_title)?>" />
            </a>
            <?php }?>
            </div>
            <?php print $this->_tmp_product_html_after_image;?>
            
            <?php if ($this->config->product_show_manufacturer_logo && $this->product->manufacturer_info->manufacturer_logo!=""){?>
            <div class="manufacturer_logo">
                <a href="<?php print SEFLink('index.php?option=com_jshopping&controller=manufacturer&task=view&manufacturer_id='.$this->product->product_manufacturer_id, 2);?>">
                    <img src="<?php print $this->config->image_manufs_live_path."/".$this->product->manufacturer_info->manufacturer_logo?>" alt="<?php print htmlspecialchars($this->product->manufacturer_info->name);?>" title="<?php print htmlspecialchars($this->product->manufacturer_info->name);?>" border="0" />
                </a>
            </div>
            <?php }?>
        </div>
        <div class = "jshop_img_description" style = "padding-left: 10px;">
            <?php print $this->_tmp_product_html_before_image_thumb;?>
           <div id='list_product_image_thumb' class="jshop_img_description">
            <?php if ( (count($this->images)>1) || (count($this->videos) && count($this->images)) ) {?>
                <?php foreach($this->images as $k=>$image){?>
                    <img class="jshop_img_thumb" src="<?php print $this->image_product_path?>/<?php print $image->image_thumb?>" alt="<?php print htmlspecialchars($image->_title)?>" title="<?php print htmlspecialchars($image->_title)?>" onclick="showImage(<?php print $image->image_id?>)" />
                <?php }?>
            <?php }?>
            </div>
            <?php print $this->_tmp_product_html_after_image_thumb;?>
            <?php if (count($this->videos)){?>
                <?php foreach($this->videos as $k=>$video){?>                
                    <a href="<?php print $this->video_product_path?>/<?php print $video->video_name?>" id="video_<?php print $k?>" onclick = "showVideo(this.id, '<?php print $this->config->video_product_width;?>', '<?php print $this->config->video_product_height;?>'); return false;"><img class="jshop_video_thumb" src = "<?php print $this->video_image_preview_path."/"; if ($video->video_preview) print $video->video_preview; else print 'video.gif'?>" alt = "video" /></a>
                <?php } ?>
            <?php }?>
            <?php print $this->_tmp_product_html_after_video;?>
        </div>

    </div>  
    <div class = "jshop_prod_description">
<h1><?php print $this->product->name?></h1>


<div class="zakaz"><?php if ($this->product->product_quantity>0){?>
   <div><img src="images/Check-icon.png" />  Товар в наличии на складе в Екатеринбурге </div>
  <?php }else{?>
<div><img src="images/Check-icon1.png" /> Товар временно отсутствует на складе. За информацией<br/> о сроках поставки обращайтесь к менеджерам компании. </div>
<?php }?></div>
<div class="prod_price">
        <strong><?php print _JSHOP_PRICE?>:</strong><span id="block_price"><?php print formatprice($this->product->getPriceCalculate())?><?php print $this->product->_tmp_var_price_ext;?></span>
   </div>
<?php if ($this->config->show_product_code){?>
<span class="jshop_code_prod"><?php print _JSHOP_EAN?>: <span id="product_code"><?php print $this->product->getEan();?></span></span><?php }?>
<?php print $this->_tmp_product_html_before_buttons;?>
    
<ul class="prod_buttons">
            <li class="prod_qty">
                <?php print _JSHOP_QUANTITY?>:&nbsp;
            </li>
            <li class="prod_qty_input">


<input type="button" onclick="
var qty_el = document.getElementById('quantity');
var qty = qty_el.value;
if( !isNaN( qty ) &amp;&amp; qty &gt; 1) qty_el.value--;return false;" class="product_minus">
                <input type = "text" name = "quantity" id = "quantity" onkeyup="reloadPrices();" class = "inputbox" style = "width: 20px" value = "<?php print $this->default_count_product?>" /><?php print $this->_tmp_qty_unit;?>
            </li>      
<input type="button" onclick="
var qty_el = document.getElementById('quantity');
var qty = qty_el.value;
if( !isNaN( qty )) qty_el.value++;return false;" class="product_plus">
            <li class = "buttons">            
                <input type = "submit" class = "button" value = "<?php print _JSHOP_ADD_TO_CART?>" onclick="jQuery('#to').val('cart');" />
                <?php if ($this->enable_wishlist){?>
                    <input type = "submit" class = "button" value = "<?php print _JSHOP_ADD_TO_WISHLIST?>" onclick="jQuery('#to').val('wishlist');" />
                <?php }?>
                                   
                <?php print $this->_tmp_product_html_buttons;?>
            </li>
            <li id = "jshop_image_loading" style = "display:none"></li>
        </ul>

<?php if (!$this->config->hide_text_product_not_available){ ?>
        <div class = "not_available" id="not_available"><?php print $this->available?></div>
    <?php }?>
        <?php print $this->product->description; ?>
   </div>
    <?php if ($this->product->product_url!=""){?>
    <div class="prod_url">
        <a target="_blank" href="<?php print $this->product->product_url;?>"><?php print _JSHOP_READ_MORE?></a>
    </div>
    <?php }?>    
    
    <?php if ($this->config->product_show_manufacturer_logo && $this->product->manufacturer_info->name!=""){?>
    <div class="manufacturer_name">
        <?php print _JSHOP_MANUFACTURER;?>: <?php print $this->product->manufacturer_info->name;?>
    </div>
    <?php }?>
    
    <?php if (count($this->attributes)){?>
    <div class = "jshop_prod_attributes">
        <table class = "jshop">
        <?php foreach($this->attributes as $attribut){?>
        <tr>
            <td width = "50">
                <?php print $attribut->attr_name?>:
            </td>
            <td>
                <span id='block_attr_sel_<?php print $attribut->attr_id?>'>
                <?php print $attribut->selects?>
                </span>
            </td>
        </tr>
        <?php }?>
        </table>
    </div>
    <?php }?>
    
    <?php if (count($this->product->freeattributes)){?>
    <div class="prod_free_attribs">
        <table class = "jshop">
        <?php foreach($this->product->freeattributes as $freeattribut){?>
        <tr>
            <td class="name" width="80"><?php print $freeattribut->name;?> <?php if ($freeattribut->required){?><span>*</span><?php }?></td>
            <td class="field"><?php print $freeattribut->input_field;?></td>
        </tr>
        <?php }?>
        </table>
        <?php if ($this->product->freeattribrequire) {?>
        <div class="requiredtext">* <?php print _JSHOP_REQUIRED?></div>
        <?php }?>
    </div>
    <?php }?>
    
    <?php if ($this->product->product_is_add_price){?>
    <div class="price_prod_qty_list_head"><?php print _JSHOP_PRICE_FOR_QTY?></div>
    <table class="price_prod_qty_list">
    <?php foreach($this->product->product_add_prices as $k=>$add_price){?>
        <tr>
            <td class="qty_from" <?php if ($add_price->product_quantity_finish==0){?>colspan="3"<?php } ?>>
                <?php if ($add_price->product_quantity_finish==0) print _JSHOP_FROM; ?>
                <?php print $add_price->product_quantity_start?> <?php print $this->product->product_add_price_unit?>
            </td>
            <?php if ($add_price->product_quantity_finish > 0){?>
            <td class="qty_line"> - </td>
            <?php } ?>
            <?php if ($add_price->product_quantity_finish > 0){?>
            <td class="qty_to">
                <?php print $add_price->product_quantity_finish?> <?php print $this->product->product_add_price_unit?>
            </td>
            <?php } ?>
            <td class="qty_price">            
                <span id="pricelist_from_<?php print $add_price->product_quantity_start?>"><?php print formatprice($add_price->price)?><?php print $add_price->ext_price?></span> <span class="per_piece">/ <?php print $this->product->product_add_price_unit?></span>
            </td>
        </tr>
    <?php }?>
    </table>
    <?php }?>
    
    <?php if ($this->product->product_price_default > 0 && $this->config->product_list_show_price_default){?>
        <div class="default_price"><?php print _JSHOP_DEFAULT_PRICE;?>: <span id="pricedefault"><?php print formatprice($this->product->product_price_default)?></span></div>
    <?php }?>        
    
    <?php if ($this->config->show_tax_in_product && $this->product->product_tax > 0){?>
        <span class="taxinfo"><?php print productTaxInfo($this->product->product_tax);?></span>
    <?php }?>
    <?php if ($this->config->show_plus_shipping_in_product){?>
        <span class="plusshippinginfo"><?php print sprintf(_JSHOP_PLUS_SHIPPING, $this->shippinginfo);?></span>
    <?php }?>
    <?php if ($this->product->delivery_time != ''){?>
        <div class="deliverytime"><?php print _JSHOP_DELIVERY_TIME?>: <?php print $this->product->delivery_time?></div>
    <?php }?>
    <?php if ($this->config->product_show_weight && $this->product->product_weight > 0){?>
        <div class="productweight"><?php print _JSHOP_WEIGHT?>: <span id="block_weight"><?php print formatweight($this->product->getWeight())?></span></div>
    <?php }?>
    
    <?php if ($this->product->product_basic_price_show){?>
        <div class="prod_base_price"><?php print _JSHOP_BASIC_PRICE?>: <span id="block_basic_price"><?php print formatprice($this->product->product_basic_price_calculate)?></span> / <?php print $this->product->product_basic_price_unit_name;?></div>
    <?php }?>
    <table>
<tr>
<td width="150">
<?php print $extra_field['name'];?>
</td>
<td width="150">
<?php print $extra_field['value'];?>
</td>
</tr>
</table>

    
    <?php if ($this->product->vendor_info){?>
        <div class="vendorinfo">
            <?php print _JSHOP_VENDOR?>: <?php print $this->product->vendor_info->shop_name?> (<?php print $this->product->vendor_info->l_name." ".$this->product->vendor_info->f_name;?>),
            (
            <?php if ($this->config->product_show_vendor_detail){?><a href="<?php print $this->product->vendor_info->urlinfo?>"><?php print _JSHOP_ABOUT_VENDOR?></a>,<?php }?>
            <a href="<?php print $this->product->vendor_info->urllistproducts?>"><?php print _JSHOP_VIEW_OTHER_VENDOR_PRODUCTS?></a> )
        </div>
    <?php }?>
    
    
    
    <?php if ($this->config->product_show_qty_stock){?>
        <div class="qty_in_stock"><?php print _JSHOP_QTY_IN_STOCK?>: <span id="product_qty"><?php print sprintQtyInStock($this->product->qty_in_stock);?></span></div>
    <?php }?>
    
  
  
<input type="hidden" name="to" id='to' value="cart" />
<input type = "hidden" name = "product_id" id = "product_id" value = "<?php print $this->product->product_id?>" />
<input type = "hidden" name = "category_id" id = "category_id" value = "<?php print $this->category_id?>" />
</div>
</div>
</form>
<?php

if (count ($this->demofiles)){?>
<div class="list_product_demo">
<table>
    <?php foreach($this->demofiles as $demo){?>
    <tr>
        <td class="descr"><?php print $demo->demo_descr?></td>            
        <?php if ($this->config->demo_type == 1) { ?>
            <td class="download"><a target="_blank" href="<?php print $this->config->demo_product_live_path."/".$demo->demo;?>" onClick="popupWin = window.open('<?php print SEFLink("index.php?option=com_jshopping&controller=product&task=showmedia&media_id=".$demo->id);?>', 'video', 'width=<?php print $this->config->video_product_width;?>,height=<?php print $this->config->video_product_height;?>,top=0,resizable=no,location=no'); popupWin.focus(); return false;"><img src = "<?php print $this->config->live_path.'images/play.gif'; ?>" alt = "play" title = "play"/></a></td>
        <?php } else { ?>
            <td class="download"><a target="_blank" href="<?php print $this->config->demo_product_live_path."/".$demo->demo;?>"><?php print _JSHOP_DOWNLOAD;?></a></td>
        <?php }?>
    </tr>
    <?php }?>
</table>
</div>
<?php } ?>

<?php if ($this->config->product_show_button_back){?>
<input type="button" class = "button" value="<?php print _JSHOP_BACK;?>" onclick="<?php print $this->product->button_back_js_click;?>" />
<?php }?>
<?php
    print $this->_tmp_product_html_before_related;
    include(dirname(__FILE__)."/related.php");
    print $this->_tmp_product_html_before_review;
    include(dirname(__FILE__)."/review.php");
?>
<?php print $this->_tmp_product_html_end;?>
<script type="text/javascript">
jQuery(function(){
jQuery('dl.tabs dt').click(function(){
jQuery(this)
.siblings().removeClass('selected').end()
.next('dd').andSelf().addClass('selected');
});
});</script>

</div>

*

ELLE

  • Глобальный модератор
  • 4505
  • 893 / 0
Код
 <input type = "submit" class = "button" value = "<?php print _JSHOP_ADD_TO_CART?>" onclick="jQuery('#to').val('cart');" />
_JSHOP_ADD_TO_CART = Купить

знааачит:
Код
 <?php  if ($product->product_quantity >0){ ?>
<input type = "submit" class = "button" value = "<?php print _JSHOP_ADD_TO_CART?>" onclick="jQuery('#to').val('cart');" />
                    <?php } else { ?>
<input type = "submit" class = "button" value = "Заказать!" onclick="jQuery('#to').val('cart');" />
<?php } ?>

зачем убирать class="prod_buttons" ?
*

graf

  • Захожу иногда
  • 195
  • 0 / 0
про class="prod_buttons" не дописал, нужно чтобы при статусе нет в наличии убиралась строка <li class="prod_qty"> Количество: </li>

Спасибо огромное за помощь лови "+"
*

ELLE

  • Глобальный модератор
  • 4505
  • 893 / 0
про class="prod_buttons" не дописал, нужно чтобы при статусе нет в наличии убиралась строка <li class="prod_qty"> Количество: </li>
выше понятно что было сделано? по аналогии сделаете и все.
просто подсветки нет - глаза можно сломать
*

graf

  • Захожу иногда
  • 195
  • 0 / 0
*

kombatboy

  • Новичок
  • 6
  • 0 / 0
Код
 <input type = "submit" class = "button" value = "<?php print _JSHOP_ADD_TO_CART?>" onclick="jQuery('#to').val('cart');" />
_JSHOP_ADD_TO_CART = Купить

знааачит:
Код
 <?php  if ($product->product_quantity >0){ ?>
<input type = "submit" class = "button" value = "<?php print _JSHOP_ADD_TO_CART?>" onclick="jQuery('#to').val('cart');" />
                    <?php } else { ?>
<input type = "submit" class = "button" value = "Заказать!" onclick="jQuery('#to').val('cart');" />
<?php } ?>

зачем убирать class="prod_buttons" ?

Пробовал так, но при вставке предложенного кода на странице вылетала ошибка сервера.
Посмотрев похожие запросы с if в данном файле решил править данную строчку
Код
<?php  if ($product->product_quantity >0){ ?>
на эту, добавив одно слово
Код
<?php  if ($this->product->product_quantity >0){ ?>

страница загрузилась, но кнопка не отображалась. Сначало было расстроился, но смекнул что "Заказать!" должно выводиться вместо "В корзину!", тоесть нужно чтобы покупалось всегда не зависимо от количества на складе. И в настройках заказа http://domen.com/administrator/index.php?option=com_jshopping&controller=config&task=catprod убрал галочку сдесь "Скрыть кнопку купить, если товара нет на складе".

Ура! Кнопка отобразилась но крокозябрами =/ Поменял кодировку - не помогло. И решил поступить как с кнопкой "В корзину!" - создал дополнительное поле
Код
define('_JSHOP_ZAKAZ', 'Заказать');
в языковом файле по адресу /components/com_jshopping/lang и вставил в product_default.php

В общем получилось вот таким образом:
 
Код
<?php  if ($this->product->product_quantity >0){ ?>
<input type = "submit" class = "button" value = "<?php print _JSHOP_ADD_TO_CART?>" onclick="jQuery('#to').val('cart');" />
                    <?php } else { ?>
<input type = "submit" class = "button" value = "<?php print _JSHOP_ZAKAZ?>" onclick="jQuery('#to').val('cart');" />
<?php } ?>


Может кому-то поможет.
*

ELLE

  • Глобальный модератор
  • 4505
  • 893 / 0
*

kombatboy

  • Новичок
  • 6
  • 0 / 0

Как раз для категории подошёл первоначально предложенный код, а с карточкой пришлось переделывать.
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Вкладки (табы) в описании товара

Автор Sergio

Ответов: 254
Просмотров: 57794
Последний ответ 12.10.2023, 12:20:59
от dron
Где посмотреть варианты карточки товара

Автор itbc

Ответов: 6
Просмотров: 3168
Последний ответ 31.10.2022, 10:05:51
от nevigen
Основная картинка в карточке товара на весь экран

Автор Mister Shadow

Ответов: 1
Просмотров: 2761
Последний ответ 08.07.2022, 22:16:27
от nevigen
meta title на странице товара

Автор ecolora

Ответов: 5
Просмотров: 2928
Последний ответ 30.05.2022, 14:31:44
от kit2m2
Вывести артикул вместо кода товара в письмо клиента

Автор antony2606

Ответов: 2
Просмотров: 2865
Последний ответ 09.02.2021, 17:01:25
от antony2606