Demo

討論

保持飢餓,保持愚笨 (Stay hungry, stay foolish)。 史蒂夫·賈伯斯

公告

本網站已取消討論區的討論方式,如果您有問題請至LINE群行動條碼圖片網址,或Facebook社團

請問關於控制器呼叫模型內的自訂function問題

  • maro
  • maro 的個人頭像 Topic Author
  • 訪客
  • 訪客
2012-01-05 15:02 #21497 來自 maro
maro created the topic: 請問關於控制器呼叫模型內的自訂function問題
各位好,先前有請教過關於insert時取得id的問題
因此,我在model裡做了這樣的函式
	function queryContentID($id){
		$query = 'SELECT content_id FROM nos_phivod_list WHERE id = '.$id.' LIMIT 1';
		$this->_db->setQuery( $query );
		$content_id = null;
		$content_id = $this->_db->loadObject();
		return $content_id->content_id;
	}
實際上就是查詢table A裡的content_id,也就是table B的紀錄id
這函式在model裡可以運作,但在控制器卻不能用

要在控制器裡使用,是因為我需要同時對table A與table B裡的紀錄做上下架
控制器裡有這樣的程式片段(我自行改成中文的)
		if(!$model->delete()) {
			$msg = JText::_( '一項或多項資料無法刪除!' );
		} else {
			$msg = JText::_( '一項或多項資料已刪除!' );
		}
看起來可以從$model去呼叫model中的function
不過我這樣使用卻失敗了
		$phivodTable =& JTable::getInstance('phivod', 'Table');
		$phivodTable->publish($cid, $publish);
		$contentTable =& JTable::getInstance('content', 'Table');
		$contentTable->publish($model->queryContentID($cid), $publish);
錯誤訊息是「Call to a member function queryContentID() on a non-object」
請問這樣的功能要如何製作呢

謝謝

Please 登入 to join the conversation.

  • CharlesJiang
  • CharlesJiang 的個人頭像
  • 訪客
  • 訪客
2012-01-07 00:14 #21501 來自 CharlesJiang
CharlesJiang replied the topic: 請問關於控制器呼叫模型內的自訂function問題
$contentTable->publish($model->queryContentID($cid), $publish);
有試過$model改為$this嗎?

Please 登入 to join the conversation.

  • maro
  • maro 的個人頭像 Topic Author
  • 訪客
  • 訪客
2012-01-09 09:55 #21508 來自 maro
maro replied the topic: 請問關於控制器呼叫模型內的自訂function問題
改成$this後錯誤訊息為
Call to undefined method PhivodsControllerPhivod::queryContentID()

看來它變成從Controller找這function了 : )

Please 登入 to join the conversation.

  • maro
  • maro 的個人頭像 Topic Author
  • 訪客
  • 訪客
2012-01-09 10:04 #21509 來自 maro
maro replied the topic: 請問關於控制器呼叫模型內的自訂function問題
不好意思,我漏看了這句
$model = $this->getModel('phivod');

完整的function為
	function publish()
	{
		global $option;
		$cid = JRequest::getVar( 'cid', array(), '', 'array' );
		if( $this->_task == 'publish')
		{
			$publish = 1;
		}
		else
		{
			$publish = 0;
		}
		$model = $this->getModel('phivod');
		$phivodTable =& JTable::getInstance('phivod', 'Table');
		$phivodTable->publish($cid, $publish);
		$contentTable =& JTable::getInstance('content', 'Table');
		$contentTable->publish($model->queryContentID($cid), $publish);
		$this->setRedirect( 'index.php?option=' . $option );
	}

現在程式沒有報錯,不過content表的紀錄也沒有連動上下架... :imdead:

Please 登入 to join the conversation.

  • maro
  • maro 的個人頭像 Topic Author
  • 訪客
  • 訪客
2012-01-09 12:30 #21510 來自 maro
maro replied the topic: 請問關於控制器呼叫模型內的自訂function問題
我嘗試改用一個比較簡潔的方式來執行
首先在model新增此function
	function contentPublish($id, $publish){
		$query = 'UPDATE #__content SET state='.$publish.' WHERE id=('.
				'SELECT content_id FROM #__phivod_list WHERE id = '.$id.' LIMIT 1)';
		$this->_db->setQuery( $query );
		return $query;
	}
這是個靠子查詢來更新發佈狀態的SQL
附帶一提,在參考Content元件後,發現它的發佈方式與官方範例hello world,基本上是個完全不同的東西
所以我仿照它的方式用SQL Update,而不靠API了

控制器內的程式如下
		$phivodTable =& JTable::getInstance('phivod', 'Table');
		$phivodTable->publish($cid, $publish);
		$model = $this->getModel('phivod');
		var_dump($model->contentPublish($cid[0], $publish));
		//$this->setRedirect( 'index.php?option=' . $option );
我終於搞懂先前SQL一直出現where array欄位的問題,是$cid這個陣列變數的因素
改成傳入$cid[0]後,function回傳的SQL正常

不過content依然不會update :help:

Please 登入 to join the conversation.

  • maro
  • maro 的個人頭像 Topic Author
  • 訪客
  • 訪客
2012-01-09 14:04 #21511 來自 maro
maro replied the topic: 請問關於控制器呼叫模型內的自訂function問題
我修出來了...謝謝大家
	function contentPublish($id, $publish){
		$query = 'UPDATE #__content SET state='.$publish.' WHERE id=('.
				'SELECT content_id FROM #__phivod_list WHERE id = '.$id.' LIMIT 1)';
		$this->_db->setQuery( $query );
		return $this->_db->Query();	//要這樣才會動!
	}

Please 登入 to join the conversation.