Дмитрий Крахмалев

Дмитрий Крахмалев

С нами с 21 января 2014; Место в рейтинге пользователей: #459
Дмитрий Крахмалев
11 января 2017, 12:01
0
Когда активен плагин — все отлично прописывается. Но как только я пытаюсь программно сменить статус на Закрыт, он все равно прописывает как было до этого.
Для автора обращения вывожу кнопку «Закрыть обращение» при нажатии на которую происходит закрытие обращения, так вот статус меняется на 0-Закрыт но когда страница загружается стоит уже 1 — открыт, как было до этого.
Код кнопки:
//=================================================
	$ticket = $modx->resource;
	$ticketID = $ticket->get("id");
	$status = $ticket->getTVValue('Status');
	
	$user=$modx->getUser();
	//Смотрим а обладает ли пользователь правами закрывать обращения (админы или сам создатель)
	if ($ticket->get("createdby")==$user->get("id")){$isRules=1;}else{$isRules=0;}

if (isset($_POST["closeTicket"])){
	if ($status==0){
		echo "Обращение уже было закрыто!";
	}else
	{
		//Смотрим а обладает ли пользователь правами закрывать обращения (админы или сам создатель)
		if ($isRules=1){

			//Оставляем комментарий (для этого получаем ссылку на ветку)
			$thread = $modx->getObject('TicketThread', array('resource' => $ticketID));
			$threadID = $thread->get('id');

		    $comment = $modx->newObject('TicketComment');
			$comment->set('thread', $threadID);
			$comment->set('text', 'Пользователь '.$user->get('username').' закрыл данное обращение.');
			$comment->set('raw', 'Пользователь '.$user->get('username').' закрыл данное обращение.');
			$comment->set('name', 'Оповещение системы');
			$comment->save();


			$modx->resource->setTVValue('Status',0);
        	$modx->resource->set('status', 0);
			echo $modx->resource->get('status');
			$modx->resource->save();
			$modx->resource->clearCache();
			echo "<div class='alert alert-success' role='alert'>Данное обращение было закрыто пользователем ".$user->get('username')."!</div>";
		}
	}
}
else{	
//Если не нажимали на кнопку показываем форму (если пользователь - автор Обращения)
  if (($isRules=1) and ($status!=0)){
	  echo "

			<div class=\"panel panel-default\" id=\"closeTicketPanel\">
			  <div class=\"panel-body\">
				  <form method=\"post\" action=\"[[~[[*id]]]]\" name=\"closeTicketForm\">
					  <input type=\"hidden\" name=\"ticketId\" value=\"[[*id]]\" />
					  <input type=\"submit\" name=\"closeTicket\" id=\"closeTicket\" value=\"Закрыть обращение\" />
				  </form>
			  </div>
			</div>
	  ";
  }
}
Дмитрий Крахмалев
11 января 2017, 11:58
0
Код плагина:
<?php
switch ($modx->event->name) {
    case 'OnMODXInit':
        // Загружаем наше поле в модель ресурса
        $modx->loadClass('modResource');
        $modx->map['modResource']['fields']['status'] = '0';
        $modx->map['modResource']['fieldMeta']['status'] = array(
            'dbtype' => 'tinyint',
            'precision' => 1,
            'phptype' => 'integer',
            'null' => false,
            'default' => '0',
        );
        $modx->map['modResource']['fields']['prior'] = '1';
        $modx->map['modResource']['fieldMeta']['prior'] = array(
            'dbtype' => 'tinyint',
            'precision' => 1,
            'phptype' => 'integer',
            'null' => false,
            'default' => '1',
        );
        break;
    case 'OnDocFormSave':
        // Сохраняем ТВ в поле таблицы ресурса
		$status=$resource->getTVValue('Status');
		$prior=$resource->getTVValue('prior');
		if (isset($status))  {$resource->set('status',$status);}
        if (isset($prior))  {$resource->set('prior', $prior);}
        $resource->save();
		
        break;
}
Дмитрий Крахмалев
08 декабря 2016, 14:08
1
+1
Может кому то будет полезным, решил задачу путем создания пустышки чанка формы оставления комментария и указании его если статус = 0 (закрыт)
[[!*Status:is=`0`:then=`[[!TicketComments? &depth=`5` &tplCommentForm=`noTicketNewCommentForm`]]`:else=`[[!TicketComments? &depth=`5`]]`]]
Дмитрий Крахмалев
03 сентября 2015, 17:52
0
До этого пользовался Properties но с фильтром так и оставалась проблема. в сниппете обходил и сверял с нужным значением и если подходило под условие выводил…
Данную статью bezumkin.ru/sections/tips_and_tricks/657/ читал но так и не пойму есть ли у кого уже нароботки по фильтрации тикетов по этим полям или нет
Дмитрий Крахмалев
13 июня 2015, 09:55
0
Проверки выложил в отдельный сниппет, так как стандартными средствами MODX при ветвлении условий более 3х уровней начинаются глюки.

Код сниппета isSelectExecutor представлен ниже:
<?php
$user=$modx->getUser();
$order_user_id=(int) $modx->getOption('order_user', $scriptProperties, -1);
$priceByIspolnitel=(int) $modx->getOption('priceByIspolnitel', $scriptProperties,0);
$comment_user_id=(int) $modx->getOption('comment_user', $scriptProperties, -1);
$user_price=(int) $modx->getOption('user_price', $scriptProperties, 0);
$url= $modx->getOption('url', $scriptProperties,'');

$vibor_link="<span class='vibor_ispolnitel'><a href='".$url."'>ВЫБРАТЬ ИСПОЛНИТЕЛЯ</a></span>";

if (($url<>'') and ($order_user_id<>-1) and ($comment_user_id<>-1) ){
   if (($user->get('id')== $order_user_id) and ($user->get('id')!= $comment_user_id)){
       if ($priceByIspolnitel==0){
            echo $vibor_link;    
       }else{
           if ($user_price>0){echo $vibor_link; }
       }
   }
   
   
   
}
Дмитрий Крахмалев
11 июня 2015, 21:17
0
Кажется разобрался… дело было в том что сохранение и очистка кэша была после return. Поправил, все очистилось успешно!

$ticket ->setTVValue('status', 'В исполнении');
                $ticket->save();
                $ticket->clearCache();
                return "
                <h2>Исполнитель успешно привязан к заданию!</h2>
Дмитрий Крахмалев
11 июня 2015, 20:45
0
Вопрос по getTickets. Я передаю в параметры снипета допустимые TV поля, и они почему то в этом документе не обновляются. Они что кэшируются? Как их сбросить я что то вообще не понимаю. На всех страницах поле дополнительное выводится, а вот на странице, которая обрабатывалась через getTicket поле пустое, как до изменения…
Или как сделать тикеты по умолчанию не кэшируемыми… хотя из за одного поля это глупо. Это поле определяет Статус, по умолчанию оно пустое, а позже когда нажимаю Выбрать исполнителя статус присваивается «В исполнении». На всех страницах он отображается а на странице заказа нет… спасает полная очистка кэша.
Дмитрий Крахмалев
09 июня 2015, 19:06
0
хм… впринципе я что то даже совсем не подумал об этом! вот только тогда кэш в браузере наплодится… а этого не хочется. если только попробовать делать при смене изображения еще и количество обновлений фона в профиль загонять. и выводить изображение с этой цифрой. тогда не будет постоянно картинка в кэше плодится. но дополнительную информацию хранить придется.
Дмитрий Крахмалев
09 июня 2015, 18:44
0
а сброс кэша страницы сбрасывает только закэшированную структуру страницы, или еще и все кэши использованных на данной странице изображений удаляются? Может каким то образом нужно очишать кэш именно рисунка… но вообще не представляю как.
Дмитрий Крахмалев
09 июня 2015, 18:42
0
Попробовал вывести все что в сессии хранится, кроме идентификатора пользователя, политик и групп ничего по профилю пользователя не встретил
Дмитрий Крахмалев
09 июня 2015, 18:39
0
Чистить ключ сессии… а как его обновить затем. или перетереть путем к изображению сразу же. Просто стал замечать что если другие пользователи тоже сменили свой фон и к ним зайти в профиль то тоже может не сразу показать, а это уже не в сессиях хранится.
Дмитрий Крахмалев
09 июня 2015, 18:37
0
Аналогичная ситуация. до ручной перезагрузки страницы не изменяется.
<?php
$resource=$modx->getObject('modResource',2);
$resource->clearCache();
    $resource->_contextKey = $resource->context_key;
    $cache = $modx->cacheManager->getCacheProvider($modx->getOption('cache_resource_key', null, 'resource'));
    $key = $resource->getCacheKey();
    $cache->delete($key, array('deleteTop' => true));
    $cache->delete($key);
Может ли это быть связано с редиректом используя Javascript или нет.
setTimeout('document.location.href="[[~2]]"', 2000);
Может стоит через makeurl и Redirect modx попробовать…
Дмитрий Крахмалев
09 июня 2015, 18:29
0
А информация профилей юзеров не кэшируется в modx или ее тоже нужно очищать?.. а то может поле extended тоже берется из кэша…
Дмитрий Крахмалев
09 июня 2015, 18:28
0
Так же хочу добавить, что структура хранения изображений пользователей определена как вложенность
uploads/[[#ID пользователя]]/bg.jpg. Меняются только ID пользователей, а для одного профиля новый фон так и остается с таким же именем файла. сделано это чтобы фоновые изображения не переполняли диск, да и нет смысла в названии файла подругому. Единственное что может быть изменно в имени это расширение файла.
Может эта информация будет важна. Имя файла остается неизменным.
Никаких phpthumbof не использую. программно произвожу обрезку изображение через php сценарий в момент орбаботки загружаемого файла.
Дмитрий Крахмалев
21 февраля 2014, 13:32
0
Разобрался. Может кому пригодится. Делается так
1) указывается input-TV-type listbox
2) в Input Option Values заносим
@SELECT  CONCAT_WS ('  -->  ', `from`, `to`) as `route`,`id` FROM `modx_taxi_routes`
с указанием своих полей из своей таблицы

p.s CONCAT_WS я просто использовал для объединения полей откуда и куда.
Дмитрий Крахмалев
15 февраля 2014, 11:13
0
У меня тоже на интернет магазине база сделана изначально была на migx. потом все переделал на migxdb чтобы доработать импортер. он у меня все характеристики товаров загружал параллельно с загрузкой товаров. Тоже товаров прилично и не тормозило. но опять же тут запрос происходит с фильтрацией по товару. тоесть если отталкиватся от одного товара то там и не так уж много характеристик, и опять же не столько содержит информации как статьи и новости. На новостном же портале может находится десятки тысяч новостей с достаточно объемным содержимым.
Ну думаю там тоже благодаря getPage и других результаты будут отсекатся. так что дуамю сильной нагрузки наверно не возникнит. Если конечно же взять для этих целей нормальный хостинг.
Кстати по поводу хостинга. Сайт будет выводится как главный сайт города а следовательно со временем посетителей будет прилично. Какой производительности хостинга для этих целей будет достаточно… Обычно я обходился самым дешевым хостингом от beget.
Дмитрий Крахмалев
14 февраля 2014, 08:39
0
А MIGXDB участвует в выводе элементов? вывод же поидее не через процессоры а через pdo или xPDO будет осуществлятся… я вот просто думаю что migxdb наложет свой отпечаток в админке, а на самом сайте не знаю. вот и спрашиваю.
Компоненты сам писать пока так и не получилось. Проблема встала именно с разработкой CMP. не все понятно. Migxdb делает это за нас. я так понял смысл там такой же то что он генерирует и схему и классы
Дмитрий Крахмалев
03 февраля 2014, 17:45
0
Клево! Спасибо! Так то xPDO и не так то страшен) особенно когда начинаешь работать с самой базой данных
Дмитрий Крахмалев
03 февраля 2014, 17:38
0
Спасибо! то что нужно. А можно одновременно использовать и id с первичным ключем автогенерируемый, и потом прописать двойной индекс. Просто если сделать без id, то в таблице заказа такси предется тоже предусмотреть 2 поля откуда и куда. Что приведет к переизбыточности информации.
Дмитрий Крахмалев
03 февраля 2014, 16:31
0
Разверни в дереве элементов сниппеты, там будет в категории Minishop все снипеты которые можно использовать. Также и с Чанками.
Я на своем сайте немножко изменил сниппет оформления заказа. разбил на 2 плейсхолдера, и сделал чтоб форма заказа показывалась в отдельном окне через colorbox.
Вот можешь тут взглянуть. могу подсказать че как если не разберешься