История такая.
Пытаюсь перед сохранением ноды(seller_bid) поменять значение CCK поля(Изображение), т.е. сделать так чтобы использовался уже существующий файл.
С помощью <pre><?php print_r($node); ?></pre>
вывел все переменные ноды, в том числе изображение:
(
[0] => Array
(
<strong>[fid] => 87</strong>
[list] => 1
[data] => Array
(
[description] =>
[alt] =>
[title] =>
)
[uid] => 1
[filename] => samsung omnia lite b7300.jpg
[filepath] => sites/default/files/samsung omnia lite b7300_1.jpg
[filemime] => image/jpeg
[filesize] => 144013
[status] => 1
[timestamp] => 1267804958
[nid] => 121
[view] =>
)
)
По идее меняю field_image[0][fid] на нужный и меняется файл в отображении. Попробовал изменить напрямую в базе.
Изображение изменилось на нужное.
Делаю модуль чтобы заменить при сохранении новой ноды:
function seller_bid_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
switch ($op) {
case 'presave':
$node->field_image[0][fid]=74;
node_save($node);
break;
}
}
?>
Изменения field_image[0][fid] не происходит.
Подскажите, что делаю не так?
Комментарии
1. Вес модуля
2. Контролировать тип ноды
3. Не забываем, что имеем дело с CCK-полями, там может быть не только fid, сделайте var_export() и выведите в drupal_set_message()
Cделал var_export() и вывел в drupal_set_message(). Получил следующее:
0 => array (
'fid' => '87',
'list' => '1',
'data' => array (
'description' => '',
'alt' => '',
'title' => '',
),
'uid' => '1',
'filename' => 'samsung omnia lite b7300.jpg',
'filepath' => 'sites/default/files/samsung omnia lite b7300_1.jpg',
'filemime' => 'image/jpeg',
'filesize' => '144013',
'status' => '1',
'timestamp' => '1267804958',
'nid' => '121',
'view' => '',
),
)
Добавляю контроль по типу ноды и получаю такой код для модуля:
if($node->type == 'seller_bid') {
switch ($op) {
case 'presave':
$node->field_image = array(
array(
'fid' => '74',
'list' => '1',
'data' => array (
'description' => '',
'alt' => '',
'title' => '',
),
'uid' => '1',
'filename' => 'Samsung_B7300_Omnia_LITE-1.jpg',
'filepath' => 'sites/default/files/Samsung_B7300_Omnia_LITE-1.jpg',
'filemime' => 'image/jpeg',
'filesize' => '111898',
'status' => '1',
'timestamp' => '1267652677',
'nid' => $node->nid
)
);
node_save($node);
break;
}
}
}
И этот код все равно не работает у меня.
Что там с весом модуля? Вес ведь влияет на порядок обработки хука модулями, каким образом он может повлиять на выполнение/невыполнение кода? Можно подробнее об этом?
В базу записываются значения, которые соответствуют тому, что ввел пользователь, данные не подменяются.
В чем может быть еще причина?
Несколько нод будут использовать одну запись в БД? Тог при удалении одной из нод - запись будет удалена и остальные останутся без изображения.
...
node_save($node);
...
Зачем вы кусаете собственный хвост? Читайте в API, что делает [module=hook_nodeapi] и применяйте его для своих задач.
Нет, мне надо вставить Imagefield из одной ноды в другую, продублировать, файл один, а записи в базе у каждой ноды свои.
Не понял Вас. API я почитал перед тем как делать.
«...В основном hook_nodeapi() используется в связке с hook_form_alter(). Модули используют hook_form_alter() для дополнения форм редактирования новыми элементами и hook_nodeapi() для чтения и записи значений этих элементов из и в базу данных.»
Собственно я и пытаюсь(применять hook_nodeapi) на интересующем меня этапе сделать так, чтобы в базу при сохранении ноды записывались нужные данные.
Код выше, но он не работает, и я хочу понять почему.
Поэтому и спрашиваю Ваши мнения.
Вопрос по прежнему актуален: что не так?
Вам просто указали , что по node_save - опять вызывается хук hook_nodeapi с параметром presave, по идее ваш код дожен уйти в бесконечную рекурсию
Уберите node_save (нода и так запишется) ...
Я неверно выразился. Если эти несколько записей в бд будут указывать на один файл, то при удалении одной ноды, удалиться так же и файл - другие ноды останутся "осиротевшими". Этот момент надо учесть.
Убрал, спасибо за разъяснение.
Спасибо, действительно важный момент.
На данный момент код модуля имеет вид:
if($node->type == 'seller_bid') {
switch ($op) {
case 'presave':
$node->field_image = array(
array(
'fid' => '74',
'list' => '1',
'data' => array (
'description' => '',
'alt' => '',
'title' => '',
),
'uid' => '1',
'filename' => 'Samsung_B7300_Omnia_LITE-1.jpg',
'filepath' => 'sites/default/files/Samsung_B7300_Omnia_LITE-1.jpg',
'filemime' => 'image/jpeg',
'filesize' => '111898',
'status' => '1',
'timestamp' => '1267652677',
'nid' => $node->nid
)
);
break;
}
}
}
И код этот по-прежнему не работает...
Какие есть еще мысли?
А можно ли hook_nodeapi использовать для типов материалов, которые созданы средством Друпала, а не самописного модуля, и если да, то куда вставить код переопределения, в template.php?