Выборка modUser по значениям дополнительных полей

Как грамотно через api MODX Revo сделать запрос на выборку всех пользователей, у которых, к примеру значение дополнительного поля c_id = 18?
Степанов Александр
02 марта 2013, 16:49
modx.pro
1
3 893
0

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

Василий Краковецкий
02 марта 2013, 21:35
0
Чето типо того:
$query = '"c_id":"18"';
$c = $modx->newObject('modUser');
$c->innerJoin ('modUserProfile','Profile');
$c->where(array('Profile.extended:LIKE' => '%'.$query.'%'));
$users = $modx->getCollection('modUser',$c);
там все в json хранится
    Andrey Grachov
    02 марта 2013, 23:39
    0
    Только не забыть заэкранировать _ :)
      Василий Краковецкий
      03 марта 2013, 03:50
      0
      Что заэкранировать? Если мы получаем айдишник от пользователя с фронтеда, и он является числом, то достаточно прописать
      $id = (int) $_GET['id_from_user'];
      а в остальных случаях модикс прекрасно обо всем позаботится.
      Или вы про знак подчеркивания? А его, простите, зачем экранировать?
        Andrey Grachov
        03 марта 2013, 04:14
        0
        Потому что при использовании LIKE знак подчеркивания является служебным символом (как и %) и означает, что на его месте может стоять один любой символ.
          Василий Краковецкий
          03 марта 2013, 04:16
          0
          Окак, не знал… Хотя в нашем случае это не особо бы повлияло на результат, но замечание действительно полезное!
      Ян Такушевич
      03 марта 2013, 10:44
      0
      У меня ваш код выдает вот такую ошибку:

      Fatal error: Call to undefined method modUser_mysql::innerJoin()
        Василий Наумкин
        03 марта 2013, 11:18
        0
        $c = $modx->newQuery('modUser');
      Степанов Александр
      03 марта 2013, 11:41
      0
      Всем спасибо! Вопрос решен.
        Степанов Александр
        03 марта 2013, 13:56
        0
        Логично предположить, что если мы хотим взять выборку по какому-то из полей профиля, то код будет

        $query = '18';
        $c = $modx->newQuery('modUser');
        $c->innerJoin ('modUserProfile','Profile');
        $c->where(array('Profile.comment:LIKE' => '%'.$query.'%'));
        $users = $modx->getCollection('modUser',$c);

        на что MODX начинает ругаться… что не так?
          Степанов Александр
          03 марта 2013, 16:46
          0
          Сделал так, все работает (вытягиваю только поля «полное имя»).

          $q=$modx->newQuery('modUser');
          $q->select(array(
                  'modUser.id',
                  'p.fullname'
          ));
          $q->innerJoin('modUserProfile', 'p','modUser.id = p.internalKey');
          $q->where(array('p.comment'=>'18'));
          $result = $modx->getCollection('modUser', $q);

          Еще раз, спасибо всем.
            Ян Такушевич
            03 марта 2013, 21:22
            0
            Можно выборку сделать при помощи сниппета Peoples:

            [[!Peoples? &where=`{"Profile.id:=":30}`]]
            Вот только у меня никак не получается сделать выборку по extended field.

            Не пойму, как выборку:

            $query = '"showprofile":"on"';
            $c->where(array('Profile.extended:LIKE' => '%'.$query.'%'));
            правильно переписать под такой синтаксис. Может кто подскажет?
              Ян Такушевич
              06 марта 2013, 11:33
              0
              Разобрался сам. Может кому пригодится:

              [[!Peoples? &where=`{"Profile.extended:LIKE":"%\"showprofile\":\"on\"%"}`]]
                Konstantin
                11 января 2016, 20:57
                0
                не найду в документации у этого сниппета — &where
              vlad
              21 мая 2015, 12:21
              -2
              Добрый день всем — столкнулся с похожей проблемой, но выводиться все отлично, только есть одно но: нет пагинации при выборке.
              То есть когда выводятся все ресурсы — пагинация есть, когда делаю выборку по диспетчерам, грузовладельцам и т.д., то пагинация отсутствует. Сам код с вызовом:

              Введите телефон компании
              — диспетчер([[!countExtendes? name=dispatcher]])

              — грузовладелец([[!countExtendes? name=shipper]])

              — перевозчик([[!countExtendes? name=transporter]])

              — экспедитор([[!countExtendes? name=forwarder]])






              [[!getPage?
              &element=`Peoples`
              &showHidden=`1`
              &tpl=`peoples_tpl_compan`
              [[!companSearch]]
              &limit=`10`
              &pageNavVar=`page.nav`
              ]]

                [[!+page.nav]]



              Сам снипет:

              if($_GET['com']){
              echo '&where=`{«Profile.phone:LIKE»:"%'.$_GET['com'].'%"}`';
              }
              elseif(isset($_GET['sel'])){

              echo '&where=`{«Profile.extended:LIKE»:"%'.$_GET['sel'].'%"}`';
              }
              Странно как то HTML почему то не отображается!!!
                Василий Наумкин
                21 мая 2015, 12:28
                0
                Странно как то HTML почему то не отображается!!!
                До тебя с первого раза не доходит, что для отображения кода нужно использовать тег code?

                Я же это уже объяснял.
                  vlad
                  21 мая 2015, 15:09
                  0
                  Просто сайтов много и не помню на каком надо писать на каком не надо
                vlad
                21 мая 2015, 15:13
                0
                Напишу заново код:
                <form class="form form-compan" action="" method="get"  name="del_res">
                Введите телефон компании
                <input type="text" name="com" size="60">
                <input type="submit" name="submit" value="Искать" class="search">
                <input type="reset" name="reset" value="Очистить">
                <div class='znachki'>
                  <p class='litImg-main'><input class="check_box_gg" type="radio" name="sel" value="dispatcher">- диспетчер([[!countExtendes ? name=dispatcher]])
                </p>
                  <p class='litImg-main'><input class="check_box_gg" type="radio" name="sel" value="shipper">- грузовладелец([[!countExtendes ? name=shipper]])
                </p> 
                  <p class='litImg-main'><input class="check_box_gg" type="radio" name="sel" value="transporter">- перевозчик([[!countExtendes ? name=transporter]])
                </p>
                  <p class='litImg-main'><input class="check_box_gg" type="radio" name="sel" value="forwarder">- экспедитор([[!countExtendes ? name=forwarder]])</p>
                 </div>
                </form>
                <div class="page-inner">
                <table class="staff">
                    <tr class="shapka">
                        <td>
                        </td>
                        <td>
                        </td>
                        <td>
                        </td>
                        <td>
                        </td>
                [[!getPage?
                &elementClass=`modSnippet`
                &element=`Peoples`
                &showHidden=`1`
                &tpl=`peoples_tpl_compan` 
                [[!companSearch]]
                &limit=`4`
                &pageNavVar=`page.nav`
                ]]
                </table>
                    <div class="pagination">
                    <ul>
                       [[!+page.nav]]
                    </ul>
                    </div>
                </div>
                сам снипет [[!companSearch]]:
                <?php
                    if($_GET['com']){
                    echo '&where=`{"Profile.phone:LIKE":"%'.$_GET['com'].'%"}`';
                    }
                    elseif(isset($_GET['sel'])){
                         
                        echo '&where=`{"Profile.extended:LIKE":"%'.$_GET['sel'].'%"}`';
                    }
                  Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                  19