Здравствуйте!
Хочу спросить, есть ли какие нибудь готовые решения удаленного (внешнего) добавления нод в друпал?
Пытаюсь решить такую задачу, на основе внешнего скрипта.
Нужно в него POST методом отправить такие данные:
- имя материала
- тело материала
- тип ноды
- и несколько дополнительных полей
после этого скрипт добавляет в базу эту запись и публикует ее.
Подскажите пожалуйста, может какие хуки или api и хоть примерно как с ними разобраться!
Или может есть другое решение подобной задачи?
Буду очень благодарен!
Комментарии
[ru-api=drupal_execute]drupal_execute[/ru-api]
Второй пример кода на странице.
Спасибо Вам огромное!
К стати как раз почти решил эту проблему с помощью node_save($node) с использованием CCK
Вот пример, может и пригодится еще кому то:
<?php
include_once './includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL); // Construct the new node object.
$node = new stdClass(); $node->title = "Your node title";
$node->body = "The body text of your node.";
$node->type = 'rpc';
$node->created = time();
$node->changed = $node->created;
$node->status = 1; // Published?
$node->promote = 0; // Display on front page?
$node->sticky = 0; // Display top of page?
$node->format = 1; // Filtered HTML?
$node->uid = 1; // Content owner uid (author)?
$node->language = 'ru'; /* **************
CCK date fields
format dates as shown in your content_type's data table
Mine were: 2008-12-25T00:00:00
************** */
$today = mktime(0,0,0, date("m"),date("d"),date("Y"));$cck_today = date("Ymd") . "T00:00:00"; $node->field_abc_date_joined[0]['value'] = $cck_today; /* **************
CCK reference fields
$node->['field_name'][0]['uid'] = 3;
$node->field_abc_user_ref_uid[0]['uid'] = 1; /* **************$node->['field_name'][0]['nid'] = 125;
************** */
CCK select fields using the options widget
$node['field_name']['key'] = 'your value';
or if it's multiple select: $node['field_name']['keys'] = array('your value').
************** */
$node->field_abc_intern_status['key'] = 'trainee';
$node->field_abc_certified_value['key'] = 'no'; /* **************
CCK regular text fields
$node['field_name'][0]['value'] = 'your value';
************** */
$node->field_abc_member_status[0]['value'] = 'volunteer'; node_submit($node);
node_save($node);?>
Но при использовании этого кода, нода почему то добавлялась дважды! Пока не могу понять почему!
Оставте что то одно)
Только что пробовал Ваш вариант.
Не понимаю почему, но обратно та же проблема. Публикуется два поста.
Если ставлю в настройках скрипта существующего пользователя, то пдобавляется один пост от неги и один от "Гость".
Если ставлю не существующего, то добавляется один пост но в админке потом ошибка типа "Пользователя такого-то не существует!".
Перед этим кодом ставил:
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
Что-то не правильно делаю?
Подскажите пожалуйста!
Пробовал!
Если убрать node_save($node) - то вообще ничего не сохраняется!
Если убрать node_submit($node) и оставить только node_save($node) то точно такой-же результат (2 добавления)
Мне кажется проблема в
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
Я просто толком не знаю что там должно подключатся!
Вы точно знаете, для чего предназначена функция node_submit? Раз даёте такой совет.
mrdakotas, жалко, времени нет посмотреть нормально, странная у Вас проблема. Я помню делал такую задачу и всё было нормально... Что-то делаете не так.
Незнаю, заглянул в один свой старый скрип тупого парсера в отдельном файле, стоит только node_save(&$node); еще есть
require_once './includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
и
require_once './modules/system/system.install';
require_once './includes/file.inc';
зачем
require_once './modules/system/system.install';
непомню и сомневаюсь что оно нужно.
Хочу напомнить что это все делается в внешнем отдельном php скрипте (независимый файлик).
Такое чувство что
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
дважды вызывает его!
Но это лисшь догадки(
Я хоть правильный инклуд подключаю?
Возможно нужно
node_save($node);
Запихнуть в отдельную какую не будь функцию (чтобы избежать повторной интерации)?
гм... Интересный вопрос возникает - почему для этого не сделать свой модуль, как и положено?
Хотя, я пока что не совсем понял, как у Вас всё вообще устроено. И что подразумевается под "внешним" файлом? Подробнее, плиз.
Будет post.php
Пишу его для того чтобы внешние публикации отсылать в него post запросами.
Поэтому решил что внешним файликом будет удобнее, так как пользователя как такового не будет, а будет указываться только $node->uid = 1; (допустим).
То есть никаких кук не надо, просто отправка пост запроса с конкретной информацией.
Если это можно решить с помощью написания модуля, то еще лучше!
Но скажу сразу, я не слишком силен в написании модулей, буду очень благодарен если хоть покажите где путь праведный!)
Можно.
Теперь ещё раз - словесная постановка задачи. Что вообще конкретно делаете? Я до сих пор не понял То есть, обычным языком напишите, что за задача стоит. Откуда отсылается запрос на добавлении ноды, зачем это делается и так далее.
Я без полного понимания вопроса не знаю, что именно подсказать. У меня складывается такое ощущение, что Вы городите ненужный огород
А по созданию своих модулей информации море. Например:
http://remage.su/content/drupal-urok-16-pishem-svoi-modul-dlya-drupal
Чтобы научиться это делать, достаточно... Начать.
На счет огорода, это 100% с Вами согласен!)))) Некуда деваться просто!)
Сейчас попробую объяснить!)
Есть несколько блогов на WordPress!
Есть один сайт на Drupal.
Задача такая:
Нужно синхронно добавлять материалы публикуемые на блогах WordPress прямо на Drupal!
Сначала хотел все реализовать на XML-RPC. Не осилил! Понял что это слишком уж много заморочек!(
Решил хакнуть ВордПресс, чтоб при публикации отдельно отсылался материал пост запросом на друпаловский скрипт, который будет публиковать его в друпале!
Вот так вот!)
Может есть идеи по лучше?
Или идеи реализации того что я уже начал городить?))
node_submit лишний.
Убери node_submit. А так все верно.
Но через модуль будет правильней делать.
С чего Вы взяли? Вы, как и предыдущий оратор, думаете, что эта функция сабмитит ноду?
В ситуации ТС эту функцию можно и убрать, да, но это ничего не решит.
Ясно. Тогда делать свой модуль. А там уже реализовать любые из приведённых выше решений.
Ссылку на урок тоже дал.
[ru-api=node_submit]node_submit[/ru-api]
Это всё не нужно. Пусть ТС создаёт свой модуль, как и положено.
Эта функция нужна раз в триста лет.И в данном случае свои фукнуции не выполняет.
это весь код?
<?phpinclude_once './includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
// Construct the new node object.
$node = new stdClass();
$node->title = "Your node title";
$node->body = "The body text of your node.";
$node->type = 'rpc';
$node->created = time();
$node->changed = $node->created;
$node->status = 1; // Published?
$node->promote = 0; // Display on front page?
$node->sticky = 0; // Display top of page?
$node->format = 1; // Filtered HTML?
$node->uid = 1; // Content owner uid (author)?
$node->language = 'ru';
/* **************
CCK date fields
format dates as shown in your content_type's data table
Mine were: 2008-12-25T00:00:00
************** */
$today = mktime(0,0,0, date("m"),date("d"),date("Y"));
$cck_today = date("Ymd") . "T00:00:00";
$node->field_abc_date_joined[0]['value'] = $cck_today;
/* **************
CCK reference fields
$node->['field_name'][0]['uid'] = 3;
$node->['field_name'][0]['nid'] = 125;
************** */
$node->field_abc_user_ref_uid[0]['uid'] = 1;
/* **************
CCK select fields using the options widget
$node['field_name']['key'] = 'your value';
or if it's multiple select: $node['field_name']['keys'] = array('your value').
************** */
$node->field_abc_intern_status['key'] = 'trainee';
$node->field_abc_certified_value['key'] = 'no';
/* **************
CCK regular text fields
$node['field_name'][0]['value'] = 'your value';
************** */
$node->field_abc_member_status[0]['value'] = 'volunteer';
node_submit($node);
node_save($node);?>
или что то за бортом оставили? А где скрипт отправки пост запроса?
Спасибо большое всем за помщь!
Приступил к созданию модуля!
Только не очень понимаю куда мне отправлять пост запрос?
Что примерно должно быть в модуле описывающее адрес интерации нашего скрипта постинга?
Не совсем согласен. По её коду можно увидеть, что она сама обрезает текст до тизера, устанавливает автора ноды, время создания и так далее.
Просто не нужна. Всё вышеназванное ТС сделал руками.
Смотреть [ru-api=hook_menu]hook_menu[/ru-api].
Да, это основа!
Скрипт отправки позже будет писаться, и к друпалу не имеет отношения! Это пока что не так важно...
Возможно, что и важно, раз нода создаётся в двух вариантах
Ок, щас буду смотреть!
Ну в данном случае я скрипт запускал руками. То есть повторная интерация по какой то другой причине кроме самого трабла в скрипте - исключена!
Сделал модуль! Обратно тот же результат! 2 ноды... ((((
Что делать?
Прикрепите-ка его к комментарию, посмотрю.
Я особо не старался навести там порядок, дошел до того чтобы он просто запустился.
Вот он и запустился... )
Вышло примерно так:
function dacopost_help($path, $arg) {
$output = '';
switch ($path) {
case "admin/help#dacopost":
$output = '<p>'. t("Displays information about site") .'</p>';
break;
}
return $output;
} // function dacopost_help
function dacopost_perm() {
return array('access dacopost content', 'access administration pages');
} // function dacopost_perm()
function dacopost_menu() {
$items = array();
$items['admin/settings/dacopost'] = array(
'title' => 'dacopost module settings', //Заголовок страницы
'description' => 'Description of your dacopost settings page', //Описание
'page callback' => 'drupal_get_form', //Функция отображающая страницу, мы создаем
//форму, поэтому используем системную функцию
'page arguments' => array('dacopost_admin'), //Содержимое формы
'access arguments' => array('access administration pages'), //Права доступа, если дать
//анонимусам право 'access administration pages', они смогут админить наш модуль.
'type' => MENU_NORMAL_ITEM, //Нормальный пункт меню
);
return $items;
}
function dacopost_admin() {
// Construct the new node object.
$node = new stdClass();
$node->title = "Modul posts";
$node->body = "Superposts";
$node->type = 'rpc';
$node->created = time();
$node->changed = $node->created;
$node->status = 1; // Published?
$node->promote = 0; // Display on front page?
$node->sticky = 0; // Display top of page?
$node->format = 1; // Filtered HTML?
$node->uid = 1; // Content owner uid (author)?
$node->language = 'ru';
node_submit($node);
node_save($node);
}
Сильно не бейте, я учусь)
----------
Поправил, первый раз не правильный вариант кода вставил!
Ох и ужас Брр
Делается элементарная проверка такого рода:
function dacopost_menu() {
$items['dacopost'] = array (
'title' => 'dacopost',
'page callback' => 'dacopost_node_add',
'access arguments' => array('access content'),
'type' => MENU_CALLBACK,
);
return $items;
}
function dacopost_node_add() {
$node = new stdClass();
$node->title = 'Modul posts';
$node->body = 'Superposts';
$node->type = 'page';
$node->created = time();
$node->changed = $node->created;
$node->status = 1; // Published?
$node->promote = 0; // Display on front page?
$node->sticky = 0; // Display top of page?
$node->format = 1; // Filtered HTML?
$node->uid = 1; // Content owner uid (author)?
$node->language = 'ru';
node_save($node);
}
Сохраняем код в файл модуля, чистим кэш. Заходим на страницу /dacopost. Страница загружается пустой. Потом идём в /admin/content/node/overview и видим, что добавилась одна нода.
У Вас это так?
Ахаха))) Ну спасибо!))
Почти... Опять два поста!(
Это что-то из области фантастики уже. У меня одна нода создаётся, как и положено.
Сайт на хостинге? Можно доступ к нему?
Да конечно! Скинул в личку!
Поставил тот же модуль на новый движок на другом сервере...
Таже хрень...
Уже крыша едет....(((
Вы меня прям напугали.
Ещё раз. Заходим на страницу /dacopost. Загрузилась страница, то есть нода создалась.
/admin/content/node
проверяем тут - добавилась одна нода. Если у Вас всё равно добавится две, то Вы - волшебник
Удалил все материалы на сайте, убедитесь ещё раз, что всё работает.
Меня интересует другой вопрос - как Вы делаете, что их две создаётся... Как ещё по-другому можно мою инструкцию воспроизвести?
Ахахаха)))
Видимо так!))
Ну честное слово, не знаю как так получается....?(
Уже на разных движках и на разных серверах пробовал!(
Неужели это из-за браузера может быть?
Всё сделано строго, как я написал выше?
/dacopost
/admin/content/node
И в результате +2 ноды?
Да!
Я очень извиняюсь, по ходу нашел ошибку...
Дело в браузере!
Работал из FireFox, ошибка повторялась, попробовал через Opera все нормально, добавилась одна!
Я в шоккке....(
Я оперщик.
Сейчас попробовал с файр фокса - всё нормально тоже.
Но я обратил внимание, что список нод также пуст, каким я его и оставил. Видимо, дальнейшие эксперименты проводились на локалке?
Почти!) На другом сервере!
Но на нем такие же траблы были из Фаерфоксом!
Сейчас с Оперой вроде все норм!
Это всё не нормально... У меня же из FF работает...
У Вас какая версия?
3.6.13 и 4.0.1 - всё отлично.
Короче, такое ощущение, что проблема только у Вас.
Кстати, этот модуль, что я сделал, нельзя использовать по сути. Если кто будет знать его адрес, то сможет плодить ноды как ему вздумается. Нужно как-то продумать с правами на запись. Права, которые непосредственно в модуле описываются, тут ничего не дадут, ибо вызов страницы не пользователем делается, а автоматикой - запросом с другого сайта.
Думаю, можно в POST передавать для проверки какое-нибудь ключевое слово и проверять в модуле, чтобы оно совпадало с заданным.
Да-да! Именно так я и задумал.
Но там немного хитрее будет! Что то типа динамического хеша.
Выходит что да!
Возможно это из-за каких то включенных плагинов в FF.
К стати читал на орговском форуме, тоже у некоторых наблюдались такие проблемы, которые в итоге так и не решались!
Если найду 100% аргумент трабла, то обязательно отпишу! И все же думаю собака зарыта где то в FF...(
P.s.: CSoft, Огромное Вам спасибо за помощь и терпеливость!
Не за что Был рад помочь, приятно делиться опытом, ведь не так давно вопросы здесь задавал я
Еще приятнее когда есть такие добрые люди, которые готовы пожертвовать своим временем и знаниями!)
дайте поюзать
Что именно? В чем проблема?
чем напоминет мой случай: http://www.drupal.ru/node/71416
кому лень смотреть всю переписку - прочитайте тему с вопросом и самый последний пост.