Наверх

Создание ресурса с помощью MODX API

Для того, чтобы создать новый ресурс с помощью кода, нужно использовать процессор resource/create:
$response = $modx->runProcessor('resource/create', $data);
if ($response->isError()) {
    return $modx->error->failure($response->getMessage());
}

$id = $response->response['object']['id'];
return $id;

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

  1. Михаил 07 октября 2014, 03:38 # 0
    Илья привет! Встал такой вопрос. Делаю расширение, есть поля которые забиваю с админки. Использую modExtra. такой вопрос, каким способом записывать данные в базу, например, есть 2 поля, исходя из их я записываю в третье поле значение. Все должно как бы обновится \ записаться. Я вот не въеду, подскажи если знаешь. Спасибо!
    1. Илья Уткин 07 октября 2014, 06:40(Комментарий был изменён) # 0
      В процессоре обновления объекта в методе beforeSet() можно дописывать любую логику:
      $id = (int)$this->getProperty('id');
      $name = trim($this->getProperty('name'));
      if (empty($id)) {
          return $this->modx->lexicon('modextra_item_err_ns');
      }
      
      if (empty($name)) {
          $this->modx->error->addField('name',
          $this->modx->lexicon('modextra_item_err_name'));
      }
      elseif ($this->modx->getCount($this->classKey, array('name' => $name, 'id:!=' => $id))) {
          $this->modx->error->addField('name', $this->modx->lexicon('modextra_item_err_ae'));
      }
      
      /* Дописываем свою логику */
      if ($this->getProperty('id') > 12 && $this->getProperty('name') != '') {
          $this->setProperty('rank', 0);
      }
      /* / Дописываем свою логику */
      
      return parent::beforeSet();
    2. Михаил 07 октября 2014, 06:42 # 0
      т.е. метод setProperty это установка параметра.
      Блин дай ссылку где про это пчитать можно. А то я ломаю голову типо db->insert хз фигню какую то думаю.
      1. Илья Уткин 07 октября 2014, 06:46 # 0
        Почитай курс Василия Наумкина по созданию компонентов.
        1. Михаил 07 октября 2014, 07:03(Комментарий был изменён) # 0
          А то например при записи я хочу закинуть данные в другую таблицу. Каким способом ты это делаешь?
          И последний вопросик. Как отлаживаешь? Ну например как узнать поступающие данные. print_r или есть еще какие то способы?
          1. Илья Уткин 07 октября 2014, 07:19 # 0
            В любую таблицу записи заношу с помощью xPDO, а для отладки есть $modx->log(); — данные заносятся в журнал ошибок MODX.
      2. Ник 04 декабря 2014, 07:31 # 0
        Илья, каким образом можно менять значения tv чекбоксы и/или tv select multiple?
        В данный момент использую Tickets, но он не понимает как менять множественный выбор
        1. Илья Уткин 04 декабря 2014, 07:48 # 0
          Обрабатывать введенные пользователем данные своим плагином на сохранение ресурса и записывать нужные значения уже с помощью setTVValue
          1. Ник 04 декабря 2014, 07:54 # 0
            Не могли бы привести пример кода для разбора multiselect tv? Почему-то нигде не могу найти
            1. Илья Уткин 04 декабря 2014, 07:57 # 0
              Неа, сейчас времени нет. Попробуйте на modx.pro разместить объявление о работе — там помогут.
              1. Ник 04 декабря 2014, 08:46(Комментарий был изменён) # 0
                Реализовал, чекбоксы отлично работают. Но вот главный вопрос: как вывести все возможные значения tv?

                Возможные значения: test||test2||test3||test4||test5||test6||test7

                На странице я их сам пишу, а хотелось бы через сниппет получить

                Вывод на странице
                <div class="form-group">
                		<div id="services_services_current" style="display:none;">[[!showTV? &tid=`[[+id]]` &tvname=`services_services`]]</div>
                		<div>Услуги СТО</div>
                		<label><input type="checkbox" name="services_services[]" id="test" value="test">test</label>
                		<label><input type="checkbox" name="services_services[]" value="test2">test2</label>
                		<label><input type="checkbox" name="services_services[]" value="test3">test3</label>
                		<label><input type="checkbox" name="services_services[]" value="test4">test4</label>
                	</div>
                
                <?php
                
                $page = $modx->getObject('modResource',$tid);
                $tv = $page->getTVValue($tvname);
                
                // Стандартные чанки, можно переопределить
                if (empty($tpl)) {$tpl = '@INLINE <span>[[+value]]</span>';}
                if (empty($tplOuter)) {$tplOuter = '@INLINE [[+rows]]';}
                
                // Подключаем pdoTools для работы с инлайновыми чанками
                $pdo = $modx->getService('pdoTools');
                
                // Разбиваем текст по символу переноса строки
                $rows = '';
                $tmp = array_map('trim', explode("||", $tv));
                foreach ($tmp as $value) {
                	if (empty($value)) {continue;}
                	$rows .= $pdo->getChunk($tpl, array('value' => $value));
                }
                
                // Если есть, что выводить - выводим
                if (!empty($rows)) {
                	return $pdo->getChunk($tplOuter, array('rows' => $rows));
                }
                $('#services_services_current span').each(function(){
                			var checked = $(this).text();
                			$("input[value='"+checked+"']").click();
                		});
                
                <?php
                $page = $modx->getObject('modResource', $id);
                if($mode == 'upd' && $page->class_key == 'Ticket'){
                	$services_services = implode("||", $_POST['services_services']);
                  	if (!$page->setTVValue('services_services', $services_services)) {
                		  $modx->log(xPDO::LOG_LEVEL_ERROR, 'services_services - ERROR');
                	}
                	  
                  
                  }
                1. Илья Уткин 04 декабря 2014, 08:56 # 0
                  Вам нужно с помощью getObject получить нужный ТВ (объект класса modTemplateVar), у него получить значение поля elements, в котором и будет та самая строка. А затем, используя, например, explode разобрать строку на элементы массива и для каждого из них вывести чанк с нужным оформлением.

                  $output = "";
                  $tv = $modx->getObject('modTemplateVar', array('name' => 'services_services'));
                  $elements = $tv->get('elements');
                  $elements = explode('||', $elements);
                  foreach ($elements as $element) {
                    $output .= $modx->getChunk('tpl.element', array('name' => $element));
                  }
                  return $output;
                  <!-- tpl.element -->
                  <label>
                    <input type="checkbox"
                      name="services_services[]"
                      value="[[+name]]">[[+name]]
                  </label>
                  1. Ник 06 декабря 2014, 14:10 # 0
                    Сделал так, спасибо
                    modx.pro/help/4332/#comment-31922

        Авторизация

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

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

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



        Шаблоны MODX

        1 2 Дальше »

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