Caracal Posted August 28, 2012 Share Posted August 28, 2012 (edited) Добрый день. Есть необходимость скрывать недоступные опции... Допустим, куртка черного цвета есть в размерах 48, 50, 52, а куртка белого цвета в размерах 50 и 52 Стандартно в престе получается так: Цвет - черный - белый Размер - 48 - 50 - 52 Как скрыть при выборе белого цвета недоступный 48 размер? Знаю, что это умеют модули: Attribute Order http://www.presto-ch...bute-order.html и Attribute Wizard http://www.presto-ch...ute-wizard.html Attribute Wizard PRO http://www.presto-ch...wizard-pro.html этого не умеет Какие решения могут быть без установки каких-либо модулей? И у кого есть Attribute Order или Attribute Wizard?? Могу предложить обмен на Attribute Wizard PRO... так сказать для ознакомления в учебных целях и обязательного последующего удаления, дабы права разработчиков не нарушать Edited August 28, 2012 by Caracal (see edit history) Link to comment Share on other sites More sharing options...
Ronaldo Perez Posted August 28, 2012 Share Posted August 28, 2012 мм, навскидку Настройки - Продукты - Display unavailable product attributes on product page: насколько я помню в коде именно так все решается. Модуль если чо шли по адресу - Москва, Шаболовка 37, тёте Тане )) Link to comment Share on other sites More sharing options...
Caracal Posted August 28, 2012 Author Share Posted August 28, 2012 мм, навскидку Настройки - Продукты - Display unavailable product attributes on product page: оно не работает... Link to comment Share on other sites More sharing options...
pvi1 Posted November 27, 2012 Share Posted November 27, 2012 Добрый день. Есть необходимость скрывать недоступные опции... Допустим, куртка черного цвета есть в размерах 48, 50, 52, а куртка белого цвета в размерах 50 и 52 Стандартно в престе получается так: Цвет - черный - белый Размер - 48 - 50 - 52 Как скрыть при выборе белого цвета недоступный 48 размер? Знаю, что это умеют модули: Attribute Order http://www.presto-ch...bute-order.html и Attribute Wizard http://www.presto-ch...ute-wizard.html Attribute Wizard PRO http://www.presto-ch...wizard-pro.html этого не умеет Какие решения могут быть без установки каких-либо модулей? И у кого есть Attribute Order или Attribute Wizard?? Могу предложить обмен на Attribute Wizard PRO... так сказать для ознакомления в учебных целях и обязательного последующего удаления, дабы права разработчиков не нарушать Почему Вы решили, что в AWP этого нет - ведь это расширенная версия AW? Link to comment Share on other sites More sharing options...
Caracal Posted November 27, 2012 Author Share Posted November 27, 2012 Почему Вы решили, что в AWP этого нет - ведь это расширенная версия AW? Потому что у меня есть AWP. Сам разраб в какой-то из тем говорил, что нет этого. AWP - он чтобы неограниченное кол-во комбинаций создавать нужен. Благо я уже нашел выход. Link to comment Share on other sites More sharing options...
pvi1 Posted November 27, 2012 Share Posted November 27, 2012 Потому что у меня есть AWP. Сам разраб в какой-то из тем говорил, что нет этого. AWP - он чтобы неограниченное кол-во комбинаций создавать нужен. Благо я уже нашел выход. А не подскажете -как разобрались? Link to comment Share on other sites More sharing options...
Caracal Posted November 28, 2012 Author Share Posted November 28, 2012 А не подскажете -как разобрались? Вот так: $(function(){ var groupIds=new Array(); $('select[id^="group_"]').each(function(){ groupIds.push(this.id); }); var allCombinations=new Array(); $.each(combinations,function(key,combination){ allCombinations.push(combination['idsAttributes']); }); $('select[id^="group_"]').change(function(){checkCombination()}); $('a[id^="color_"][class="color_pick"]').click(function(){checkCombination()}); checkCombination(); function checkCombination() { $('select[id^="group_"] option').removeAttr('disabled'); $.each(groupIds,function(key,groupId){ var this_select=$('select[id='+groupId+']'); this_select.children('option').each(function(){ if(this_select.val()!=this.value){ var combination=new Array(); combination[key]=this.value; $.each(groupIds,function(key2,groupId2){ if(key!=key2){ combination[key2]=$('select[id='+groupId2+']').val(); } }); var position=-1; $.each(allCombinations,function(key1,theCombination){ if(position==-1){ position=key1; $.each(theCombination,function(key2,value){ if(combination[key2]!=value)position=-1; }); } }); if(position<0) { this_select.children('option[value='+this.value+']').attr('disabled','disabled'); } } }); }); } }); Link to comment Share on other sites More sharing options...
pvi1 Posted November 28, 2012 Share Posted November 28, 2012 Спасибо большое. Link to comment Share on other sites More sharing options...
pvi1 Posted November 28, 2012 Share Posted November 28, 2012 А функцию в каком файле прописывали? Link to comment Share on other sites More sharing options...
Caracal Posted November 29, 2012 Author Share Posted November 29, 2012 А функцию в каком файле прописывали? просто новый js в head Link to comment Share on other sites More sharing options...
pvi1 Posted November 29, 2012 Share Posted November 29, 2012 в head product.tpl? Link to comment Share on other sites More sharing options...
Caracal Posted November 29, 2012 Author Share Posted November 29, 2012 в head product.tpl? header.tpl можно... можно и между body ...особой роли не играет Link to comment Share on other sites More sharing options...
pvi1 Posted November 29, 2012 Share Posted November 29, 2012 Поставил в head.tpl в блок <head>. Реакции никакой. Взял в теги <script>...</script>. Блин, у меня 1.5.2. А скрипт только для 1.4? Link to comment Share on other sites More sharing options...
Caracal Posted November 29, 2012 Author Share Posted November 29, 2012 Поставил в head.tpl в блок <head>. Реакции никакой. Взял в теги <script>...</script>. Блин, у меня 1.5.2. А скрипт только для 1.4? ну вообще да...скрипт просто переводит option в disabled Link to comment Share on other sites More sharing options...
pvi1 Posted November 29, 2012 Share Posted November 29, 2012 (edited) Кстати, купил Attribute Order. Может или я еще в Presta слабоват и не додую, в чем дело или модуль никудышний. Короче, кроме того что он может менятьместами группы атрибутов и скрывать невозможные комбинации. Но дело в том, что после первого или второго выбора уже невозможно выбрать и заложенную комбинацию. Если нужно разъяснение , могу привести и приложить скрины. Edited November 29, 2012 by pvi1 (see edit history) Link to comment Share on other sites More sharing options...
pvi1 Posted November 29, 2012 Share Posted November 29, 2012 header.tpl можно... можно и между body ...особой роли не играет Поставил версию 1.4.4 RUS., вставил скрипт, выводит ошибку Fatal error: Uncaught exception 'SmartyCompilerException' with message 'Syntax Error in template "Z:\home\localhost\www\Presta/themes/prestashop/header.tpl" on line 78 "$('select ').change(function(){checkCombination()});" unknown function "checkCombination"' in Z:\home\localhost\www\Presta\tools\smarty\sysplugins\smarty_internal_templatecompilerbase.php:431 Stack trace: #0 Z:\home\localhost\www\Presta\tools\smarty\sysplugins\smarty_internal_templateparser.php(2660): Smarty_Internal_TemplateCompilerBase->trigger_template_error('unknown functio...') #1 Z:\home\localhost\www\Presta\tools\smarty\sysplugins\smarty_internal_templateparser.php(2812): Smarty_Internal_Templateparser->yy_r148() #2 Z:\home\localhost\www\Presta\tools\smarty\sysplugins\smarty_internal_templateparser.php(2912): Smarty_Internal_Templateparser->yy_reduce(148) #3 Z:\home\localhost\www\Presta\tools\smarty\sysplugins\smarty_internal_smartytemplatecompiler.php(51): Smarty_Internal_Templateparser->doParse(16, '}') #4 Z:\home\localhost\www\Presta\tools\smart in Z:\home\localhost\www\Presta\tools\smarty\sysplugins\smarty_internal_templatecompilerbase.php on line 431 Link to comment Share on other sites More sharing options...
Caracal Posted November 29, 2012 Author Share Posted November 29, 2012 Поставил версию 1.4.4 RUS., вставил скрипт, выводит ошибку Fatal error: Uncaught exception 'SmartyCompilerException' with message 'Syntax Error in template "Z:\home\localhost\www\Presta/themes/prestashop/header.tpl" on line 78 "$('select ').change(function(){checkCombination()});" unknown function "checkCombination"' in Z:\home\localhost\www\Presta\tools\smarty\sysplugins\smarty_internal_templatecompilerbase.php:431 Stack trace: #0 Z:\home\localhost\www\Presta\tools\smarty\sysplugins\smarty_internal_templateparser.php(2660): Smarty_Internal_TemplateCompilerBase->trigger_template_error('unknown functio...') #1 Z:\home\localhost\www\Presta\tools\smarty\sysplugins\smarty_internal_templateparser.php(2812): Smarty_Internal_Templateparser->yy_r148() #2 Z:\home\localhost\www\Presta\tools\smarty\sysplugins\smarty_internal_templateparser.php(2912): Smarty_Internal_Templateparser->yy_reduce(148) #3 Z:\home\localhost\www\Presta\tools\smarty\sysplugins\smarty_internal_smartytemplatecompiler.php(51): Smarty_Internal_Templateparser->doParse(16, '}') #4 Z:\home\localhost\www\Presta\tools\smart in Z:\home\localhost\www\Presta\tools\smarty\sysplugins\smarty_internal_templatecompilerbase.php on line 431 У тебя в php ошибка. Неправильно поставил. Сейчас проверил на демке 1.5.2 - работает. С селектами во всяком случае. Link to comment Share on other sites More sharing options...
pvi1 Posted November 29, 2012 Share Posted November 29, 2012 А что неправильно поставил? В файле header.tpl после строки {$HOOK_HEADER} я вставил скрипт <script> $(function(){ var groupIds=new Array(); $('select ').each(function(){ groupIds.push(this.id); }); var allCombinations=new Array(); $.each(combinations,function(key,combination){ allCombinations.push(combination['idsAttributes']); }); $('select ').change(function(){checkCombination()}); $('a ').click(function(){checkCombination()}); checkCombination(); function checkCombination() { $('select option').removeAttr('disabled'); $.each(groupIds,function(key,groupId){ var this_select=$('select '); this_select.children('option').each(function(){ if(this_select.val()!=this.value){ var combination=new Array(); combination[key]=this.value; $.each(groupIds,function(key2,groupId2){ if(key!=key2){ combination[key2]=$('select ').val(); } }); var position=-1; $.each(allCombinations,function(key1,theCombination){ if(position==-1){ position=key1; $.each(theCombination,function(key2,value){ if(combination[key2]!=value)position=-1; }); } }); if(position<0) { this_select.children('option ').attr('disabled','disabled'); } } }); }); } }); </script> Link to comment Share on other sites More sharing options...
Caracal Posted November 29, 2012 Author Share Posted November 29, 2012 (edited) У меня в отдельном файле вынесено. Вот так: <script type="text/javascript" src="/themes/dsmain/js/disopt.js"></script> ...и работает Стоит в header.tpl под строкой: <script type="text/javascript" src="{$js_dir}jquery.scroll.min.js"></script> Edited November 29, 2012 by Caracal (see edit history) Link to comment Share on other sites More sharing options...
pvi1 Posted November 29, 2012 Share Posted November 29, 2012 Сделал так. Скрипт заработал Но появляется комбинация по умолчанию и все. Может, я комбинации неправильно ввожу. Ну, например, как Вы описывали свою проблему в посте: 1 комбинация: Цвет - черный, размер 48 2 комбинация: Цвет - черный, размер 50 3 комбинация: Цвет - черный, размер 52 4 комбинация: Цвет - белый, размер 50 5комбинация: Цвет - белый , размер 52 По умолчанию включена первая комбинация и она появляется, остальные не работают. Что не так? Link to comment Share on other sites More sharing options...
Caracal Posted November 29, 2012 Author Share Posted November 29, 2012 Может быть такое, что много недоступных комбинаций. Решение не универсальное, иначе бы в престе разработчики давно наладили Display unavailable product attributes on product page Тут всё индивидуально в зависимости от потребностей. Если из 6 возможных 1 недоступная, то должно работать нормально... В данном случае недоступна Цвет - белый, размер 48 В 48 размере у вас не может быть доступен белый цвет. Переключите размер на другой и оба цвета станут доступны - это нормальная работа скрипта. Лучше по умолчанию ставить в обоих параметрах доступные комбинации. например Цвет - черный, размер 50 Link to comment Share on other sites More sharing options...
pvi1 Posted November 29, 2012 Share Posted November 29, 2012 У меня в отдельном файле вынесено. Вот так: <script type="text/javascript" src="/themes/dsmain/js/disopt.js"></script> ...и работает Стоит в header.tpl под строкой: <script type="text/javascript" src="{$js_dir}jquery.scroll.min.js"></script> У меня как на скрине. В коде ссылки выводятся перебором, естественно я поставил ссылку после перебора. Кстати ссылки {$js_dir}jquery.scroll.min.js у меня нет Link to comment Share on other sites More sharing options...
pvi1 Posted November 29, 2012 Share Posted November 29, 2012 Может быть такое, что много недоступных комбинаций. Решение не универсальное, иначе бы в престе разработчики давно наладили Display unavailable product attributes on product page Тут всё индивидуально в зависимости от потребностей. Если из 6 возможных 1 недоступная, то должно работать нормально... В данном случае недоступна Цвет - белый, размер 48 В 48 размере у вас не может быть доступен белый цвет. Переключите размер на другой и оба цвета станут доступны - это нормальная работа скрипта. Лучше по умолчанию ставить в обоих параметрах доступные комбинации. например Цвет - черный, размер 50 Так и сделал. Из 6 комбинаций только одна невозможная и по умолчанию поставил, как Вы сказали. Никак Link to comment Share on other sites More sharing options...
Caracal Posted November 29, 2012 Author Share Posted November 29, 2012 (edited) Значит у вас что-то не так. Вот например... Переходим на официальном сайте на демку 1.5.2: http://demo-store.pr...cs/30-ipad.html Я работаю в опере... Нажимаем CTRL U Находим комбинации... вот они: // Combinations addCombination(85, new Array('14','49','53'), 999, 130, 0, -1, '', 0.00, 1); addCombination(89, new Array('14','50','53'), 999, 230, 0, -1, '', 0.00, 1); addCombination(93, new Array('14','51','53'), 896, 330, 0, -1, '', 0.00, 1); addCombination(87, new Array('14','50','52'), 1000, 100, 0, -1, '', 0.00, 1); addCombination(91, new Array('14','51','52'), 999, 200, 0, -1, '', 0.00, 1); addCombination(83, new Array('14','49','52'), 597, 0, 0, 69, '', 0.00, 1); addCombination(84, new Array('54','49','52'), 1000, 0, 0, 72, '', 0.00, 1); addCombination(88, new Array('54','50','52'), 999, 100, 0, -1, '', 0.00, 1); addCombination(92, new Array('54','51','52'), 991, 200, 0, -1, '', 0.00, 1); addCombination(86, new Array('54','49','53'), 999, 130, 0, -1, '', 0.00, 1); addCombination(90, new Array('54','50','53'), 998, 230, 0, -1, '', 0.00, 1); addCombination(94, new Array('54','51','53'), 990, 330, 0, -1, '', 0.00, 1); // Colors //]]> Допустим, я удалю предпоследнюю... и получу: // Combinations addCombination(85, new Array('14','49','53'), 999, 130, 0, -1, '', 0.00, 1); addCombination(89, new Array('14','50','53'), 999, 230, 0, -1, '', 0.00, 1); addCombination(93, new Array('14','51','53'), 896, 330, 0, -1, '', 0.00, 1); addCombination(87, new Array('14','50','52'), 1000, 100, 0, -1, '', 0.00, 1); addCombination(91, new Array('14','51','52'), 999, 200, 0, -1, '', 0.00, 1); addCombination(83, new Array('14','49','52'), 597, 0, 0, 69, '', 0.00, 1); addCombination(84, new Array('54','49','52'), 1000, 0, 0, 72, '', 0.00, 1); addCombination(88, new Array('54','50','52'), 999, 100, 0, -1, '', 0.00, 1); addCombination(92, new Array('54','51','52'), 991, 200, 0, -1, '', 0.00, 1); addCombination(86, new Array('54','49','53'), 999, 130, 0, -1, '', 0.00, 1); addCombination(94, new Array('54','51','53'), 990, 330, 0, -1, '', 0.00, 1); // Colors //]]> </script> http://s019.radikal....e7738b41ddf.png Вставлю наш код куда-нибудь: http://s019.radikal....68806db53e2.png (вставил под <script type="text/javascript" src="/js/jquery/jquery.autocomplete.js"></script>) нажму в опере волшебную кнопку Применить изменения. Нажму на соседнюю вкладку с нашим Apple iPad 2... http://s017.radikal.ru/i444/1211/27/40c3be2e881f.png (см. положение курсора) начну переключать опции... http://i069.radikal....0a4177caf48.jpg переключаю....переключаю.... и вот вижу что комбинация Color: White Modek: 32 GB Options: Wi-Fi + 3G недоступна вот смотрите более тусклым 32 GB ...её не выберешь - она option disabled Всё работает. У меня работает на престе 1.4.8 официальная демка судя по всему 1.5.2 Edited November 29, 2012 by Caracal (see edit history) Link to comment Share on other sites More sharing options...
pvi1 Posted November 29, 2012 Share Posted November 29, 2012 (edited) Спасибо, понял. Все правильно, Чем меньше недоступных комбинаций - тем лучше. А если будет комбинция Цвет Черный - размер 48 и 52, а цвет белый - только 54 - наступает ступор. Я почему так критично настроен, потому что у меня есть опыт работы с компонентом Joomshopping от Joomla - так там последний приведенный вариант делается самой программой. и можно такие сложные комбинации наделать - только фантазируй. Edited November 29, 2012 by pvi1 (see edit history) Link to comment Share on other sites More sharing options...
Caracal Posted November 29, 2012 Author Share Posted November 29, 2012 Спасибо, понял. Все правильно, Чем меньше недоступных комбинаций - тем лучше. А если будет комбинция Цвет Черный - размер 48 и 52, а цвет белый - только 54 - наступает ступор. Я почему так критично настроен, потому что у меня есть опыт работы с компонентом Joomshopping от Joomla - так там последний приведенный вариант делается самой программой. и можно такие сложные комбинации наделать - только фантазируй. Именно. Кому-то подойдёт такое решение, а кому-то и нет. CS-Cart более продуман в плане комбинаций... Если в престе все комбинации загружаются пользователю, то CS-Cart всё хранит в БД и через аякс формируются запросы и считается цена на стороне сервера. Там вариантвов больше и комбинаций может быть сколько угодно, а преста ложится напрочь при полутра тысячах вариантов для одного товара. Насчет Joomshopping ничего сказать не могу, не сталкивался. Link to comment Share on other sites More sharing options...
pvi1 Posted November 29, 2012 Share Posted November 29, 2012 Эти возможности CS-cart в бесплатном варианте? Joomshopping бесплатный, и тоже все атрибуты через базу. Link to comment Share on other sites More sharing options...
Sanek11 Posted March 14, 2013 Share Posted March 14, 2013 подскажите у меня фаил header.tpl выглядет так, где вставить ваше изменения? <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="{$lang_iso}"> <head> <title>{$meta_title|escape:'htmlall':'UTF-8'}</title> {if isset($meta_description) AND $meta_description} <meta name="description" content="{$meta_description|escape:html:'UTF-8'}" /> {/if} {if isset($meta_keywords) AND $meta_keywords} <meta name="keywords" content="{$meta_keywords|escape:html:'UTF-8'}" /> {/if} <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8" /> <meta name="generator" content="PrestaShop" /> <meta name="robots" content="{if isset($nobots)}no{/if}index,follow" /> <link rel="icon" type="image/vnd.microsoft.icon" href="{$img_ps_dir}favicon.ico?{$img_update_time}" /> <link rel="shortcut icon" type="image/x-icon" href="{$img_ps_dir}favicon.ico?{$img_update_time}" /> <script type="text/javascript"> var baseDir = '{$content_dir}'; var static_token = '{$static_token}'; var token = '{$token}'; var priceDisplayPrecision = {$priceDisplayPrecision*$currency->decimals}; var priceDisplayMethod = {$priceDisplay}; var roundMode = {$roundMode}; </script> {if isset($css_files)} {foreach from=$css_files key=css_uri item=media} <link href="{$css_uri}" rel="stylesheet" type="text/css" media="{$media}" /> {/foreach} {/if} {if isset($js_files)} {foreach from=$js_files item=js_uri} <script type="text/javascript" src="{$js_uri}"></script> {/foreach} {/if} {$HOOK_HEADER} </head> <body {if $page_name}id="{$page_name|escape:'htmlall':'UTF-8'}"{/if}> {if !$content_only} {if isset($restricted_country_mode) && $restricted_country_mode} <div id="restricted-country"> <p>{l s='You cannot place a new order from your country.'} <span class="bold">{$geolocation_country}</span></p> </div> {/if} <div id="page"> <!-- Header --> <div id="header"> <a id="header_logo" href="{$base_dir}" title="{$shop_name|escape:'htmlall':'UTF-8'}"> <img class="logo" src="{$img_ps_dir}logo.jpg?{$img_update_time}" alt="{$shop_name|escape:'htmlall':'UTF-8'}" {if $logo_image_width}width="{$logo_image_width}"{/if} {if $logo_image_height}height="{$logo_image_height}" {/if} /> </a> <div id="header_right"> {$HOOK_TOP} </div> </div> <div id="columns"> <!-- Left --> <div id="left_column" class="column"> {$HOOK_LEFT_COLUMN} </div> <!-- Center --> <div id="center_column"> {/if} Link to comment Share on other sites More sharing options...
Caracal Posted March 15, 2013 Author Share Posted March 15, 2013 Поставьте в <head> </head> Link to comment Share on other sites More sharing options...
Sanek11 Posted March 15, 2013 Share Posted March 15, 2013 вставил выдает ошибку Fatal error: Uncaught exception 'SmartyCompilerException' with message 'Syntax Error in template "/home/sanek206/domains/speakbuy.com/public_html/themes/prestashop/header.tpl" on line 40 "$('select ').change(function(){checkCombination()});" unknown function "checkCombination"' in /home/sanek206/domains/speakbuy.com/public_html/tools/smarty/sysplugins/smarty_internal_templatecompilerbase.php:431 Stack trace: #0 /home/sanek206/domains/speakbuy.com/public_html/tools/smarty/sysplugins/smarty_internal_templateparser.php(2660): Smarty_Internal_TemplateCompilerBase->trigger_template_error('unknown functio...') #1 /home/sanek206/domains/speakbuy.com/public_html/tools/smarty/sysplugins/smarty_internal_templateparser.php(2812): Smarty_Internal_Templateparser->yy_r148() #2 /home/sanek206/domains/speakbuy.com/public_html/tools/smarty/sysplugins/smarty_internal_templateparser.php(2912): Smarty_Internal_Templateparser->yy_reduce(148) #3 /home/sanek206/domains/speakbuy.com/public_html/tools/smarty/sysplugins/smarty_internal_smartytemp in /home/sanek206/domains/speakbuy.com/public_html/tools/smarty/sysplugins/smarty_internal_templatecompilerbase.php on line 431 Link to comment Share on other sites More sharing options...
Kerm Posted March 15, 2013 Share Posted March 15, 2013 Попробуй в {literal} {/literal} код вставить Link to comment Share on other sites More sharing options...
Kerm Posted March 15, 2013 Share Posted March 15, 2013 У меня не много другая трабла, я добавляю товары, изменяю остатки, цены и т.д. импортом и у меня получается что в некоторых товарах комбинация по умолчанию может стоять та, которая не доступна и при заходе на карточку товара пишет выберите другой цвет или размер, вот как бы так сделать чтобы если такое происходит то комбинация менялась на другую, которая доступна, скриптом к примеру, но лучше при помощи смарти или php.. Link to comment Share on other sites More sharing options...
Caracal Posted March 17, 2013 Author Share Posted March 17, 2013 Попробуйте отдельным файлом подключить <script type="text/javascript" src="my.js"></script> Link to comment Share on other sites More sharing options...
websprint Posted November 11, 2013 Share Posted November 11, 2013 (edited) Для версии 1.5.6 работает, но с колорпикерами и селектами не хочет. Только с выпадающим списком ( Edited November 11, 2013 by websprint (see edit history) Link to comment Share on other sites More sharing options...
Recommended Posts