Jump to content

Индивидуальные URL при добавлении товара.


Recommended Posts

Всем привет!

 

Столкнулся с проблемой. Много товаров с одним названием. Есть ли решение как подставлять в url товара _id?

 

Пробовал через product.tpl при создании подставляет, а при обновлении подставляет снова. итог tovar_2_2 и так далее до бесконечности.

Link to post
Share on other sites

в api/Products.php в функции add_product есть код 

 

// Если есть товар с таким URL, добавляем к нему число
        while($this->get_product((string)$product['url']))
        {
            if(preg_match('/(.+)_([0-9]+)$/', $product['url'], $parts))
                $product['url'] = $parts[1].'_'.($parts[2]+1);
            else
                $product['url'] = $product['url'].'_2';
        }

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

Link to post
Share on other sites

 

в api/Products.php в функции add_product есть код 

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

 

ну добавьте вы $product['id'] к примеру

Link to post
Share on other sites

ну добавьте вы $product['id'] к примеру

не совсем понял. выводит сообщение, что товар с этим адресом уже есть. я так понимаю, что до исполнения этой функции дело просто не доходит. ошибаюсь? можно подробнее, что вы имеете ввиду?

Link to post
Share on other sites

Хочется, чтобы товар открывался по id, например, site.ru/index.php?module=ProductView&id=894

 

1. Нужно в настройках сервера заменить  product_url на id в строке /index.php?module=ProductView.....

2. В /view/ProductView заменить:

 

$product_url = $this->request->get('product_url', 'string');

  на 

 $product_id = $this->request->get('id', 'integer');

 

3. В этом же файле:

 

$product = $this->products->get_product((string)$product_url);

на

$product = $this->products->get_product((int)$product_id);

 

 

После этого товар должен открыться по пути: /products/{id}

 

Ну и во всех местах, где в шаблоне и админке  url подставляется нужно заменить на id

Edited by Maksclub
Link to post
Share on other sites

Для того чтоб срабатывал код

 

// Если есть товар с таким URL, добавляем к нему число
        while($this->get_product((string)$product['url']))
        {
            if(preg_match('/(.+)_([0-9]+)$/', $product['url'], $parts))
                $product['url'] = $parts[1].'_'.($parts[2]+1);
            else
                $product['url'] = $product['url'].'_2';
        }

 

           
Нужно в ProductAdmin.php закоментировать код который выводит сообщение об ошибке
 

 

 // Не допустить одинаковые URL разделов.
            //elseif(($p = $this->products->get_product($product->url)) && $p->id!=$product->id)
            //{            
            //$this->design->assign('message_error', 'url_exists');
            //if(!empty($product->id))
            //    $images = $this->products->get_images(array('product_id'=>$product->id));
            //}

 

Link to post
Share on other sites

Шикарное решение, но мне хотелось бы без правки базы

 

То же самое можно получить если  в api/Products.php в функции add_product после (или вместо)

 

        if(empty($product['url']))

        {

...............

        }

 

вставить

 

        if(empty($product['url']))

        {

            $product['url'] = $product['id'];

        }

 

 

Аналогично в функции update_product.

Link to post
Share on other sites
  • 6 years later...
В 25.03.2018 в 09:19, phukortsin сказал:

 

То же самое можно получить если  в api/Products.php в функции add_product после (или вместо)

 

        if(empty($product['url']))

        {

...............

        }

 

вставить

 

        if(empty($product['url']))

        {

            $product['url'] = $product['id'];

        }

 

 

Аналогично в функции update_product.

Не работает. а в update_product вообще нет "аналогичного".

И к тому же, чтобы в url был ID, нужно в ProductAdmin.php:

заменить $product->url = trim($this->request->post('url', 'string'));

на $product->url = $this->request->post('id', 'integer');

НО даже и тогда код:

        if(empty($product['url']))

        {

            $product['url'] = $product['id'];

        }
не видит ID товара и ставит его как 0 и делает УРЛ 0_1, 0_2, 0_3....

Edited by get31
Link to post
Share on other sites
6 часов назад, get31 сказал:

Не работает. а в update_product вообще нет "аналогичного".

И к тому же, чтобы в url был ID, нужно в ProductAdmin.php:

заменить $product->url = trim($this->request->post('url', 'string'));

на $product->url = $this->request->post('id', 'integer');

НО даже и тогда код:

        if(empty($product['url']))

        {

            $product['url'] = $product['id'];

        }
не видит ID товара и ставит его как 0 и делает УРЛ 0_1, 0_2, 0_3....

Получение ID нового товара происходит на строке                         $id = $this->db->insert_id();

после нее идет присваивания позиции товара как ее id путем update. 
по аналогии можно сделать update у товара url как id

Link to post
Share on other sites

А вообще, зачем ID товара впихивать в url товара, когда проще генерировать от времени хеш md5 

будет так:

supersite.com/products/e47d1ce09eeea6783300addf49551aeeb

или урезать до 10 знаков 

supersite.com/products/e47d1ce09e

Link to post
Share on other sites

Тогда на форте будет выводить товар и по его id по его url

1. supersite.com/products/1234

2. supersite.com/products/e47d1ce09e


будет один товар 

Link to post
Share on other sites
17 часов назад, alexivchenko сказал:

supersite.com/products/e47d1ce09eeea6783300addf49551aeeb

Да, можно так, но при каждом сохранении будет меняться урл

$product->url = uniqid('') . substr(md5(time()), 0, 10);

а смена урла тоже плохо

Link to post
Share on other sites
23 часа назад, get31 сказал:

Да, можно так, но при каждом сохранении будет меняться урл

$product->url = uniqid('') . substr(md5(time()), 0, 10);

а смена урла тоже плохо

вью трогать не нужно, выше код для api/Products.php раздел add_product. 

url нужно создавать только в момент добавления товара, то есть в модели, а во вью нужно его только выводить. В случае, если нужно для товара задать уникальный url в модели есть проверка, если url пустой задать уникальный url, а если мы задали свой, то его и присвоить. 

Edited by alexivchenko
Link to post
Share on other sites
  • 2 months later...
В 18.07.2024 в 19:49, sergeevizh сказал:

Ну или на край сделать добавление Id товара к url 

supersite.com/products/1234-kakoito-tovar

А как привести все новые товары, категории и бренды к url типа url и id через тире, ну то есть

simplacms.ru/products/samsung-s7070-diva-17

simplacms.ru/catalog/bytovaya-tehnika-2

simplacms.ru/brands/apple-1

Хочу чтобы товар был доступен и по url и по id

Цитата

 

simplacms.ru/products/samsung-s7070-diva-17

simplacms.ru/products/17

 

Цитата

 

simplacms.ru/catalog/bytovaya-tehnika-2

simplacms.ru/catalog/2

 

Цитата

 

simplacms.ru/brands/apple-1

simplacms.ru/brands/1

 

И что бы при переходе по ид товара, категории или бренда перекидывала на урл.
 

сделал так и в htaccess прописал вместо 

RewriteRule ^products/([^/]+)/?$    index.php?module=ProductView&product_url=$1 [L,QSA]

это

RewriteRule ^products/(.*)-([0-9]+)$ index.php?module=ProductView&product_url=$1&product_id=$2 [L,QSA]

а дальше то что? подскажите

Link to post
Share on other sites
В 14.10.2024 в 15:47, fuckmoney сказал:

Хочу чтобы товар был доступен и по url и по id

И что бы при переходе по ид товара, категории или бренда перекидывала на урл.

Совсем просто такое вряд ли получится. Надо дорабатывать распознавание адресов. Если готовы оплачивать,обращайтесь в личку...

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...