Уходит в бесконечное сохранение, как исправить?
Есть плагин что при сохранение ресурса делает действия, и потом сохраняет. И всё время выходит эта ошибка.
[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
Но если я отключу один плагин, то оно сохраняет нормально, хотя в этом плагине я проверял данные поступают как строка.
Когда этот плагин отключен, сохраняется нормально, но эта ошибка всё ещё выходит.
Были записаны так
[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();
Комментарии: 10
Как вообще понять где берётся эта ошибка, есть там где она возникает, но ведь где-то должен быть место откуда его вызывают, допустим как в случае с js и dev tools
включаете отображение ошибок, я дописываю в htaccess.
php_flag display_startup_errors on
php_flag display_errors on
php_flag html_errors on
Открываете консоль браузера на вкладке Сеть (Network), очищаете там все, чтобы было удобно. Нажимаете Сохранить ресурс, смотрите что там не так
Вот тут
А вот тут
$ar = json_decode($reviews->get('value'), true);
ты получаешь уже имеющиеся отзывы из ресурса $reviews.А вот тут
$tvcid->setValue($currentResourceId, json_encode($ar));
Ты устанавливаешь значение чего? $tvcid объект класса modTemplateVar, и он не хранит значение переменной шаблона. Мне кажется надо устанавливать значение переменной в объект $reviews.
Да а если нет он создаёт, и отображает правильно созданный элемент, и даже когда уже есть элементы он правильно всё подставляет, но при попытки сохранить(новые изменения в уже созданных таким методом) таким образом созданные Migx уже уходит в бесконечное сохранение. Да до этого я делал правильно через resource и так далее, но беда в том что это должно работать с авторизированными людьми у которых нет прав на что либо кроме лоад и т.д
Не понимаю причём тут авторизованные люди. Вы можете в объект modx добавить любого пользователя. А что касается MIGX, то указывать MIGX_id необязательно, он подставиться автоматически, возможно и из-за этого проблема. И лучше всё же сделать через ресурсы.
Если делать через ресурсы, то человек без прав не может создать migx запись, поэтому пришлось делать так. Всё равно не помогает
Вот это работает и записывает данные
И всё так же уходит в бесконечное сохраннее если этот плагин включен
$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);
}
}
}
Гляньте:
1. ошибка в Консоли браузера
2. ошибка в Логе modx
3. ошибка в Логе Сервера
4. Если зайти в Админке, в ресурс, MIGX нормально показывает? Это вопрос про ошибку на 1860 строке prnt.sc/3CQsst937gOr
5. Попробовать(естественно с переделками) данный код в Console
1. ошибка в Консоли браузера
2. ошибка в Логе modx
3. ошибка в Логе Сервера
4. Если зайти в Админке, в ресурс, MIGX нормально показывает? Это вопрос про ошибку на 1860 строке prnt.sc/3CQsst937gOr
5. Попробовать(естественно с переделками) данный код в Console
1)500
2)Пусто
3)Уже не стал смотреть
4)Да нормально
5)Удалил этот плагин и сделал как снипет
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;
Но что-то мне подсказывает проблема в этом плагине, когда его отключаешь всё работает, пытался установить 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);
}
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.