Nawigacja
Książka
# W każdy czwartek o 22:00 #
Spotkania ludności drupal.pl na IRC- odpal czat -
- dedykowany temat na forum -
Ostatnie tematy na forum
- Pozycje w menu same zmieniają miejsca
- Szybki komplet baramek proxy
- Klonowanie rodzaju zawartości
- Lubie to w views
- nie aktywne opcje
- Drupal - portfolio
- [Ubertcart][uc_webform_pane] Gdzie system zapisuje Attributes i Opcje chciałbym je sklonować
- aktywna pozycja w menu
- Odmowa dostępu przy zmianie szablonu
- Notifications w drupal 7 a OG
Shoutbox
grzegorz.bartman:
Wybiera się ktoś na DrupalCon do Monachium? 2 dni 10 godzin ago |
malcolm:
No, wspomnień czar ;) 6 dni 8 godzin ago |
spamator12:
@Mati thx :P |
Przy probie użycia hook_insert wywala błąd: "Unknown column 'vid'"
- Zaloguj się lub utwórz konto, by odpowiadać
- Zaloguj się lub utwórz konto, by odpowiadać
- Drupal 6
Przyznam, że skończyły mi się pomysły...
Próbuje mojego sparsowanego xml-a dodać bezposrednio do drupala, mam wcześniej utowrzony typ zawartosci.
Przy probie użycia hook_insert wywala mi dziwny bład:
kawałek mojego kodu:
function mycontenttype_insert($node) {
petla po xml
db_query("INSERT INTO {mycontenttype} (vid, nid, name) VALUES ('%d', '%d', '$name')",
$node->vid, $node->nid, $node->name);
komunikat błedu:
user warning: Unknown column 'vid' in 'field list' query: INSERT INTO mycontenttype
no więc nie wiem jakim cudem mam unknown column vid, skoro to kolumna utorzona przez drupala?
być może drupal_write_record byłby tutaj lepszy ale musiałabym chyba najpierw skorzystać z hook_schema, nie bardzo mam teraz na to czas, do hook_schema zajrze przy okazji pisania hook_install ;)





Daj więcej kodu, bo samo query wygląda ok. Próbowałaś może debugować?
w sumie nie probowałam debugować, zaraz pogrzebie po netbeansie i zobaczymy co wyjdzie (w sumie jeszcze tego nie robiłam) ;) poniżej kod
<?php
//insert into databse hotel
function hotels_insert($node) {
//simplexml load xml file
$link = variable_get('bluevendo_path',0);
$hotels = simplexml_load_file($link.'/hotelfulllist.xml') or die("Error: Cannot create object"); //db_query("DELETE FROM hotels") or die(db_error()); foreach ($hotels->hotel as $hotel) {
$hotel_atrybuty = $hotel->attributes();
$hotel_id = $hotel_atrybuty['id'];
$hotel_tomid = $hotel_atrybuty['tomid'];
$hotel_name = $hotel->params->name;
$hotel_city = $hotel->params->city;
$hotel_cityid = $hotel->params->city[id];
$hotel_region = $hotel->params->region;
$hotel_regionid = $hotel->params->region[id];
$hotel_country = $hotel->params->country;
$hotel_countryid = $hotel->params->country[id];
$hotel_standard = $hotel->params->standard;
$hotel_season = $hotel->params->seasontypename;
$hotel_seasonid = $hotel->params->seasontypeid;
$hotel_categoryname = $hotel->params->categoryname;
$hotel_minage = $hotel->params->minage;
$hotel_types = $hotel->params->types;
$hotel_label = $hotel->descriptions->description->label;
$hotel_body = $hotel->descriptions->description->body;
$hotel_image = $hotel->images->image;
$hotel_clasifications = $hotel->clasifications;
$hotel_latitude = $hotel->geolocation->latitude;
$hotel_longitude = $hotel->geolocation->longitude;
db_query("INSERT INTO {hotels} ( vid, nid, hotelid,tomid,name,city,cityid,region,regionid,country,countryid,standard,season,seasonid,categoryname,minage,types,label,body,image,clasifications,latitude,longitude) VALUES ('%d', '%d', '$hotel_id','$hotel_tomid','$hotel_name','$hotel_city','$hotel_cityid','$hotel_region','$hotel_regionid','$hotel_country','$hotel_countryid','$hotel_standard','$hotel_season','$hotel_seasonid','$hotel_categoryname','$hotel_minage','$hotel_types','$hotel_label','$hotel_body','$hotel_image','$hotel_clasifications','$hotel_latitude','$hotel_longitude')",
$node->vid, $node->nid, $node->hotelid,$node->tomid,$node->name,$node->city,$node->cityid,$node->region,$node->regionid,$node->country,$node->countryid,$node->standard,$node->season,$node->seasonid,$node->categoryname,$node->minage,$node->types,$node->label,$node->body,$node->image,$node->clasifications,$node->latitude,$node->longitude);
drupal_set_message('Hoteletest zostały dodane do bazy danych.');}
}
?>
to cały pliczek inc odpalany z menu modułu w petlach brakuje jeszcze paru rzeczy ale to poźniej dopisze, prosta petla chociaz duzo obiektów
a daj jeszcze wynik DESCRIBE hotels; z mysqla. Nie ma na tekj kolumnie jakiegoś autoincrementa, czy literówki w nazwie?
przez chwile nie wiedziałam o co ci chodzi ;)
tylko describe hotels owszem zwróci mi ale inna tabele, a hook_insert odwołuje sie do typu zawartości content_type_hotels {hotels} bo w tabeli hotels (taką też mam była mi potrzebna do testów pętli faktycznie nie ma pola vid, nid
dobra, chyba mam coś źle zdefiniowane, skoro hook_insert chce wrzucać dane do innej tabeli, moze to przez brak hook_node_info() tam chyba powinna być definicja base...
Mam kilka uwag/pomysłów:
1. Wszystkie segmenty są trzymane w tabeli 'node', Drupal nie tworzy oddzielnej tabeli dla każdego rodzaju zawartości. To może być bezpośrednia przyczyna błędu.
db_query("INSERT INTO {hotels} ( vid, nid,2. Lepiej jest dodawać nowe segmenty korzystając z API a nie bezpośrednio wstawiając nowy rekord do bazy, bo wtedy nie odpalają się standardowe hook'i, validacja itd.
Przyjżyj się
node_submitinode_save.3. Nie bardzo rozumiem, czemu wybrałaś hook_insert(). Wygląda na to, że aktualizujesz jakieś hotele na podstawie zewnętrznego pliku XML, tylko co ma do tego hook_insert?
Ten hook jest odpalany w momencie wstawiania nowego node'a do bazy (albo tuż po ;). Zauważ, że nie korzystasz wcale z parametru $node (poza insertem).
4. Skoro już doszliśmy do inserta, w pętli chcesz wstawić kilka hoteli, ale $node się nie zmienia, więc SQL wywali pewnie błąd, bo $node->nid musi być unikalny.
Nie lepiej podpiąć ten kod pod CRONa albo dodać gdzieś link w menu?
Michlis, zaczen od końca;)
4. tak będzie to podpiete pod crona jak zadziała, link w menu też mam wywołujacy reczne dodanie, wiec user sam zdecyduje czy hotele sie dodadzą/updetuja przez crona czy recznie.
3. ucze sie, wybrałam insert bo sadziłam ze z mojej petli powstawiam sobie własnie nody do bazy, ale chyba walnełam sie na nazewnictwie :/
node=roadzaj zawartosci
segment=pojedynczy obiekt noda ?
2. ok popatrze na node_submit i node_save
czytałam troche o drupal_write_record() ale nie chciało mi sie odpalać do tego schema :/
lenistwo chyba nie popłaca
1. wiesz nie do końca cię rozumiem, skoro po utowrzeniu nowego typu zawartosci np hotels, utowrzyła mi sie tabela z czescią pól dla hotelu "content_type_hotels" to jakoś nie moge sie zgodzic z tym co napisałes ;)
ucze sie ciagle wiec nie wszystko jest dla mnie jasne i logiczne, szukam sposobu aby mojego sparsowanego xmla, z petli wrzucic od razu do bazy danych ale drupal info o jednym "obiekcie" trzyma w kilku tabelach, dlatego probuje to ogarnac
tabela node, tabela typu zawartosci, i jeszcze tabele to pól (gdzie mamy mozliwosc wieloktotnego dodania wartosci)
Ad. 1)
Hmm, sprawdziłem na prawie czystej instalce D7 i po stworzeniu nowego rodzaju zawartości nie tworzy się tabel 'content_type_...', więc może tworzy ją jakiś inny moduł na swoje potrzeby?
Dalej będę się upierał, że wszystkich node'y siedzą w tabeli 'node' tzn. ich definicja. W D6 treść (body) jest w 'node_revision'. W D7 sporo się pozmieniało po dodaniu tabel 'field_...'.
Jedna rzecz mnie jeszcze zastanawia. Twój kod wygląda tak jakbyś miała pustą bazę i wrzucała wszystko jak leci z pliku XML. Nie sprawdzasz nigdzie czy hotel już istnieje, tak jakby aktualizacja nie wchodziła w grę, tylko dodajesz nowe dane. Na pewno tak ma być?
Michlis, na tym etapie sprawdzanie czy coś jest w bazie to byłoby strzał w stope, co mam srpawdzac skoro nic nie chce mi sie dodac?
Mowa tutaj o Drupal 6, być moze D7 robi w bazie inne tabele, ja na razie musze cos dopisac do D6.
Tak docelowo, ma być sprawdzanie czy dane id wystepuje, potem update, jak nie wystepuje to insert.
Ale na razie utknełam na dodaniu czegos, jak widzisz dany typ zawartosci ma sporo pól, nie chce mis ie tego przepisywac do D7 bo wcale nie jestem pewna ze lepiej mi pojdzie na D7.
Jakieś pomysły, wskazówki?
Zacznij od dodawania do bazy korzystając z API a nie bespośrednio z poziomu SQLa. Mam tu na myśli
node_submit()inode_save(). Tutaj masz przykładowe tutoriale:Migrating the Drupal way. Part I: creating a node....
Drupal 6 - Inserting & Updating Nodes Programmatically
ok dzieki, przejże te linki, w miedzyczasie oglądam sobie jak wygląda i działa node_example i nodeapi_example
edit: zrobiłam test na szybko i działa ;)
to ide się grzebać w pisaniu jakie dane do którego pola mają wpaść...