Модули editablefields и editview не подошли, поэтому, не придумав ничего лучше, сделал такой хак. Переопределил для view тему, заменил текстовые поля на input-ы/select-ы/checkbox-ы и добавил обработку POST:
views-view-table--catalog.tpl.php
$updated = false;
foreach($_POST as $k=>$v) {
if(substr($k, 0, 4) == 'nid-') {
$nid = $v;
$status = $_POST['status-'.$nid] == 'on' ? 1 : 0;
$status_old = $_POST["status-$nid-old"];
if($status != $status_old) {
db_query("UPDATE node SET status=$status WHERE nid=$nid");
$updated = true;
}
$price = $_POST['sell_price-'.$nid];
$price_old = $_POST["sell_price-$nid-old"];
if($price != $price_old) {
db_query("UPDATE uc_products SET sell_price=$price WHERE nid=$nid");
$updated = true;
}
$availability = $_POST['field_availability_value-'.$nid];
$availability_old = $_POST["field_availability_value-$nid-old"];
if($availability_values[$availability] != $availability_old) {
db_query("DELETE FROM content_field_availability WHERE nid=$nid");
db_query("INSERT INTO content_field_availability (nid, vid, field_availability_value) VALUES ($nid, $nid, '$availability')");
$updated = true;
}
}
}
if($updated) {
cache_clear_all();
drupal_set_message('Изменения сохранены');
$p = substr($_SERVER['REQUEST_URI'], 1);
list($path, $query) = explode('?', $p, 2);
drupal_goto($path, $query);
}
//echo $_SERVER['REQUEST_URI'];
?>
<form method='post'>
<table class="<?php print $class; ?>">
<?php if (!empty($title)) : ?>
<caption><?php print $title; ?></caption>
<?php endif; ?>
<thead>
<tr>
<?php foreach ($header as $field => $label):
if($field == 'status') {
$label = "<input type='checkbox' id='header-status' onclick=\"
if($('#header-status:checked').val() == 'on')
$('.field-status').attr('checked', 'on');
else
$('.field-status').removeAttr('checked');
\">$label";
}
?>
<th class="views-field views-field-<?php print $fields[$field]; ?>">
<?php print $label; ?>
</th>
<?php endforeach; ?>
</tr>
</thead>
<tbody>
<?php foreach ($rows as $count => $row): ?>
<tr class="<?php print implode(' ', $row_classes[$count]); ?>">
<?php foreach ($row as $field => $content){
$name = "$field-{$row['nid']}";
if($field == 'nid') {
$content .= "<input type='hidden' name='$name' value='{$row['nid']}'>";
}
if($field == 'status') {
if($content == 'Да') {
$content = "<input name='$name' type='checkbox' class='field-status' checked='checked'>";
$content .= "<input name='$name-old' type='hidden' value='1'>";
} else {
$content = "<input name='$name' type='checkbox' class='field-status'>";
$content .= "<input name='$name-old' type='hidden' value='0'>";
}
}
if($field == 'sell_price') {
$content = "<input name='$name' value='$content' style='width:80px'><input name='$name-old' type='hidden' value='$content'>";
}
if($field == 'field_availability_value') {
$current = $content;
$content = "<select name='$name'>";
foreach($availability_values as $k=>$v) {
if(empty($v)) continue;
$selected = $current == $v ? "selected" : "";
$content .= "<option $selected value='$k'>$v</option>";
}
$content .= "</select>";
$content .= "<input name='$name-old' type='hidden' value='$current'>";
}
?>
<td class="views-field views-field-<?php print $fields[$field]; ?>">
<?php print $content; ?>
</td>
<?php } ?>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<input type='submit' value='Сохранить изменения'>
</form>