Как правильно сформировать запрос, что бы вставить новость вбазу.

Главные вкладки

Аватар пользователя Newbie-neko Newbie-neko 26 июля 2009 в 19:16

Здравствуйте, подскажите пожалуйста необходимый минимум таблиц в бд, в которые должны быть вставлены
данные, что бы успешно добавилась новость.

Я пока обнаружил 2 таблицы (node и node_revision)

Но после того как вставляюю туда новость, она не редактируется.

В какие ещё таблицы занести данные? Спасибо.

Комментарии

Аватар пользователя Newbie-neko Newbie-neko 26 июля 2009 в 23:14

Ну уж я понял что нарушаю. Раз он работать отказывается после 2х записей в бд.

Но надо нарушить.

И как бы её сложновато использовать эту функцию.

Там что-то никак не могу понять какова структура должна быть у ноды. (

Какова структура-то?

И как вызвать эту функцию из другой программы? Мне бы как бы из другой программы вызвать функцию.

Там переменные как Global обявлены. Но это пол беды ведь можно же самому вписать логин пароль юзера и т.п. Вот только связанные с этой функцией файлы каковы?

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

Аватар пользователя dimedrol dimedrol 27 июля 2009 в 0:19

"Newbie-neko" wrote:
Мне бы как бы из другой программы вызвать функцию.

С этого и стоило начинать.

Начинайте плясать с этого node_save. Smile Читайте все и внимательно.

Аватар пользователя dimedrol dimedrol 27 июля 2009 в 12:36

"Newbie-neko" wrote:
Про гугл я слышу в первый раз.

Значит Вас впереди ждет еще много приятных и удивительных открытий.

Аватар пользователя v_20q v_20q 28 июля 2009 в 13:56

Сохранять ноды без использования node_save() действительно не стоит.
При необходимости добавлять их из другой программы следует написать мост между этой программой и Drupal'ом. Есть несколько путей, как можно это сделать.

  1. Во-первых, можно написать собственный модуль, в котором реализовать hook_xmlrpc(). Эта функция будет принимать данные от внешней программы, нормализовать их drupal и сохранять при помощи node_save().
    • Плюсы заключаются в том, что внешняя программа и drupal могут находиться на разных компьютерах. Также программа может быть написана на любом языке, потому что во всех современных языках есть поддержка удалённого вызова процедур через xmlrpc.
    • Минусы заключаются в том, что нужно делать много http-запросов, что иногда невозможно из-за каких-либо причин. К тому же такой способ создаёт определённые проблемы с безопасностью, хотя конечно всё решаемо.
  2. Если внешняя программа написана на PHP, то можно напрямую использовать библиотеки Drupal'а в ней. Для этого в то место программы, которое будет служить мостом, следует добавить две строчки:
    <?php
    require_once $drupal_root . '/includes/bootstrap.inc';
    drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
    ?>

    где $drupal_root - это пусть от текущего рабочего каталога до папки, в которой лежат файлы index.php, update.php и другие.

    • Плюсы: самый просто вариант, так как будут доступны все функции.
    • Минусы: это возможно только, если внешняя программа написана на PHP, и потребуется довольно много памяти.
  3. Внешняя программа будет сохранять данные, которые нужно добавить в Drupal в какой-нибудь безопасной папке в формате xml. Для Drupal нужно написать собственный модуль, который будет реализовывать hook_cron(). Эта функция будет вызываться через равные промежутки времени (скажем, через час, смотря как настроен сервер) и будет считывать файлы из это безопасной папки по одному файлы, парсить данные и сохранять через node_save().
    • Плюсы: не требует больших затрат ресурсов (память, сетевые соединения), все языки очень хорошо поддерживают сохранение и извлечение данных из xml (в PHP - расширение SimpleXML).
    • Минусы: данные сохраняются не в реальном времени.
Аватар пользователя Newbie-neko Newbie-neko 28 июля 2009 в 19:54

v_20q, да, всё отлично, так и сделал. Спасибо.

Осталось найти описание ноды. Т.е в каком формате передавать $node в функция

node_save(&$node)

Если кто знает - дайте ссылку. Только не на гугл. Полуркать я и сам могу.

<?php
require_once $drupal_root . '/includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
?>

Аватар пользователя Newbie-neko Newbie-neko 28 июля 2009 в 20:03

Нода это что обьект что ли должен быть?

$node = new stdClass();
$node->is_new=1;
$node->title = "Book node".rand();
$node->body = "";
$node->type = "book";
$node->uid = 1;
$node->teaser = "";
$node->filter = 1;
$node->status = 1;
$node->comment = 2;
$node->created = time();
$node->changed = time();
$node->field_publisher[0]['value']='Gutenberg';
$node->field_author[0]['value']='Gutenberg';
$now = microtime(true);
node_save($node);
$x=$x+microtime(true)-$now;
$t=$t+microtime(true)-$now;

Аватар пользователя Newbie-neko Newbie-neko 28 июля 2009 в 20:14

Проблема решена.
Спасибо тем, кто знал как сделать, но молчал в тряпку, и не мог скинуть кусок
кода из 10 строк.

Спасибо товарищу dimedrol за гугл - ДОБАВИЛ В закладки.

И огромное спасибо v_20q, за require_once $drupal_root . '/includes/bootstrap.inc'; Это реально облегчило задачу. >_<

__________________________________________
require_once 'includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

$node = new StdClass;
$node->title = 'external node';
$node->type = 'news';
$node->status = 1; // Published
$node->body = 'some content...';
$node->comment = 2;
$node->promote = 1;

node_save($node) ;
____________________________________________

Офлайн.

Аватар пользователя v_20q v_20q 28 июля 2009 в 20:18

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

Минимум тебе нужны следующие свойства дать объекту: type, language, uid. Всё остальное будет добавлено автоматически со стандартными значениями в node_save(), а body и title будут пустыми. Даже язык можно по-моему опустить, хотя не уверен.

edit: А удалить нельзя комментарий уже? Smile

Аватар пользователя Newbie-neko Newbie-neko 28 июля 2009 в 20:36

Когда пытаюсь новую новость (созданную таким вот способом, что вверху указан) отредактировать, то испытываю затруднения. I lol Biggrin

warning: call_user_func_array() [function.call-user-func-array]: First argument is expected to be a valid callback, 'news_node_form' was given in D:\AppServ\money_exp\includes\form.inc on line 366.

Аватар пользователя Newbie-neko Newbie-neko 28 июля 2009 в 20:58

Всё, сделал.

Всем спасибо за помосч.

«Минимум тебе нужны следующие свойства дать объекту: type, language, uid. Всё остальное будет добавлено автоматически со стандартными значениями в node_save(), а body и title будут пустыми. Даже язык можно по-моему опустить, хотя не уверен.»

Дело в том что некоторые вещи сами не выставляются, к примеру поле type в таблице node
А без него потом новость не редактируется.

$node->type = "story";

Ну и последнее includes\bootstrap.inc - Пытается установить сессию.
Я конечно не знаю где это отключтть. Так что постоянно вылезает
: Cannot modify header information - headers already sent b

__________
$node = new StdClass;
$node->title = $zagolovok;
$node->type = 'news';
$node->status = 1; // Published
$node->body = $tobase;
$node->teaser = $tobase;
$node->comment = 2;
$node->promote = 1;
$node->type = "story"; // Иначе не редактируется. Баг в движке...

$node->format = 2;
_____________

А в остальном всё окей.

Аватар пользователя Newbie-neko Newbie-neko 28 июля 2009 в 20:59

«Наугад, а тип news создан вообще в «Типы материалов»?»

Да, типа, как раз-таки не было )

Ещё что-то там сессию пытается создать... Но это всё мелочи уже )