Основной курс по Joomla
0 Пользователей и 1 Гость просматривают эту тему.
  • 86 Ответов
  • 6042 Просмотров
*

AndreyUA

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

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

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

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

Спасибо!
*

Linfuby

  • Живу я здесь
  • ******
  • 1240
  • 174
  • Всё просто...
\administrator\components\com_jshopping\controllers\products.php
Функция save.
Если не ошибаюсь то в строках 471-482 как раз и идет сохранение псевдонима
Немного воображения и логики, и любая проблема становится решенной.
Кривые решения - дают кривой результат!
Решения для JoomShopping
Благодарности и поддержка принимаются по след. реквизитам:
Яндекс.Деньги - 41001751720054
*

anti4anti

  • Новичок
  • *
  • 5
  • 0
Тоже мучаюсь с этой затеей, пока глухо.
*

Linfuby

  • Живу я здесь
  • ******
  • 1240
  • 174
  • Всё просто...
Тоже мучаюсь с этой затеей, пока глухо.
А в чем загвоздка-то?
Я же написал где искать.
Код
            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] = "Тут писать любой Псевдоним, который применится если значение оставить пустым";
            }
Немного воображения и логики, и любая проблема становится решенной.
Кривые решения - дают кривой результат!
Решения для JoomShopping
Благодарности и поддержка принимаются по след. реквизитам:
Яндекс.Деньги - 41001751720054
*

AndreyUA

  • Осваиваюсь на форуме
  • ***
  • 61
  • 7
anti4anti, у меня пока тоже не получается.
Linfuby, "алиас" не есть "код товара". Это не те строки.

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

anti4anti

  • Новичок
  • *
  • 5
  • 0
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

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

anti4anti

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

Linfuby

  • Живу я здесь
  • ******
  • 1240
  • 174
  • Всё просто...
Linfuby, "алиас" не есть "код товара". Это не те строки.
Виноват... Невнимателен...
Если НЕ пусто - сохранить товар с введёным кодом товара.
Если пусто - сгенерировать автоматически код такого содержания: M[id производителя]P[id товара].
Как там!? Немного воображения и логики? :)
\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, 15:48:58 от Linfuby »
Немного воображения и логики, и любая проблема становится решенной.
Кривые решения - дают кривой результат!
Решения для JoomShopping
Благодарности и поддержка принимаются по след. реквизитам:
Яндекс.Деньги - 41001751720054
*

SDKiller

  • Dev Team
  • ******
  • 2734
  • 320
  • ...ergo sum
Вообще в компоненте куча событий для плагинов.
Зачем хакать его?
*

anti4anti

  • Новичок
  • *
  • 5
  • 0
Linfuby, огромное спасибо)))
*

AndreyUA

  • Осваиваюсь на форуме
  • ***
  • 61
  • 7
Linfuby, спасибо! Работает как надо.
*

vic.blacksmith

  • Новичок
  • *
  • 8
  • 0
Linfuby, большое спасибо за ценную доработку.
*

Sni10

  • Осваиваюсь на форуме
  • ***
  • 110
  • 5
  • I am a law abiding citizen . . .
Linfuby, Спасибо большущее. 2 дня копошился в поиске. Надо бы внести в FAQ. Очень ценное решение. Особенно когда товаров под 10000
*

srg

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

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

[вложение удалено Администратором]
*

dmitry_stas

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

avduevsky

  • Осваиваюсь на форуме
  • ***
  • 61
  • 0
  • topall.com.ua
Во, во, Вы же потом не обновите компонент...

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

Прошу прощение за поднятие старой темы.
Но, нету ли у Вас решения для генерации кодов товаров в атрибутах?
xxx: о! а селерон то в этом ноуте 64-битный!
ууу: это типа "О! А г0вно то с орехами!"
*

Sni10

  • Осваиваюсь на форуме
  • ***
  • 110
  • 5
  • I am a law abiding citizen . . .
Прошу прощение за поднятие старой темы.
Но, нету ли у Вас решения для генерации кодов товаров в атрибутах?

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

Sorrowful

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

Linfuby

  • Живу я здесь
  • ******
  • 1240
  • 174
  • Всё просто...
Sorrowful, просто ради интереса, Какие названия совпадают? Шоколад?
Немного воображения и логики, и любая проблема становится решенной.
Кривые решения - дают кривой результат!
Решения для JoomShopping
Благодарности и поддержка принимаются по след. реквизитам:
Яндекс.Деньги - 41001751720054
*

Sorrowful

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

dmitry_stas

  • Профи
  • ********
  • 9676
  • 932
за генерацию алиаса при сохранении товара отвечает строки ~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

  • Захожу иногда
  • **
  • 21
  • 0
Парни, не выходит прописать алиас как надо, не понимаю я пока синтаксиса 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

  • Захожу иногда
  • **
  • 21
  • 0
Разобрался немного сам, правда не так как хотел, в общем изменил создалие алиаса на корню, а не через 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

  • Живу я здесь
  • ******
  • 1240
  • 174
  • Всё просто...
Если кому-то будет не лень, напишите правильный код через 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);
            }
Немного воображения и логики, и любая проблема становится решенной.
Кривые решения - дают кривой результат!
Решения для JoomShopping
Благодарности и поддержка принимаются по след. реквизитам:
Яндекс.Деньги - 41001751720054
*

Sorrowful

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

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

alex1988

  • Осваиваюсь на форуме
  • ***
  • 150
  • 0
Добрый день.

Подскажите по генирации алиаса в товарах и категориях.
Генерируеться сейчас только от названия, а нужно добавить ещё и 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, 14:49:58 от alex1988 »
*

dmitry_stas

  • Профи
  • ********
  • 9676
  • 932
$element->$name.'-'.$element->id например
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

alex1988

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

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

dmitry_stas

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

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

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