Новости Joomla

Совет по Joomla: несколько значений по умолчанию в XML-формах для стандартных полей типа list

👩‍💻 Совет по Joomla: несколько значений по умолчанию в XML-формах для стандартных полей типа list.При работе над плагином возникла необходимость указать стандартный набор из нескольких элементов стандартного поля списка. И хотелось указать их в стандартном же атрибуте default для полей. Когда это нужно?Когда Ваши пользователи устанавливают плагин и НЕ заходят в настройки - в коде вы можете использовать значения по умолчанию с помощью класса Registry (писал об этом ранее) и всегда быть уверенным, что хоть какие-то жизненно необходимые параметры к вам придут всегда. 🧐 Но как сделать то же самое для интерфейса админки?Пользователя нужно направлять, предлагать очевидный работоспособный сценарий для начала, а дальше он уже сам разберется. Когда человек заходит в параметры свежеустановленного плагина в Form ещё нет данных и параметры по умолчанию выставляются из атрибутов default в xml-полях.
<field name="showdesc" type="radio"                       label="PLG_CFI_PARAM_SHOWDESC"                       class="btn-group btn-group-yesno"                       default="1">                    <option value="0">JNO</option>                    <option value="1">JYES</option>                </field>
Здесь по умолчанию будет включено "Да". И если пользователь не переключит параметр, то при сохранении мы ожидаемо получим "да" в params плагина.Для поля списков type=&quot;list&quot; можно указать значение по умолчанию и многие знают, что его можно указать только одно.
<field type="list"                       name="article_fields"                       label="article_fields"                       description="article_fields_desc"                       layout="joomla.form.field.list-fancy-select"                       multiple="true"                       default="id"                >                    <option value="id">id</option>                    <option value="title">title</option>                    <option value="alias">alias</option>                    <option value="introtext">introtext</option>                    <option value="fulltext">fulltext</option>                    <option value="state">state</option></field>
Но у нас поле с множественным выбором (атрибут multiple) и хотелось бы указать несколько значений по умолчанию...Оказывается, так можно сделать. Для этого в атрибуте default нужно указать json с нужными параметрами в виде {int}key : {string} value.Например, default='{"0":"id","1":"title"}'.
<field type="list"                       name="article_fields"                       label="article_fields"                       description="article_fields_desc"                       layout="joomla.form.field.list-fancy-select"                       multiple="true"                       default='{"0":"id","1":"title"}'                >                    <option value="id">id</option>                    <option value="title">title</option>                    <option value="alias">alias</option>                    <option value="introtext">introtext</option>                    <option value="fulltext">fulltext</option>                    <option value="state">state</option></field>
⚠️ Обратите внимание на кавычки! Поскольку json_decode не понимает одинарные кавычки собственно json нужно писать с двойными, а значение для атрибута default писать в одинарные.🙏 За подсказанное решение огромное спасибо участникам нашего сообщества - разработчикам Дмитрию Васюкову (@fictionlabs) и Игорю Бердичевскому (@septdir).@joomlafeed#joomla #разработка #webdev #development

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

baloon

  • Захожу иногда
  • 369
  • 13 / 0
Вот есть несколько категорий с товарами и внезапно понадобилось на все товары определенной категории назначить скидку в 10%. И приходится каждый товар открывать и ставить ему скидку. Это ведь муторно и неправильно. А как сделать, чтобы можно было назначать скидку один раз на определенную категорию и все товары этой категории принимали эту скидку? Делалось такое кем-нибудь?
« Последнее редактирование: 21.09.2012, 20:57:52 от baloon »
*

baloon

  • Захожу иногда
  • 369
  • 13 / 0
Re: Скидка на категорию [почти решено]
« Ответ #1 : 21.09.2012, 23:07:34 »
VirtueMart 1.1.9
Почти сделал. Осталось сделать вывод установленной скидки в категории.
В файле administrator\components\com_virtuemart\html\product.product_category_form.php
строка примерно 70, после
Код
        <input type="text" class="inputbox" name="category_name" size="60" value="<?php echo shopMakeHtmlSafe( $db->sf('category_name'))?>" />
      </td>
    </tr>
добавить
Код
   			<tr> 
      <td width="21%" nowrap><div align="right"><?php echo $VM_LANG->_('PHPSHOP_PRODUCT_FORM_DISCOUNT_TYPE')?>:</div>
      </td>
      <td width="79%" ><?php
require_once( CLASSPATH.'ps_product_discount.php' );
        echo ps_product_discount::discount_list( $db->sf("product_discount_id") ); ?>
      </td>
    </tr>
Это выводит селект со списком скидок. Тут можно будет выбирать нужную скидку на все товары данной категории.
Далее, сразу после этого добавить
Код
    <?php
$product_discount_id = $db->sf("product_discount_id");
$sql = 'SELECT product_id FROM  jos_vm_product_category_xref WHERE category_id = ' . $category_id;
$result_select_query = mysql_query( $sql );
while($row = mysql_fetch_row($result_select_query)){
$sql2 = 'UPDATE jos_vm_product SET product_discount_id = ' . $product_discount_id . ' WHERE product_id = ' . $row[0];
mysql_query( $sql2 );
}
?>
Это назначает id скидки всем товарам данной категории. Работает.
Но вот после выбора скидки в категории и после сохранения, если опять открыть эту категорию, то выбранная скидка в селекте со списком скидок, не будет отображаться.
Придумал два варианта
1. создать в таблице с категориями jos_vm_category поле discount_id и туда тоже записывать id выбранной скидки. И при выводе селекта со скидками учитывать это поле и в соответствие с ним устанавливать нужное значение в селекте.
2. при выводе селекта со списком ссылок смотреть, какой id скидки присвоен какому-нибудь товару из данной категории и учитывая это назначать нужное значение в селекте.
Второй вариант хуже, потому что вдруг какому-нибудь товару из данной категории будет назначена другая скидка, а проверка учтет именно этот товар и в результате всем другим товарам будет переназначена другая скидка.
Поэтому я делаю первый вариант. Нужно добавить поле category_discount_id в таблицу jos_vm_category, сделать sql запрос в БД
Код
ALTER TABLE jos_vm_category ADD category_discount_id INT(11) NOT NULL
В том же файле product.product_category_form.php дописать код, после
Код
		mysql_query( $sql2 );
}
добавить
Код
	$sql3 = 'UPDATE jos_vm_category SET category_discount_id = ' . $product_discount_id . ' WHERE category_id = ' . $category_id;
mysql_query( $sql3 );
Теперь у каждой категории будет id назначенной скидки.

Осталось научить селект со скидками узнавать какую скидку он должен показать при открытие категории для редактирования.
В файле administrator\components\com_virtuemart\classes\ps_product_discount.php есть строки
Код
				$selected = $db->f( "discount_id" ) == $discount_id ? "selected=\"selected\"" : "" ;
$html .= "<option id=\"$id\" value=\"" . $db->f( "discount_id" ). "\" $selected>" . $db->f( "amount" ) ;
вроде тут назначается selected для той option которая соответствует присвоенной скидки. Тут я не знаю как дальше делать, подскажите. Нужно дописать условие для категории.

*

baloon

  • Захожу иногда
  • 369
  • 13 / 0
Re: Скидка на категорию [почти решено]
« Ответ #2 : 21.09.2012, 23:51:02 »
$db->sf("product_discount_id") - что она делает?
Полная строка выглядит так
echo ps_product_discount::discount_list( $db->sf("product_discount_id") );
*

baloon

  • Захожу иногда
  • 369
  • 13 / 0
Re: Скидка на категорию [почти решено]
« Ответ #3 : 24.09.2012, 13:32:59 »
up
*

Ejov

  • Осваиваюсь на форуме
  • 18
  • 1 / 0
Re: Скидка на категорию [почти решено]
« Ответ #4 : 06.04.2016, 20:00:27 »
Жаль, что тема не развилась. Тема нужная.
Спасибо baloon за решение.
По поводу того, что скидка не сохраняется при заходе в категорию в последующие разы, можно сделать так:
просто забить на это.
Если нужно убрать скидку для категории - просто удаляем действующую на выбранную категорию скидку из админки: товары - список скидок на товары - удалить скидку. Конечно, не самое лучшее решение, но работает.
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

[Решено] Товарная накладная и товарный чек

Автор mikeles

Ответов: 6
Просмотров: 5994
Последний ответ 21.09.2019, 19:48:12
от kungurskiy
[Решено] Чебокс "Показывать только товары, которые есть в наличии"

Автор artMelnikov

Ответов: 20
Просмотров: 7765
Последний ответ 28.06.2017, 11:19:51
от OutLaw1
[Решено] Скидки на зависимые товары

Автор Serpent19

Ответов: 4
Просмотров: 1846
Последний ответ 04.06.2014, 15:47:15
от One
[Решено] Категорий при добавлении товара больше 200...

Автор mobiland

Ответов: 6
Просмотров: 2064
Последний ответ 22.11.2013, 12:41:26
от El_nik
Сортировка в админке по производителю. РЕШЕНО

Автор igoryk

Ответов: 4
Просмотров: 2278
Последний ответ 20.10.2013, 17:07:26
от AnatolyW