Des Опубликовано 29 августа, 2015 Жалоба Поделиться Опубликовано 29 августа, 2015 Здравствуйте! Когда я задавал вопрос в другой теме, хочу продублировать, вдруг кто посоветует нормальное решение. При залитии в Симплу товаров с одинаковыми названиями для них генерируется одинаковые урл, из-за это товары могут не корректно отображаться на сайте. Например если у нас есть активный товар с урлом /products/tovar и другой неактивный и урлом /products/tovar, периодически они могут замещать друг друга.т.е. При нажатии на товар в категории будет писать что товар не найден, то тех пор, пока не изменишь урл неактивного товара на /products/tovar_1. Вопрос, возможно есть решение для автоматической генерации урлов типу /products/tovar_1, /products/tovar_2, /products/tovar_3 во время импорта? Цитата Ссылка на сообщение Поделиться на другие сайты
mishanya Опубликовано 29 августа, 2015 Жалоба Поделиться Опубликовано 29 августа, 2015 Здравствуйте! Когда я задавал вопрос в другой теме, хочу продублировать, вдруг кто посоветует нормальное решение. При залитии в Симплу товаров с одинаковыми названиями для них генерируется одинаковые урл, из-за это товары могут не корректно отображаться на сайте. Например если у нас есть активный товар с урлом /products/tovar и другой неактивный и урлом /products/tovar, периодически они могут замещать друг друга.т.е. При нажатии на товар в категории будет писать что товар не найден, то тех пор, пока не изменишь урл неактивного товара на /products/tovar_1. Вопрос, возможно есть решение для автоматической генерации урлов типу /products/tovar_1, /products/tovar_2, /products/tovar_3 во время импорта? нужно в simpla/ajax/import.php, в районе строки 150 где if(!empty($item['url'])) $product['url'] = trim($item['url']); elseif(!empty($item['name'])) $product['url'] = $this->translit($item['name']); добавить проверку на то существует ли уже такой адрес. но при этом время импорта увеличиться, т.к. для каждого товара добавиться еще один запрос. Цитата Ссылка на сообщение Поделиться на другие сайты
Des Опубликовано 29 августа, 2015 Автор Жалоба Поделиться Опубликовано 29 августа, 2015 нужно в simpla/ajax/import.php, в районе строки 150 где if(!empty($item['url'])) $product['url'] = trim($item['url']); elseif(!empty($item['name'])) $product['url'] = $this->translit($item['name']); добавить проверку на то существует ли уже такой адрес. но при этом время импорта увеличиться, т.к. для каждого товара добавиться еще один запрос.У меня есть данная проверка в файле импорта и если я не ошибаюсь, она просто проверяет чтоб был не пустой урл, а в противном случае генерирует его и переводит. Цитата Ссылка на сообщение Поделиться на другие сайты
mishanya Опубликовано 29 августа, 2015 Жалоба Поделиться Опубликовано 29 августа, 2015 У меня есть данная проверка в файле импорта и если я не ошибаюсь, она просто проверяет чтоб был не пустой урл, а в противном случае генерирует его и переводит. ну так правильно, я написал что к этому коду нужно добавить еще проверку есть ли такой юрл или нет Цитата Ссылка на сообщение Поделиться на другие сайты
Des Опубликовано 29 августа, 2015 Автор Жалоба Поделиться Опубликовано 29 августа, 2015 ну так правильно, я написал что к этому коду нужно добавить еще проверку есть ли такой юрл или нетЯ подумал что то проверка) Я знаю что её туда нужно добавить, по этому и спрашиваю) Цитата Ссылка на сообщение Поделиться на другие сайты
mishanya Опубликовано 29 августа, 2015 Жалоба Поделиться Опубликовано 29 августа, 2015 Я подумал что то проверка) Я знаю что её туда нужно добавить, по этому и спрашиваю) так если знаете, в чем проблема? с кодом помочь? Цитата Ссылка на сообщение Поделиться на другие сайты
Des Опубликовано 29 августа, 2015 Автор Жалоба Поделиться Опубликовано 29 августа, 2015 Я не программист, думал может есть решение от создателя, но просто не могу найти. Цитата Ссылка на сообщение Поделиться на другие сайты
mishanya Опубликовано 29 августа, 2015 Жалоба Поделиться Опубликовано 29 августа, 2015 (изменено) замените код что выше (150я строка), на if(!empty($item['url'])) $product['url'] = trim($item['url']); elseif(!empty($item['name'])) $product['url'] = $this->translit($item['name']); // выберем все товары из базы и проверим есть ли уже такой юрл $this->db->query('SELECT count(*) as count FROM __products WHERE url=?', $product['url']); $url_exists = $this->db->result('count'); и дальше в этом же файле строкм 248 заменить if(empty($product_id)) $product_id = $this->products->add_product($product); на if(empty($product_id)) { $product_id = $this->products->add_product($product); if($url_exists) $this->products->update_product($product_id, array('url'=>$product['url'].$product_id)); } Изменено 29 августа, 2015 пользователем mishanya Цитата Ссылка на сообщение Поделиться на другие сайты
Des Опубликовано 29 августа, 2015 Автор Жалоба Поделиться Опубликовано 29 августа, 2015 Огромное спасибо, сейчас попробуем!)) Цитата Ссылка на сообщение Поделиться на другие сайты
Des Опубликовано 29 августа, 2015 Автор Жалоба Поделиться Опубликовано 29 августа, 2015 А можно еще вопросик? $url_exists = $this->db->result('count'); Тут вы подсчитываете количество таких адресов, верно? А тут вы в конце добавляете id товара в конце урл? $this->products->update_product($product_id, array('url'=>$product['url'].$product_id)); Можно как-то вместо id товара добавлять количество урлов +1? Хотя это нужно будет проверять до тех пор, пока не останется не одного урла типу /products/tovar_1, /products/tovar_2, /products/tovar_3.Может лучше посчитать количество товаров с одинаковым названием и к тому количеству делать +1? Цитата Ссылка на сообщение Поделиться на другие сайты
Des Опубликовано 29 августа, 2015 Автор Жалоба Поделиться Опубликовано 29 августа, 2015 замените код что выше (150я строка), на if(!empty($item['url'])) $product['url'] = trim($item['url']); elseif(!empty($item['name'])) $product['url'] = $this->translit($item['name']); // выберем все товары из базы и проверим есть ли уже такой юрл $this->db->query('SELECT count(*) as count FROM __products WHERE url=?', $product['url']); $url_exists = $this->db->result('count'); и дальше в этом же файле строкм 248 заменить if(empty($product_id)) $product_id = $this->products->add_product($product); на if(empty($product_id)) { $product_id = $this->products->add_product($product); if($url_exists) $this->products->update_product($product_id, array('url'=>$product['url'].$product_id)); } Я так понимаю, нужно изменить так: // выберем все товары из базы и проверим есть ли уже такой юрл $this->db->query('SELECT count(*) as count FROM __products WHERE name=?', $product['name']); $url_exists = $this->db->result('count'); и там что-то типу такого if($url_exists) $this->products->update_product($product_id, array('url'=>$product['url'].$url_exists)); } Но это чисто предположения и мне кажется, что лучше их даже не пробовать)) Цитата Ссылка на сообщение Поделиться на другие сайты
mishanya Опубликовано 29 августа, 2015 Жалоба Поделиться Опубликовано 29 августа, 2015 нет. я же написал. нужно if(!empty($item['url'])) $product['url'] = trim($item['url']); elseif(!empty($item['name'])) $product['url'] = $this->translit($item['name']); заменить на if(!empty($item['url'])) $product['url'] = trim($item['url']); elseif(!empty($item['name'])) $product['url'] = $this->translit($item['name']); // выберем все товары из базы и проверим есть ли уже такой юрл $this->db->query('SELECT count(*) as count FROM __products WHERE url=?', $product['url']); $url_exists = $this->db->result('count'); и дальше заменить if(empty($product_id)) $product_id = $this->products->add_product($product); на if(empty($product_id)) { $product_id = $this->products->add_product($product); if($url_exists) $this->products->update_product($product_id, array('url'=>$product['url'].$product_id)); } не нужно придумывать ничего. как написано так и менять Цитата Ссылка на сообщение Поделиться на другие сайты
mishanya Опубликовано 29 августа, 2015 Жалоба Поделиться Опубликовано 29 августа, 2015 в первом случае нужно просто добавить две строки, во втором - добавить еще и фигурные скобки условия, кроме того что вы написали, поэтому просто лучше замените на то что написал. Цитата Ссылка на сообщение Поделиться на другие сайты
Des Опубликовано 29 августа, 2015 Автор Жалоба Поделиться Опубликовано 29 августа, 2015 в первом случае нужно просто добавить две строки, во втором - добавить еще и фигурные скобки условия, кроме того что вы написали, поэтому просто лучше замените на то что написал.Это я понял и даже попробовал, просто урл длинный получается, а чем короче, тем лучше, вот и спросил. Я просто вставил кусочки, кода где делал изменения. Вот полный вариант моей теории)) if(!empty($item['url'])) $product['url'] = trim($item['url']); elseif(!empty($item['name'])) $product['url'] = $this->translit($item['name']); // выберем все товары из базы и проверим есть ли уже такой юрл $this->db->query('SELECT count(*) as count FROM __products WHERE name=?', $product['name']); $url_exists = $this->db->result('count'); и второй кусок if(empty($product_id)) { $product_id = $this->products->add_product($product); if($url_exists) $this->products->update_product($product_id, array('url'=>$product['url'].$url_exists)); } Цитата Ссылка на сообщение Поделиться на другие сайты
Kors Опубликовано 29 августа, 2015 Жалоба Поделиться Опубликовано 29 августа, 2015 Все предложенные решения имеют следующие недостатки:1. Они относительно хорошо выполняют свою работу только при СОЗДАНИИ товара. Если же товар обновляется, то URL формируется по-старому, без изменений.ТО есть если Вы хотите исправить URL-ы, делаете экспорт, а потом импорт полученного файла в расчете на исправление URL-ов, то ничего не выйдет. Надо предварительно удалять товары, а это может породить массу других проблем. 2. Сама проверка проводится недостаточно хорошо. Проверяется, есть ли уже такой URL, и если есть, то проводится модификация. Но и модифицированный URL уже может существовать и тогда надо модифицировать иначе - это автор метода упускает. А вообще - предложенный метод - изобретение своего велосипеда. Готовый код для модификации URL-а есть в стандартном API в функции add_product($product)... Цитата Ссылка на сообщение Поделиться на другие сайты
mishanya Опубликовано 29 августа, 2015 Жалоба Поделиться Опубликовано 29 августа, 2015 Все предложенные решения имеют следующие недостатки:1. Они относительно хорошо выполняют свою работу только при СОЗДАНИИ товара. Если же товар обновляется, то URL формируется по-старому, без изменений.ТО есть если Вы хотите исправить URL-ы, делаете экспорт, а потом импорт полученного файла в расчете на исправление URL-ов, то ничего не выйдет. Надо предварительно удалять товары, а это может породить массу других проблем. 2. Сама проверка проводится недостаточно хорошо. Проверяется, есть ли уже такой URL, и если есть, то проводится модификация. Но и модифицированный URL уже может существовать и тогда надо модифицировать иначе - это автор метода упускает. А вообще - предложенный метод - изобретение своего велосипеда. Готовый код для модификации URL-а есть в стандартном API в функции add_product($product)... если бы вы внимательно смотрели, то увидили бы, что по барабану есть ли уже модифицированный URL, к товару добавляется его айди, что значит что двух таких товаров быть не может. Цитата Ссылка на сообщение Поделиться на другие сайты
mishanya Опубликовано 29 августа, 2015 Жалоба Поделиться Опубликовано 29 августа, 2015 (изменено) А вообще - предложенный метод - изобретение своего велосипеда. Готовый код для модификации URL-а есть в стандартном API в функции add_product($product)... есть и он должен работать и при импорте, видимо у автора он не работает. на счет обновления товара можно также дописать проверку на юрл как это работает в админке по дефолту. а на счет породить массу других проблем, это ваше личное опасение, у вас тут каждый метод порождает чуть-ли не апокалипсис. Изменено 29 августа, 2015 пользователем mishanya Цитата Ссылка на сообщение Поделиться на другие сайты
Des Опубликовано 29 августа, 2015 Автор Жалоба Поделиться Опубликовано 29 августа, 2015 Все предложенные решения имеют следующие недостатки:1. Они относительно хорошо выполняют свою работу только при СОЗДАНИИ товара. Если же товар обновляется, то URL формируется по-старому, без изменений.ТО есть если Вы хотите исправить URL-ы, делаете экспорт, а потом импорт полученного файла в расчете на исправление URL-ов, то ничего не выйдет. Надо предварительно удалять товары, а это может породить массу других проблем. 2. Сама проверка проводится недостаточно хорошо. Проверяется, есть ли уже такой URL, и если есть, то проводится модификация. Но и модифицированный URL уже может существовать и тогда надо модифицировать иначе - это автор метода упускает. А вообще - предложенный метод - изобретение своего велосипеда. Готовый код для модификации URL-а есть в стандартном API в функции add_product($product)...Мне кажется наоборот хорошо, что данный метод не трогает уже добавленные товары, для поисковых систем это было бы не хорошо, хотя если трогать только неактивные позиции, тогда нормально. А как вам вариант если просто считать количество товаров с одинаковым названием и это ко-лово + 1 добавлять к урлу? Цитата Ссылка на сообщение Поделиться на другие сайты
Kors Опубликовано 29 августа, 2015 Жалоба Поделиться Опубликовано 29 августа, 2015 значит что двух таких товаров быть не может. А это вывод совсем НЕ правильный.Надеюсь, сами сообразите, почему. Цитата Ссылка на сообщение Поделиться на другие сайты
mishanya Опубликовано 29 августа, 2015 Жалоба Поделиться Опубликовано 29 августа, 2015 Мне кажется наоборот хорошо, что данный метод не трогает уже добавленные товары, для поисковых систем это было бы не хорошо, хотя если трогать только неактивные позиции, тогда нормально. А как вам вариант если просто считать количество товаров с одинаковым названием и это ко-лово + 1 добавлять к урлу? проблема в том, что если вы потом удалите один такой товар, и захотите добавить новый, получиться проблема. количество товара изначально было - 2 с одинаковым названием, теперь один удалили, - количество стало 1. в моем же варианте, айди товара всегда уникален. Цитата Ссылка на сообщение Поделиться на другие сайты
mishanya Опубликовано 29 августа, 2015 Жалоба Поделиться Опубликовано 29 августа, 2015 А это вывод совсем НЕ правильный.Надеюсь, сами сообразите, почему. нет не соображу. может подскажите. или хотите сказать что айди товара это не уникальный ключ? Цитата Ссылка на сообщение Поделиться на другие сайты
Kors Опубликовано 29 августа, 2015 Жалоба Поделиться Опубликовано 29 августа, 2015 А как вам вариант если просто считать количество товаров с одинаковым названием и это ко-лово + 1 добавлять к урлу?Ну подумайте сами. Допустим у Вас есть 20 товаров с именем Сумка. Вы посчитали к-во 20. Добавили единицу. А потом всем 20 товарам сделали URL sumka21. Шило на мыло? Цитата Ссылка на сообщение Поделиться на другие сайты
Kors Опубликовано 29 августа, 2015 Жалоба Поделиться Опубликовано 29 августа, 2015 нет не соображу. может подскажите. или хотите сказать что айди товара это не уникальный ключ?Допустим, есть 1. товар с URL nokia400. 2. у таблицы товаров текущий autoincrement = 400 3. Добавляется НОВЫЙ товар nokia 4. В результате работы Вашего метода благополучно возникнут два разных товара с URL nokia400... Цитата Ссылка на сообщение Поделиться на другие сайты
mishanya Опубликовано 29 августа, 2015 Жалоба Поделиться Опубликовано 29 августа, 2015 Допустим, есть1. товар с URL nokia400.2. у таблицы товаров текущий autoincrement = 4003. Добавляется НОВЫЙ товар nokia4. В результате работы Вашего метода благополучно возникнут два разных товара с URL nokia400... вероятность такого не большая, я бы сказал минимальная, но может быть да. в этом случае можно делать повторную проверку как в add_product. Цитата Ссылка на сообщение Поделиться на другие сайты
Kors Опубликовано 29 августа, 2015 Жалоба Поделиться Опубликовано 29 августа, 2015 есть и он должен работать и при импорте, видимо у автора он не работает.Так, может, надо выяснить и поправить? Или хотя бы автору про это намекнуть. Зачем изобретать новые методы-велосипеды с новыми ошибками? Цитата Ссылка на сообщение Поделиться на другие сайты
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.