Foх Posted March 12, 2014 Report Share Posted March 12, 2014 Добрый день.Решил выложить изменение цен по категориям.Так как цены меняются,то есть нужда менять цены сразу у всей категории. В самой симпле такого к сожалению нету.Итак начнем: 1. Добавляем в БД поле с инфой об изменении цен.Запросы: ALTER TABLE `s_categories` ADD `cupon` TEXT NOT NULL; ALTER TABLE `s_categories` ADD `no_change` INT NOT NULL DEFAULT '0'; 2. Работаем с шаблоном админки. Файл /simpla/design/html/category.tplВнизу, после: <input class="button_green button_save" type="submit" name="" value="Сохранить" /> Вставляем <div style="padding-top:10px; clear:both;"></div> <div class="block layer"> <h2>Корректировка цен</h2> <ul> <li><label class=property>Прибавить к ценам: </label> <input name="plus" class="page_url" type="text" value="" /> </li> <li> <label class=property>Тип: </label> <select name="type"> <option value="1">рублей</option> <option value="2">процентов</option> </select> </li> <li> <label class=property>Вложенность: </label> <select name="type2"> <option value="1">не учитывать подкатегории</option> <option value="2" selected="selected">учитывать подкатегории</option> </select> </li> <li> <label class=property>Возврат к прежним значением:<br><span style="font-size:11px;">(работает только с процентами)</span> </label> <select name="type3"> <option value="1">Нет</option> <option value="2">Да</option> </select> </li> </ul> </div> {$category->cupon} <input class="button_green button_save" type="submit" name="" value="Обновить цены" /> 3. Добавляем в запрос к БД дополнительное поле. Файл /api/Catrgories.phpСтрока 187 (или где-то рядом).Ищем запрос: $query = $this->db->placehold("SELECT c.id, c.parent_id, c.name, c.description, c.url, c.meta_title, c.meta_keywords, c.meta_description, c.image, c.visible, c.position FROM __categories c ORDER BY c.parent_id, c.position"); и добавляем в него c.cupon,должно получиться : $query = $this->db->placehold("SELECT c.id, c.parent_id, c.name, c.cupon, c.description, c.url, c.meta_title, c.meta_keywords, c.meta_description, c.image, c.visible, c.position FROM __categories c ORDER BY c.parent_id, c.position"); 4. Добавляем функционал пакетного изменения цен. Файл /simpla/CategoryAdmin.phpПосле: if($this->request->method('post')) { Вставляем if((int)$_REQUEST['plus']!='' && (int)$_REQUEST['plus']!=0) { $euro=1; if($_REQUEST['type']==1) { $summ=(int)$_REQUEST['plus']/$euro; $summrub=(int)$_REQUEST['plus']; if($_REQUEST['type2']==1) { if($_REQUEST['type3']==1) { $txt="В последний раз цены менялись на ".$_REQUEST['plus']." рублей"; }else{ $txt="В последний раз цены были восстановлены"; } $query = "UPDATE __categories set cupon='".$txt."' WHERE id='".$_REQUEST['id']."' AND no_change!=1"; $this->db->query($query); $query = "SELECT * FROM __variants WHERE product_id IN (SELECT product_id FROM __products_categories WHERE category_id = '".$_REQUEST['id']." AND category_id IN (SELECT id from __categories WHERE no_change!=1)')"; $this->db->query($query); $pr=$this->db->results(); for($a=0;$a<count($pr);$a++) { $query = "UPDATE __variants set price=price+'".$summrub."' WHERE id='".$pr[$a]->id."'"; $this->db->query($query); } }else{ $this->categoriesp[]=$_REQUEST['id']; $this->prod_in_ctg($_REQUEST['id']); $products=Array(); for($a=0;$a<count($this->categoriesp);$a++) { if($_REQUEST['type3']==1) { $txt="В последний раз цены менялись на ".$_REQUEST['plus']." рублей"; }else{ $txt="В последний раз цены были восстановлены"; } $query = "UPDATE __categories set cupon='".$txt."' WHERE id='".$this->categoriesp[$a]."' AND no_change!=1"; $this->db->query($query); $query = "SELECT product_id FROM __products_categories WHERE category_id = '".$this->categoriesp[$a]."' AND category_id IN (SELECT id from __categories WHERE no_change!=1)"; $this->db->query($query); $pr=$this->db->results(); for($b=0;$b<count($pr);$b++) { $products[]=$pr[$b]->product_id; } } $query = "SELECT * FROM __variants WHERE product_id IN (".implode(",", $products).")"; $this->db->query($query); $pr=$this->db->results(); for($a=0;$a<count($pr);$a++) { $query = "UPDATE __variants set price=price+'".$summrub."' WHERE id='".$pr[$a]->id."'"; $this->db->query($query); } } }else{ if($_REQUEST['type2']==1) { if($_REQUEST['type3']==1) { $txt="В последний раз цены менялись на ".$_REQUEST['plus']." процентов"; }else{ $txt="В последний раз цены были восстановлены"; } $query = "UPDATE __categories set cupon='".$txt."' WHERE id='".$_REQUEST['id']."' AND no_change!=1"; $this->db->query($query); $query = "SELECT * FROM __variants WHERE product_id IN (SELECT product_id FROM __products_categories WHERE category_id = '".$_REQUEST['id']." AND category_id IN (SELECT id from __categories WHERE no_change!=1)')"; $this->db->query($query); $pr=$this->db->results(); for($a=0;$a<count($pr);$a++) { $price=0; if($_REQUEST['type3']==1) { $price=$pr[$a]->price+($pr[$a]->price*$_REQUEST['plus']/100); }else{ $price=$pr[$a]->price/(100-$_REQUEST['plus'])*100; } $query = "UPDATE __variants set price='".$price."' WHERE id='".$pr[$a]->id."'"; $this->db->query($query); } }else{ $this->categoriesp[]=$_REQUEST['id']; $this->prod_in_ctg($_REQUEST['id']); $products=Array(); for($a=0;$a<count($this->categoriesp);$a++) { if($_REQUEST['type3']==1) { $txt="В последний раз цены менялись на ".$_REQUEST['plus']." процентов"; }else{ $txt="В последний раз цены были восстановлены"; } $query = "UPDATE __categories set cupon='".$txt."' WHERE id='".$this->categoriesp[$a]."' AND no_change!=1"; $this->db->query($query); $query = "SELECT product_id FROM __products_categories WHERE category_id = '".$this->categoriesp[$a]."' AND category_id IN (SELECT id from __categories WHERE no_change!=1)"; $this->db->query($query); $pr=$this->db->results(); for($b=0;$b<count($pr);$b++) { $products[]=$pr[$b]->product_id; } } $query = "SELECT * FROM __variants WHERE product_id IN (".implode(",", $products).")"; $this->db->query($query); $pr=$this->db->results(); for($a=0;$a<count($pr);$a++) { $price=0; if($_REQUEST['type3']==1) { $price=$pr[$a]->price+($pr[$a]->price*$_REQUEST['plus']/100); }else{ $price=$pr[$a]->price/(100-$_REQUEST['plus'])*100; } $query = "UPDATE __variants set price='".$price."' WHERE id='".$pr[$a]->id."'"; $this->db->query($query); } } } } И все.Теперь в результате в категориях будет возможность менять цены сразу у всей категории на определенную сумму или процент.Также есть возможность возврата к предыдущей цене. Если у кого что не получится пишите.может что и упустил. Quote Link to post Share on other sites
Foх Posted March 13, 2014 Author Report Share Posted March 13, 2014 1. Для чего служит no_change? Таблице базы поле создается, по умолчанию значение у него 0. Нигде это поле НЕ ИЗМЕНЯЕТСЯ, то есть оно всегда равно 0. В коде в нескольких местах стоит условие no_change!=1, которое всегда true. 2. Вручную обрабатываются передаваемые скрипту параметры, хотя в Simpla есть удобный и надежный инструмент $this->request->get(), $this->request->post(). 3. prod_in_ctg() - видимо, Ваша собственная функция. Если так, то без ее определения у пользователей будет вылетать ошибка... 4. Довольно нерационально во многих местах как по сложности кода, так и по обращению к БД. Например, в блоке $query = "SELECT * FROM __variants WHERE product_id IN (SELECT product_id FROM __products_categories WHERE category_id = '".$_REQUEST['id']." AND category_id IN (SELECT id from __categories WHERE no_change!=1)')"; $this->db->query($query); $pr=$this->db->results(); for($a=0;$a<count($pr);$a++) { $query = "UPDATE __variants set price=price+'".$summrub."' WHERE id='".$pr[$a]->id."'"; $this->db->query($query); } делается запрос select *, хотя используется только одно поле id. В этом блоке меняется значение циклом по варианту. А можно было бы легко и просто вместо всего блока написать лишь ОДИН запрос. 5. В нескольких местах стоит: "менялись на ... рублей". А если магазин работает в гривнах и не знает никаких рублей? 6. Код очень длинный и повторяющийся. Явно можно было бы существенно сократить. 7. Восстановление цен - работает совсем неправильно, так как оно уменьшает текущую цену на тот же процент. А поскольку процент идет от новой цены, то результат совсем другой (см. материалы по математике средней школы). А восстановление цен при изменении на фиксированное количество рублей вообще отсутствует. И что будет, если сначала повысить на 20%, потом повысить на 30% и сделать подряд два возвращения прежних цен - о таком, видимо, лучше и не заикаться... Спасибо за замечания)будем допиливать.Если что буду обновлять. Quote Link to post Share on other sites
artbe Posted November 18, 2014 Report Share Posted November 18, 2014 На версии 2.3.6 при обновлении цен, появляется ошибка на 50 строке $this->prod_in_ctg($_REQUEST['id']); Fatal error: Call to undefined method CategoryAdmin::prod_in_ctg() in Y:\home\localhost\www\hot\simpla\CategoryAdmin.php on line 50 Quote Link to post Share on other sites
Kors Posted November 18, 2014 Report Share Posted November 18, 2014 Про это автору было сообщено ранее (п.3) более чем полгода тому назад. Исправить что-то он не спешит... Пакетное изменение ценhttp://simpla-tuning.com/products/paketnoe-izmenenie-tsen Quote Link to post Share on other sites
Gregar Posted November 19, 2014 Report Share Posted November 19, 2014 Про это автору было сообщено ранее (п.3) более чем полгода тому назад. Исправить что-то он не спешит... Пакетное изменение ценhttp://simpla-tuning.com/products/paketnoe-izmenenie-tsen Дорогое и не совсем рабочее дополнение. Если мы меняем на 30% (или на любой другой процент) категорию "мобильные телефоны", у нас все меняется, но если хотем уменьшить получаем ошибку.. Quote Link to post Share on other sites
artbe Posted November 20, 2014 Report Share Posted November 20, 2014 Убедительная просьба, выложить функцию prod_in_ctg() Quote Link to post Share on other sites
Kors Posted November 20, 2014 Report Share Posted November 20, 2014 Дорогое и не совсем рабочее дополнение. Если мы меняем на 30% (или на любой другой процент) категорию "мобильные телефоны", у нас все меняется, но если хотем уменьшить получаем ошибку.. На демо такой ошибки не наблюдаю.Если можете точно описать, какая ошибка и при каких действиях выходит на демо, проверю. Или обращайтесь в личку... Quote Link to post Share on other sites
Родослав Posted November 22, 2014 Report Share Posted November 22, 2014 не могу установить себе это на сайт может кто помочь? Quote Link to post Share on other sites
question Posted April 10, 2019 Report Share Posted April 10, 2019 Я так меняю UPDATE n_variants, n_products, n_categories, n_products_categories SET n_variants.compare_price = round (n_variants.price * 0.85 ,2) WHERE n_variants.product_id = n_products.id AND n_products.id = n_products_categories.product_id AND n_products_categories.category_id IN (84, 112, 180, 195, 206, 279, 1796, 1797, 1798, 1799, 1800); Quote Link to post Share on other sites
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.