Есть самописный модуль, в нем функция, в которой присутствует переменная равная NID (номеру текущей ноды), есть UID пользователя, задача заключаеться в том, чтобы проверить, являеться ли текущий пользователь автором просматриваемой ноды. Я пока только так придумал:
<?php
function myfunction($cid, $type) {
global $user;
if ($type == 'node') {
$node = db_fetch_object(db_query(db_rewrite_sql('SELECT n.uid FROM {node} n WHERE n.nid = %d'), $cid));
}
if ($user->uid == $node->uid) {
тра-ля-ля
}
}
?>
Тоесть мы из базы запросом выдергиваем UID автора ноды и сравниваем его с UID пользователя.
На сколько оптимально такое решение? Или можно данную задачу реализовать другим образом?
Комментарии
global $user;
if ($type == 'node') {
$node = node_load($cid);
if ($user->uid == $node->uid) {
тра-ля-ля
}
}
}
Обосную. node_load() использует static кеширование. Если кто-то уже подгрузил ноду до вас (например, если это страница ноды), то функция не будет лезть в базу второй раз, а дернет объект из памяти. Я рекомендую использовать сугубо user_load (c 6.x) и node_load для вот таких подгрузок. Это экономит если не вам, то тем, кто будет грузить после вас.
Большое спасибо за подробный ответ.
Сам думал по началу использовать node_load, но подумал, что это будет более ресурсоемко. Еще раз спасибо за разъяснения.
UPD: А на сколько будет оправданно использование node_load, если результат функции будет показан не только в самой ноде, при её просмотре, но и в тизере тоже?
Тоесть получаеться, что при выводе списка нод, на каждую ноду из списка будет вызываться node_load, хотя отображаться будут только тизеры. И на сколько я понимаю, при таком раскладе node_load для каждой ноды из списка будет лезть в базу а не брать данные из кеша.
если есть вывод тизеров уже, то еще один node_load по этим же нодам базу дергать не будет
Ок, понял. Благодарю за оперативный ответ.