Уходит в бесконечное сохранение, как исправить?

Есть плагин что при сохранение ресурса делает действия, и потом сохраняет. И всё время выходит эта ошибка.
[2022-03-02 14:53:26] (ERROR @ /var/www/vhosts/site.kz/httpdocs/core/components/migx/model/migx/migx.class.php: 1860) PHP warning: json_decode() expects parameter 1 to be string, array given

Но если я отключу один плагин, то оно сохраняет нормально, хотя в этом плагине я проверял данные поступают как строка.
Когда этот плагин отключен, сохраняется нормально, но эта ошибка всё ещё выходит.
<?php
switch ($modx->event->name) {
    
    case 'OnDocFormSave':

        if ($resource->get('template') == 3 && !empty($resource->getTVValue('reviews'))) {
            $activeReviews = 0;
            $totalActiveRating = 0;    
            $avgRating = 0;
            try {

                try {
                    $reviews = json_decode($resource->getTVValue('reviews'), true);
                    $modx->log(1, gettype($resource->getTVValue('reviews')));  
                    
                    if($reviews){
                        foreach($reviews as $key => $value){
                            if($value['is_active'] == '1'){
                                $activeReviews += 1;
                                $totalActiveRating += $value['rating'];
                            }
                        
                        }
                        
                        $avgRating = $totalActiveRating / 5;                        
                    }

                } catch(Exception $e) {
                    $avgRating = 0;
                    $modx->log(1, 'Бред 0');
                    $modx->log(1, $e);                    
                }
                try {
                    $resource->setTVValue('ratingCount', $avgRating);
                    $resource->setTVValue('activeReviewsCount', $activeReviews);
                } catch(Exception $e) {
                    $modx->log(1, 'Бред 1');
                    $modx->log(1, $e);
                }                    
            }
            catch(Exception $e) {
                $modx->log(1, 'Бред 2');
                $modx->log(1, $e);
            }            

        }
}
При этом данные в tv reviews
Были записаны так
$ar = json_decode($reviews->get('value'), true);

$new_id = (empty($ar)) ? 1 : intval($ar[count($ar)-1]['MIGX_id'])+1;

array_push($ar, array(
      'MIGX_id' => $new_id,
      'full__name' => $name,
      'rating' => $rating,
      'text' => $review,
      'is_active' => 0,
));    
 
$tvcid = $modx->getObject('modTemplateVar',array('id'=> 25));       // Указываем имя нужного TV
$tvcid->setValue($currentResourceId, json_encode($ar));       // Записываем в TV значение
$tvcid->save();
Viktor
02 марта 2022, 11:56
modx.pro
173
0

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

Viktor
02 марта 2022, 11:57
0
Как вообще понять где берётся эта ошибка, есть там где она возникает, но ведь где-то должен быть место откуда его вызывают, допустим как в случае с js и dev tools
    Евгений Webinmd
    02 марта 2022, 14:56
    0
    включаете отображение ошибок, я дописываю в htaccess.
    php_flag display_startup_errors on
    php_flag display_errors on
    php_flag html_errors on
    Открываете консоль браузера на вкладке Сеть (Network), очищаете там все, чтобы было удобно. Нажимаете Сохранить ресурс, смотрите что там не так
    Артур
    02 марта 2022, 20:43
    0
    Вот тут
    $ar = json_decode($reviews->get('value'), true);
    ты получаешь уже имеющиеся отзывы из ресурса $reviews.
    А вот тут
    $tvcid->setValue($currentResourceId, json_encode($ar));
    Ты устанавливаешь значение чего? $tvcid объект класса modTemplateVar, и он не хранит значение переменной шаблона. Мне кажется надо устанавливать значение переменной в объект $reviews.
      Viktor
      03 марта 2022, 08:52
      0
      Да а если нет он создаёт, и отображает правильно созданный элемент, и даже когда уже есть элементы он правильно всё подставляет, но при попытки сохранить(новые изменения в уже созданных таким методом) таким образом созданные Migx уже уходит в бесконечное сохранение. Да до этого я делал правильно через resource и так далее, но беда в том что это должно работать с авторизированными людьми у которых нет прав на что либо кроме лоад и т.д
        Артур
        03 марта 2022, 23:09
        0
        Не понимаю причём тут авторизованные люди. Вы можете в объект modx добавить любого пользователя. А что касается MIGX, то указывать MIGX_id необязательно, он подставиться автоматически, возможно и из-за этого проблема. И лучше всё же сделать через ресурсы.
          Viktor
          04 марта 2022, 09:23
          0
          Если делать через ресурсы, то человек без прав не может создать migx запись, поэтому пришлось делать так. Всё равно не помогает
            Viktor
            04 марта 2022, 10:33
            0
            Вот это работает и записывает данные
            $tvcid->setValue($currentResourceId, json_encode($ar));
            но поменял на это
            $tvr = $modx->newObject('modTemplateVarResource');
            $tvr->set('tmplvarid', 25);
            $tvr->set('contentid', $currentResourceId);
            
            $tvr->set('value', json_encode($ar));
            $tvr->save();
            MIGX_id обязательно нужно ставить, иначе сам он не подставляет именно в код
            И всё так же уходит в бесконечное сохраннее если этот плагин включен
            <?php
            switch ($modx->event->name) {
            	
            	case 'OnDocFormSave':
            		if ($resource->get('template') == 3 && empty($resource->getTVValue('reviews'))) {
            			$resource->setTVValue('ratingCount', strval(0));
            			$resource->setTVValue('activeReviewsCount', strval(0));
            		}
            		elseif ($resource->get('template') == 3 && !empty($resource->getTVValue('reviews'))) {
            			$activeReviews = 0;
            			$totalActiveRating = 0;    
            			$avgRating = 0;
            
            			try {
            				$reviews = json_decode($resource->getTVValue('reviews'), true);
            				
            				if($reviews){
            					foreach($reviews as $key => $value){
            						if($value['is_active'] == '1'){
            							$activeReviews += 1;
            							$totalActiveRating += $value['rating'];
            						}
            					}
            					
            					$avgRating = $totalActiveRating / 5;                        
            				}
            				$resource->setTVValue('ratingCount', strval($avgRating));
            				$resource->setTVValue('activeReviewsCount', strval($activeReviews));
            			} catch(Exception $e) {
            				$modx->log(1, 'Бред 0');
            				$modx->log(1, $e);                    
            			}
            
            
            		}
            
            }
          Константин Ильин
          04 марта 2022, 12:20
          0
          Гляньте:
          1. ошибка в Консоли браузера
          2. ошибка в Логе modx
          3. ошибка в Логе Сервера
          4. Если зайти в Админке, в ресурс, MIGX нормально показывает? Это вопрос про ошибку на 1860 строке prnt.sc/3CQsst937gOr
          5. Попробовать(естественно с переделками) данный код в Console
            Viktor
            07 марта 2022, 06:36
            0
            1)500
            2)Пусто
            3)Уже не стал смотреть
            4)Да нормально
            5)Удалил этот плагин и сделал как снипет
            <?php
            $currentResourceCacheName = "reviews".$modx->resource->id;
            
            if ($modx->cacheManager->get($currentResourceCacheName)) {
                $output = $modx->cacheManager->get($currentResourceCacheName);
            }else{
            
                $activeReviews = 0;
                $totalActiveRating = 0;    
                $avgRating = 0;
            
                try {
                    $reviews = json_decode($modx->resource->getTVValue('reviews'), true);
                    
                    if($reviews){
                        foreach($reviews as $key => $value){
                            if($value['is_active'] == '1'){
                                $activeReviews += 1;
                                $totalActiveRating += $value['rating'];
                            }
                        }
                        
                        $avgRating = $totalActiveRating / $activeReviews;                        
                    }
                    
                } catch(Exception $e) {
                    $modx->log(1, 'Бред 0');
                    $modx->log(1, $e);
                }
            
            
            
                $output = strval($activeReviews).','.strval($avgRating);
                $modx->cacheManager->set($currentResourceCacheName, $output, 36000);
            }
            
            return $output;
              Viktor
              07 марта 2022, 09:43
              0
              Но что-то мне подсказывает проблема в этом плагине, когда его отключаешь всё работает, пытался установить phpthumb с включенном этим плагином не получилось.
              <?php
              /**
              
               * Generate Webp image format
               * 
               * Uses either Imagick or imagewebp to generate webp image
               * 
               * @param string $file Path to image being converted.
               * @param int $compression_quality Quality ranges from 0 (worst quality, smaller file) to 100 (best quality, biggest file).
               * 
               * @return false|string Returns path to generated webp image, otherwise returns false.
               */
              
              
              if(
              	$modx->event->name == 'OnSiteRefresh' ||
              	$modx->event->name == 'OnTemplateSave' ||
              	$modx->event->name == 'OnChunkSave' ||
              	$modx->event->name == 'OnPluginSave' ||
              	$modx->event->name == 'OnTemplateVarSave' ||
              	$modx->event->name == 'OnDocFormSave' ||
              	$modx->event->name == 'OnSnippetSave'
              ) {
              	$options= [xPDO::OPT_CACHE_KEY=>'webp_on_page']; // Clear webp modx cache
              	$modx->cacheManager->clean($options);
              }
              
              function jcphp01_modx_custom_generate_webp_image($file, $compression_quality = 80)
              {
                  
                  
                  $fileWithBasePath = preg_replace("~\/(?!.*\/)(.*)~", '', MODX_BASE_PATH) . $file;
                  
                  // check if file exists
                  if (!file_exists($fileWithBasePath)) {
                      return false;
                  }
              
                  // If output file already exists return path
                  $output_file = $file . '.webp';
                  $outputFileWithBasePath = $fileWithBasePath . '.webp';
                  
                  if (file_exists($outputFileWithBasePath)) {
                      return $output_file;
                  }
                  
                  
                  $file_type = strtolower(pathinfo($fileWithBasePath, PATHINFO_EXTENSION));
              
                  if (function_exists('imagewebp')) {
                      
                      switch ($file_type) {
                          case 'jpeg':
                          case 'jpg':
                              $image = imagecreatefromjpeg($fileWithBasePath);
                              break;
              
                          case 'png':
                              $image = imagecreatefrompng($fileWithBasePath);
                              imagepalettetotruecolor($image);
                              imagealphablending($image, true);
                              imagesavealpha($image, true);
                              break;
              
                          case 'gif':
                              $image = imagecreatefromgif($fileWithBasePath);
                              break;
                          default:
                              return false;
                      }
              
                      // Save the image
                      $result = imagewebp($image, $outputFileWithBasePath, $compression_quality);
                      if (false === $result) {
                          return false;
                      }
              
                      // Free up memory
                      imagedestroy($image);
              
                      return $output_file;
                  } elseif (class_exists('Imagick')) {
                      $image = new Imagick();
                      $image->readImage($fileWithBasePath);
              
                      if ($file_type === 'png') {
                          $image->setImageFormat('webp');
                          $image->setImageCompressionQuality($compression_quality);
                          $image->setOption('webp:lossless', 'true');
                      }
              
                      $image->writeImage($outputFileWithBasePath);
                      return $output_file;
                  }
              
                  return false;
              }
              
              
              
              
              
              function check_image_file_for_webp_converter_custom($img_real, &$webp_on_page){
              	static $uniq_imgs= [];
              	
              
              	$img_real= trim($img_real);
              	if(in_array($img_real, $uniq_imgs)) return;
              	$uniq_imgs[]= $img_real;
              	
              	$ext= strtolower(pathinfo($img_real, PATHINFO_EXTENSION));
              	if(
              		$ext == 'jpg' ||
              		$ext == 'jpeg' ||
              		$ext == 'png' 
              	) {
              		$abs= jcphp01_modx_custom_generate_webp_image($img_real);
              		$abs_base= str_replace('//', '/', MODX_BASE_PATH.$abs);
              
              		if( file_exists($abs_base)){
              			$webp_on_page[$img_real]= $abs;
              		}
              	}
              }
              
              
              try{
              
                  if( // replace jpg and png images to webp
                  	$modx->event->name == 'OnWebPagePrerender' && 
                  	stripos($_SERVER['HTTP_ACCEPT'], 'image/webp') !== false
                  ){
                      
                  	if($disable_replacing_for_logged_user && $modx->user->hasSessionContext('mgr')) return ''; 
                  	
                  	$options= [xPDO::OPT_CACHE_KEY=>'webp_on_page'];
                  	$cache_key= md5(MODX_SITE_URL.$_SERVER['REQUEST_URI']);
                  
                  	$cached_webp_on_page= $modx->cacheManager->get($cache_key, $options);
                  	$output= &$modx->resource->_output;
                  
                      
                  
                  	if( empty($cached_webp_on_page) ){
                  		$webp_on_page= [];
                  		
                  		preg_match_all('/<img[^>]+>/i', $output, $result);
                  		
                  		if(count($result)){ // Search images in img tag
                  			foreach($result[0] as $img_tag)	{
                  				$img_tag= str_replace("'", '"', $img_tag); // src
                  				preg_match('/(src)=("[^"]*")/i', $img_tag, $img[$img_tag]);						
                  				$img_real= str_replace('"', '', $img[$img_tag][2]);
                  				check_image_file_for_webp_converter_custom($img_real, $webp_on_page);
                  				
                  				preg_match('/(data-src)=("[^"]*")/i', $img_tag, $img[$img_tag]); // data-src					
                  				$img_real= str_replace('"', '', $img[$img_tag][2]);
                  				check_image_file_for_webp_converter_custom($img_real, $webp_on_page);
                  				
                  				preg_match('/(srcset)=("[^"]*")/i', $img_tag, $img[$img_tag]); // srcset
                  				$srcset= explode(',', str_replace('"', '', $img[$img_tag][2]));
                  				foreach($srcset as $src_item){
                  				    $src_a= explode(' ', $src_item);
                  				    if(isset($src_a[0]) && !empty($src_a[0])) {
                  				        check_image_file_for_webp_converter_custom($src_a[0], $webp_on_page);
                  				    } else {
                  				        if(isset($src_a[1]) && !empty($src_a[1])) {
                  				            check_image_file_for_webp_converter_custom($src_a[1], $webp_on_page);
                  				        }
                  				    }
                  				}
                  			}
                  		}
                  
                  		preg_match_all('/url\(([^)]*)"?\)/iu', $output, $result);
                  		if(count($result)){ // Search images in url css rules
                  			foreach($result[1] as $img_tag)	{
                  				if(stripos($img_real, 'data:')) continue;
                  				$img_real= str_replace(['"',"'"], '', $img_tag);
                  				check_image_file_for_webp_converter_custom($img_real, $webp_on_page);
                  			}
                  		}
                  		
                  		$webp_on_page['/webp/webp/']= '/webp/';
                  		$webp_on_page['//webp/']= '/webp/';
                  		$webp_on_page['.webp.webp']= '.webp';
                  		
                  		if(count($webp_on_page)) $output= str_replace(array_keys($webp_on_page), array_values($webp_on_page), $output);
                  		$modx->cacheManager->set($cache_key, serialize($webp_on_page), 0, $options);
                  	} else {
                  		$webp_on_page= unserialize($cached_webp_on_page);
                  		if(count($webp_on_page)){
                  			$output= str_replace(array_keys($webp_on_page), array_values($webp_on_page), $output);
                  		}
                  	}
                  	return '';
                  }
                  
              } catch (Exception $e){
                  $modx->log(1, 'Та самая бредовая ошибка из-за которой не сохраняются товары');
                  $modx->log(1, $e);
              }
                Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                10