• Правильно ли писать так (бем)?

    @ilyarsoftware
    header_logotype_link и header_logotype_image модификаторы блока («ключ-значение», если следовать Соглашение по именованию), а используются как самостоятельные единицы, их задача отражать модификацию именно блока: <section class="header header_logotype_image">, но данном случае будет мало смысла.

    Будет более верно для ссылки и картинки использовать самостоятельный блок, а для отражения специфичности модификатор, например:

    <!-- .header -->
    <section class="header">
      <div class="container">
        <div class="header__top">
          <div class="header__logotype">
            <a href="#" class="link link_type_header">
               <img src="_tmp/logotype.png" alt="Casino" class="image image_type_header">
            </a>
          </div>
        </div>
      </div>
    </section>
    <!-- /.header -->


    .header {
        &__top {}
        &__logotype {}
    }
    .link {
        &_type {
           &_header {}
        }
    }
    .image {
        &_type {
           &_header {}
        }
    }


    Или использовать микс (на мой взгляд, такой подход поддерживать проще):

    <!-- .header -->
    <section class="header">
      <div class="container">
        <div class="header__top">
          <div class="header__logotype">
            <a href="#" class="header__link link">
              <img src="_tmp/logotype.png" alt="Casino" class="header__image image">
            </a>
          </div>
        </div>
      </div>
    </section>
    <!-- /.header -->


    .header {
        &__top {}
        &__logotype {}
        &__link {}
        &__image {}
    }
    .link {}
    .image {}


    Еще стоит подумать на тем, что логотип может быть не только в шапке, т.е. он может потребоваться в другом контексте, значит его следует реализовать самостоятельным блоком (подробнее об этот тут «Как в принципе отличать, где блок, а где элемент?»).
    Ответ написан
    Комментировать
  • Где находится шаблон в umi cms?

    @ilyarsoftware
    В каждом случаем использования UMI.CMS могут быть по разному настроено использование шаблонов, как месторасположения так и тип шаблонизации.

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

    На примере стандартной поставки с использованием шаблона "Современный интернет-магазин", расположение шаблона в /templates/demodizzy/ далее в зависимости от типа шаблонизации:

    XSLT /templates/demodizzy/xslt/layouts/default.xsl
    <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet version="1.0">
    
      <xsl:template match="/" mode="layout">
        <html>
          <head>
            ...
            <script src="/templates/demodizzy/js/script.js"></script>
            <link rel="stylesheet" href="/templates/demodizzy/css/styles.css"/>
          </head>
          ...
        </html>
      </xsl:template>
    
    </xsl:stylesheet>


    TPL /templates/demodizzy/tpls/content/inner.tpl
    <!DOCTYPE html>
    <html>
      <head>
         ...
        <script src="/templates/demodizzy/js/script.js"></script>
        <link rel="stylesheet" href="/templates/demodizzy/css/styles.css"/>
      </head>
      ...
    </html>


    PHP /templates/demodizzy/php/default.phtml
    <?php /** @var umiTemplaterPHP $this */ ?>
    <?php /** @var array $variables */ ?>
    <?php
    ...
    ?>
    <html>
      <head>
        ...
        <script src="/templates/demodizzy/js/script.js"></script>
        <link rel="stylesheet" href="/templates/demodizzy/css/styles.css"/>
      </head>
      ...
    </html>
    Ответ написан
    4 комментария
  • Поговорим про ReactJS и BEM, JSX и BEMJSON?

    @ilyarsoftware
    На полный ответ нет времени, использовать можно и используют, у bem-xjst будущие есть, дополнительно:
    BEM + React
    Что вы думаете о виртуальном bemjson дереве на клиенте
    redux и БЭМ

    Поиск site:ru.bem.info "bem-xjst".
    Ответ написан
    Комментировать
  • Почему не выполняется команда bem?

    @ilyarsoftware
    ./node_modules/.bin/bem create -l desktop.blocks -b input -T css

    Чтобы не указывать путь к исполняемому файлу...
    export PATH=./node_modules/.bin:$PATH
    bem/project-stub/README.ru.md#Сборка-проекта

    Ищете дополнительно, как обновить $PATH для вашей ОС.
    Ответ написан
  • Как по БЭМ написать элемент в блоке с модификатором?

    @ilyarsoftware
    Добавив модификатор к блоку .container--parallax {} можно учитывать его наличие в реализации всех элементов блока .container--parallax .container__title {}.

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


    Добавляя модификатор для элемента .container__title--parallax {} мы сужаем область действия модификации только на элемент.

    Как как именно поступать решать вам, это зависит от потребностей, методология не решает подобные вопросы.
    Ответ написан
    Комментировать
  • Как добавить счётчик на UMI.CMS через FTP?

    @ilyarsoftware
    Есть макрос %system googleAnalyticsCode()% — выводит код для сбора статистики Google Analytics, тут Вставка кода GoogleAnalytics в XSLT-шаблоны описано два способа, как пользоваться макросом и как вставить код непосредственно в шаблон (подойдет для любого типа счетчика), пример Добавление счетчика liveinternet.

    Какой у вас шаблон смотрите в Модуль "Структура"/Настройки модуля "Структура".

    И последнее смотрите документ Формат хранения шаблонов.
    Ответ написан
    Комментировать
  • Как добавить доп поля для регистрации пользователя?

    @ilyarsoftware
    Предположу, что getRequest = null, надо смотреть как форма передает, для вашей задачи менять штатный фал не требуется.
    Ответ написан
  • Возможен dom в json формате?

    @ilyarsoftware
    Да это возможно, например BEMJSON:
    {
      tag : 'div',
      attrs : {
        id : 'anchor1',
        name : 'BEM',
      },
      content : [
        {
          tag : 'div',
          attrs : {
            id : 'anchor2',
            name : 'BEM 2',
          },
          content : 'BEM text'
        },
      ]
    }

    После прогона через стандартные шаблоны BEMHTML получим (живой пример):
    <div id="anchor1" name="BEM">
        <div id="anchor2" name="BEM 2">BEM text</div>
    </div>


    Еще может быть для вашей задаче подойдет BEMTREE. При помощи BEMTREE описывается шаблон обработки JSON-данных, который преобразует данные в BEMJSON и далее через BEMHTML получаем HTML. Пример:

    Есть данные:

    {
      "content": "BEM Block!",
      "title": "I am BEM"
    }


    Описываем трансформацию данных в BEMJSON на технологии BEMTREE:

    block( 'someBlock' )(
      def()( function () {
        var data = this.ctx.data || {};
        this.ctx.content = [
          { elem : 'title', content : data.title || 'Empty title' },
          { elem : 'content', content : data.content || 'Empty content' },
        ];
        return applyNext();
      } )
    );


    После применения на данных мы получим BEMJSON, останется только применить BEMHTML. Это и есть двухпроходная шаблонизация.

    Тут jsfiddle.net/ilyar/5dw8Q и тут https://goo.gl/GRGSFf — живой пример применения BEMTREE в браузере (можно и на сервере применяя те же шаблоны).
    Ответ написан
    1 комментарий
  • Как разобраться с ошибкой Field "index_choose"?

    @ilyarsoftware
    Скорей всего в типе данных объекта каталога отсутствует поле строковым идентификатором: "index_choose".

    Это поле "Выбран для индексации" является системным и должно находится в группе "Индекс фильтров".

    Вероятно ошибочно удалено или используется пользовательский тип данных для объекта каталога, в котором это поле не добавлено.
    Ответ написан
    1 комментарий
  • Как получить элементы состаного поля?

    @ilyarsoftware
    Стандартное использование составного поля:
    $someObjectId = 1253;
        $objects = umiObjectsCollection::getInstance();
        $bar = $objects->getObject($someObjectId);
        $optioned = $bar->getValue('_');
        $data = [];
        foreach ($optioned as $item) {
            $itemObject = $objects->getObject($item['rel']);
            $data[] = array(
              'objectId' => $item['rel'],
              'name' => $itemObject->getName(),
              'value' => $item['float'],
            );
        }


    Кроме этого для элемента составного поля можно использовать следующий формат:

    [
      'int' => 1, // bigint(20)
      'varchar' => null, // varchar(255)	
      'rel' => null, // int(10) - идентификатор объекта (umiObject)
      'tree' => null, // int(10) - идентификатор страницы (umiHierarchyElement)
      'float' => 0 // double
    ],
    Ответ написан
    Комментировать
  • UMI зашифровал файлы на сайте. Как из расшифровать?

    @ilyarsoftware
    UMI.CMS не Open Source, но насколько я помню защищенная версия ставилась на только по триальному лицензии, при обновлении на актуальной лицензия можно получить не зашифрованные исходники. В противном случае пункт 9.7. из Лицензионного соглашения не имеет смысла:

    9.7. Клиент может изменять, добавлять или удалять любые файлы приобретенной программы (включая базу данных) в соответствие с Российским Законодательством об авторском праве. В этом случае Правообладатель не гарантирует беспере­бойную работу программы и обновлений.

    Кроме этого, согласно текущим системным требованиям PHP должен быть >= 5.4:
    • PHP 5.4.*
    • PHP 5.5.*
    • PHP 5.6.*
    • PHP 7.*.*

    И для версии UMI.CMS 2.7.4 и более ранних может потребоваться Zend Optimizer. На текущий момент даже триальная версия ставится без Zend optimizer в этом удобно убедится с помощью этого проекта ilyar.github.io/umi-project-stub, предположу что используются другие методы защиты от копирования.
    Ответ написан
    Комментировать
  • Как правильно давать имена блоков по БЭМ c глубокой вложенностью?

    @ilyarsoftware
    Есть смысл разбить на два блока:
    <!-- микс блока wrapper, но можно и не миксовать, если нужно -->
    <div class="header wrapper">
      <!-- элемент блока wrapper -->
      <div class="wrapper__left">
        <!-- aside элемент блока header c модификатором pink -->
        <div class="header__aside header__aside_pink"/>
      </div>
      <!-- элемент блока wrapper -->
      <div class="wrapper__right">
        <!-- aside элемент блока header c модификатором blue -->
        <div class="header__aside header__aside_blue"/>
      </div>
    </div>

    Если надо одним блоком:
    <div class="header">
      <!-- wrappe элемент блока header -->
      <div class="header__wrapper">
        <!-- wrapperLeft элемент блока header -->
        <div class="header__wrapperLeft">
          <!-- aside элемент блока header c модификатором pink -->
          <div class="header__aside header__aside_pink"/>
        </div>
        <!-- wrapperRight элемент блока header -->
        <div class="header__wrapperRight">
          <!-- aside элемент блока header c модификатором blue -->
          <div class="header__aside header__aside_blue"/> 
        </div>
      </div>
    </div>

    или
    <div class="header">
      <!-- wrapper элемент блока header c модификатором left -->
      <div class="header__wrapper header__wrapper_left">
        <!-- aside элемент блока header c модификатором pink -->
        <div class="header__aside header__aside_pink"/>
      </div>
      <!-- wrapper элемент блока header c модификатором right -->
      <div class="header__wrapper header__wrapper_right">
        <!-- aside элемент блока header c модификатором blue -->
        <div class="header__aside header__aside_blue"/>
      </div>
    </div>


    Конечное решение зависит от проекта и вашего подхода к его реализации. Методология гибкая и не диктует реализацию строго.
    Ответ написан
    Комментировать
  • UMI.CMS - добавление выбора опций в шаблон xsl - пустая страница?

    @ilyarsoftware
    Причина пустая страницы при работе с XSLT-шаблонизатором может говорить о наличии в шаблоне ошибки. Включите режим отображения ошибок (config.ini):

    [debug]
    enabled = "1"
    show-backtrace = "1"


    Вместо пустой страницы, будут отображаться сообщения вида:

    Warning: DOMDocument::load(): Specification mandate value for attribute checked in /umi/xsltTpls/default.xsl


    Из этого сообщения буде стразу понятно где проблема.

    Еще может быть полезен шаблон debug.xsl:
    <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
      <!-- debug tools -->
      <xsl:template match="*" mode="debug">
        <textarea>
          <xsl:copy-of select="*"/>
        </textarea>
      </xsl:template>
    
    </xsl:stylesheet>


    Его надо подключить в ваши шаблоны <xsl:include href="debug.xsl"/> и использовать в любом xsl:apply-templates добавляя mode="debug" например так:

    <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
      <xsl:template match="property">
        <xsl:apply-templates select="value/option" mode="debug" />
      </xsl:template>
    
    </xsl:stylesheet>


    В результате будет видно содержание XML-дерева для которой применяется шаблон, это может быть полезным для правильного построения XPath используемый select или match шаблонов.
    Ответ написан
    3 комментария
  • Как использовать umiTemplaterPHP при разработке php-шаблона?

    @ilyarsoftware
    К umiTemplaterPHP это отношения не имеет, это стандарт документирования PHPDoc, многие IDE поддерживают его по умолчанию или с плагином. Ищите информацию о поддержке этого стандарта в используемой IDE.

    Для документирования массива на текущий момент стандарт дает следующий пример:

    /**
     * Initializes this class with the given options.
     *
     * @param array $options {
     *     @var bool   $required Whether this element is required
     *     @var string $label    The display name for this element
     * }
     */


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

    /**
     * @return array {
     *     @var bool   $required Whether this element is required
     *     @var string $label    The display name for this element
     * }
     */


    Но такое применение может не поддерживаться текущими инструментами для работы с PHPDoc. На эту тему открыто обсуждение в проекте развития PHPDocumentor.

    Возможные решения рассмотрены в документе: Документирование ассоциативных массивов в PHPDoc.
    Ответ написан
  • Добавление цены к товару при отправки его в корзину UMI?

    @ilyarsoftware
    Как можно отправить запрос с ценой = 1 000?

    Если кратко, то никак. Подробнее можно прочитать в документации по макросу %emarket basket()% именно он используется для взаимодействие с корзиной для текущего пользователя.

    Ниже опишу возможные варианты применения применения коэффициента для цены.

    Используйте валюты, системная валюта "фантики", в модуле Интернет магазин устанавливаете курс рублей 10, на посетителю показываете рубли. Создаем новою валюту, и устанавливаем ее в качестве системной валюты в config.ini, Код валюты по умолчанию: default-currency = "RUR", можно использовать существующие, если только у вас отключено обновление валют, в противном случае курс будет обновятся.

    Более простой вариант для применения коэффициента к цене можно задействовать функционал скидок.

    Для реализации более сложной логики применения коэффициента следует использовать API UMI.CMS, например реализовать обработчик событий umiObjectProperty_loadPriceValue для отображения цены и order_refresh (в зависимости от требований может потребоваться использовать событие orderItem_refresh) для расчета заказа (подробнее смотри документацию Разработка нестандартного функционала / Событийная...).

    Как вариант использования API UMI.CMS сделать собственную реализацию процесса работы с корзиной и оформления товара это будет проще чем делать с нуля, но сложнее чем реализация обработчиков событий, зато получаем больше контроля.
    Ответ написан
    4 комментария
  • Как добавлять объекты в справочник через Edit-in-Place в UMI?

    @ilyarsoftware
    Делать это 40 полями в свойствах объекта не рационально.

    Вполне рационально т.к. UMI.CMS отдельно хранит схему данных (Шаблонны данных - тип) и данные (объекты системы), остается решить вопрос интерфейс для этого будет полезно использовать возможность кастомизации системы которая назавается Перегрузка шаблонов административного интерфейса или через фронтенд, что будет еще проще реализовать.

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


    Если я правильно все понял, то это решение не отличается от варианта, когда создаем глубокую или плоскую иерархию типов данных для объектов.

    Так не работает: имена полей перекликаются, например name он подставляет заголовок страницы.


    Проблема решения описана не достаточно подробно, предположу что, проблема в данных, посмотрите как базе записано имя элемента справочника, если я правильно определил проблему, по данным все будет понятно.
    Ответ написан
  • Какие изменения исходников допустимы, чтобы не потерять поддержку службы заботы?

    @ilyarsoftware
    Изменения системы регламентируются Лицензионным договором:
    3.2.4. Клиент вправе вносить изменения в правомерно приобретённый экземпляр Системы исключительно в целях функционирования Системы на конкретных технических средствах Клиента или под управлением конкретных программ Клиента (адаптация) в пределах, указанных на странице docs.umi-cms.ru/system_modification_rules, а также исправлять явные ошибки Системы.

    Другими словами, чтобы не потерять поддержку, изменения можно вносить только используя предусмотренные для этого способы. В сложных ситуация или какой-то неоднозначности следует обратиться в поддержку за советом.

    Кроме этого, важно помнить, что изменяя исходный код системы не предусмотренный для клиентских решений теряется не только поддержка, а также и техническая возможность обновления (измененные системные файлы будут презаписанны).
    Ответ написан
    Комментировать