Наверх

Часть 1 (Практика). Получение свойств объекта

Давайте, напишем свой сниппет, который будет показывать пользователю любое поле любого ресурса. Нам понадобятся знания, полученные в первой части статьи.
Задача. У сайта есть слоган. Текст слогана находится в поле introtext главной страницы сайта. Нужно отображать этот слоган на всех страницах сайта.
Создадим новый сниппет getValue:
$res = $modx->getObject('modResource',$id);
$output = $res->get($val);
return $output;

И вызывать его будем так:
[[getValue? &id=`[[++site_start]]` &val=`introtext`]]

Все параметры, которые мы передали в сниппет (id и val) внутри сниппета превращаются в переменные ($id и $val) и мы можем их использовать.

Кроме того наш сниппет может работать не только с главной страницей и показывать не только introtext — в другом месте страницы вы можете показать, например, заголовок родительского документа:
[[getValue? &id=`[[*parent]]` &val=`pagetitle`]]

Думаю, теперь большему количеству людей понятно, что такое xPDO и как его можно применять на практике. Дальше будем рассматривать более сложные случаи, так как xPDO позволяет манипулировать абсолютно всеми объектами, а не только ресурсами, что открывает перед нами большие возможности. G+

11 комментариев

  1. Алексей 12 февраля 2015, 11:00 # 0
    Использую modx revo 2.3.1
    Создал спинет getValue
    В нем:
    ini_set('display_errors', -1); 
    error_reporting(E_ALL);
    $res = $modx->getObject('modResource',$id);
    $output = $res->get($val);
    return $output;
    
    Вызвал снипит в основном шаблоне. Отдал следующую ошибку:
    Fatal error: Call to a member function get() on a non-object in /var/www/altauto.ru/core/cache/includes/elements/modsnippet/24.include.cache.php on line 5
    Подскажите пожалуйста в чем может быть причина. Интернет и в частности google не помог решить данную проблему. Слышал что косвенно может быть виновата старая версия php, но у меня 5.3.3-7.
    1. Илья Уткин 12 февраля 2015, 11:14 # 0
      У вас $id не указан. Либо вызывать сниппет надо так: [[getValue? &id=`[[*id]]`]], либо в самом сниппете указать id
    2. Алексей 12 февраля 2015, 11:31 # 0
      Илья, в первую очередь огромное Вам спасибо за незамедлительный ответ. Первый же вариант `[[*id]]`подошел, и вывел желаемый результат.
      1. Алексей 12 февраля 2015, 14:07 # 0
        Еще один вопрос возник в момент обучения. В данном примере мы можем получить pagetitle или introtext ресурса чей ID указан в параметрах вызова снипета. А можно подобным способом добраться до дополнительных полей — TV параметров. Хочу попытаться получить их в виде php массива и уже работать с ними соответствующим образом.
        1. Илья Уткин 12 февраля 2015, 15:43(Комментарий был изменён) # 0
          Да, можно. ТВ мы рассматриваем в 4 части.
        2. PticaOgnennaya 21 августа 2015, 07:43 # 0
          Да, все-таки, нужно добавить, что $id нужно указать при создании сниппета.
          1. Александр 13 января 2016, 13:43 # 0
            Спасибо, очень доступно.
            1. amsterdam 22 сентября 2016, 15:00 # 0
              Подскажите с событием? Для вас это пара пустяков. Событие нужно следующее:

              Создание дочернего ресурса в определенном каталоге
              1. Илья Уткин 23 сентября 2016, 08:07 # 0
                Нужное событие — OnDocFormSave. Просто в коде самого плагина нужно добавить условие на выборку по родителю.
              2. amsterdam 23 сентября 2016, 08:34 # 0
                И как это условие будет выглядеть?) Вот так)

                if ($resource->get('parent') == 346)
                1. Илья Уткин 23 сентября 2016, 08:36 # 0
                  Да, типа того. Готового решения у меня нет — не сталкивался с такой задачей

                Авторизация

                через сервис Loginza:

                Подписка или RSS

                Буду присылать новые статьи — никакого спама



                Шаблоны MODX

                1 2 Дальше »

                Объектная
                модель
                MODX