28 авг. 2014 г., 19:15

Прошу помощи по синтаксису "where" в снипете

Здравствуйте коллеги! Делаю алфавитный рубрикатор, за основу взял вариант GetResources+Ajax: http://modx.ws/urok-modx-ajax-zagruzka-resursov
Застрял на параметре в сниппете, не знаю синтаксис.
Как правильно написать фильтр, если первый символ ЦИФРА, типа:
$params['where'] = '{"pagetitle:LIKE":"[0-9]%"}';
и если первый символ английская буква:
$params['where'] = '{"pagetitle:LIKE":"[A-z]%"}';
В данном случае LIKE не поможет. Здесь нужны регулярные выражения, то есть конструкция REGEXP (или RLIKE - синоним REGEXP). В вашем случае:
Как правильно написать фильтр, если первый символ ЦИФРА, типа:
$params['where'] = '{"pagetitle:RLIKE":"^[[:digit:]]+"}';
или
$params['where'] = '{"pagetitle:RLIKE":"^[0-9]+"}';
Знак ^ - это начало строки, чтобы именно в начале искал цифру, а не где-то в любом месте строчки. - цифровой символ. [0-9] В квадратных скобках пишется перечисление возможных символов. 0-9 - это, как все поняли, от нуля и до девятки. Можно указать, к примеру, [0,1,3], то есть только эти цифры искать (любую из них). + - это минимум один символ. * - любое количество (даже отсутствие). ? - отсутствие или один символ.
и если первый символ английская буква:
$params['where'] = '{"pagetitle:RLIKE":"^[a-z]+"}';
Вот только с кирилицей в конструкции [...] полная беда, даже не пытайтесь.
Отлично! Работает! Спасибо огромное Николай. Несколько дней бился над этим вопросом. А с кирилицей у меня все проще, там по одной букве передаю (через LIKE - работает норм.), не массивом.
У меня возникла немного похожая проблема. Передаю sql запрос для выборки из базы, и в запросе хочу подставить имя пользователя. Не работает.
$user = ''; echo 'ID пользователя:'. $user; // Выводит значение как положено
$result = mysql_query("SELECT * FROM `tables` WHERE `user` = '$user'"); Не работает такая конструкция, а если напрямую прописать:
$result = mysql_query("SELECT * FROM `tables` WHERE `user` = '5'");
Работает выборка.
echo "SELECT * FROM tables WHERE usernames = '$user'";
Выдает что вроде бы имя подставляется правильно.
Понимаю, что нужно делать через xPDO, но осилить его пока не могу, не совсем понимаю его синтаксис, по урокам создавал таблицу, через CMP Generator все делал и работало, а на свою переделать не получается, поэтому пока хочу сделать через SQL.
У вас как-то странно, то колонка user, то usernames. ID у вас хоть числовой? Дайте полный код без всяких изменений.
Поправил.
$user = ''; echo 'ID пользователя:'. $user; // Выводит значение как положено $result = mysql_query("SELECT * FROM `tables` WHERE `username` = '$user'");
Не работает такая конструкция, а если напрямую прописать:
$result = mysql_query("SELECT * FROM `tables` WHERE `username` = 'petya'");
Работает выборка.
echo "SELECT * FROM tables WHERE username = '$user'";
Выдает
"SELECT * FROM tables WHERE username = 'petya'"
$user = ''; echo 'ID пользователя:'. $user; // Выводит значение как положено
Как у вас там что-то выводится, если у вас присваивается пустое значение переменной? $user = '';
Редактор код сожрал, там должно быть:
''
Короче, там через modx.user.id:userinfo=`username` получаем имя залогиненного пользоваателя
Да, MODX вырезает знаки [[]] в запросах (а еще и HTML-сущности, что для меня оказалось новостью (нафига сущности вырезать??)). В общем, вроде поправил. Как раз сейчас и проверим.
Итак, [[+modx.user.id]] - это MODX-тег, а не PHP-переменная. Если разницы не видите - очень плохо. И это не является числом. Уж если вы пытаетесь что-то в php делать, то и делайте средствами php, а не шаблонизации. $id = $modx->user->id. А уж если ооочень хочется плейсхолдер использовать, то $id = $modx->placeholders['modx.user.id'] или $id = $modx->getPlaceholder('modx.user.id').
Спасибо, огромное. Добавил такую запись $user = $modx->user->get('username'); и получил в переменной $user значение текущего залогиненного пользователя. Теперь в запросе SQL отрабатывается выборка как положено.
Но меня сильно заинтересовала возможность использовать свои таблицы средствами xPDO. Мне кажется, это гораздо перспективнее и, самое главное, правильнее в отношении ModX.
Если не трудно, скиньте ссылочки на учебные материалы по пользовательским таблицам в ModX. Делал по этой инструкции, не получилось. В консоли все равно выдает ошибку.
1. Дальше если захотите писать, пишите отдельный топик. Хватит нам уже флудить в чужом топике. 2. Материала по xPDO у Ильи больше чем необходимо. Вот прям все по порядку и изучайте. https://ilyaut.ru/xpdo/. Я пересказом заниматься не буду.

Добавить комментарий