не работает изменение БД из comment.tpl

Уважаемые программисты LS, пожалуйста, скажите, что не так в моем коде.

Как ни бодался — глухо.

Задача:

У каждого комментария в топике создаем кнопочку «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 комментариев

avatar
В вашем описании вообще нет работы с бд. 4й пункт лишь записывает значение в сущность топика, но не сохраняет ее в базу.
avatar
Извиняюсь, не докопал…

Дальше каким образом инициировать апдейт поля в базе?
avatar
Копать в сторону Topic_UpdateTopic($oTopic).
Если одно поле изменить надо написать более простую функцию без лишних действий, само сохранение в базу происходит в файле Topic.mapper.class.php, посмотри функцию UpdateTopic и сделай подобную для одного поля.
avatar
Сделал так, как написано выше. Все равно, почему-то эффекта — 0. Ничего не происходит при нажатии (поле БД не обновляется). Что странно, информативных сообщений, которые должны быть, тоже нет.

Как можно продебажить сию логику в исходниках?
avatar
если включен кеш, то необходимо его сбрасывать (topic_update) в методе UpdateTopicField
дебажить с помощью var_dump('bla') либо активировать хакер-консоль и дебажить через dump()
avatar
Дописал сброс кеша в UpdateTopicField() (см. топик, п.4) — опять не помогло…
Странно… Берусь за дебаг:

— vote.js

updateTopicField: function(idTarget,objVote,value,type){
      alert('bla bla');
      if (!this.typeVote[type]) {
...

и нифига ведь не выскакивет…

— new_field.php

...
$iValue=getRequest('value',null,'post');
$bStateError=true;
$sMsgTitle='';
$sMsg='';

var_dump('bla bla');
...

и тоже не вижу bla
avatar
Попробоавл пойти другим путем:
из new_field.php
попробовал сделать 3мя функциями:

$oTopic->getNewField();
$oTopic->setNewField($new_field);
$oEngine->Topic_UpdateTopic($oTopic);

Вроде бы уже все стандартно, но, БЛИН, ваще никаких ответов от движка.
В чем дело то? (
avatar
Всем спасибо.

в \www\templates\skin\new\js\vote.js
после ф-ии onUpdateTopicField была пропущена запятая, после исправления пошла отладка и решение.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.