Подскажите как правильно вытащить содержимое TV в плагин
у меня есть плагин который косит слова из контента ресурса, НО
хочу реализовать возможность добавления таких слов в TV поле в migx
а вопрос состоит в том как этот список слов вызвать в плагине
вот сам плагин
хочу реализовать возможность добавления таких слов в TV поле в migx
а вопрос состоит в том как этот список слов вызвать в плагине
вот сам плагин
<?php
switch ($modx->event->name) {
case 'OnDocPublished':
if ($resource->get('template') == 24 && !$resource->get('content')) $resource->set('published', 0);
$content = $resource->get('content');
$words = array('<p>word1</p>,<p>word2</p>,<p>word3</p>');
$pattern = '/(?:' . join('|', $words) . ')/i';
$content = preg_replace($pattern, '', $content);
$resource->set('content', $content);
$resource->save();
break;
case ' OnBeforeDocFormSave':
if ($resource->get('template') == 24 && !$resource->get('content')) $resource->set('published', 0);
$content = $resource->get('content');
$words = array('<p>word1</p>,<p>word2</p>,<p>word3</p>');
$pattern = '/(?:' . join('|', $words) . ')/i';
$content = preg_replace($pattern, '', $content);
$resource->set('content', $content);
$resource->save();
break;
case 'OnDocFormSave':
if ($resource->get('template') == 24 && !$resource->get('content')) $resource->set('published', 0);
$content = $resource->get('content');
$words = array('<p>word1</p>,<p>word2</p>,<p>word3</p>');
$pattern = '/(?:' . join('|', $words) . ')/i';
$content = preg_replace($pattern, '', $content);
$resource->set('content', $content);
$resource->save();
break;
}
Комментарии: 32
Вместо migx я бы посоветовал лучше использовать tvSuperSelect, чтобы не мучаться каждый раз открытием модалки и вбиванием слова. При этом, если у некоторых ресурсов могут быть одинаковые слова, то вы сможете их выбрать из списка уже имеющихся.
Код получения слов ресурса в виде массива будет такой:
Код получения слов ресурса в виде массива будет такой:
$res = $modx->getObject('modResource', $resource->id);
$words = json_decode($res->getTVValue('words'), true); //в getTVValue название своего TV
tv я думаю вбить в одном ресурсе и к нему обращаться будет проще
а как обратиться к TV определенного ресурса ))))
например у него id=11 и TV со словами будет в нем
например у него id=11 и TV со словами будет в нем
Код тот же самый, просто замените в 1ой строчке моего кода, $resource->id на id вашего ресурса
$res = $modx->getObject('modResource', id_ресурса);
$words = json_decode($res->getTVValue('words'), true);
Сам код тоже можно улучшить, я так понимаю у вас там одни и те же действия, можно как функцию сделать, а так же switch позволяет вот так:
<?php
switch ($modx->event->name) {
case 'OnDocPublished':
case 'OnBeforeDocFormSave':
case 'OnDocFormSave':
if ($resource->get('template') == 24 && !$resource->get('content')) $resource->set('published', 0);
$res = $modx->getObject('modResource', id_ресурса_где_вбиты_слова);
$words = $res->getTVValue('words'); // тут получить слова, распарсить строку, смотря что там вернет.
// еще проще в php файл записать эти слова и подключать через include
$content = $resource->get('content');
$pattern = '/(?:' . join('|', $words) . ')/i';
$content = preg_replace($pattern, '', $content);
$resource->set('content', $content);
$resource->save();
break;
}
создал тв поле migx добавил слова testx testy в tv и в поле контент
может разделитель в параметрах вывода TV или чтото в коде не так? как найти причину непонятно
<?php
switch ($modx->event->name) {
case 'OnDocPublished':
case 'OnBeforeDocFormSave':
case 'OnDocFormSave':
if ($resource->get('template') == 24 && !$resource->get('content')) $resource->set('published', 0);
$res = $modx->getObject('modResource', 11);
$words = $res->getTVValue('words'); // тут получить слова, распарсить строку, смотря что там вернет.
$content = $resource->get('content');
$pattern = '/(?:' . join('|', $words) . ')/i';
$content = preg_replace($pattern, '', $content);
$resource->set('content', $content);
$resource->save();
break;
}
но увы не подчищаетможет разделитель в параметрах вывода TV или чтото в коде не так? как найти причину непонятно
Потому что migx хранит в json. При этом, в migx у вас видимо всего одно поле для ввода слова, допустим его ключ word, тогда при декодировании вы получите не массив слов, а массив элементов этого migx, т.е. двумерный массив.
Значит вам нужно будет еще пробежаться по нему и получить все слова.
Значит вам нужно будет еще пробежаться по нему и получить все слова.
$words = array();
$res = $modx->getObject('modResource', 11);
$temp = json_decode($res->getTVValue('words'), true);
foreach ($temp as $v) {
if (!in_array($v['word'], $words)) { //$v['word'] - тут нужно указать ключ вашего поля для слова
array_push($words, $v['word']); //тут тоже соответственно
}
}
//после цикла вы получите массив введенных слов. Поэтому я и предлагал tvSuperSelect, с ним было бы проще, без лишнего цикла и вводить в него проще.
Т.
/core/components/gallery/elements/tv/output/ выдает такую ошибку при сохранении с этой строкой
Дописал код в комменте. Честно, не понимаю причем тут gallery
тоже не понял но там и на другие снипеты орал
с tvsuperselct вид тв поля какой нужен
Как установите его, в списке тв полей появится tvsuperselect
нашел
tvsuperselect
и такой код
и такой код
<?php
switch ($modx->event->name) {
case 'OnDocPublished':
case 'OnBeforeDocFormSave':
case 'OnDocFormSave':
if ($resource->get('template') == 24 && !$resource->get('content')) $resource->set('published', 0);
$res = $modx->getObject('modResource', 11);
$words = $res->getTVValue('words'); // тут получить слова, распарсить строку, смотря что там вернет.
$content = $resource->get('content');
$pattern = '/(?:' . join('|', $words) . ')/i';
$content = preg_replace($pattern, '', $content);
$resource->set('content', $content);
$resource->save();
break;
}
не удаляет слова указанные в tv words
Ну вы хоть почитайте мой комментарий, я же в самом первом написал код, а вы снова по своему получаете, вот и не работает. tvSuperSelect тоже хранит json
<?php
switch ($modx->event->name) {
case 'OnDocPublished':
case 'OnBeforeDocFormSave':
case 'OnDocFormSave':
if ($resource->get('template') == 24 && !$resource->get('content')) $resource->set('published', 0);
$res = $modx->getObject('modResource', 11);
$words = json_decode($res->getTVValue('words'), true);
$content = $resource->get('content');
$pattern = '/(?:' . join('|', $words) . ')/i';
$content = preg_replace($pattern, '', $content);
$resource->set('content', $content);
$resource->save();
break;
}
когда делаю так получаю ошибку при сохранении… которую выше писал но на снипет colorpicker
При сохранении ресурса имеете в виду? Просто зависает? Тогда скорее другой плагин что-то ломает. Надо смотреть логи, так сложно сказать.
да, при сохранении выскакивает ошибка, но зависания нет, просто продолжаешь работать а сохранить не можешь :)
при этом для всех шаблонов хотя там в условиях указан конкретный
лог ошибок пуст
старый код плагина где я слова перечислял через запятую не вызывает проблем
при этом для всех шаблонов хотя там в условиях указан конкретный
лог ошибок пуст
старый код плагина где я слова перечислял через запятую не вызывает проблем
Вы лог модх смотрите? Надо серверный, ибо ошибка 100% с кодом 5хх, скорее 500.
ошибка выбивается сразу как я добавляю строку
$words = json_decode($res->getTVValue('words'), true);
а при такой $words = $res->getTVValue('words');
ее нет
в серверных логах ошибок нет
$words = json_decode($res->getTVValue('words'), true);
а при такой $words = $res->getTVValue('words');
ее нет
в серверных логах ошибок нет
А у вас поле точно типа tvSuperSelect? Странно конечно. Если не разберитесь, можете мне в тг или в сообщения написать, смогу сегодня в обеду глянуть
да, именно tvSuperSelect
в вашем исходном коде, в название события есть пробел в начале, оно раньше не запускалось.
case ' OnBeforeDocFormSave':
так же строчка $words = $res->getTVValue('words'); может вернуть уже готовый массив и не надо его вытаскивать из json, как я ранее писал надо смотреть что там возвращает. Вот так:$words = $res->getTVValue('words');
$modx->log(1, print_r($words,1));
Потом смотреть в журнале ошибок модх <?php
switch ($modx->event->name) {
case 'OnDocPublished':
case 'OnBeforeDocFormSave':
case 'OnDocFormSave':
if ($resource->get('template') == 27 && !$resource->get('content')) $resource->set('published', 0);
$res = $modx->getObject('modResource', 11);
$words = $res->getTVValue('words');
$modx->log(1, print_r($words,1));
$content = $resource->get('content');
$pattern = '/(?:' . join('|', $words) . ')/i';
$content = preg_replace($pattern, '', $content);
$resource->set('content', $content);
$resource->save();
break;
}
вот так выводит, надо по и дее без ковычек и в ...["testx","testy"]
ну и само собой слова не чистятся
на coloricker плагин ругался я его отключил
[2023-05-25 11:39:37] (ERROR @ /var/www/www-root/data/www/.ru/core/cache/includes/elements/modplugin/59.include.cache.php: 9) [«testx»,«testy»]
[2023-05-25 11:39:37] (ERROR @ /var/www/www-root/data/www/.ru/core/cache/includes/elements/modplugin/59.include.cache.php: 12) PHP warning: join(): Invalid arguments passed
12 строка — $pattern = '/(?:'. join('|', $words). ')/i';
рабочий плагин строка в нем выглядит так если слова руками вписывать
$words = array('word1,word2`)
$words = array('word1,word2`)
Я у себя протестил, такой код норм чистит. Вы после сохранения страницу ресурса обновите в админке и увидите, что слова удалились из контента.
<?php
switch ($modx->event->name) {
case 'OnDocPublished':
case 'OnBeforeDocFormSave':
case 'OnDocFormSave':
$res = $modx->getObject('modResource', 1);
$words = json_decode($res->getTVValue('words'), true);
$content = $resource->get('content');
$pattern = '/(?:' . join('|', $words) . ')/i';
$content = preg_replace($pattern, '', $content);
$resource->set('content', $content);
$resource->save();
break;
}
вывод через разделитель или по умолчанию?
Вывод чего? В контенте ресурса у меня просто рандомный набор слов и слова из words плагин удаляет внутри контента.
у него есть какой то глюк или ограничение на слова и они просто обнуляются
а как сделать так чтобы он удалял именно конструкцию word1 а не просто word?
подскажите как сделать чтобы брало не только из одного TV а из двух или трех?
точнее не как брать а как в коде плагина прописать так чтобы исключало сразу слова из 2 или 3 TV?
сейчас это
1 сделать переменную words2
а в строке pattern добавить его в исключение (не знаю только как )
2 добавить сразу данные из TV поля words2 в переменную words
точнее не как брать а как в коде плагина прописать так чтобы исключало сразу слова из 2 или 3 TV?
сейчас это
$words = json_decode($res->getTVValue('words'), true);
$pattern = '/(?:' . join('|', $words) . ')/i';
как я понимаю можно 1 сделать переменную words2
а в строке pattern добавить его в исключение (не знаю только как )
2 добавить сразу данные из TV поля words2 в переменную words
Так
$words = json_decode($res->getTVValue('words'), true);
$words2 = json_decode($res->getTVValue('words2'), true);
$words3 = json_decode($res->getTVValue('words3'), true);
$words4 = json_decode($res->getTVValue('words4'), true);
$wordsToExclude = array_unique(array_merge($words, $words2, $words3, $words4));
$pattern = '/(?:' . join('|', $wordsToExclude) . ')/i';
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.