Борис И

Борис И

С нами с 20 апреля 2014; Место в рейтинге пользователей: #71
Борис И
23 ноября 2014, 20:49
0
Спасибо за быстрый ответ.
А что даст проверка на контекст и новое условие media_source?
Как я понимаю, при отправке с фронта, tickets назначает реальную папку (id ресурсу) только после отправки и сохранения ресурса, плагин срабатывает раньше, а в это время пути к картинкам ведут еще на нулевой ресурс assets/images/tickets/0/имяфайла.png

По вашей подсказке сделал срабатывание плагина только для авторизованных в mgr, что в моем случае частично решает проблему (обычные пользователи, отправляют статьи на проверку (плагин не срабатывает и не прописывает «кривые пути»), а уже менеджер заходит в админку проверяет, публикует и сохраняет (срабатывает плагин и прописывает корректный путь))

if($modx->context->get('key') == 'mgr') {
    $tv = $modx->getOption('TV',$scriptProperties,'firstImage');
    $img = $resource->GetTVValue($tv);

    if(empty($img)) {
         $def_img ='template/default.png';
         $media_source = '/assets/images/tickets/';
         $text = $resource->content;
    
         if (preg_match_all( '|<img.*?src=[\'"](.*?)[\'"].*?>|i',$text , $matches )!=0)	{$img = $matches[1][0];}
         else {$img = $def_img;}
    
         $img = str_replace($media_source, '', $img);
         $resource->setTVValue($tv,$img);
    }
}
Решение получается не универсальное, куда копать дальше?
Есть ли возможность запустить плагин после срабатывания tickets ( когда пути уже ведут на реальный, а не на нулевой ресурс)
Борис И
23 ноября 2014, 12:50
0
Здравствуйте, нашелся маленький недочет. Если добавлять ресурс с фронта. То путь до картинки подтягивает к 0 папке (ресурсу).
Картинкам в Tickets уже после отправки прописывается реальный id, а сначала он 0. Если знаете, подскажите пожалуйста как исправить.
Сейчас приходится заходить в админку, удалять путь к картинке и заново сохранять, чтобы опять сработал плагин и прописался нормальный путь.
Борис И
09 ноября 2014, 14:40
0
Василий, прошу прошения, пишу в выходной и с глупыми вопросами.
В первый вызов страница не из кэша, получается что стили подключены дважды, самим сниппетом и мной, а вот после попадания в cache остаются только те, которые подключил я сам.
Само по себе это не страшно, но в первый раз некрасиво.

Борис И
09 ноября 2014, 12:08
0
Василий, это можно как либо обойти, сейчас подключаю вручную, но это неправильно. Ладно бы, дело было только в star_rating, но Tickets и pdoTools два основных компонента на сайте.
Изначально вызывал не кешированный pdoPage, что тоже быстро, но он же с кэшем просто сказка (почти в два раза быстрее быстрого).
Куда копать, чтобы Tickets подключил стили и скрипты в связке с кэшируемым pdoPage и они попали в итоговый cache.
Борис И
07 ноября 2014, 21:35
0
Попытался вообще убрать все подключаемые файлы js, ситуация не изменилась. Без cache все отлично, как только попадает в кэш, летят все стили, подключаемые автоматически Tckets и star_rating. Если их добавь в ручную то все ОК. Как то это не правильно, да и не подключается TicketsConfig. В общем ничего не изменилось. Уже несколько дней бьюсь, пока безрезультатно.
Борис И
06 ноября 2014, 16:05
0
Полностью с вами согласен, решение кривое, но решение. Если найдете правильное решение, напишите пожалуйста, может пригодиться многим.
Борис И
06 ноября 2014, 14:05
0
Здравствуйте. Ответить точно я не могу, но могу привести свой пример.
У меня в форме есть доп. поля (tv, например поле model ) которые пользователь заполняет сам, я их не подцепляю.
Вот пример вызова, обратите внимание на &allowedFields=`longtitle,fullname,model,introtext,avtor`
[[!TicketForm? &requiredFields=`longtitle,model,introtext` &allowedFields=`longtitle,fullname,model,introtext,avtor` &redirectUnpublished=`63` &parents=`[[!get?]]` &tplFormCreate=`tpl.Tickets.form.create1` ]]
В шаблоне формы tpl.Tickets.form.create1 участок отвечающий за model. Сделал, абсолютно также как остальные стандартные поля.
<div class="form-group">
		<label for="ticket-model">[[%ticket_model]]</label>
		<input type="text" class="form-control" placeholder="[[%ticket_model]]" name="model" value="" maxlength="50" id="ticket-model"/>
		<span class="error"></span>
	</div>
Ну и добавил подпись в словарь.
Все работает и введенные поля (tv) успешно отправляет.

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

Борис И
04 ноября 2014, 21:53
0
Здравствуйте. Если я вас правильно понял, то вот костыли.
1. форму для публикации тиккета выводим так (понятно, что используемые и необходимые поля у каждого свои )

[!TicketForm? &requiredFields=`longtitle,introtext` &allowedFields=`longtitle,fullname,introtext` &redirectUnpublished=`ваш id` &parents=`[[!get?]]` &tplFormCreate=`tpl.Tickets.form.create1` ]]
2. сниппет [!get?]]
<?php
return $_GET[parentcat];
3. часть шаблона tpl.Tickets.form.create1 отвечающая за выбор категории (рекомендую изначально сделать копию оригинального шаблона (например тот же tpl.Tickets.form.create1) и уже туда добавлять код)
<script>
    window.onload = function() 
    {$("#parentcat [value='[[!get?]]']").attr("selected", "selected");}
</script> 
<form  action="" id="ticketFormcat" method="get" >
        <div class="form-group">
	    	<label  for="ticket-sections">Ваше название</label>
                <select name="parentcat" class="form-control" id="parentcat" onchange="if (this.selectedIndex) this.form.submit ()">
                        <option value="" ></option>
                        [[pdoMenu?
                        &parents=`0`
                        &level=`1`
                        &firstClass=``
                        &lastClass=``
                        &hereClass=``
                        &outerClass=``
                        &tplOuter=`@INLINE [[+wrapper]]`
                        &tpl=`@INLINE <option value="[[+id]]">[[+menutitle]]</option>`
                    ]]
            </select>
        </div>
    </form>
Принцип работы
У сниппета TicketForm есть возможность выбора родителя откуда выводить: &parents Вот туда мы будем подставлять значение из выбранного селекта (категории). Мы выбираем селект (категории — выводимый с помощью pdoMenu), форма отправляется по выбору селекта (onchange=«if (this.selectedIndex) this.form.submit ()»). Сниппет [[!get?]] ловит отправленное значение (id) формы (id категории), по выбранному нами селекту (категории) и подставляет его в TicketForm &parents=`[[!get?]]`. Так, как после автоматической отправки формы, по выбору селекта страница перезагружается и он сбрасывается, то скриптом $("#parentcat [value='[[!get?]]']").attr(«selected», «selected»); устанавливаем выбранное значение, чтобы не путать пользователя.
Как следует, не потестил, но пока вроде работает.

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

Приветствуются любые правки, переделки и оптимизация.
Борис И
04 ноября 2014, 15:38
0
Большое спасибо, ваше решение однозначно лучше. Единственное, добавил правило OnDocFormSave, иначе не срабатывало (тиккеты уже опубликованы, открывал и пересохранял их чтобы сработал плагин).
Борис И
20 сентября 2014, 22:59
0
unihost 264 руб (виртуальный — мастер+)
0.0011010: Created inline chunk
0.3912332: Total time
6 291 456: Memory usage
adminvps 6$ (виртуальный — Standart)
0.0007169: Created inline chunk
0.1967750: Total time
4 194 304: Memory usage
Борис И
21 июня 2014, 21:10
0
Спасибо, обновился и гадость пропала. Но, нашелся плагин Core Services который перед закрывающимся тегом body добавляет ссылки на всякие нехорошие сайты. Удалил его, надеюсь на этом бой с гадостью завершен. Странно, только одно, стояла версия modx 2.2.11, значит в ней тоже дыры