Создать узел программно с полем cck location - PullRequest
2 голосов
/ 16 октября 2010

Я пытаюсь программно создать узел пользовательского типа контента "location" в Drupal 6, с узлом, содержащим поле местоположения (http://drupal.org/project/location) называется "location" (да, я знаю, номенклатура может быть лучше, но я простоэкспериментируя с этим в данный момент).

Создание узла работает просто отлично, но я не могу найти способ установить содержимое для поля местоположения - то есть узел создается со всем содержимым, но значением для этого местоположенияfield.

Я пытаюсь создать узел следующим образом:

        $newNode = (object) NULL;
        $newNode->type = 'location';
        $newNode->title = $locationName;
        $newNode->uid = $userId;
        $newNode->created = strtotime("now");
        $newNode->changed = strtotime("now");
        $newNode->status = 1;
        $newNode->comment = 0;
        $newNode->promote = 0;
        $newNode->moderate = 0;
        $newNode->sticky = 0;

        $newNode->field_location[0]['street'] = 'Teststraße';
        $newNode->field_location[0]['postal_code'] = '12345'; 
        $newNode->field_location[0]['city'] = 'Musterstadt'; 

        node_save($newNode);

Узел создается с правильным заголовком, но поля местоположения остаются неустановленными.

Как я могупрограммно установить поля, связанные с местоположением?

Заранее спасибо!

Ответы [ 4 ]

4 голосов
/ 16 октября 2010

Хотел добавить это как комментарий, но кажется, что вставить код в комментарий довольно проблематично. Итак, начнем: я изменил internas так, чтобы я больше не использовал поле cck, а использовал опцию местоположения по умолчанию, как предложено googletorp.

Фактический код для создания нового местоположения и назначения его новому узлу выглядит следующим образом:

$location['street'] = "myStreet";
$location['postal_code'] = "12345";
...

$newLocationId = location_save($location);

$newNode = ...
$newNode->locations[0]['lid'] = $newLocationId;

node_save($newNode);

Спасибо за руководство:)

3 голосов
/ 16 октября 2010

Вместо node_save многие люди рекомендуют использовать drupal_execute для программной отправки формы редактирования узла.Это дает вам преимущество проверки формы.

См. http://thedrupalblog.com/programmatically-create-any-node-type-using-drupal-execute для превосходного примера использования drupal_execute.Не забудьте заглянуть в комментарий http://thedrupalblog.com/programmatically-create-any-node-type-using-drupal-execute#comment-70, чтобы увидеть дополнительную информацию о полях CCK.

Преимущество drupal_execute заключается в том, что вы также получаете проверку формы.Таким образом, после оператора drupal_execute вы можете увидеть, были ли какие-либо ошибки, используя form_get_errors (http://api.drupal.org/api/function/form_get_errors/6).См. Фрагмент (вставленный ниже) из http://civicactions.com/blog/cck_import_and_update для примера использования form_get_errors

$node->type = 'yourtype';
$values = array();
$values[...] = ...;
drupal_execute('yourtype_node_form', $values, $node);
$errors = form_get_errors();
if (count($errors)) {
  // do something ...
}

Еще один очень хороший ресурс по программной подаче узлов с использованием drupal_execute можно найти по адресу http://drupal.org/node/293663

2 голосов
/ 16 октября 2010

Я сделал это, только не с полем CCK, а с опцией расположения по умолчанию, которую вы можете добавить к узлам.

Что я сделал, чтобы это работало, так это сначала сохранил местоположение (есть функция APIдля этого), а затем добавьте идентификатор местоположения из сохраненного местоположения.

Пример кода:

Обратите внимание, $center из внешнего источника, поэтому он не связан с Drupal.Я знаю, что все мои местоположения из Дании в моем примере, так что эта часть просто жестко закодирована.

Когда вы не используете поле CCK, вам не нужно сохранять данные местоположения на узле, вместо этогоВы можете просто сохранить местоположение и создать пару самостоятельно.Это быстрое решение, вместо использования формы узла, как предложено.Для сложных узлов это может быть лучшим выбором, но когда все просто, это делается быстрее.

// Update the location data.
$location = is_array($node->location) ? $node->location : array();
$location += array(
  'street' => $center->address->address2,
  'city' => $center->address->zipName,
  'postal_code' => $center->address->zip,
  'country' => 'dk',
  'country_name' => 'Denmark',
);
location_save($location);

// Insert location instance, if it's not set yet.
$criteria = array(
  ':nid' => $node->nid,
  ':vid' => $node->vid,
  ':lid' => $location['lid'],
);
if (!db_result(db_query("SELECT COUNT(*) FROM {location_instance} WHERE nid = %d AND vid = %d AND lid = %d;", $criteria))) {
  db_query("INSERT INTO {location_instance} (nid, vid, lid) VALUES (%d, %d, %d)", $criteria);
}
0 голосов
/ 29 марта 2013

Для Drupal 7, сохранение в качестве вкладки расположения по умолчанию.

$location = array(
  'latitude' => $row->gmapycord,
  'longitude' => $row->gmapxcord,
);
$lid = location_save($location);
if ($lid) {
  $entity->locations['0']['lid'] = $lid;
}

Вдохновленный от: здесь

...