не работает изменение БД из comment.tpl
Уважаемые программисты LS, пожалуйста, скажите, что не так в моем коде.
Как ни бодался — глухо.
Задача:
У каждого комментария в топике создаем кнопочку «change new_field», при нажатии на которую в таблицу prefix_topic (в созданное поле new_field) добавляется ID этого комментария.
Решение делаю изменением исходников (программист из меня хреновый, плагин не осилю, ибо задумок много всяких, костылями много проще).
Мое решение (почему-то не рабочее)
1. изменения в \www\templates\skin\new\comment.tpl
добавил после кнопки «добавить в избранные»
2. Далее изменил \www\templates\skin\new\js\vote.js
добавил «тип голосования» new_field: ajax обработчик new_field.php, targetName: 'idTopic', т.к. изменяем конкретный топик таблицы topic
написал функцию updateTopicField(...) на основе ф-ии vote(...)
сделал функцию onUpdateTopicField(...) на основе ф-ии onVote(...), убрав не нужную (как мне кажется) часть — просто чтобы выводились сообщения об успешности/неуспешности изменения поля
3. \www\include\ajax\new_field.php
4. \www\classes\modules\topic\Topic.class.php
5. \www\classes\modules\topic\mapper\Topic.mapper.class.php
Что не так, что подправить для того, чтобы задача была решена?
topic updated 2010-07-08 13:04
Как ни бодался — глухо.
Задача:
У каждого комментария в топике создаем кнопочку «change new_field», при нажатии на которую в таблицу prefix_topic (в созданное поле new_field) добавляется ID этого комментария.
Решение делаю изменением исходников (программист из меня хреновый, плагин не осилю, ибо задумок много всяких, костылями много проще).
Мое решение (почему-то не рабочее)
1. изменения в \www\templates\skin\new\comment.tpl
добавил после кнопки «добавить в избранные»
{if $oUserCurrent and $oUserCurrent->isAdministrator()}
<li><a href="#" onclick="lsVote.updateTopicField({$oTopic->getId()},this,{$oComment->getId()},'new_field'); return false;">change new_field</a></li>
{/if}
2. Далее изменил \www\templates\skin\new\js\vote.js
добавил «тип голосования» new_field: ajax обработчик new_field.php, targetName: 'idTopic', т.к. изменяем конкретный топик таблицы topic
typeVote: {
comment: {
url: DIR_WEB_ROOT+'/include/ajax/voteComment.php',
targetName: 'idComment'
},
topic: {
url: DIR_WEB_ROOT+'/include/ajax/voteTopic.php',
targetName: 'idTopic'
},
new_field: {
url: DIR_WEB_ROOT+'/include/ajax/new_field.php',
targetName: 'idTopic'
},
blog: {
url: DIR_WEB_ROOT+'/include/ajax/voteBlog.php',
targetName: 'idBlog'
},
user: {
url: DIR_WEB_ROOT+'/include/ajax/voteUser.php',
targetName: 'idUser'
}
},
написал функцию updateTopicField(...) на основе ф-ии vote(...)
updateTopicField: function(idTarget,objVote,value,type) {
if (!this.typeVote[type]) {
return false;
}
this.idTarget=idTarget;
this.objVote=$(objVote);
this.value=value;
this.type=type;
thisObj=this;
var params = new Hash();
params['value']=value;
params[this.typeVote[type].targetName]=idTarget;
params['security_ls_key']=LIVESTREET_SECURITY_KEY;
JsHttpRequest.query(
'POST '+this.typeVote[type].url,
params,
function(result, errors) {
thisObj.onUpdateTopicField(result, errors, thisObj);
},
true
);
},
сделал функцию onUpdateTopicField(...) на основе ф-ии onVote(...), убрав не нужную (как мне кажется) часть — просто чтобы выводились сообщения об успешности/неуспешности изменения поля
onUpdateTopicField: function(result, errors, thisObj) {
if (!result) {
msgErrorBox.alert('Error','Please try again later');
}
if (result.bStateError) {
msgErrorBox.alert(result.sMsgTitle,result.sMsg);
} else {
msgNoticeBox.alert(result.sMsgTitle,result.sMsg);
}
}
3. \www\include\ajax\new_field.php
<?php
set_include_path(get_include_path().PATH_SEPARATOR.dirname(dirname(dirname(__FILE__))));
$sDirRoot=dirname(dirname(dirname(__FILE__)));
require_once($sDirRoot."/config/config.ajax.php");
$iValue=getRequest('value',null,'post');
$bStateError=true;
$sMsgTitle='';
$sMsg='';
if ($oTopic=$oEngine->Topic_GetTopicById(getRequest('idTopic',null,'post'))) {
$oEngine->Topic_UpdateTopicField($iValue, $oTopic->getId());
$bStateError=false;
$sMsgTitle=$oEngine->Lang_Get('attention');
$sMsg=$oEngine->Lang_Get('update_ok');
} else {
$sMsgTitle=$oEngine->Lang_Get('error');
$sMsg=$oEngine->Lang_Get('system_error');
}
$GLOBALS['_RESULT'] = array(
"bStateError" => $bStateError,
"sMsgTitle" => $sMsgTitle,
"sMsg" => $sMsg,
);
?>
4. \www\classes\modules\topic\Topic.class.php
public function UpdateTopicField($iCommentId, $iTopicId) {
/**
* Чистим зависимые кеши
*/
$this->Cache_Clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG,array('topic_update'));
$this->Cache_Delete("topic_{$iTopicId}");
$this->oMapperTopic->UpdateTopicFieldDB($iCommentId, $iTopicId);
}
5. \www\classes\modules\topic\mapper\Topic.mapper.class.php
public function UpdateTopicFieldDB($sCommentId, $iTopicId) {
$sql = "UPDATE ".Config::Get('db.table.topic')."
SET
new_field = ?
WHERE
topic_id = ?d
";
if ($this->oDb->query($sql,$sCommentId,$iTopicId)) {
return true;
}
return false;
}
Что не так, что подправить для того, чтобы задача была решена?
topic updated 2010-07-08 13:04
8 комментариев
Дальше каким образом инициировать апдейт поля в базе?
Если одно поле изменить надо написать более простую функцию без лишних действий, само сохранение в базу происходит в файле Topic.mapper.class.php, посмотри функцию UpdateTopic и сделай подобную для одного поля.
Как можно продебажить сию логику в исходниках?
дебажить с помощью var_dump('bla') либо активировать хакер-консоль и дебажить через dump()
Странно… Берусь за дебаг:
— vote.js
и нифига ведь не выскакивет…
— new_field.php
и тоже не вижу bla
из new_field.php
попробовал сделать 3мя функциями:
$oTopic->getNewField();
$oTopic->setNewField($new_field);
$oEngine->Topic_UpdateTopic($oTopic);
Вроде бы уже все стандартно, но, БЛИН, ваще никаких ответов от движка.
В чем дело то? (
в \www\templates\skin\new\js\vote.js
после ф-ии onUpdateTopicField была пропущена запятая, после исправления пошла отладка и решение.