TicketComments: сохранение комментария

Здравствуйте! В ходе работы с дополнением Tickets возникла следующая проблема.
Есть страница — Конкурсы. Она представляет из себя простой документ. Наполняется она следующим образом:
[[!pdoPage?
	&element=`getTickets`
	&tpl=`tmpl.Tickets.competitions.row`
	&parents=`155`
	&includeTVs=`competitionConditions`
	&includeContent=`1`
	&sortby=`{"publishedon":"DESC"}`
	&limit=`1`
]]
На странице должен демонстрироваться последний из добавленных конкурсов.
155 — айди конкурсного раздела с тикетами. Задумка такова, что каждый конкурс представляет из себя тикет в этом разделе. Здесь проблем нет. competitionConditions — композитный tv-параметр, созданный с использованием MigX — с его помощью я вывожу список правил для каждого конкурса.
Что вполне успешно и происходит на одной из вкладок моего шаблона tmpl.Tickets.competitions.row:
<!-- begin tab 1 -->                                
	<div class="competitions_rules tab" id="tab_1">
		<ul>
			[[!getImageList?
				&tvname=`competitionConditions`
				&tpl=`tmpl.MIGX.cConditions`
				&limit=`all`
				&docid=`[[+id]]`
			]]
		</ul>
	</div>
<!-- tab 1 eof -->
На второй вкладке должны публиковаться «конкурсные работы». Я решил их реализовать через премодерируемые комментарии, вызывая сниппет TicketComments в оболочке pdoPage:
<!-- begin tab 2 -->                                
	<div class="competitions_works tab hide" id="tab_2">
		<ul>
			<li>
				[[!pdoPage?
                    	        	&includeTVs=``
                    	        	&element=`TicketComments`
                    	        	&parents=`[[+id]]`
                               	 	&tplComments=`tmpl.Tickets.competition.entries` 
                                	&tplCommentForm=`tmpl.Tickets.competition.form`
                                	&tplPageFirst=`@INLINE <li class="first"><a href="[[+href]]"></a></li>`
                   	        	&tplPageFirstEmpty=`@INLINE <li class="first inactive"><a href="javascript:void(0);"></a></li>`
                   	        	&tplPageLast=`@INLINE <li class="last"><a href="[[+href]]"></a></li>`
                   	        	&tplPageLastEmpty=`@INLINE <li class="last inactive"><a href="javascript:void(0);"></a></li>`
                   	        	&tplPagePrev=`@INLINE <li class="control"></li>`
                   	        	&tplPageNext=`@INLINE <li class="control" style="display: none"><a href="[[+href]]" id="pageNext"></li>`
                   	        	&tplPagePrevEmpty=`@INLINE <li class="control"></li>`
                   	        	&tplPageNextEmpty=`@INLINE <li class="control"></li>`
                   	        	&limit=`3`
                   	        	&sortby=`{"publishedon":"DESC"}`
                                	&formBefore=`0`
                                	&autoPublish=`0`
                                	&allowGuest=`0`
                                	&allowGuestEdit=`0` 
                                	&fastMode=`0`
                            	]]
                    	</li>
                </ul>
		<!-- begin page navigation -->    
                	<div class="page_navigation">                            
                		<ul>
                            	      [[!+page.nav]]
                 		</ul>
                	 </div>
		<!-- page navigation eof -->                                    
	</div>
<!-- tab 2 eof -->
И здесь возникает проблема. При попытке добавить комментарий/«конкурсную работу», они добавляются на страницу, с которой вызван сниппет TicketsComment. При этом, в документе закладки «Комментарии» не появляется (потому, что документ не является контейнером с тикетами?). Комментарий можно отследить лишь через Приложения --> Тикеты.
Вопрос: можно ли при вызове TicketsComment указвать конкретный тикет, к которому «привяжутся» комментарии?
Я попытался решить это указанием &parents=`[[+id]]` (как в вызове geiImageList &docid=`[[+id]]`). Пробовал задать &thread=`[[+id]]` — и это тоже не помогло.
Буду благодарен за советы или объяснения.
Денис Райх
10 декабря 2014, 07:46
modx.pro
3 108
0

Комментарии: 11

Наумов Алексей
10 декабря 2014, 12:11
+1
Не очень охота читать так много кода и текста, но прочитав «проблему» в конце пара замечаний:

1. Комментарии добавляются не к странице, а к thread, который может быть, например, page-155, или mycustomthread, в общем какой угодно. Поэтому на одной странице вы можете вывести разные комментарии, из разных thread…
2.… но в тоже время вроде нельзя делать несколько вызовов TicketsComment, т.к. вроде возникает проблема в javascript =)

короче смотрите что такое thread, и как это устроено в БД.
    Денис Райх
    11 декабря 2014, 02:20
    0
    Большое спасибо за совет. Попробую повозиться со значениями &thread и погляжу, что получится.
    Денис Райх
    11 декабря 2014, 06:13
    0
    Проблема с выводом комментариев из треда разрешилась: я реорганизовал структуру и теперь вызываю TicketComments с детальной страницы тикета, а не со сторонней страницы. В таком случае, комментарии привязываются к нужному тикету. Да это и логичнее.
      Денис Райх
      11 декабря 2014, 07:01
      0
      Продолжая тему: возникла необходимость в изменении стандартной формы комментария. Я хочу добавить туда два поля: «Название работы» и «Ссылка на работу». Причастившись к мудрости Василия — параграф «Расширение комментариев» — я попытался повторить описанное выше.
      1)В форме комментирования добавил поле ввода:
      <input name="competitiveName" id="competitiveName" placeholder="">
      2)В тексте TicketComments прописал:
      /*PLUGIN*/
      if ($modx->event->name == 'OnBeforeCommentSave') {
      
       $properties = array(
        'competitiveName' => $modx->stripTags($_POST['competitiveName'])
       ); 
      
       $modx->event->params['TicketComment']->set('properties', $properties);
      };
      /*PLUGIN EOF*/
      3)В чанке вывода комментариев определил:
      <div class="work_field">Название работы:<span>[[+properties.competitiveName]]</span></div>
      Результат нулевой. Подозреваю, что разместил код плагина совсем не в том месте, где нужно — я поглядел код сниппета, и нигде не обнаружил конструкции ($_POST['*variableName*']), что только утвердило меня в подозрении — я туплю.
      Пожалуйста, посоветуйте, как правильно поступить? Где разместить код плагина?
      P.s.: Единожды поняв принцип, будет намного легче расширять функционал по аналогии.
      Алексей
      21 ноября 2016, 07:45
      0
      Как не давать сохранять комментарий, если в тексте есть матерки? -) Такая авто-модерация коммента. И выдавать всплывающую ошибку «будьте более лаконичны в своем комментарии».
      По сути я пробовал возвращать false в плагине на событие «OnBeforeCommentSave» но коммент все равно сохраняется в БД.
      Подскажите, как правильно фильтровать такие комменты?
        Денис Райх
        21 ноября 2016, 08:06
        0
        «Как правильно» я подсказать не могу.
        Почему бы не попробовать фильтровать содержимое комментария на фронтэнде, вовсе до отправки на сервер?
        Либо перезаписывать содержимое комментария уже после записи («OnBeforeCommentPublish», «OnCommentSave»), основываясь на результате, возвращённым Вашим мат-фильтром.
        Василий Наумкин
        21 ноября 2016, 09:30
        +1
        Если плагин возвращает false, то MODX считает это ошибкой работы плагина и пишет в лог. А так, никаких значений они не возвращают.

        Если хочешь сгенерировать ошибку, то нужно сделать так:
        $modx->event->output('Ошибка!');
        Ну и погляди в энциклопедии значение слова "лаконичный" — оно не про матерки.
          Алексей
          21 ноября 2016, 11:56
          0
          Да все верно! лаконичность не про то… Большое спасибо за наводку в плагине!
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        11