Форум русской поддержки Joomla!® CMS
10.12.2016, 20:36:42 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
   
   Начало   Поиск Joomla 3.0 FAQ Joomla 2.5 FAQ Joomla 1.5 FAQ Правила форума Новости Joomla Реклама Войти Регистрация Помощь  
Страниц: [1] 2 3  Все   Вниз
  Добавить закладку  |  Печать  
Автор

Код товара - автоматическая генерация.

 (Прочитано 5176 раз)
0 Пользователей и 1 Гость смотрят эту тему.
AndreyUA
Осваиваюсь на форуме
***

Репутация: +7/-0
Offline Offline

Сообщений: 61


« : 30.04.2012, 10:58:07 »

Всем добрый день!
У меня вопрос к знающим JoomShopping.
Как известно, каждый товар, производитель или категория имеет свой ID.
Я хотел бы сделать на основе ID товара и ID производителя автоматическую генерацию кода товара.

Идея такова.
При добавлении нового товара или редактирования старого, идет проверка поля "Код товара".

Условие:
Если НЕ пусто - сохранить товар с введёным кодом товара.
Если пусто - сгенерировать автоматически код такого содержания: M[id производителя]P[id товара].

Я пока только учу азы PHP, условие буду стараться написать сам.
Подскажите, какой файл необходимо править, чтоб добиться желаемого результата.

Спасибо!
Записан
Linfuby
Живу я здесь
******

Репутация: +165/-0
Offline Offline

Пол: Мужской
Сообщений: 1202


Всё просто...


« Ответ #1 : 30.04.2012, 13:12:55 »

\administrator\components\com_jshopping\controllers\products.php
Функция save.
Если не ошибаюсь то в строках 471-482 как раз и идет сохранение псевдонима
Записан
anti4anti
Новичок
*

Репутация: +0/-0
Offline Offline

Пол: Мужской
Сообщений: 5


« Ответ #2 : 14.05.2012, 15:17:26 »

Тоже мучаюсь с этой затеей, пока глухо.
Записан
Linfuby
Живу я здесь
******

Репутация: +165/-0
Offline Offline

Пол: Мужской
Сообщений: 1202


Всё просто...


« Ответ #3 : 14.05.2012, 17:52:35 »

Тоже мучаюсь с этой затеей, пока глухо.
А в чем загвоздка-то?
Я же написал где искать.
Код:
            if ($post['alias_'.$lang->language]!="" && !$_alias->checkExistAlias2Group($post['alias_'.$lang->language], $lang->language, $post['product_id'])){
                $post['alias_'.$lang->language] = "";
                JError::raiseWarning("", _JSHOP_ERROR_ALIAS_ALREADY_EXIST);
            }
Меняем на
Код:
            if ($post['alias_'.$lang->language]!="" && !$_alias->checkExistAlias2Group($post['alias_'.$lang->language], $lang->language, $post['product_id'])){
                $post['alias_'.$lang->language] = "";
                JError::raiseWarning("", _JSHOP_ERROR_ALIAS_ALREADY_EXIST);
            }else{
            $post['alias_'.$lang->language] = "Тут писать любой Псевдоним, который применится если значение оставить пустым";
            }
Записан
AndreyUA
Осваиваюсь на форуме
***

Репутация: +7/-0
Offline Offline

Сообщений: 61


« Ответ #4 : 14.05.2012, 23:50:55 »

anti4anti, у меня пока тоже не получается.
Linfuby, "алиас" не есть "код товара". Это не те строки.

Если я не ошибаюсь, код товара - product_ean. Но в файле products.php такой строки нету.
« Последнее редактирование: 15.05.2012, 00:10:54 от AndreyUA » Записан
anti4anti
Новичок
*

Репутация: +0/-0
Offline Offline

Пол: Мужской
Сообщений: 5


« Ответ #5 : 15.05.2012, 10:55:10 »

AndreyUA, нашел где это делается, но есть загвоздка.
/administrator/components/com_jshopping/views/product_edit/tmpl/info.php
Код:
<td class="key">
         <?php echo _JSHOP_EAN_PRODUCT;?>
       </td>
       <td>
         <input type = "text" name = "product_ean" id = "product_ean" value = "<?php echo $row->product_ean?>" onkeyup="updateEanForAttrib()"; />
       </td>
изменил на
Код:
<td class="key">
         <?php echo _JSHOP_EAN_PRODUCT;?>
       </td>
       <td>
         <input type = "text" name = "product_ean" id = "product_ean" value = "<?php if ($row->product_ean == ""){ echo 'test00' , $row->product_id;} else {echo $row->product_ean;} ?>" onkeyup="updateEanForAttrib()"; />   
       </td>
Но теперь проблема при создании нового товара, т.к. id ему присваивается только после сохранения. Нужно как то брать id последнего товара и прибавлять к нему 1, но в php я только начинаю осваиваться.
Записан
AndreyUA
Осваиваюсь на форуме
***

Репутация: +7/-0
Offline Offline

Сообщений: 61


« Ответ #6 : 15.05.2012, 12:14:14 »

Я считаю, это не совсем верное решение. Файлы в папке "views" отвечают только за формирование и вывод информации (как шаблон для конечного пользователя).
Нужно искать файл с функцией сохранения этого самого кода товара.
Точнее, может быть даже не функция, а строчка такого типа:
Код:
$post[$product_ean] = $product_ean;
« Последнее редактирование: 15.05.2012, 12:19:28 от AndreyUA » Записан
anti4anti
Новичок
*

Репутация: +0/-0
Offline Offline

Пол: Мужской
Сообщений: 5


« Ответ #7 : 15.05.2012, 12:19:15 »

AndreyUA, есть и такое но там мои усилия вообще ничем не увенчались, а так криво но работает.
/administrator/components/com_jshopping/controllers/products.php
Функция сейв примерно 688 строка.
« Последнее редактирование: 15.05.2012, 12:29:23 от anti4anti » Записан
Linfuby
Живу я здесь
******

Репутация: +165/-0
Offline Offline

Пол: Мужской
Сообщений: 1202


Всё просто...


« Ответ #8 : 15.05.2012, 13:40:48 »

Linfuby, "алиас" не есть "код товара". Это не те строки.
Виноват... Невнимателен...
Если НЕ пусто - сохранить товар с введёным кодом товара.
Если пусто - сгенерировать автоматически код такого содержания: M[id производителя]P[id товара].
Как там!? Немного воображения и логики? Azn
\administrator\components\com_jshopping\controllers\products.php
Функция save, ищем следующий текст примерно 519 строка.
Код:
       $product_id = $product->product_id;
Ниже добавляем
Код:
       if (!$post['product_ean']) {
         $manufacturer_id = 0;
         if (isset($post['product_manufacturer_id'])){
         $manufacturer_id = $post['product_manufacturer_id'];
         }
         $product->product_ean = "M[".$manufacturer_id."]P[".$product_id."]";
        }
        if (!$product->store()){
            JError::raiseWarning("",_JSHOP_ERROR_SAVE_DATABASE."<br>".$product->_error);
            $this->setRedirect("index.php?option=com_jshopping&controller=products&task=edit&product_id=".$product->product_id);
            return 0;
        }
Радуемся результату.
« Последнее редактирование: 15.05.2012, 13:48:58 от Linfuby » Записан
SDKiller
Dev Team
******

Репутация: +325/-5
Offline Offline

Пол: Мужской
Сообщений: 2749


...ergo sum


« Ответ #9 : 15.05.2012, 13:54:17 »

Вообще в компоненте куча событий для плагинов.
Зачем хакать его?
Записан
anti4anti
Новичок
*

Репутация: +0/-0
Offline Offline

Пол: Мужской
Сообщений: 5


« Ответ #10 : 15.05.2012, 17:02:28 »

Linfuby, огромное спасибо)))
Записан
AndreyUA
Осваиваюсь на форуме
***

Репутация: +7/-0
Offline Offline

Сообщений: 61


« Ответ #11 : 15.05.2012, 17:22:02 »

Linfuby, спасибо! Работает как надо.
Записан
vic.blacksmith
Новичок
*

Репутация: +0/-0
Offline Offline

Сообщений: 8


« Ответ #12 : 18.05.2012, 20:25:57 »

Linfuby, большое спасибо за ценную доработку.
Записан
Sni10
Осваиваюсь на форуме
***

Репутация: +5/-0
Offline Offline

Пол: Мужской
Сообщений: 110


I am a law abiding citizen . . .


« Ответ #13 : 07.10.2012, 11:33:28 »

Linfuby, Спасибо большущее. 2 дня копошился в поиске. Надо бы внести в FAQ. Очень ценное решение. Особенно когда товаров под 10000
Записан
srg
Давно я тут
****

Репутация: +41/-1
Offline Offline

Сообщений: 212



« Ответ #14 : 07.10.2012, 12:22:41 »

Вообще в компоненте куча событий для плагинов.
Зачем хакать его?
Во, во, Вы же потом не обновите компонент...

Вот мой плагинчик по авто генерации кода товара. После установки заходим в плагин включаем его и вводим префикс несколько символов (ну сокращение по названию магазина, типа BigMart пусть bgm). Как формируется: авто генерация если не заполнено поле ean,  вид [префикс][id товара дополненное нулями до 6 символов], например id 175, тогда ean='bgm000175'  

[вложение удалено Администратором]
Записан
dmitry_stas
Профи
********

Репутация: +798/-4
Offline Offline

Сообщений: 7784



« Ответ #15 : 13.10.2012, 01:41:53 »

Вот мой плагинчик по авто генерации кода товара.
логичнее было бы сделать это не после сохранения товара, а до
Записан
avduevsky
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Пол: Мужской
Сообщений: 61


topall.com.ua


« Ответ #16 : 19.03.2013, 19:22:00 »

Во, во, Вы же потом не обновите компонент...

Вот мой плагинчик по авто генерации кода товара. После установки заходим в плагин включаем его и вводим префикс несколько символов (ну сокращение по названию магазина, типа BigMart пусть bgm). Как формируется: авто генерация если не заполнено поле ean,  вид [префикс][id товара дополненное нулями до 6 символов], например id 175, тогда ean='bgm000175' 

Прошу прощение за поднятие старой темы.
Но, нету ли у Вас решения для генерации кодов товаров в атрибутах?
Записан
Sni10
Осваиваюсь на форуме
***

Репутация: +5/-0
Offline Offline

Пол: Мужской
Сообщений: 110


I am a law abiding citizen . . .


« Ответ #17 : 03.07.2013, 17:17:50 »

Прошу прощение за поднятие старой темы.
Но, нету ли у Вас решения для генерации кодов товаров в атрибутах?

Да по сути логика построения конструкции аналогичная к родительскому коду товара. Наверно нужно тоже самое (с другими переменными наверно) прописать в файле придания кода атрибутам. Вероятно это файлы сдесь же в папке контроллеров - attributes.php или attributesvalues.php или еще где? Если бы разработчики подсказали где ковырять - дальше методом тыка можно и самому попробовать.
Записан
Sorrowful
Захожу иногда
**

Репутация: +0/-0
Offline Offline

Сообщений: 21


« Ответ #18 : 08.11.2013, 21:40:25 »

Здравствуйте уважаемые, подскажите пожалуйста как сделать следующее, чтобы при сохранении продукта его алиас формировался следующим образом: транслитерация названия продукта (то есть то что и происходит сейчас) и плюс добавить код продукта в конце, чтобы получилось вот так: product_name-ean.html
Зачем это все, возможно спросите Вы, дело в том, что в магазине есть много продуктов с одинаковыми названиями, и получается, что когда его сохраняешь, выдает ошибку что такой алиас уже существует.
Записан
Linfuby
Живу я здесь
******

Репутация: +165/-0
Offline Offline

Пол: Мужской
Сообщений: 1202


Всё просто...


« Ответ #19 : 08.11.2013, 22:57:37 »

Sorrowful, просто ради интереса, Какие названия совпадают? Шоколад?
Записан
Sorrowful
Захожу иногда
**

Репутация: +0/-0
Offline Offline

Сообщений: 21


« Ответ #20 : 09.11.2013, 01:12:19 »

нет)) Цвета красок для моделирования, в категории может быть несколько названий продукта например "Зеленый", несколько "Красный выцветший" и тому подобное. А код продукта у них разный.
Записан
dmitry_stas
Профи
********

Репутация: +798/-4
Offline Offline

Сообщений: 7784



« Ответ #21 : 09.11.2013, 10:49:56 »

за генерацию алиаса при сохранении товара отвечает строки ~517-527, в частности
Код:
if ($jshopConfig->create_alias_product_category_auto && $post['alias_'.$lang->language]=="") $post['alias_'.$lang->language] = $post['name_'.$lang->language];
в файле \administrator\components\com_jshopping\controllers\products.php
Записан
Sorrowful
Захожу иногда
**

Репутация: +0/-0
Offline Offline

Сообщений: 21


« Ответ #22 : 12.11.2013, 13:24:55 »

Парни, не выходит прописать алиас как надо, не понимаю я пока синтаксиса php.
Linfubyпредложил такой код в начале этой темы

Код:
if ($post['alias_'.$lang->language]!="" && !$_alias->checkExistAlias2Group($post['alias_'.$lang->language], $lang->language, $post['product_id'])){
                $post['alias_'.$lang->language] = "";
                JError::raiseWarning("", _JSHOP_ERROR_ALIAS_ALREADY_EXIST);
            }else{
            $post['alias_'.$lang->language] = "Тут писать любой Псевдоним, который применится если значение оставить пустым";
            }
Помогите написать строчку после оператора else, чтобы если такой алиас уже существует, тогда задать алиас следующего вида: alias-product_ean. То есть алиас и через дефис артикул продукта.
Если посчитаете нужным, сообщите сумму которую Вы хотите получить за помощь.
Спасибо.
Записан
Sorrowful
Захожу иногда
**

Репутация: +0/-0
Offline Offline

Сообщений: 21


« Ответ #23 : 12.11.2013, 13:37:46 »

Разобрался немного сам, правда не так как хотел, в общем изменил создалие алиаса на корню, а не через else

эту строчку
Код:
$post['alias_'.$lang->language] = JApplication::stringURLSafe($post['alias_'.$lang->language]);

заменил на
Код:
$post['alias_'.$lang->language] = JApplication::stringURLSafe($post['alias_'.$lang->language]."-".$post['product_ean']);

Если кому-то будет не лень, напишите правильный код через else, чтобы алиасы с артикулом на конце формировались лишь тогда, когда уже есть такой же без артикула
Записан
Linfuby
Живу я здесь
******

Репутация: +165/-0
Offline Offline

Пол: Мужской
Сообщений: 1202


Всё просто...


« Ответ #24 : 12.11.2013, 15:23:07 »

Если кому-то будет не лень, напишите правильный код через else, чтобы алиасы с артикулом на конце формировались лишь тогда, когда уже есть такой же без артикула
Наверное как-то так?
Код:
            $post['alias_'.$lang->language] = JApplication::stringURLSafe($post['alias_'.$lang->language]);
            if ($post['alias_'.$lang->language]!="" && !$_alias->checkExistAlias2Group($post['alias_'.$lang->language], $lang->language, $post['product_id'])){
                //Удалить эту строчку очищающую алиас
                $post['alias_'.$lang->language] = "";
                //Добавляем свое формирование алиаса, если такой алиас уже существует
                $post['alias_'.$lang->language] = JApplication::stringURLSafe($post['alias_'.$lang->language]."-".$post['product_ean']);
                //Сообщение о существовании такого псевдонима можно удалить.
                JError::raiseWarning("", _JSHOP_ERROR_ALIAS_ALREADY_EXIST);
            }
Записан
Sorrowful
Захожу иногда
**

Репутация: +0/-0
Offline Offline

Сообщений: 21


« Ответ #25 : 12.11.2013, 16:01:34 »

Linfuby, большое тебе спасибо.
Как говорится, мир не без добрых людей.
Плюсую в репутацию.

PS надо все же выучить основы php, обычное ведь было логическое условие, а не знаешь синтаксиса и думай как его написать.
Записан
alex1988
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 151


« Ответ #26 : 15.03.2014, 12:37:51 »

Добрый день.

Подскажите по генирации алиаса в товарах и категориях.
Генерируеться сейчас только от названия, а нужно добавить ещё и id товара, т.к. товаров много и есть с одинаковым названием.
Код:
Код:
<?php


defined( '_JEXEC' ) or die;

class plgJshoppingAdminGenerate_Alias extends JPlugin {

private function generateAlias($type) {
if (!isset($_POST['task']) || $_POST['task']!='generateAlias') {
return;
}
$app = JFactory::getApplication();
$cid = $app->input->get('cid', array(), 'array');
if (!count($cid)) {
$app->enqueueMessage(JText::_('JLIB_HTML_PLEASE_MAKE_A_SELECTION_FROM_THE_LIST'), 'error');
return;
}

if ($type == 'category') {
$table_name = '`#__jshopping_categories`';
} else if ($type == 'manufacturer') {
$table_name = '`#__jshopping_manufacturers`';
} else {
$table_name = '`#__jshopping_products`';
}
$select_id = $type.'_id';

$replace = $this->params->get('replace', 0);
$db = JFactory::getDBO();
$query = $db->getQuery(true)
->select('language')
->from('#__jshopping_languages')
->where('1');
$db->setQuery($query);
$allLanguage = $db->loadColumn();
if (!count($allLanguage)) {
$app->enqueueMessage(JText::_('PLG_JSHOPPINGADMIN_GENERATE_ALIAS_NO_LANGUAGE'), 'warning');
return;
}

$select = array();
foreach ($allLanguage as $language) {
$select[] = '`name_'.$language.'`';
$select[] = '`alias_'.$language.'`';
}
$query = $db->getQuery(true)
->select($select_id.' as id,'.implode(',', $select))
->from($table_name)
->where($select_id.' IN ('.implode(',', $cid).')');
$db->setQuery($query);
$elements = $db->loadObjectList();

if (!count($elements)) {
$app->enqueueMessage(JText::_('PLG_JSHOPPINGADMIN_GENERATE_ALIAS_NO_ELEMENTS'), 'warning');
return;
}

$query = 'CREATE TEMPORARY TABLE `jshopping_temp_table_for_generate_aliases` (id INT, '.implode(' VARCHAR(255),', $select).' VARCHAR(255), PRIMARY KEY (`id`)) DEFAULT CHARACTER SET utf8';
$db->setQuery($query);
$db->execute();

$insertValues = $updateValues = array();
$generated = 0;
foreach ($elements as $element) {
$insertValue = array();
$insertValue[] = $element->id;
foreach ($allLanguage as $language) {
$name = 'name_'.$language;
$alias = 'alias_'.$language;
$insertValue[] = $element->$name;
if ($element->$alias == '' || $replace) {
if ($element->$name != '') {
$insertValue[] = JApplication::stringURLSafe($element->$name);
$generated++;
} else {
$insertValue[] = '';
}
} else {
$insertValue[] = $element->$alias;
}
$updateValues[] = $table_name.'.'.'`'.$alias.'` = jshopping_temp_table_for_generate_aliases.`'.$alias.'`';
}
$insertValues[] = '("'.implode('","', $insertValue).'")';
}
$query = 'INSERT INTO jshopping_temp_table_for_generate_aliases VALUES '.implode(',', $insertValues);
$db->setQuery($query);
$db->execute();

$query = $db->getQuery(true)
->update($table_name.', jshopping_temp_table_for_generate_aliases')
->set($updateValues)
->where('jshopping_temp_table_for_generate_aliases.id = '.$table_name.'.'.$select_id);
$db->setQuery($query);
$result = $db->execute();

$app->enqueueMessage(JText::_('PLG_JSHOPPINGADMIN_GENERATE_ALIAS_UPDATE').$generated);
}

private function init($type) {
JFactory::getLanguage()->load('plg_jshoppingadmin_generate_alias', dirname(__FILE__));
JToolBarHelper::custom('generateAlias', 'refresh', 'refresh', JText::_('PLG_JSHOPPINGADMIN_GENERATE_ALIAS_BUTTON'), true);
$this->generateAlias($type);
}

function onBeforeDisplayListCategoryView(&$view) {
$this->init('category');
}

function onBeforeDisplayManufacturers(&$view) {
$this->init('manufacturer');
}

function onBeforeDisplayListProductsView(&$view) {
$this->init('product');
}

}
?>

Как я понимаю, вот тут идёт генирация от имени товара
Код:
$insertValue[] = JApplication::stringURLSafe($element->$name);
и как сюда добавить product_id
П.С. это расширения от невигена.
« Последнее редактирование: 15.03.2014, 12:49:58 от alex1988 » Записан
dmitry_stas
Профи
********

Репутация: +798/-4
Offline Offline

Сообщений: 7784



« Ответ #27 : 15.03.2014, 13:24:02 »

$element->$name.'-'.$element->id например
Записан
alex1988
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 151


« Ответ #28 : 15.03.2014, 13:31:02 »

блин....я всю ночь сидел мучался......и $element->$name.'-'.$element->product_id  делал, и кучу вариантов, а Ваш не пробовал.
Спасибо огромное, заработало.

Ну я так понимаю что ID в алиасе не портит картину с точки зрения SEO?
Записан
dmitry_stas
Профи
********

Репутация: +798/-4
Offline Offline

Сообщений: 7784



« Ответ #29 : 15.03.2014, 13:40:32 »

ну откуда ж там product_id, если
Цитировать
->select($select_id.' as id,'.implode(',', $select))

Ну я так понимаю что ID в алиасе не портит картину с точки зрения SEO?

думаю что нет. при апдейте наверное добавим настройку. либо в принципе можно в принудительном порядке при возникновении дубля.
Записан
Страниц: [1] 2 3  Все   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

Powered by SMF 1.1.21 | SMF © 2006, Simple Machines

Joomlaforum.ru is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla! name and logo is used under a limited license granted by Open Source Matters
the trademark holder in the United States and other countries.

LiveInternet