Курс 2016 года “Разработка на UMI.CMS от 0 до готового сайта”

Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.


Темы - Rodogor

Страницы: [1]
1
Здравствуйте.
Что-то начал делать очень тяжелые сайты, грузится всё очень долго. Почти всё кастомное, и походу косячу именно я, но анализируя структуру БД и как устроено понимаю, что таки не только мои косяки там. Стандартное я стараюсь оптимизировать - задаю либо более конкретное условие (в определённых ситуациях по большому количеству полей быстрее отфильтровать), стараюсь упростить многие места.

И вот настало то самое время, когда мне пора юзать какое-нибудь кэширование. Хотя пользуюсь я им давно, но понял, что нужно что-то нормальное, а что делать не знаю.

Я понимаю, что к примеру в интернет-магазине много время занимает поиск товаров, которые выводятся на главную, затем для каждой странице upage и т.п. - короче время, это можно сохранить в файл с готовым html и вывести, я так уже делал.. От множественного вызова upage я давно отказался, почти всё делаю на php - так работает быстрее.

А можно ли закешировать на уровне хостинга, сервера ? К примеру, выполняется один и тот же запрос... Чем кроилово в коде - может кэшить именно этот запрос, точнее ответ на запрос ?

XSLT кэширование запросов - я смотрел через ?showStreamsCalls, получалось так, что те макросы, которые вызываются два раза на странице (ну мало ли) вызываются только один раз. После обновления браузера запросы снова полностью повторяются.

Я вообще представляю, что должно работать так:
1)без кэша - запрос, выполнение кода, запрос к базе, ответ.
2)с кэшем - если нет кэша: поиск данных по хэшу,  не нашли, выполняем запросы, сохраняем кэш, выводим ответ. если есть кэш - поиск по хэшу, проверка на модификацию, вывод.


Смотрю как работают некоторые сайты, к примеру key.ru:
<streams-call total-time="0.065534">
<call generation-time="">upage://35.minMode</call>
<call generation-time="0.000291">udata://custom/current_mode</call>
<call generation-time="0.000185">udata://custom/count_compare_good</call>
<call generation-time="0.000175">udata://custom/getCityList/</call>
<call generation-time="0.000338">udata://system/listErrorMessages</call>
<call generation-time="">upage://67187</call>
<call generation-time="0.006832">udata://users/getLoginzaProvider</call>
<call generation-time="0.047968">udata://custom/emarketCartLite/</call>
<call generation-time="0.000167">udata://custom/show_last_showed_count</call>
<call generation-time="0.001737">udata://catalog/category_list_html/</call>
<call generation-time="0.001492">udata://custom/recommendedItem/1063</call>
<call generation-time="0.001426">udata://custom/banners_list/(vendor_banner_1)</call>
<call generation-time="0.000175">udata://custom/banners_list/(main_vendor_banner)</call>
<call generation-time="0.000646">udata://custom/primary_slider/</call>
<call generation-time="0.001858">udata://custom/special_offers_list/</call>
<call generation-time="0.000970">udata://custom/novinki_list/</call>
<call generation-time="0.000613">udata://custom/lastlist/37/1063/7</call>
<call generation-time="0.000565">udata://custom/lastlist/3505/1063/7</call>
<call generation-time="0.000096">udata://custom/text_messages</call>
</streams-call><!-- This page generated in 0.21666 secs -->

Столько, сколько у них грузится весь сайт - у меня столько выполняется один единственный upage. Видно, что у них upage запросы возвращаются без времени - у меня так возвращаются запросы, которую грузятся из файло. Как это можно сделать ?

В некоторых запросах у них возвращается готовый html код. Интуитивно и постепенно я начал отказываться от мега-кроилова на XSLT, но неужели на столько всё плохо ? К примеру, udata://catalog/category_list_html/

Тестирую хостинг -
Производительность: 14.97 - результат ниже нормы
Данный показатель измеряет, сколько раз выполняется генерация пустой страницы за одну секунду. Чем больше этот показатель, тем лучше.
Показатели load average: 0.27, 0.38, 0.58

Походу реально мало.... у кого как ?... Что посоветуете ?..

2
Здравствуйте.
Шарил по документации и не нашёл как же таки задумывалась мультиязычность в UMI CMS.
Рассмотрим на примере новости или объекта каталога. Как отнести какой-то объект к какой-то версии сайта ? Варианты: нужно, что бы все новости/объекты каталога были одинаковыми, но имели перевод ИЛИ для каждого языка свой контент.
Неужели необходимо создавать доп.поля для каждого типа данных, в который заносить поля для каждого языка, а если нужно для каждого языка свой контент - делать справочник "языки" и для каждой страницы выбирать к какому языку (или языкам) она относится ?

3
Custom макросы / Импорт данных по cron. xmlImporter
« : 24 Января 2013, 13:51:09 »
Здравствуйте.

Сделал кастомный макрос import_do, вызываемый в админке при использование модуля "обмен данными", при нажатие кнопки "выполнить импорт". Кастомность - не использование кукизов для хранения перемещений по xml документы при импорте.

Кастом макрос запускается по крону.

Захожу руками на cron.php - всё выполняется без проблем, работает корректно.
Запускается по крону - создаваемые объекты получаются без заполненных полей (name, title, 1с специфические и т.п.)... Названия объектов = ид из импорта, page @Id.
<page id="{@Идентификатор}" parentId="{$catalog-id}" type-id="root-catalog-category-type">

Тут же удаляю объекты, запускаю через адресную строку - всё корректно добавляется.

Никто не сталкивался с чем-нибудь подобным ?

4
Здравствуйте. Вроде не маленький мальчик и подобное делал не раз, но почему-то сейчас у меня не получается сделать редирект на созданную страницу, как допустим создание блога - отправили из формы данные в макрос, а там $this->redirect();

Что делаю:
0. создаём страницу - получаем id
1. прописываем права (аналогично блогах и стандартному кодэ)
2. по id страницы получаем objectId источника данных страницы
3. сохраняем заполненные поля
4. commit для созданной страницы
5. выводим id страницы - выводится
6. через происходит либо а) выводим url - не выводится б) если выводится - редиректится

Что пробовал делать - у меня по порядку идут страницы, т.е. я заранее знаю url. Так вот я руками прописывал следующий url и редирект происходил.
              
 
                $questId = $hierarchy->addElement('41807','27', $name, $name,'1338');
$quest = $hierarchy->getElement($questId);
$quest->setIsActive(true);
$oUsers = cmsController::getInstance()->getModule('users');
$pCollection = permissionsCollection::getInstance();
$pCollection->setDefaultPermissions($questId);
$pCollection->setElementPermissions($oUsers->user_id, $questId, 31);
$user     = umiObjectsCollection::getInstance()->getObject( $oUsers->user_id );
$groups   = $user->getValue('groups');
foreach($groups as $id)
$pCollection->setElementPermissions($id, $blogId, 1);
$data = cmsController::getInstance()->getModule("data");
$oQuestId = $quest->getObjectId();
$data->saveEditedObject($oQuestId,true);
$quest->commit();
var_dump($questId);
var_dump($hierarchy->getIdByPath($questId));
$this->redirect($hierarchy->getIdByPath($questId));

UPDATE:
заметил, что так работает -
$this->redirect($quest->link);   

5
Custom макросы / Выборка по id пользователя.
« : 12 Декабря 2012, 11:44:56 »
Здравствуйте.
Никак не могу понять как сформировать выборку объектов созданных пользователем ? К примеру, хотим вывести все сообщения, которые создал пользователь, id пользователя есть, тип объектов/страниц тоже есть. Как задать в условие для поиска ownerId - не понятно...


6
Custom макросы / Создаём превью на API.
« : 04 Декабря 2012, 00:06:33 »
Здравствуйте.
Имею уже загруженное файло, картинку. Хочу вернуть сразу создать превьюку и вернуть на неё ссылку ответом ajax запроса.

Имеем модуль system и метод makeThumbnail.

Как не пытаюсь вызвать его - не получается.
И через system_buildin_load и через  cmsController, ну и банально ::

Можно ли всё же как-нибудь его вызвать ?

7
Наполнение сайтов / За что не люблю UMI.
« : 22 Ноября 2012, 21:14:49 »
Пост гнева.

Долго-долго делал сайт.
Пользователь начал наполнять и говорит - не могу нормально сделать связанные товары (ссылка "дерево"), т.к. названия режутся.



Написал в umi, получил ответ:



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

Я очень быстро выяснил, что XML возвращается правильный, режется уже на стороне клиента. (Интересно, а почему не через json, ГЛЮЧИЛО что ли)
Быстро нашёл кучу неиспользуемого кода, кучу левых файлов, в итоге нашёл где это всё делается, поменял... И ничего не заработало. Пол дня матерился - ведь решение рядом, код вот он, больше нигде такого нет.
В итоге показывая заказчику в конце дня результаты мучений офигели от того, что у него РАБОТАЕТ. Оказывается хитро подключенный JS плотно сидел в кеше и даже порнорежим в chrome не спасал. Что бы обновить этот JS файл пришлось открыть его по прямой ссылке и обновить раз 10 пока не появился нужный(обновлённый) кодэ

День потеряна, задача решаемая за пять минут заняла целый день....



Системный код = JS выполняемый на клиентском уровне ?...

8
Custom макросы / UMIDump, relation и справочник
« : 02 Ноября 2012, 16:49:00 »
Здравствуйте.
Делаю выгрузку из 1с и не получается к полю привязать справочник.
Само поле создаётся, а как привязать справочник и выбрать какое-либо из его значений я не понял.

В документации пишется что-то вроде такого:
 <property name="order_items" type="relation" multiple="multiple">
          <title>Наименования заказа</title>
          <value>
            <item id="27816" name="Комбайн" type-id="756" ownerId="14" xlink:href="uobject://27816"/>
          </value>
        </property>
Выбрать значение всё же не получается.
Собственно вопросы: как подключить справочник БЕЗ выбора значения и с выбором конкретного значения.

9
Наполнение сайтов / Связка размер-цвет.
« : 22 Октября 2012, 14:39:17 »
Здравствуйте. Давайте поговорим :)
Предлагаю пообсуждать, пофантазировать на счёт одной очень интересной темы.... Говорят, мол правильно заданный вопрос уже несёт в себе ответ.

Никак не могу понять как лучше делать связку размер-цвет для нескольких товаров. Дать пользователю возможность выбора цвета-размера. Да ещё и предположим цены меняются в зависимости от цвета-размера.

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

Итак, у нас такая задача: есть следующие товары
ботинки синии 31 размер, ботинки синии 32 размер, ботинки синии 33 размер,
ботинки зелёные 31 размер, ботинки зелёные 32 размер, ботинки зелёные 35 размер.

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

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

Как лучше на umi сделать эту связку ?

Я лично вижу так:

1) выбираем один из объектов и привязываем к нему остальные ссылкой типа дерево. Остальные объекты выключаем. Остальные объекты нам нужно хранить для того, что бы считалось их количество и т.п....
Кликая по цветам/размерам на заднем фоне подменяем id объектов для добавления в корзину, ну и покупаем уже нужный товар (ведь через udata можно получить данные выключенных объектов по id). Но блин ссылка в корзине будет весьти к выключенному объекту... Ну обдумать можно.

Я склоняюсь к этому варианту, но мне кажется будет много запросов. Можно конечно раз в день/после синхронизации заполнять в основном объекте поля, но как-то не знаю....

2) создаём КАТАЛОГ "ботинки", в который уже помещаем эти все ботинки. 
Пользователь выбирает ботинки, подменяем ему id для добавления в корзину, ссылки из корзины видут на нужный объект, но он не будет связан с остальными объектами... Логично ведь, если выбирали ботинки, были различные цвета - вернуться надо туда же и что бы размер/цвет был уже выбран. Ну вроде можно сделать так, что когда module="catalog" method="object" - анализировать нужно ли получать parentId и делать getObjectList...... Т.е. нужно как-то определить, что делать - выводить только этот объект, получать родителя и искать "соседей",.....
Вроде бы это всё даже логичнее.... url конечно бешенный будет. каталог/объект...
Да и если один товар будет - для него так же нужно создавать категорию и кидать туда...  Или можно и без этого обойтись.
Или сделать вообще такую комбинацию -
ботинки\синие 31
ботинки\синие 32
ботинки\синие 33
ботинки\зелёные 32
ботинки\зелёные 33
ботинки\зелёные 35
балетки(объект каталога)
сланцы(объект каталога)

Написать макрос, смесь GetObjectList и getCategoryList, в котором будут выводиться И категории И объекты (они ведь суть есть наследники/дети для верхней категории), это вроде не сложный кастом.

3) используем опционные свойства в umi, через составные свойства. Вообще не вижу это решение. Всё, что связано с umi приходится переписывать и делать самому, поэтому пытаться понять это мой мозг просто отказывается.

Создаём тип данных "характеристики" с полями [цвет][размер][цена](ну или цену задать можно уже в объекте), разрешаем пользовать как справочник. Добавляем в наш тип данных, который объект каталога. Заходим, выбираем цвет-размер, дописываем цену. А как привязать к какому-либо складу ? А если складов несколько ?
Вот тут я вообще уже не вижу....

10
Здравствуйте.
Что-то я затупил и не могу решить задачу, хотя задача простая.

Мне нужно выбрать все активные объекты определённого типа из каталога.

$sel = new umiSelection;
$sel->addObjectType(169);
$sel->addElementType(48);

.... далее ещё добавляются различные параметры выборки в зависимости от переданных параметров - наличие/отсутствие свойства, порядок сортировки и т.п.....

Тут я указываю нужный мне тип объекта и тип элемента (базовый тип).

Добавляю $sel->addHierarchyFilter(4,10);

4 - id каталога, внутри которого я выполняю поиск.

После добавления этой строчки начинает выдаваться полная ересь. Выдаются объекты, которые лежат и вне каталога с id=4 и с типами отличными от нужного мне.

Убираю $sel->addElementType(48); , после этого начинают выдаваться объекты типа  <object id="2802" name="Гаврилов Посад" type-id="115" ownerId="10"/> и т.п., а не нужные мне страницы внутри нужного мне каталога.

Как же правильно написать такую выборку ?



$sel->addActiveFilter(true); так же не работает

11
Здравствуйте.

Подскажите пожалуйста как реализовать механизм истории изменений какого-либо поля. К примеру, адрес пользователя.  Пользователь многократно меняет адрес, мы запоминаем его текущий и бывшие адреса.

Каким образом его лучше хранить ? В каком типе данных представить ?


12
Здравствуйте.
Сохранил объекты в ссылке на дерево.
Сохранял umiHierarchy. umiHierarchy::getInstance()->getElement($blogId);
Пытаюсь вернуть ссылки на то, что я сохранил.
Получается, что сохранены у меня объекты umiHierarchyElement. Могу получить только id объекта - getObjectId, а получить id страницы, что бы дальше сформировать ссылку - не получается......

Собтственно вопрос -как получить ссылку, если есть umiHierarchyElement ?

13
Шаблоны XSLT / Изучаю UMI, XSLT.
« : 29 Мая 2012, 21:28:27 »
Здравствуйте. Помогите пожалуйста разобраться с XSLT шаблонами.
Я в целом только изучаю систему и разбираюсь, поэтому могу сильно ошибаться. Пожалуйста, поправьте если что.
На примере одного конкретного макроса я пытаюсь понять как в целом взаимодействовать с системой.
Сейчас в голове такая картина:
Для добавлении функционала какого-либо из модулей, нужно найти его описания http://help-dev.umi-cms.ru/. Найти макрос, который реализует нужный функционал. Если макрос должен выводить информацию – пишем шаблон <xsl:template match="udata[@module = 'МОДУЛЬ'][@method = 'метод']">, затем пишем шаблон для элементов item данного макроса.  Если макрос связан с вводом инфы -  точно так же <xsl:template match="udata[@module = 'МОДУЛЬ'][@method = 'метод']">, в описание шаблона создаём <form> </form>. К примеру, <form name="frm_editblogmsg" method="post" action="/blogs20/postEdit/{$post/pid}/do/" onsubmit="site.forms.data.save(this); return site.forms.data.check(this);"> отправляет новый пост.
Проясните пожалуйста 1) откуда взялась инфа  action, что делает …/do (интуитивно тут понятно, с фигурными скобками тоже ясно) 2) onsubmit – интуитивно понятно, что сохранить формы сайта, но хочется более подробно вчитать про такие конструкции.

Поставил такую задачу: тестовый демо-сайт demodizzy. Нужно добавить возможность пользователям создавать СВОИ блоги и видеть в users/settings созданные блоги. Использовать XSLT шаблоны.


1)Изучив документацию, я пришёл к выводу, что за добавление своих блогов отвечает %blogs20 editUserBlogs()%.
Первый трабл - Я не могу понять, как вставить TPL шаблон в %blogs20 editUserBlogs()% XSLT.
Выполняю в адресной строке udata/blogs20/editUserBlogs – получаю XML, где вижу список имеющихся блогов(скрин не делаю, ничего необычного). Выполняю blogs20/editUserBlogs – получаю Debug message for UC-pages http://my.jetscreenshot.com/12061/20120529-xx4u-80kb.jpg. Это говорит о том, что в шаблоне не описано как обрабатывать вызов этого модуля и метода. Добавляю в файл Default.xsl
<xsl:template match="result[@module = 'blogs20'][@method='editUserBlogs']" >
<xsl:apply-templates select="document('udata://blogs20/editUserBlogs')" />
   </xsl:template>
Теперь я получаю XML в теле сайта.  http://my.jetscreenshot.com/12061/20120529-hmme-114kb.jpg
Имеющийся вопросы: 1)Почему он не преобразовывается в HTML ?
Попытка ответа: Потому что нет описания для этого, необходимо добавить обрабатывание этой раздачи, т.е. шаблонизатор для module="blogs20" method="editUserBlogs", должен быть шаблон.
disable-output-escaping="yes"  тут не причём, это экранирование тегов, если уже готовый HTML выдаётся.
Я правильно понял ?
2) Смотрю как организован просмотр блогов. Предположим, я хочу добавить новое поле для блога. Добавляю поле, тип число. Просматриваю через сайт– его нет. Дописываю к адресу поста блога .xml – вижу, что новое поле таки формируется XML документом. http://my.jetscreenshot.com/12061/20120529-avhz-114kb.jpg
В голове появляется тень мыслей 1) выводятся только конкретные статичные поля 2) нужно ковырять как и где выводятся
Начинаю смотреть по коду, как организовывается вывод поста блога.  Нахожу такую строчку –
   <xsl:value-of select="document(concat('udata://blogs20/postView/',$document-page-id))/udata/content" disable-output-escaping="yes" />
concat('udata://blogs20/postView/',$document-page-id) это грубо говоря udata://blogs20/postView/95/ если 95 ID поста блога, а что возвращает в этом случае всё выражение с дописанном в конце document(…udata/content) ?
Ткните пожалуйста в читалку, это реальный пробел в моих знаниях, а голова уже кругом.
Анализируем дальше… udata://blogs20/postView возвращает пост без нового поля, которое я сам создал.  http://my.jetscreenshot.com/12061/20120529-coat-105kb.jpg
Вопрос: Как сделать так, что бы возвращались все поля ?
Я попробовал искать, где же уже есть подобный механизм… Нашёл в emarket/personal/ в персональной информации.. Смотрю код -  ссылается на users/settings: <xsl:apply-templates select="document('udata://user/settings')" />. Нахожу код этого фрагмента:
<xsl:template match="udata[@method = 'settings']">
<form enctype="multipart/form-data" method="post" action="{$lang-prefix}/users/settings_do/" id="con_tab_profile">
         <div>
            <label>
               <span>
                  <xsl:text>&login;: </xsl:text>
               </span>
               <input type="text" name="login" class="textinputs" disabled="disabled" value="{$user-info//property[@name = 'login']/value}" />
            </label>
         </div>
…… убеждаемся, что тут всё прописано статично – вот логин вывелся, &login;, что бы на разных языках подмена была… дальше статинчные поля… а вот поле расширенная информация – не статично, т.е. добавив в типе данных новое поле – оно тут появляется.
<xsl:apply-templates select="document(concat('udata://data/getEditForm/', $user-id))" />
В data/common-edit-form.xsl находим <xsl:template match="udata[@method = 'getCreateForm' or @method = 'getEditForm']"> и смотрим каким образом выводятся эти поля, которые мы добавляем сами. В файле data/properties.xsl понимаем, что там просто вычисляются значения этих полей и выводятся. <xsl:template match="property|fields/field//value">
      <xsl:value-of select="value" />
   </xsl:template>

Неужели для того, что бы автоматом выводить новые поля блога, придётся столько раскопать и сделать ? Пусть в стоящей предомной задаче это и не нужно, но в целях углублённой экскурсии в UMI CMS лишним не будет..


Страницы: [1]