Форум пользователей Impera CMS
Impera CMS - отличный движок для лёгкого создания интернет магазина.
Обладает невероятным количеством функций, необходимых в онлайн торговле.

Следить
Главная
23:09
07 мар
#
?
yaskin написал:

Суть такова.

Есть сайт на wordpress типа site.ru

и есть магазин на импере по адресу market.site.ru

и есть модуль отображения категорий AddyOsmani Zoomer catalog

Вопрос: Как вывести категории магазина с помошью этого модуля на главной странице site.ru

Технически возможно ли это? и если возможно, подскажите логику где копать.

Есть какие соображения как это можно сделать?

Приму любые мысли по этому поводу, даже фантастические.

08:57
09 мар
#
?
yaskin написал:

Первый вариант через iframe

Есть еще какие идеи?

13:20
09 мар
#
написал:

Похожее обсуждалось в теме На лету внедрить часть каталога одного сайта на фронтенд другого. Резюмируя изложенное в той теме, нужно сделать следующее:

  • в желаемое место страницы WordPress сайта добавить вызов информера с сайта магазина, предположим хотим дать этому информеру номер 123

    <script src="http://сайт.магазина.ru/informer?num=123" language="JavaScript"></script>

  • в шаблон магазина, а именно в папку http://сайт.магазина.ru/design/папка_шаблона/html, добавить файл informer123.tpl, где отрисовать категории с помощью AddyOsmani Zoomer catalog

    {* информер 123 *}{strip}
    
    
    
        {* захватываем следующий вывод в переменную $result *}
        {capture  assign = 'result'}
    
    
    
            {* рисуем категории *}
            {include file = '../../common_parts/Addyosmani-Zoomer-catalog/main.tpl'
    
                     title = 'Разделы магазина'
                     items = $categories|default:false
    
                     width = 135
                     height = 135
    
                     margin = 10
                     frames = true
                     names = true
                     prices = true
                     highlights = true
                     hits = true
                     news = true
                     actions = true
                     awaits = true
                     my_icons = false
                     nesting = false
                     nesting_heads = false
    
                     link_css = true
                     link_engine = true}
    
    
    
        {/capture}
    
    
    
        {* если захваченный вывод не пуст *}
        {if $result|regex_replace:'/[\s\t\r\n]/':'' != ''}
    
            {* помним, что информер вызывают как яваскрипт *}
            document.write('{$result|replace:"'":"\'"}');
    
        {/if}
    
    {/strip}

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

Следует учесть такой момент. Технология внешних информеров подразумевает управляемость тем, что менеджер магазина разрешает транслировать на сторонних сайтах. Поэтому у категорий в админпанели существует флажок Не экспорт. Устанавливая его для нужных категорий, менеджер тем самым запрещает экспортировать сведения об этих категориях вне сайта магазина.

Однако модуль AddyOsmani Zoomer catalog создан для внутреннего использования, то есть на сайте магазина, и следовательно не обращает внимание на разрешения/запреты трансляции категорий. Иными словами, приказывая модулю отрисовать содержимое массива $categories, мы должны понимать, что он отрисует категории невзирая на состояния флажков Не экспорт этих категорий.

Если же принципиально стоит вопрос соблюсти технологию, используя только немодифицированный AddyOsmani Zoomer catalog, тогда правильно было бы перед вызовом модуля отсеять из массива категорий все запрещенные к экспорту, и передать модулю уже этот новообразованный массив. Например назовем его $cats.

{* создаем пустой массив *}
{$cats = []}

{* фильтруем в массив категории с неустановленным флагом НЕ ЭКСПОРТ *}
{foreach $categories as $r}
    {if !$r->export_disabled|default:false}
        {$cats[] = $r}
    {/if}
{/foreach}


Данный пример фильтрует только категории верхнего уровня, не проверяя вложенные. Это достаточно при настройке nesting = false (не показывать вложенные) модуля AddyOsmani Zoomer catalog.

22:13
10 мар
#
?
yaskin написал:

Спасибо за быстрый и обстоятельный ответ, но скрипт выдает ошибку

Syntax error at line 1 while loading: in string literal: invalid line terminator.
document.write('

jquery подключен. В чем проблема может быть?

причем даже на голом html файле.

23:37
10 мар
#
?
Van написал:

Разработчик неточно написал document.write('{$result|replace:"'":"\'"}');

Вдруг $result содержит типа **** str = 'текст с \'одинарными\' кавычками'; ****?

После |replace:"'":"\'" превратится в **** str = \'текст с \\'одинарными\\' кавычками\'; ****

Внутри кавычки разэкранировались. Вставить сие в document.write('') будет ошибка.

Правильно document.write('{$result|replace:'\\':'\\\\'|replace:"'":"\'"}');

2 подряд replace. Один экранирует слэши. Второй кавычки.

23:51
10 мар
#
?
написал:

Не проще ли document.write('{$result|escape:quotes}') ?

22:01
12 мар
#
?
yaskin написал:

Все таки дело наверно не в кавычках, т.к. я просмотрел содержимое $result и кавычек не обнаружил.

Opera показывает такую ошибку:

Syntax error at line 1 while loading: in string literal: invalid line terminator.
document.write('
---------------^

Internet Explorer такую:

Строка : 2

Символ : 17

Ошибка : Незавершенная строковая константа

Код : 0

Если напрямую перейти по адресу http://сайт.магазина.ru/informer?num=123

та код выдается в таком виде

document.write('

<link href="http://сайт.магазина.____бла_бла_бла______jQuery(window).load(function () {jQuery(\'ul#ZOOMERcatalog30882792-addyosmani-zoomer li\').Zoomer({ speedView: 200,speedRemove: 400,titleAnim: true,priceAnim: true,speedTitle: 400,width: 104,height: 104,debug: false});});</script>
');

В общем не могу понять где ошибка.

23:01
12 мар
#
?
yaskin написал:

Склоняюсь к тому, что JS анализатор видит функцию как разные строки.

Погуглив, выяснил что:

"...дело в том, что в JS не обязательно завершать все точкой с запятой.

Такие же ошибки могут возникнуть если написать не

return true;

а

return
true;

JS увидит

return;
true;

при этом код может и не вызывать синтаксических ошибок, но произойдет сбой"

Вопрос: как обойти сию проблему?

13:19
13 мар
#
написал:

Согласен с постером Van, правильно использовать два указанных им replace подряд для устранения проблемы непредсказуемого экранирования кавычек.

Постер Саня на мой взгляд неправ - escape:quotes экранирует только неэкранированные кавычки. Следовательно в таком примере, который позже будет использоваться в качестве литеральной константы-параметра метода document.write:

  переменная = 'слово1 \'слово2\' слово3';


получим

  переменная = \'слово1 \'слово2\' слово3\';


вместо предполагаемого

  переменная = \'слово1 \\\'слово2\\\' слово3\';


Что же касается проблемы постера yaskin, предполагаю она состоит в тегах <script>, попавших в тело другого скрипта и не бывших искусственно сделанными неопознаваемыми. Проще говоря, следующую воображаемую конструкцию интерпретатор JS видимо распознает неверно.

  <script>
      document.write('<script> example = \'пример\' </script>');
  </script>


Как интерпретатору понять, какой из тегов </script> закрывает тело родительского скрипта?

Я попробовал бы решить эту проблему третьим replace, который искусственно разрывает внутри литеральной константы всякие теги, чтобы интерпретатор JS на них не реагировал.

  document.write('{$result|replace:'\\':'\\\\'|replace:"'":"\'"|replace:'<':"<' + '"}');


Этот replace разрезает литеральную константу в местах обнаружения символа открывающей угловой скобки на несколько констант и образует из них конкатенацию (склеивание) с помощью оператора +. Получилось бы нечто похожее:

  <script>
      document.write('<' + 'script> example = \'пример\' <' + '/script>');
  </script>

Написание ответа

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


Обратите внимание! Для противодействия спаму новые посты форума проявляются с задержкой от нескольких минут, пока не пройдут модерацию.