CakePHP,无法在编辑动作中发现问题

时间:2009-10-14 10:04:05

标签: cakephp

我希望每次点击包含联系人ID的链接时,在contact_status_id字段中的联系人表格中切换状态编号。页面显示没有错误,但操作不会更改数字。尚未实施验证。

也许一双新眼睛可以发现问题?

function inbox_toggle_number_status($id=null)
{
    //Call from the inbox when the number is clicked and status toggled.

    $this->User->Contact->id = $id;

    if (!empty($id))
    {

        $current_status = $this->User->Contact->find('first', array('conditions' => array('id' => $id)));

        if ($current_status['Contact']['contact_status_id'] == '1'):
            $this->User->Contact->saveField('contact_status_id', '2');
            exit();

        elseif ($current_status['Contact']['contact_status_id'] == '2'):
            $this->User->Contact->saveField('contact_status_id', '3');
            exit();

        elseif ($current_status['Contact']['contact_status_id'] == '3'):
            $this->User->Contact->saveField('contact_status_id', '2');
            exit();

        else:
            exit();

        endif;
    }
}

3 个答案:

答案 0 :(得分:1)

function inbox_toggle_number_status( $id = null )
{
    if( !$id )
    {
        $this->Session->setFlash( 'no id' );
        $this->redirect( array( 'action' => 'index' ) );
    }

    $this->User->Contact->id = $id;
    $current_status = $this->User->Contact->read( null, $id );

    switch( $current_status['Contact']['contact_status_id'] )
    {                
        case 1:
            $this->User->Contact->saveField( 'contact_status_id', 2 );
            break;

        case 2:
            $this->User->Contact->saveField( 'contact_status_id', 3 );
            break;

        case 3:
            //should yu not go back to 1?
            $this->User->Contact->saveField( 'contact_status_id', 2 );
            break;
    } // switch
}

答案 1 :(得分:0)

我从未对蛋糕中的一些保存方法好运。出于这个原因,我几乎总是使用Model :: save(array()),数组包含要更新的id和字段。如果你想走这条路,你可以这样做:

if(!empty($id)) {
    $arr = array( 'Contact' => array( 'id' => $id ) );

    $current_status = $this->User->Contact->find('first', array('conditions' => array('id' => $id)));

    if ($current_status['Contact']['contact_status_id'] == '1'):
        $arr['Contact']['contact_status_id'] = 2;
    <other conditional clauses here>


    $this->User->Contact->save($arr);
    exit();
}

如果您想继续使用您的路由,请将您的调试级别2设置为,并告诉我们脚本是否正在尝试将值保存到db中(在页面底部提供SQL转储)。

答案 2 :(得分:0)

我有个主意;看到这一行?

$this->User->Contact->id = $id;

此ID设置可能仅适用于设置后执行的第一个查询,

所以

您可能必须在包含saveField调用的if语句之前再次设置它。

但是,在find(...)调用之前你并不需要它,因为你将$ id设置为find(...)'conditions'数组的一部分。

<强>解决方案

尝试将$ this-&gt; User-&gt; Contact-&gt; id = $ id移到find(...)之后的行,因此将为即将到来的setField(...)调用设置它。

同时

而不是使用!empty(...),尝试使用

开始函数
if(!isset($id)){
    $this->redirect(/*some url with an error message*/ );
}

后跟在$ id有效时执行的代码