Новости 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 Пользователей и 1 Гость просматривают эту тему.
  • 22 Ответов
  • 1741 Просмотров
*

shurakana

  • Давно я тут
  • 792
  • 50 / 6
Всем привет!
Возникла необходимость сделать подписку на новые комментарии, во встроенном компоненте комментариев JoomShopping.
т.е. без использования сторонних расширений.

Интересует не само письмо и прочие кнопки, а именно функция отправки письма, при добавлении нового комментария.
По такому же принципу хочу реализовать письмо об изменении цены товара.
Функция сохранения комментария-отзыва
Код
function reviewsave()
Находится в сайт\components\com_jshopping\controllers\product.php

Может кто окинет взглядом и сразу что-нибудь придумает?

Версия Jshopping - 4.x
« Последнее редактирование: 04.08.2014, 00:13:22 от shurakana »
Эта подпись отображается внизу каждого Моего сообщения. Я также могу использовать BB код и смайлы.
*

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

shurakana

  • Давно я тут
  • 792
  • 50 / 6
Re: Подписка на комментарии в JoomShopping?
« Ответ #2 : 04.08.2014, 14:38:43 »
)))) А, там есть типа "отписаться от рассылки" в письме?

Уведомление пользователю приходит после публикации админа, или как только оставлен?)
« Последнее редактирование: 04.08.2014, 14:54:05 от shurakana »
Эта подпись отображается внизу каждого Моего сообщения. Я также могу использовать BB код и смайлы.
*

ELLE

  • Глобальный модератор
  • 4505
  • 893 / 0
Re: Подписка на комментарии в JoomShopping?
« Ответ #3 : 04.08.2014, 15:05:31 »
может просто JComments поставить? там все это есть и даже больше :)
JComments - если нужно принципиально хранить данные у себя
или любой сторонний сервис, который легко интегрируется в магазин, - в них тоже все эти дела настраиваются
« Последнее редактирование: 04.08.2014, 15:11:01 от ELLE »
*

shurakana

  • Давно я тут
  • 792
  • 50 / 6
Re: Подписка на комментарии в JoomShopping?
« Ответ #4 : 04.08.2014, 20:08:40 »
Итак, в файле сайт\components\com_jshopping\controllers\product.php как указывалось ранее, добавил
Код
mail(email@email.ru, "тема", "текст");
Работает, но, естественно письмо идет сразу, до одобрения или публикации.

Пошел в админку, посмотрел какая функция отвечает за публикацию отзыва это
\administrator\components\com_jshopping\controllers\reviews.php
там три функции подряд начиная со строки 173:
Публикация
Код
    function publish(){
        $this->_publish(1);
        $this->setRedirect("index.php?option=com_jshopping&controller=reviews");
    }
Отключение
Код
    function unpublish(){
        $this->_publish(0);
        $this->setRedirect("index.php?option=com_jshopping&controller=reviews");
    }
И основная, которая публикует или отключает отзыв после определения параметра flag в первых двух.
Код
    function _publish($flag) {
        $jshopConfig = JSFactory::getConfig();
        $db = JFactory::getDBO();
        $cid = JRequest::getVar('cid');
        JPluginHelper::importPlugin('jshoppingadmin');
        $dispatcher = JDispatcher::getInstance();
        $dispatcher->trigger( 'onBeforePublishReview', array(&$cid, &$flag) );
        foreach ($cid as $key => $value) {
            $query = "UPDATE `#__jshopping_products_reviews` SET `publish` = '".$db->escape($flag)."' WHERE `review_id` = '".$db->escape($value)."'";
            $db->setQuery($query);
            $db->query();
            $review = JTable::getInstance('review', 'jshop');
            $review->load($value);
            $product = JTable::getInstance('product', 'jshop');
            $product->load($review->product_id);
            $product->loadAverageRating();
            $product->loadReviewsCount();
            $product->loadQuestCount();
            $product->store();
            #unset($product);
            unset($review);
        }
       
        $dispatcher->trigger('onAfterPublishReview', array(&$cid, &$flag) );
    }
Добавил отправку письма в цикл foreach, сначало в первую функцию, потом в третью, разница в том что в первой письма отправляются только при публикации, а втретьем идут и при отключении комментария.

Условие сделал такое, как уже сказал добавил в цикл который выше():
Код
	$query = "SELECT * FROM teyzk_jshopping_products_reviews WHERE subscribe=product_id"; // сравнение двух полей
$db->setQuery($query);
$list = $db->loadObjectList();
foreach ($list as $item) {
mail($item->user_email, "Тема письма", "текст");
}
Долго думал как сделать "кому отправлять", в итоге решил сделать условием совпадение номера подписки и номера товара.

Но, помогите перехватить переменную "номера товара" для которого публикуется отзыв, а то письмо отправляется все подписчикам на уведомления.

Переменная $cid в третьем коде, перехватывается из параметра url из админки при публикации как я понял, и передает id самого отзыва.


Эта подпись отображается внизу каждого Моего сообщения. Я также могу использовать BB код и смайлы.
*

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
Re: Подписка на комментарии в JoomShopping?
« Ответ #5 : 04.08.2014, 20:22:35 »
ну так делайте запрос к #__jshopping_products_reviews, в котором вытащить product_id для нужного review_id
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

shurakana

  • Давно я тут
  • 792
  • 50 / 6
Re: Подписка на комментарии в JoomShopping?
« Ответ #6 : 04.08.2014, 21:33:39 »
Спасибо! Что проникся в информацию..) Я пока обдумывал условия, видимо у меня перегрузилась "буферная память"..)))

Так как после твоего совета я минут 10 не мог понять что даст мне id товара и куда его надо вставлять..))

Все работает..)

Код:
Код
			//получение id товара по номеру отзыва
$query="SELECT product_id FROM teyzk_jshopping_products_reviews WHERE review_id='".$db->escape($value)."'";
$db->setQuery($query);
$prod_id=$db->loadResult();

//получение всех подписчиков полученного id товара
$query = "SELECT * FROM teyzk_jshopping_products_reviews WHERE subscribe=publish_type and product_id='$prod_id'";
$db->setQuery($query);
$list = $db->loadObjectList();

// отправка писем всем подписчикам этого товара
foreach ($list as $item) {
mail($item->user_email, "тема", "сообщение");
}
Эта подпись отображается внизу каждого Моего сообщения. Я также могу использовать BB код и смайлы.
*

shurakana

  • Давно я тут
  • 792
  • 50 / 6
Re: Подписка на комментарии в JoomShopping?
« Ответ #7 : 05.08.2014, 02:06:40 »
Сделал отписку от комментариев, добавив в письмо ссылку с параметрами.
Но, в обработчике вот такая схема подключения, можно ли сделать как то по joom'овски через $db = JFactory::getDBO();?
Файлы расположены в корне.
Код
<?php
   $prod_id = $_POST['product_id'];
   $link = mysql_connect('localhost', 'root', '') or die('Ошибка: Не удалось подключится к серверу БД.'.mysql_error($link));
   mysql_select_db('im', $link) or die('Не удалось подключиться к базе данных. '.mysql_error($link));
   $sql = "UPDATE teyzk_jshopping_products_reviews SET subscribe=0 WHERE subscribe='$prod_id;'";
   if(!mysql_query($sql))
   {echo '<p>Не вышло</p>';}
   else {echo '<p>Вышло</p>';}
?>
В принципе не обязательно, но безопасность как в таком случае..?

UPD Добавил проверку по email, а то так получается что отпишутся все пользователи которые подписались на этот товар.
« Последнее редактирование: 05.08.2014, 03:57:18 от shurakana »
Эта подпись отображается внизу каждого Моего сообщения. Я также могу использовать BB код и смайлы.
*

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
Re: Подписка на комментарии в JoomShopping?
« Ответ #8 : 05.08.2014, 09:18:47 »
можно ли сделать как то по joom'овски через $db = JFactory::getDBO();?

у практически любого компонента есть возможность расширения его возможностей. в частности, в ЖШ можно создать свой \components\com_jshopping\controllers\mycontroller.php, метод, например, unsubscribe которого будет вызываться как site.com/index.php?option=com_jshopping&controller=mycontroller&task=unsubscribe
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

shurakana

  • Давно я тут
  • 792
  • 50 / 6
Re: Подписка на комментарии в JoomShopping?
« Ответ #9 : 05.08.2014, 18:37:47 »
Хотел поместить туда простую функцию, для пробы, пишет ошибка - класс JshoppingControllertest не найден в jshopping.php строка 18

Но, в jshopping.php название класса заносится в переменную. Так где его типа "зарегистрировать" (мой класс) чтоли, чтоб определялся?

Или можно самый простой образец "mycontroller.php" с вытекающими..?
Эта подпись отображается внизу каждого Моего сообщения. Я также могу использовать BB код и смайлы.
*

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
Re: Подписка на комментарии в JoomShopping?
« Ответ #10 : 05.08.2014, 20:20:28 »
Цитировать
класс JshoppingControllertest не найден

имя файла контроллера не соответствует имени класса в этом контроллере.

mycontroller.php -> class JshoppingControllerMycontroller extends JControllerLegacy{
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

shurakana

  • Давно я тут
  • 792
  • 50 / 6
Re: Подписка на комментарии в JoomShopping?
« Ответ #11 : 05.08.2014, 22:10:19 »
Названия то я скорректировал. Потом даже проскользнула мысль что класс mycontroller.php обязателен..))))

Оказываетcя после названия функции круглые скобки забыл (). И там всякие ошибки, и синтакс и тивариэйбл..
Спасибо, что заставил второй разок попробывать, я уже подумал что это либо очень сложно, либо где то ошибка. (В таких случаях мало кто думает что сам тупой..))))

И еще момент, как сделать, чпу url?

Максимум что у меня получилось это redirect на http://localhost/im/shop/unsubscribe.html там ниче не работает. Правил роутер, jshop_menu_list_item, и еще какие то файлы. Не выходит. Секрет есть?

Эта подпись отображается внизу каждого Моего сообщения. Я также могу использовать BB код и смайлы.
*

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
Re: Подписка на комментарии в JoomShopping?
« Ответ #12 : 05.08.2014, 22:16:02 »
секрета нет. есть обычные правила роутинга :) вот только с какой целью для ссылки на аннулирование подписки делать чпу ?
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

shurakana

  • Давно я тут
  • 792
  • 50 / 6
Re: Подписка на комментарии в JoomShopping?
« Ответ #13 : 05.08.2014, 22:37:12 »
Хотя-бы для того чтобы знать на будущее.

Ведь каждый шаг это + к опыту, и самое главное к возможностям..
Ведь к пример раньше я знал только if и else, а сейчас знаю и unset  ^-^

UPD - И чтобы в адресе небыло com_jshopping..)
« Последнее редактирование: 05.08.2014, 22:45:51 от shurakana »
Эта подпись отображается внизу каждого Моего сообщения. Я также могу использовать BB код и смайлы.
*

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
Re: Подписка на комментарии в JoomShopping?
« Ответ #14 : 06.08.2014, 09:21:30 »
Код: php
echo SEFLink('index.php?option=com_jshopping&controller=mycontroller&task=unsubscribe',0,1)
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

Linfuby

  • Завсегдатай
  • 1242
  • 176 / 0
  • Всё просто...
Re: Подписка на комментарии в JoomShopping?
« Ответ #15 : 06.08.2014, 10:09:40 »
Либо создать скрытый пункт меню, тогда можно сделать ссылку красивее: http://localhost/unsubscribe.html :)
Немного воображения и логики, и любая проблема становится решенной.
Кривые решения - дают кривой результат!
Решения для JoomShopping
Благодарности и поддержка принимаются по след. реквизитам:
Яндекс.Деньги - 41001751720054
*

shurakana

  • Давно я тут
  • 792
  • 50 / 6
Re: Подписка на комментарии в JoomShopping?
« Ответ #16 : 07.08.2014, 18:46:46 »
В общем ничего не вышло.
Файл mycomponent.php
Код
defined..
jimport..
class JshoppingControllerMycomponent extends JControllerLegacy{
function unsubscribe(){
echo "Проверка<br>"
echo SEFLink('index.php?option=com_jshopping&controller=mycomponent&task=unsubscribe',0,1); // просто проверка ссылки - выводится
$this->setRedirect( SEFLink('index.php?option=com_jshopping&controller=mycomponent&task=unsubscribe',0,1));
}
}

Когда строка "$this->setRedirect( SEFLink(..." закомментирована доступ есть, и по SEF адресу, и по обычному.

А когда НЕ закомментирована ошибка ".... перенаправляет запрос на этот адрес таким образом, что он никогда не завершится. Ошибка выходит по обоим адресам, SEF и обычному.

Ну оно и понятно, постоянно выполняется запрос..  !
Никакие файлы не редактировал (роутер и пр.) все стандартное.
Эта подпись отображается внизу каждого Моего сообщения. Я также могу использовать BB код и смайлы.
*

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
Re: Подписка на комментарии в JoomShopping?
« Ответ #17 : 07.08.2014, 19:01:28 »
Цитировать
В общем ничего не вышло.
а что должно было выйти?

Цитировать
Ну оно и понятно, постоянно выполняется запрос
непонятно, если все понятно, то что именно не понятно? естественно, редирект на самого себя дает бесконечный цикл.
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

shurakana

  • Давно я тут
  • 792
  • 50 / 6
Re: Подписка на комментарии в JoomShopping?
« Ответ #18 : 07.08.2014, 19:09:21 »
Ничего не вышло — всмысле ничего не получается..))

Так как сделать чтобы был однократный редирект?

Т.е. если ссылка такая index.php?option=com_jshopping&controller=mycomponent&task=unsubscribe то выполнять редирект.

если shop/mycomponent/unsubsribe то не выполнять, и все.

Почему в других (стандартных) контроллерах не редиректится постоянно, я не пойму..
Эта подпись отображается внизу каждого Моего сообщения. Я также могу использовать BB код и смайлы.
*

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
Re: Подписка на комментарии в JoomShopping?
« Ответ #19 : 07.08.2014, 19:20:42 »
в других стандартных контроллерах в принципе не редиректится. какой в вашем случае смысл в редиректе? для чего он?
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

shurakana

  • Давно я тут
  • 792
  • 50 / 6
Re: Подписка на комментарии в JoomShopping?
« Ответ #20 : 07.08.2014, 19:51:47 »
Чет я вообще ничего не понимаю уже..

Как бы, мне нужно чтобы при запросе site.com/index.php?option=com_jshopping&controller=mycontroller&task=unsubscribe
выводилась SEF ссылка..

Теперь я сам не пойму что мне нужно было.

Т.е. изначально то вся морока была изза этого.

Но компонент то доступен по прямому адресу..
Кароче запутался.. По сути вроде все нормально.. Спасибо.

Эта подпись отображается внизу каждого Моего сообщения. Я также могу использовать BB код и смайлы.
*

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
Re: Подписка на комментарии в JoomShopping?
« Ответ #21 : 07.08.2014, 20:29:21 »
насколько я понимаю, вам нужно было не
Цитировать
при запросе site.com/index.php?option=com_jshopping&controller=mycontroller&task=unsubscribe
выводилась SEF ссылка
, а получить SEF ссылку для отмены подписки. по крайней мере речи о редиректах с не-SEF на SEF ранее не было :)

это конечно можно сделать, но собственно зачем? ссылку вида index.php?option=com_jshopping&controller=mycontroller&task=unsubscribe вы нигде светить не будете, в письме у вас будет /mycomponent/unsubsribe, она же будет открываться в браузере. зачем еще выдумывать проблемы себе? хотя по сути сама по себе генерация SEF ссылки для отмены подписки - уже надуманная проблема :) но вы ж сказали, что это для опыта, поэтому я не стал настаивать на обратном :) но по сути - это лишнее
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

shurakana

  • Давно я тут
  • 792
  • 50 / 6
Re: Подписка на комментарии в JoomShopping?
« Ответ #22 : 07.08.2014, 22:23:33 »
Вот вобщем.

subs.php
Код
defined( '_JEXEC' ) or die( 'Restricted access' );
jimport('joomla.application.component.controller');
class JshoppingControllerSubs extends JControllerLegacy{

function unsubscribe(){
  echo "<form action=".SEFLink('index.php?option=com_jshopping&controller=subs&task=ok',0,1)." method='POST'>
<input type='hidden' name='user_email' value=".$_GET['usem'].">
<input type='hidden' name='product_id' value=".$_GET['prid'].">
<input type='submit' value='отписаться'>
</form>";
}

function ok(){
$db=&JFactory::getDBO();
$query="UPDATE teyzk_jshopping_products_reviews SET subscribe=0 WHERE subscribe='$_POST[product_id]' and user_email='$_POST[user_email]'";
                $db->setQuery($query);
                $db->query();
echo "Вы успешно отписались!";
}
}

Все работает..)
Эта подпись отображается внизу каждого Моего сообщения. Я также могу использовать BB код и смайлы.
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

WT JoomShopping Favorite - кнопки избранного в категории товаров и карточке тов

Автор sergeytolkachyov

Ответов: 25
Просмотров: 35706
Последний ответ 23.09.2025, 11:22:23
от Alex_gs
Атрибуты полей при оформлении заказа в JoomShopping

Автор goga_pgasovav

Ответов: 1
Просмотров: 625
Последний ответ 12.08.2025, 11:21:29
от kit2m2
Конфликт js шаблонов JoomShaper helix3 J5 с JoomShopping 5

Автор heartlink

Ответов: 6
Просмотров: 1400
Последний ответ 22.07.2025, 12:40:12
от heartlink
Модуль карусели товаров JoomShopping на Swiper.js для Joomla

Автор sergeytolkachyov

Ответов: 2
Просмотров: 2045
Последний ответ 04.07.2025, 10:30:36
от sergeytolkachyov
[Решено] Сбросить счётчик ID товаров JoomShopping

Автор goga_pgasovav

Ответов: 3
Просмотров: 1355
Последний ответ 13.02.2025, 00:11:20
от goga_pgasovav