Финансовая поддержка VPS, бесплатные дополнения и docs Донаты оплачивают сервер и двигают бесплатные дополнения MODX и документацию. Поддержать

Всего 126 147 комментариев

Володя
Володя
В двух словах — есть сниппет, получает токен, авторизуется по протоколу OAuth 2.0, при запросе использует Callback URI… дальнейшие действия не суть…
Создал плагин на какое то событие, берет контент ресурса, отправляет в сниппет, но сниппет получит токен и отправит текст в панель вебмастера — только если будет вызван на странице Callback URI.

вот с этим и заморочка…

p.s. по сути вся проблема в получении токена при вызове сниппета из плагина…
Cyrax_02
Cyrax_02
И ещё одна оптимизация. В предложении WHERE (как для стандартных полей `properties`, `uri`, `introtext`, `alias`, так и для пользовательских TV-полей) добавлять проверку на NULL (IFNULL/ISNULL) достаточно только в 2 случаях:
1. Если поле сравнивается с некоторым значением операцией «не равно»:
..., "tv1:!=":"5", ...
Сейчас такому условию НЕ будут удовлетворять ресурсы, для которых значение поля tv1 не указано. А должны удовлетворять.
2. Если поле сравнивается с пустым значением:
..., "tv1:=":"", ...
..., "tv1":"", ...
Сейчас такому условию НЕ будет удовлетворять ни один ресурс. А должны удовлетворять все ресурсы, для которых не задано значение поля tv1.

Во всех остальных случаях подстановка IFNULL/ISNULL не нужна. Все прочие условия будут работать корректно и без IFNULL/ISNULL.

— Почему в предложении WHERE важно не добавлять IFNULL/ISNULL в безусловном порядке для всех полей, а делать это только для двух вышеуказанных случаев:
а) ускорение выполнения запроса (т.к. каждый IFNULL/ISNULL увеличивает время выполнения запроса)
б) если IFNULL/ISNULL ставить всегда, то пользователь не будет иметь возможности корректно использовать оператор is null:
..., "tv1:IS":"null", ...
Этот оператор ничего не будет возвращать, т.к. в итоговом запросе вместо (tv1 IS NULL) получим (tv1 IS '').
Cyrax_02
Cyrax_02
Да, и касательно IFNULL. В целях сохранения переносимости я бы сделал так:
switch($modx->getOption('dbtype')) {
    case 'mysql': $dbObjectNameBorder = '`'; $nullCheckExpr = 'IFNULL'; break;
    case 'sqlsrv': $dbObjectNameBorder = ''; $nullCheckExpr = 'ISNULL'; break;
}
и далее использовал $dbObjectNameBorder и $nullCheckExpr. Такой вариант будет работать и с mySQL, и с MS SQL.
Михаил
Михаил
У меня книг по PHP аж 8. И скажу что везде по разному описан один и тот же код, к сожалению. Можно с ним смотреть как то примеры реализации, может советы. Но прямо все выучить не получиться(
Лучше делать на примерах. Я вот взял CodeIgnaiter и начал на нем делать блог, сайт, доску объявлений. Все криво конечно, но зато начинаешь понимать что то в программировании
Александр Москвин
Александр Москвин
Всё просто, тебе нужно вывести только товары.
Используй &where — JSON массив с дополнительными условиями получения ресурса.
А именно напиши так:
&where=`{'template':15}` — указываешь вывод только определенных шаблонов, где 15 номер шаблона.
Или берешь по папке
&where=`{'isfolder':0}` — т.е вывод всех ресурсов, которые не папка.
Cyrax_02
Cyrax_02
Ну вот, только руки дошли.
В общем, получается так. В предложение SELECT Вы добавили проверку IFNULL для всех дополнительных TV-полей:
IFNULL(`TVtv1`.`value`, '')
В итоге при заполнении чанка-шаблона значениями TV-полей туда будут «вставляться» не null, а пустые строки.

Но осталось ещё добавить IFNULL:
1) в предложение SELECT для стандартных полей `properties`, `uri`, `introtext`, `alias` — эти поля также могут принимать значения null
2) в предложение WHERE для всех дополнительных TV-полей.
Например, при указании в параметре &where JSON-условия {..., «tv1»:"", ...} в предложении WHERE должно формироваться условие:
... AND IFNULL(`TVtv1`.`value`, '') = '' AND ...
3) в предложении WHERE для стандартных полей `properties`, `uri`, `introtext`, `alias`

Необходимости добавления IFNULL в предложении WHERE (последние два пункта) можно избежать, если все проверки вытащить во внешний запрос: во внутреннем запросе выполняются JOIN'ы необходимых таблиц и отбираются все необходимые поля с использованием IFNULL, а во внешнем запросе выполняются все необходимые проверки. Но в этом случае памяти может требоваться больше. Если же без использования внешнего запроса — будет дольше выполняться. Впрочем, нужно тестировать.