Новости Joomla

Свои типы полей в Joomla.

Свои типы полей в Joomla.Это большая тема, о которой можно говорить очень много

Это большая тема, о которой можно говорить очень много. Самое главное, что возможности применения ограничиваются только вашей больной фантазией. Вы строите интерфейс своего модуля или плагина и вам нужно подтянуть данные из сторонней системы (список чего-нибудь по какому-нибудь API), чтобы сохранить выбранный id в Joomla. Или сделать какую-то проверку и в зависимости от неё показать то или иное сообщение пользователю. Для этого подойдут свои пользовательские типы полей. Интерфейс Joomla по большей части описан в XML-файлах. У каждого из них свои параметры. Некоторые не описаны в документации (manual.joomla.org), поэтому самым любопытным будет полезно заглянуть в собственно файлы фреймворка по пути

libraries/src/Form/FormField.php, а так же в
libraries/src/Form/Fields. У каждого класса поля перечислены его специфические свойства, которые можно описывать в XML. А в своём типе поля вы можете устанавливать эти значения программно. В моём модуле WT Quick links под капотом происходят изменения. Теперь для работы (в админке) ему нужен вспомогательный плагин. А в самом модуле нам бы проверить, а не выключен ли он? В Joomla есть тип поля Note - заметка. Его можно использовать для вывода примечаний.

<field type="note" name="your_note_for_user" label="Заголовок примечания" title="Альтернативный способ для заголовка" description="Текст примечания" class="col-12 alert alert-info" heading="h1" close="true" />

heading - указывать уровень заголовка.
close - позволяет закрыть это примечание. В классе поля
libraries/src/Form/Field/NoteField.php описана логика вывода. И в принципе оно нам подходит для нашей задачи. Но оно будет выводить сообщение всегда, а нам нужно только тогда, когда плагин отключён. Поэтому берём и создаём свой класс поля, который мы унаследуем от
NoteField. Это значит, что у нас в руках будет весь инструментарий стандартного поля
Note + то, что мы сами добавим. В XML-манифест добавляем наше поле

<field type="systempluginstatus" name="systempluginstatus" addfieldprefix="Joomla\Module\Wtquicklinks\Site\Fields"/>

-

type - имя файла и класса,-
addfieldprefix - указываем namespace к нашему классу, может быть любой нам нужный-
name - нельзя полю без имени...Это означает, что Joomla будет использовать класс поля из файла
modules/mod_wt_quick_links/src/Fields/SystempluginstatusField.php.А в классе поля будет написано следующее:

<?php // namespace для атрибута addfieldprefix namespace Joomla\Module\Wtquicklinks\Site\Fields; // нельзя напрямую обращаться к этому файлу defined('_JEXEC') or die; // подключаем родительский класс для переопределения use Joomla\CMS\Form\Field\NoteField; use Joomla\CMS\Language\Text; use Joomla\CMS\Plugin\PluginHelper; // имя класса и имя файла точь-в-точь class SystempluginstatusField extends NoteField { protected $type = 'Systempluginstatus'; protected function getLabel() { // если плагин не включён if(PluginHelper::isEnabled('system','wtquicklinks')) { // меняем свойства родительского класса $this->class = 'alert alert-danger w-100'; $this->element['label'] = '⚠️ А-а-а-а!'; $this->element['description'] = 'Плагин не включён!!'; // и просто рендерим его с нашими свойствами return parent::getLabel(); } // А иначе всё хорошо, скрываем поле из виду. $this->parentclass = 'd-none'; return ''; } }

Просто и удобно. И людям приятно, что о них позаботились и рассказали почему что-то не работает. @webtolkru#joomla #php #webdev #разработка

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

alexkrin

  • Новичок
  • 8
  • 0 / 0
  • Вечный школьнег
Доброго времени суток!

У меня возникла следующая проблема при настройке VirtueMart 1.1.4. Дело касается вывода сопутствующих товаров. Мне необходимо выводить около 9 позиций сопутствующих товаров в карточке товара. Изменить количество товаров я могу, а вот как сделать так, чтобы они отражались не в одну строчку, а в несколько? Например в 3 ряда по 3 товара в каждом.... Помогите, пожалуйста.
Насколько я понимаю, изменения необходимо внести здесь: /administrator/components/com_virtuemart/html/shop.product_details.php  
Вот этот код:

Код
// Let's have a look wether the product has related products.
$q = "SELECT product_sku, related_products FROM #__{vm}_product,#__{vm}_product_relations ";
$q .= "WHERE #__{vm}_product_relations.product_id='$product_id' AND product_publish='Y' ";
$q .= "AND FIND_IN_SET(#__{vm}_product.product_id, REPLACE(related_products, '|', ',' )) LIMIT 3, 9";
$db->query( $q );
/*// This shows randomly selected products from the products table
// if you don't like to set up related products for each product
$q = "SELECT product_sku FROM #__{vm}_product ";
$q .= "WHERE product_publish='Y' AND product_id != $product_id ";
$q .= "ORDER BY RAND() LIMIT 0, 4";
$db->query( $q );*/
$related_products = '';
if( $db->num_rows() > 0 ) {
$tpl->set( 'ps_product', $ps_product );
$tpl->set( 'products', $db );
$related_products = $tpl->fetch( '/common/relatedProducts.tpl.php' );
}

  :o
*

drinkmaker

  • Захожу иногда
  • 65
  • 13 / 0
  • Щасливцю?
За вывод отвечает файл шаблона relatedProducts.tpl.php

Скорее всего он у тебя лежит тут:  ВВВ.ТвойСайт.Ком/components/com_virtuemart/themes/ТвойШаблон/templates/common/relatedProducts.tpl.php

У меня экзотический шаблон, выглядит вот так:

Код
<?php if( !defined( '_VALID_MOS' ) && !defined( '_JEXEC' ) ) die( 'Direct Access to '.basename(__FILE__).' is not allowed.' ); ?>

<hr/>

<h3><?php echo $VM_LANG->_('PHPSHOP_RELATED_PRODUCTS_HEADING')?></h3>
 
<table width="100%" align="center">
<tr>
    <?php
    while( $products->next_record() ) { ?>
      <td valign="top">
      <?php echo $ps_product->product_snapshot( $products->f('product_sku') )?>
      </td>
<?php
    }
?>
    </tr>
</table> 

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

Код
<?php if( !defined( '_VALID_MOS' ) && !defined( '_JEXEC' ) ) die( 'Direct Access to '.basename(__FILE__).' is not allowed.' ); ?>

<hr/>

<h3><?php echo $VM_LANG->_('PHPSHOP_RELATED_PRODUCTS_HEADING')?></h3>
 
<table width="100%" align="center">
  <?php
    while( $products->next_record() ) { ?>
<tr>
        <td valign="top">
      <?php echo $ps_product->product_snapshot( $products->f('product_sku') );  $products->next_record() ; ?>
      </td>

              <td valign="top">
      <?php echo $ps_product->product_snapshot( $products->f('product_sku') ); $products->next_record() ; ?>
      </td>

              <td valign="top">
      <?php echo $ps_product->product_snapshot( $products->f('product_sku') )?>
      </td>
  </tr>
<?php
    }
?>
 
</table>

Следует отметить, что это не совсем правильное решение, оно работает только в том случае если количество связанных товаров кратно 3 :))
Но принцип, я думаю, ясен. Я просто запямятовал PHP, это на скорую руку.
Если не получится говори, помогу.
Долго думали - чего котенку в организме не хватает, если он ест полиэтилен. Решили, что мозгов.
*

prostoy

  • Захожу иногда
  • 394
  • 6 / 1
  • Истина где то рядом.
У меня проблема если я ввожу например 4-ре сопутствуюших товаров то получается что 4-й товар копируется еще 2-раза что бы было кратное 3 товаром на каждой стороке. Как это исправить?
*

Sequels

  • Захожу иногда
  • 104
  • 5 / 0
У меня ВМ версии 1.1.8, помогите где можно исправить этот код, т.к. вышеуказанного у меня нет.
У меня сопутствующих товаров по несколько штук, а выводит только по 4 и все.
*

Sequels

  • Захожу иногда
  • 104
  • 5 / 0
Повторно прошу помочь, не могу решить проблему  !
*

Minstrel

  • Новичок
  • 7
  • 3 / 0
  • Minstrel
Для этого необходимо заменить код файла components/com_virtuemart/themes/default/Template/common/relatedProducts.tpl.php на
Код: php
    <?php if( !defined( '_VALID_MOS' ) && !defined( '_JEXEC' ) ) die( 'Direct Access to '.basename(__FILE__).' is not allowed.' ); ?>
    <hr/>
    <h3><?php echo $VM_LANG->_('PHPSHOP_RELATED_PRODUCTS_HEADING')?></h3>
    <table width="100%" align="center">
    <tr>
    <?php
    $td_counter = 1;
    while( $products->next_record() ) {
       ?>
       <td valign="top">
          <?php echo $ps_product->product_snapshot( $products->f('product_sku') )?>
       </td>
    <?php
    $td_counter++;
       // Added by Minstrel: new rows
       if ($td_counter == 4) { // Defining row element count
          echo "</tr><tr>";
          $td_counter = 1;      // Reset counter
       }
    }
    ?>
    </tr>
    </table>
« Последнее редактирование: 20.12.2011, 06:18:11 от Minstrel »
*

Sequels

  • Захожу иногда
  • 104
  • 5 / 0
Для этого необходимо заменить код файла components/com_virtuemart/themes/default/Template/common/relatedProducts.tpl.php на

Неа :(
В первой строке выводит 3 товара, а во вторую все остальные и получается тихий ужас %)

Уже голову сломал, столько вариантов перепробовал...
*

Minstrel

  • Новичок
  • 7
  • 3 / 0
  • Minstrel
Да, действительно, у меня была реализация для двухстрочного вывода.
Чтобы работало для любого количества строк,
надо еще добавить сброс счетчика $td_counter = 1; после вывода </tr><tr>
Добавил в код
*

Sequels

  • Захожу иногда
  • 104
  • 5 / 0
Да, действительно, у меня была реализация для двухстрочного вывода.
Чтобы работало для любого количества строк,
надо еще добавить сброс счетчика $td_counter = 1; после вывода </tr><tr>
Добавил в код

Отлично! Спасибо огромное за помощь!
*

Igoritaly

  • Давно я тут
  • 659
  • 2 / 0
Да, действительно, у меня была реализация для двухстрочного вывода.
Чтобы работало для любого количества строк,
надо еще добавить сброс счетчика $td_counter = 1; после вывода </tr><tr>
Добавил в код
А у меня все равно выводит не больше четырех товаров
*

Igoritaly

  • Давно я тут
  • 659
  • 2 / 0
Мне в принципе не важно сколько в строку будет, главное что-бы он выводил то количество материалов которое я указал в админке в разделе "Сопутствующие товары". Я указал 7 а он выводит всего лишь 3
*

saharin88

  • Захожу иногда
  • 291
  • 20 / 1
  • JoomWork
Minstrel
Спасибо!
*

Minstrel

  • Новичок
  • 7
  • 3 / 0
  • Minstrel
А у меня все равно выводит не больше четырех товаров
Количество в строке определяется вот этим числом
Код: php
if ($td_counter == 4) { // Defining row element count

Мне в принципе не важно сколько в строку будет, главное что-бы он выводил то количество материалов которое я указал в админке в разделе "Сопутствующие товары". Я указал 7 а он выводит всего лишь 3
А это уже надо разбираться, почему он не накапливает в переменной $product необходимое количество доп. товаров.
Скорее всего, максимальное число задано где-то в настройках админки виртумарта.

Я указал 7 а он выводит всего лишь 3
Это вы где указываете?
« Последнее редактирование: 20.12.2011, 06:22:40 от Minstrel »
*

San_Sanich

  • Новичок
  • 7
  • 0 / 0
Спасибо автору за грамотное объяснение! Вот тут - http://brj.pp.ru/wiki/commerce/virtuemart/relatedproducts есть ещё информация, возможно кому-то пригодится.
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Количество просмотров товара VirtueMart Существует?

Автор grishin

Ответов: 38
Просмотров: 11495
Последний ответ 22.08.2020, 08:44:29
от rsn
Не выводит списком Настраиваемое поле в VirtueMart 5.0

Автор ЛюдмилаМир

Ответов: 2
Просмотров: 3013
Последний ответ 25.08.2019, 16:27:04
от ЛюдмилаМир
Joomla VirtueMart помощь в переводе

Автор akkord31

Ответов: 0
Просмотров: 2870
Последний ответ 21.05.2019, 09:14:02
от akkord31
Миграция с Joomla 1.5 на 3 с VirtueMart 1.1.9 stable на свежую. Кто поможет?

Автор Гриша-Десантник

Ответов: 7
Просмотров: 3110
Последний ответ 23.04.2019, 10:22:25
от draff
Переход на https VirtueMart 1.1.4 проблемы с фото

Автор Sergey1984

Ответов: 4
Просмотров: 3247
Последний ответ 25.10.2018, 20:56:54
от Sergey1984