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

    @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 {}


    Еще стоит подумать на тем, что логотип может быть не только в шапке, т.е. он может потребоваться в другом контексте, значит его следует реализовать самостоятельным блоком (подробнее об этот тут «Как в принципе отличать, где блок, а где элемент?»).
    Ответ написан
    Комментировать
  • Для чего в БЭМ т.н. "первый уровень вложенности", то есть "блок__элемент"?

    @ilyarsoftware
    Подскажите, для чего в БЭМ т.н. "первый уровень вложенности", то есть "блок__элемент"?


    "блок__элемент" отражает только принадлежность элемента к блоку и не никак не относится к вложенности.

    Зачем весь этот цирк с двойным подчеркиванием и якобы вложенностью, но запретом на ее использование?


    Вложенность не запрещена и реализуется на уровне HTML т.е. так где мы мы естественно можем отразить структуру, поподробнее в посте: Вкладывание элементов в элементы и другие тонкости и ответ на вопрос: Почему нежелательно использовать вложенные селекторы?.

    А для чего вводить двойное подчеркивание, если элемент может быть с указанным родителем в качестве модификатора?


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

    Вопрос почему кодеры так активно кричат "бэм это хорошо", если достаточно было сказать "ребята, научитесь УМНО пользоваться вложенностью", дескать каждый уровень вложенности это как золото, их нельзя делать 22, максимум 2 или 3??


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

    ну то есть - зачем каждому элементу писать модификатор, отказывая себе во вложенности, если вложенность тут очевидна?
    А если делать все равно вложенность, то на какой долбаться с ней без вложенности?

    Хотелось бы услышать объяснения без ссылок на "какую-то там статью про бэм" в которой те, кто сломали себе мозг, ломают его остальным.


    Без ссылок не обойтись, см. выше, но они подобраны исключительно точно по вашим вопросам и содержат необходимые объяснения.
    Ответ написан
  • Где находится шаблон в 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 он подставляет заголовок страницы.


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