Здесь нам поможет метод getCollection.
getCollection — брат метода getObject, который в отличие от него выдает (возвращает) нам не объект, а целый массив объектов.
Давайте откроем сайт из предыдущей части и в консоли напишем следующее:
$resources = $modx->getCollection('modResource'); $output = '<p>Всего ресурсов: '.count($resources).'</p>'; foreach ($resources as $k => $res) { $output .= '<p>['.$k.'] => '.$res->get('pagetitle').'</p>'; } print $output;
То есть с результатом метода getCollection мы можем обращаться как с обычным массивом, просто каждый элемент этого массива — объект. Но обратите внимание на ключи этого массива — массив начинается не с нулевого элемента. Ключом будут являться id полученных объектов. Таким образом, зная id документа, данные которого, например, вы не хотите выводить на экран, можно сделать так:
$resources = $modx->getCollection('modResource'); unset($resources[2]); $output = '<p>Всего ресурсов: '.count($resources).'</p>'; foreach ($resources as $k => $res) { $output .= '<p>['.$k.'] => '.$res->get('pagetitle').'</p>'; } print $output;
Хотя правильнее было бы его вообще исключить из выборки, но как это делается, мы узнаем в других частях.Попробуйте и вы увидите, что подсчитанное количество ресурсов изменилось и заголовок ресурса с id равным 2 не отобразился.
А что делать, если нам нужно обработать не все ресурсы, а только некоторые, например, только новости? Создайте ресурс «Новости» и добавьте ему несколько дочерних ресурсов. А я пока расскажу, какой еще параметр можно передать в метод getCollection (первый параметр. как вы помните, это имя класса нужных объектов).
Для метода getCollection вторым параметром является условие выборки. Условие должно являться массивом, в котором ключи — это названия свойств объекта, а значения — это те значения, которые будут заданы в качестве поискового запроса.
Помните, как мы выполняли метод toArray() и получали все свойства объекта? Так вот, по всем этим свойствам можно проводить поиск.
Как вы думаете, что общего будет у новостей? Ну конечно, родительский ресурс у них будет общий. У меня ресурс «Новости» имеет id, равный 5, соответственно я буду искать объекты, у которых значение свойства parent будет равно 5:
$where = array( 'parent' => 5 ); $resources = $modx->getCollection('modResource',$where); $output = '<p>Всего ресурсов: '.count($resources).'</p>'; foreach ($resources as $k => $res) { $output .= '<p>['.$k.'] => '.$res->get('pagetitle').'</p>'; } print $output;
Должен сказать, что в предыдущей части я немного недоговорил. Дело в том, что у метода getObject вторым параметром тоже является условие выборки. Просто если условие не является массивом (а в предыдущей части мы после запятой указывали число — id), то MODX считает, что указан id объекта.
То есть мы спокойно можем сделать так:
$where = array( 'id' => 2 ); $res = $modx->getObject('modResource',$where); $output = $res->get('pagetitle'); print $output;и даже так:
$where = array( 'uri' => 'novosti/' ); $res = $modx->getObject('modResource',$where); $output = $res->get('pagetitle'); print $output;
На этом пока все, редактирование объектов изучим в следующей части, а сейчас опять небольшой практикум. Попробуйте сами выполнить задание. А если не получится, загляните в ответ. G+
Задание. Написать сниппет, который выводит на страницу заголовки, аннотации и даты публикации всех новостей, если их всего пять или меньше, а если новостей больше пяти, пусть выводит содержание ресурса «Новости» (того самого контейнера, который является родительским ресурсом всех новостей).
как переделать чтоб был вывод на экран, ато ничего не выводит…
спасибо!
p.s. пробовал зайти через фейсбук… выдал ошибку какую то и теперь при заходе на твой сайт вот такая только блямба yadi.sk/d/xR0EmL3Y4CX06 yadi.sk/d/9KQc6Khc4CXAu
Как будет вернее??
github.com/modxcms/revolution/blob/develop/core/xpdo/om/xpdoobject.class.php (стр. 948)
и github.com/modxcms/revolution/blob/develop/core/model/modx/modresource.class.php (стр. 311)
PS. Если вы сначала установите новое значение для поля content с помощью метода set(), а потом попытаетесь вывести значение, то увидите, что значения $resource->content и $resource->get('content') различаются.
Fi1osof уже писал об этом: community.modx-cms.ru/blog/modx-xpdo/9693.html
Извиняюсь, что наглею…
Установлен MiniShop2, следовательно цена хранится в поле 'price' объекта 'msProduct'.
Может так проще?
Стараюсь, методом проб и ошибок)))
Илья, подскажите, как создать новую тему?
А то есть вопрос, но не хочу писать не в тот раздел, куда нужно.
У вопрос такого плана.
Необходимо в Shopkeeper для пользователей, которые авторизировались, набрали в корзину какой-либо товар, но в силу различных причин не стали оформлять и отправлять заказ, возможность при повторном входе в магазин (через произвольный промежуток времени — час, день, два) возможность видеть набранный товар и иметь возможность его дооформить, либо доложить товар и отправить).
Также, подобно принципу работы с заказами в ShopModxBox, администратору (менеджеру) необходимо иметь возможность видеть еще не сформированные заказы, а лишь добавленные в корзину.,,
Есть понимание (общее) как данный вопрос должен решаться, но…
Понимаю, что вопрос большой. В настоящий момент пытаюсь разобраться сам, однако слишком многих знаний пока не хватает. Есть возможность рассмотреть различные варианты осуществления данной проблемы.
При оформлении, запись удаляете. Если не оформлен заказ, оставляете эту строчку. При повторном заходе пользователя, смотрите, есть ли у него строчка в этой таблице. Если есть, добавляете все товары в корзину.
Вот в этой таблице и будут «неоформленные» заказы. В админке делаете отдельный раздел для таких заказов (пишете свой компонент) — вот и отображение для менеджера неоформленных заказов.
К моему стыду признаю, что ничего у меня не получилось. Знания не приходят так быстро, как хотелось бы.
Уверен, что знающим людям написать подобный плагин составит гораздо меньше труда и времени. Я же, в свою, очередь готов оплатить данную работу. Условия готов рассмотреть
Делаю такой запрос
не проходит (
Может есть какая то штатная возможность в pdo, для таких выборок? Ситуация, в принципе, тривиальная.
Как-то так, что ли…
Тут, вначале выводится таблица статистики (если без параметра то за текущий месяц), а ниже список ссылок с параметром, чтобы вывести за соответствующий месяц. Вот живое: newsport24.ru/statistika-stavok.html
И чанк tpl.sheetItem, в котором разберется даже верстальщик:
tpl.sheetsOuter:
Подскажи пожалуйста, как можно выводить результаты работы сниппета в плейсхолдер?
Ну например, сниппет, на месте вызова (в сайдбаре) формирует список ссылок, по кликам на которые, (в контентной области) выводится список найденных ресурсов.
И ссылки формировать такие:
Я у Васи видел такое исполнение для mSearch
Подозреваю, что сниппет должен парсить страничку, на предмет своего плейсхолдера и заменять его на список результатов. Только вот, как это…
Решаю задачку по созданию навигации по меткам для ресурсов, наподобие tagLister, только с учетом контекстов. Для этого создал tv с именем и типом «autotag» который содержит метки. Для создания списка ссылок, (собственно навигации) надо вывести уникальные значения меток, т.к. в tv они могут повторяться. При этом необходимо вывести их так, чтобы в список не попадали значения из переводов в других контекстах, и хотелось бы передавать в сниппет имя tv-шки, на не её id. Сделал, пока что, так:
Но тут два джойна, запрос получился относительно тяжелый. Вот, собственно, о чем я и хотел спросить — можно ли как то, получить те же данные, используя механизм связей?
И еще, можно ли тут как то использовать механизм кеширования (пока что, для меня — темный лес :))?
Сорри, написал не в тот топик
Единственное, можно использовать DISTINCT, чтобы отсеивать дубликаты на уровне базы данных:
Как то так, что ли…
Подскажи пожалуйста, есть ли какой то простой способ реализовать в сниппете, механизм @INLINE, для чанков? Ну, что то навроде
У Васи, во всех сниппетах есть такая возможность, но не могу понять, как это делается :(
А этот метод, как раз, к loadChunk и обращается.
К примеру у нас есть переменная, которые мы получаем в таком формате
Я вывожу так, но может лучше по другому это делать?
Благодарю за уроки! Начинаю знакомится, но столкнулся стем, что в консоле работает только первый пример:
Остальные примеры не работают. Например вот этот мне интересен
Чистота в окне результата…
Подскажите. возможно что-то изменилось в новых версиях modx?
Заранее благодарю!
return нужно использовать в сниппетах, чтобы результат был возвращён в том месте, где вызван сниппет. А в Console return не выводит сообщение на экран, а просто выполняет завершение скрипта.
Для тех, кто еще не знает, вызывается метод getChunk, в котором будет формироваться список в качестве плейсхолдеров выступают ключи массива вторым аргументом, в самом чанке к ним можно обращаться так [[+title]], [[+description]], [[+longtitle]] (еще раз скажу, что названия плейсхолдеров точно такое же как и название ключей в массиве).
Как правильно делать запросы такого типа?
Отфильтровать по опциям и доп опциям…
Нужно в плагине запустить что то подобное.
Пробовал так
но никаких результатов.
то есть при добавлении 'properties' => array('width' => 120) ничего не выдает. Как правильно составить запрос?
Подскажите, такой момент.
При помощи pdoResources или getResources. Зная id родителя, можно получить id-детей.
Но работает это только в «Ресурсах».
Как провернуть тоже самое, но во вкладке «Элементы», а именно в «Дополнительные поля TV», там у меня всё аккуратно по под папочкам разложено, типа такого:
-Готовый объект (12)
--f_cvet (101)
--f_faktura (102)
--f_material (103)
--f_profil (104)
Так вот, как зная id 12, получить дочерние id'шники: 101,102,103,104?
Заранее спасибо за ответ!