Onlangs ben ik begonnen met het schrijven van een Drupal 7 module met de Entity API maar ik zit met een probleem. Iedere maal ik probeer mijn entity te wijzigen, krijg ik een error. Dit lijkt te worden veroorzaakt door het meerdere malen laden van de load() method.
Recoverable fatal error: Object of class stdClass could not be converted to string in DatabaseStatementBase->execute() (regel 2039 van /drupal7/includes/database/database.inc).
Dit is waarschijnlijk te wijten aan het dubbel uitvoeren van FooController::load.
Onderstaand is de code die ik gebruik.
<?php
function foo_menu() {
$items = array();
...
$items['admin/foo/%foo/edit'] = array(
'title' => 'Edit foo',
'page callback' => 'foo_edit',
'page arguments' => array(2),
'access arguments' => array('administer content'),
'type' => MENU_CALLBACK,
);
...
return $items;
}
function foo_edit($foo) {
return drupal_get_form('foo_edit_form', $foo);
}
function foo_edit_form($form, &$form_state, $foo) {
$form['#foo'] = $foo;
$form_state['values'] = $foo;
$form['id'] = array(
'#type' => 'hidden',
'#value' => $foo->id,
);
...
$form['picture'] = array(
'#type' => 'file',
'#title' => t('Picture'),
'#default_value' => $foo->picture->filename,
);
...
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Save'),
);
return $form;
}
function foo_edit_form_submit($form, &$form_state) {
$foo = (object)$form_state['values'];
if ($picture = file_save_upload('picture')) {
$picture = file_move($picture, FOO_FILE_PATH . $picture->filename, FILE_EXISTS_RENAME);
$picture->status |= FILE_STATUS_PERMANENT;
$picture = file_save($picture);
$foo->picture = $picture->fid;
}
entity_get_controller('foo')->save($foo);
drupal_set_message(t('Foo saved.'));
$form_state['redirect'] = 'admin/foo';
}
?>
Waarschijnlijk het meest belangrijke deel:
<?php
function foo_load ($id) {
$foo = foo_load_multiple(array($id));
return $foo ? $foo[$id] : FALSE;
}
function foo_load_multiple ($ids = array(), $conditions = array()) {
return entity_load('foo', $ids, $conditions);
}
class FooController extends DrupalDefaultEntityController {
...
function load ($ids = array(), $conditions = array()) {
$foos = parent::load($ids, $conditions);
// Code executed twice
error_log('FooController::load');
foreach ($foos as $foo) {
$foo->picture = file_load($foo->picture);
}
return $foos;
}
...
}
?>
Call stack
... (Array, 11 elements)
11: load (Array, 7 elements)
10: entity_load (Array, 4 elements)
9: foo_load_multiple (Array, 4 elements)
8: foo_load (Array, 4 elements)
7: _menu_load_objects (Array, 4 elements)
6: _menu_translate (Array, 4 elements)
5: menu_get_item (Array, 4 elements)
4: menu_get_custom_theme (Array, 4 elements)
3: menu_set_custom_theme (Array, 4 elements)
2: _drupal_bootstrap_full (Array, 4 elements)
1: drupal_bootstrap (Array, 4 elements)
Called from /sites/bar/modules/custom/foo/foo.module, line 367
... (Array, 20 elements)
20: load (Array, 7 elements)
19: entity_load (Array, 4 elements)
18: foo_load_multiple (Array, 4 elements)
17: foo_load (Array, 4 elements)
16: _menu_load_objects (Array, 4 elements)
15: _menu_translate (Array, 4 elements)
14: menu_local_tasks (Array, 4 elements)
13: menu_tab_root_path (Array, 4 elements)
12: menu_get_active_help (Array, 4 elements)
11: system_block_view (Array, 2 elements)
10: call_user_func_array (Array, 4 elements)
9: module_invoke (Array, 4 elements)
8: _block_render_blocks (Array, 4 elements)
7: block_list (Array, 4 elements)
6: block_get_blocks_by_region (Array, 4 elements)
5: block_page_build (Array, 4 elements)
4: drupal_render_page (Array, 4 elements)
3: drupal_deliver_html_page (Array, 4 elements)
2: drupal_deliver_page (Array, 4 elements)
1: menu_execute_active_handler (Array, 4 elements)
Called from /sites/bar/modules/custom/foo/foo.module, line 367
Heeft hier iemand toevallig ervaring mee?
Dank bij voorbaat.
Deze website is voor Nederlandstalige Drupal-fans en wordt onderhouden door een groep Belgische en Nederlandse vrijwilligers. Iedereen kan meewerken aan deze site.
Fouten of onjuistheden kun je melden melden via het forum
De site draait op Drupal 7 en wordt gehost door Pantheon.
Drupal is een geregistreerd merk van Dries Buytaert. | Powered by Pantheon.
Drupal.be/Drupal.nl is de website van de Nederlandstalige Drupalgemeenschap.
Opgelost: http://stackoverflow.com/questions/5217466/drupal-entity-method-loading-twice