создание ноды с картинкой программно [РЕШЕНО]

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

Аватар пользователя chudomozg chudomozg 18 марта 2011 в 4:08

Приветствую вас, товарищи знатоки!

Сабж:
Создаю ноду следующим образом:

                //непосредсвенно создание ноды
                $node = new stdClass();
                $node->title = $res_mass['typeautoparts_name'].' '.$res_mass['firm_name'].' '.$res_mass['model_name'];
                $node->body = $res_mass['node'];
                $node->type = 'product';
                $node->uid = 1;
                $node->filter = 1;
                $node->status = 1;
                $node->comment = 0;
                $node->language ='ru';
                $node->field_firm_name[0]['value'] = $res_mass['firm_name'];
                $node->field_model_name[0]['value'] = $res_mass['model_name'];  
                $node->field_color_name[0]['value'] = $res_mass['color_name'];  
                $node->field_body[0]['value'] = $res_mass['body'];  
                $node->field_optic[0]['value'] = $res_mass['optic'];           
                $node->field_engine[0]['value'] = $res_mass['engine'];         
                $node->field_location_f_r[0]['value'] = $res_mass['F_R'];              
                $node->field_location_l_r[0]['value'] = $res_mass['l_r'];              
                $node->field_typeautoparts_name[0]['value'] = $res_mass['typeautoparts_name'];         
                $node->field_oem[0]['value'] = $res_mass['oem'];               
                $node->field_producer[0]['value'] = $res_mass['producer'];             
                $node->model = ($res_mass['origcode']+0).'';
                $node->sell_price = ($res_mass['price']);
               
               
                //*
                //РАбота с картинкой
                //*
                //Загружаем
                $file_jc=$res_mass['photos'][0];
                $file='sites/default/files/tmp/'.basename($file_jc);
                file_put_contents($file, file_get_contents($file_jc));
               
                //Регистрируем в системе
                // Get the file size
                $details = stat($file);
                $filesize = $details['size'];

                // Get the path to your Drupal site's files directory
                $dest = file_directory_path();

                // Copy the file to the Drupal files directory
                if(!file_copy($file,$dest)) {
                        echo "Failed to move file: $file.\n";
                        return;
                } else {
                        // file_move might change the name of the file
                        $name = basename($file);
                }

                // Build the file object
                $file_obj = new stdClass();
                $file_obj->filename = $name;
                $file_obj->filepath = $file;
                $file_obj->filemime =  file_get_mimetype($name);
                $file_obj->filesize = $filesize;
                $file_obj->filesource = $name;
                // You can change this to the UID you want
                $file_obj->uid = 1;
                $file_obj->status = FILE_STATUS_TEMPORARY;
                $file_obj->timestamp = time();
                $file_obj->list = 1;
                $file_obj->new = true;

                // Save file to files table
                drupal_write_record('files', $file_obj);

                // change file status to permanent
                file_set_status($file_obj,1);
               
               
                $image_field['fid'] = 'upload';
                $image_field['title'] = $node->title;
                $image_field['nid'] = $node->nid;
                $image_field['filename'] = $file_obj->filename;
                $image_field['filepath'] = $file_obj->filepath;
                $image_field['filemime'] = $file_obj->filemime;
                $image_field['filesize'] = $file_obj->filesize;
               
                $node->field_image_cache[0]=$image_field;
               
                node_save($node);

Картинка не прикрепляется

Картинка загружается на сервер, регистрируется в "files" - но к ноде не прикрепляется

Комментарии

Аватар пользователя Ch Ch 18 марта 2011 в 7:58

Картинка к ноде может крепится разными способами. Например через image field.
Создайте ноду с картинкой в ручную и поглядите как она выглядит.

Аватар пользователя chudomozg chudomozg 18 марта 2011 в 11:02

Ну так как знатоки дремлют сам решил свою проблему.И так прошу внимания

                //непосредсвенно создание ноды
                $node = new stdClass();
                $node->title = $res_mass['typeautoparts_name'].' '.$res_mass['firm_name'].' '.$res_mass['model_name'];
                $node->body = $res_mass['node'];
                $node->type = 'product';
                $node->uid = 1;
                $node->filter = 1;
                $node->status = 1;
                $node->comment = 0;
                $node->language ='ru';
                $node->field_firm_name[0]['value'] = $res_mass['firm_name'];
                $node->field_model_name[0]['value'] = $res_mass['model_name'];  
                $node->field_color_name[0]['value'] = $res_mass['color_name'];  
                $node->field_body[0]['value'] = $res_mass['body'];  
                $node->field_optic[0]['value'] = $res_mass['optic'];           
                $node->field_engine[0]['value'] = $res_mass['engine'];         
                $node->field_location_f_r[0]['value'] = $res_mass['F_R'];              
                $node->field_location_l_r[0]['value'] = $res_mass['l_r'];              
                $node->field_typeautoparts_name[0]['value'] = $res_mass['typeautoparts_name'];         
                $node->field_oem[0]['value'] = $res_mass['oem'];               
                $node->field_producer[0]['value'] = $res_mass['producer'];             
                $node->model = ($res_mass['origcode']+0).'';
                $node->sell_price = ($res_mass['price']);
               
               
                //*
                //РАбота с картинкой
                //*
                //Загружаем
                $file_jc=$res_mass['photos'][0];
               
                //сохраняем temp файл
                $file='sites/default/files/tmp/'.basename($file_jc);
                file_put_contents($file, file_get_contents($file_jc));
               
                //вот такая одна красивая строчка была на англоязычном сайте
                //http://www.appnovation.com/creating-nodes-programmatically-have-cck-imag...
                //вместо моих строк 30-50 Biggrin я в шоке был)))
                //сохраняем файл куда надо
                $field = field_file_save_file($file, array(), 'sites/default/files/');
               
                $node->field_image_cache[] = $field;
       
                //сохраняем ноду
                node_save($node);
                if (!isset($file)) unlink($file);
Аватар пользователя chudomozg chudomozg 18 марта 2011 в 17:51

"Ch" wrote:
file_put_contents($file, file_get_contents($file_jc));
Это что такое?

Сохранение фала в temp. стандартная PHP функция - Drupal тут не при чем.

Аватар пользователя chudomozg chudomozg 19 марта 2011 в 2:11

Дело в том, что я пишу модуль импорта со старого сайта. А ссылки на картинки там не всегда "прямые". и не уверен что copy() может с URL работать.