2011-06-08 69 views
10

我已經花費了今天的研究如何在cakephp中使用ajax請求保存數據,並且現在已經到了哪裏,cakephp網站上的文檔似乎對於這個特定主題有點缺乏。使用AJAX和CakePHP保存數據

我有幾個可排序的列表,我需要保存每個列表項的位置,當一個排序。我有一個Ajax請求如下設置時被觸發,當一個項目被移動:

$.ajax({      
     url: "/orders/save_column_order", 
     type:"POST",           
     data:"data="+data 
     }); 

,並在控制器中引用的功能是:

function save_column_order(){ 
    if($this->RequestHandler->isAjax()){ 

      SAVE STUFF... 

     } 
    } 

我有幫手等設置:

var $helpers = array('Html','Form','Js'); 
var $components = array('Session','Email','RequestHandler'); 

而且它不工作...

所以我的問題是:

1)發送ajax請求到控制器的動作的當前url是什麼?它只是/控制器/操作?

2)我還需要做什麼才能讓控制器訪問ajax數據?

獎金:

3)有沒有一種方法,包括在CakePHP的框架引用數據庫設置,所以我可以手動更新我的MySQL數據庫自定義的PHP文件?

回答

24

你非常接近。

1.)URL簡單地是/控制器/動作。數據通過$ this->數據傳遞,並且在動作中神奇地可用。 **因爲你在助手而不是'Javascript'中列出'Js',所以我假設你使用的是Cake 1.3.x和jQuery,因爲jQuery是Cake 1.3的默認值,而Js取代了Javascript/Ajax。

- 修復你的助手:

var $helpers = array('Html', 'Form', 'Js'=>array("Jquery")); 

- 解決您的jQuery:

$.ajax({ 
    url:'/orders/save_column_order', 
    type:'POST', 
    data:data 
}); 

2)使用Cake的魔力:

function save_column_order() { 
    if ($this->data != null) { 
     $this->Model->save($this->data); 
    // whatever else needs doing... 
    } 
} 

- 既然你做ajax,你可能不希望Cake的默認視圖渲染行爲(只是猜測。)如果你想渲染任何視圖的話,那可能只是一個爲Ajax回調標記的剪斷,所以你可能希望把它放在一個元素,而不是一個全面的看法:

function save_column_order() { 
    // ... 
    /* arg 1 - you can specify any view or element you like. 
     arg 2 - enforces your preferred request handling and layout */ 
    $this->set(compact('vars', 'for', 'view')); 
    $this->render('/elements/new_column_order', 'ajax'); 
} 

- 否則,只是抑制渲染:

function save_column_order() { 
    ...  
    $this->autoRender = false; 
} 

- 如果您保存不起作用,請確保$ this-> data的結構是Cake-save-friendly。如果您需要查看的$這個 - 內容>數據,Cake的內置調試(從您的應用程序的任何地方)將幫助你理順:

debug($this->data); 

3)等等,什麼?

不知道我明白你問的是正確的,所以如果這不包括你的問題,請澄清你想要做什麼?

如果你的意思是,Cake允許你手動更新表中的記錄,是嗎?雖然我不確定你爲什麼想要。 Cake非常強大的內置ORM是該框架的一半,而其非常全面的魔力則是另一半。

你可以用Model :: sql()方法直接寫SQL,雖然這不鼓勵它是OOP或可重用的。

當您在模型中定義關聯時,可以將外鍵設置爲false,並指定在Cake的自動連接中像嵌套選擇一樣工作的條件。如果你需要強制連接/ s,Cake的$ options ['joins']會給你完全細化的控制;你可以指定任何類型的JOIN,如果默認的LEFT不足以滿足你需要做的事情。

您可以使用$ this-> Model-> bind()/ unbind()動態創建和中斷模型綁定。您可以指定遞歸級別,應用可包含行爲,指定要選擇的字段以及所有條件。

如果你需要一個子查詢和蛋糕只是無法得到它的權利,$ dbo-> buildStatement()將構建SQL語句和$ dbo->表達式()會火了:

function intricate() { 
    $dbo = $this->Rate->Status->getDataSource(); 
    $subquery = $dbo->buildStatement(
     array(
      'fields' => array('`Status`.`id`'), 
      'table' => $dbo->fullTableName($this->Rate->Status), 
      'alias' => 'Status', 
      'limit' => null, 
      'offset' => null, 
      'joins' => array(), 
      'conditions' => $subqueryConditions, 
      'order' => null, 
      'group' => null 
      ), 
     $this->Rate->Status 
     ); 
    $subquery = "Status.id = (".$subquery.")"; 
    $status = $dbo->expression($subquery); 
    $options['fields']= 
     array(
      "Rate.id", "Rate.plan_id", "Rate.status_id","Rate.rate", "Plan.id", 
      "Plan.company_id", "Plan.name", "Company.id", "Company.name" 
     ); 
    $options['conditions']= 
     array(
      $status, 
      "Geographical.name LIKE '%{$this->zip}%'" 
     ); 
    $rates = $this->Rate->find('all', $options); 
    $this->set(compact('rates')); 
    } 

- 如果你的意思是 - Cake是否允許你即時更換數據庫配置,是的。然而,這樣做可能會變得非常頑固,特別是當Cake的魔法是情況的一部分時。

您可以/app/config/database.php添加多個分貝CONFIGS -

class DATABASE_CONFIG { 
    var $default = array(
     'driver' => 'mysql', 
     'persistent' => false, 
     'host'=>'localhost', 
     'login' => 'cake', 
    'password' => 'icing', 
     'database' => 'dev' 
); 
    var $offsite = array(
     'driver' => 'mysql', 
     'persistent' => false, 
     'host' => '11.22.33.44', // or whatever 
     'login' => 'cake', 
     'password' => 'frosting', 
     'database' => 'live' 
); 
} 

- 在你的控制器它們之間切換/模型就是事情變得有點緊張,這取決於複雜您的情況:

// Model::getDataSource()->configKeyName holds whichever db config you're using 
if ($this->Model->getDataSource()->configKeyName != 'default') { 
    // do something, for example, change models, tables, reload schema, etc. 
    $this->loadModel('Special') 
    $this->Model->table = 'extras'; 
    $this->Model->schema(true); 
} else { 
    // predictably, Model::setDataSource($configKey) changes configs 
    $this->Model->setDataSource('offsite'); 
} 

- 如果這是你的意思,我可以粘貼一段代碼,我寫了幾個星期前,我需要保存一個ajax表單提交(以2個階段形式完成),以3個表在2個數據庫中(一個服務於我的Cake應用程序,另一個服務於傳統的Cod eIgniter應用程序)展示了所有這些花哨的步法以及一些優秀的老式Cake魔術連接保存/更新快捷鍵。 (我還必須生成有選擇的電子郵件,並最終發出REST請求,將新插入的記錄的ID傳遞給CI應用程序以觸發其處理。)

無論如何,HTH。 :)

+0

非常感謝您的幫助!我已經做了你所說的更改,但是現在我從ajax請求中獲得了404錯誤。我更接近讓它工作,這要歸功於你,還有什麼想法404可能會降低到什麼程度?回覆。 3)你絕對正確,它不是很蛋糕,我完全忘了自定義的sql語句 - 我將自定義sql看作是一個標誌,我做錯了,現在我不需要使用它!也是你的權利,即時通訊使用JQuery和蛋糕1.3。 – Alex 2011-06-09 16:20:37

+3

Np。錯誤404通常表示某些內容已關閉 - 可能是權限,還是錯字路由?否則Cake會丟失Controller/Action/View/whatever。任何時候Cake都會咳嗽一個404,我直接去看我的錯誤日誌 - 首先是Cake,然後是Apache的 - 看看它試圖拉取什麼。檢查所有權/權限,查找文件/類名中的錯別字,所有小東西。如果您使用Auth,請將您的ajax控制器操作添加到允許的列表中。 Cake的debug()是一個救生員,沒有什麼比FirePHP(整合Cake)更好的調試蛋糕ajax問題。 – OpenSorceress 2011-06-09 16:53:50

+0

你是救星和英雄!我有一個愚蠢的網址問題,給了我404。非常感謝。 – Alex 2011-06-09 16:58:50

0
  1. 是的,這很簡單。
    1. 要訪問數據就像你送它,你可以用$this->data照常
    2. 你爲什麼不使用工具,如phpmyadmin訪問數據?
+0

phpMyAdmin是一個安全噩夢。完全不適合生產服務器。 IME,最後的選擇/臨時解決方案的團隊開發服務器。 **另外,直接訪問數據庫操作解決方案實際上只適用於開發人員類型的用戶。**在無限現實場景中,應用程序必須解決需要複雜/異乎尋常的數據庫和數據源設置和操作。我的項目 - >完美的例子:目前的淘汰/遷移階段意味着處理Cake和CI的dbs。 2個框架,2個數據庫/服務器(略有不匹配的表格!),3個模型,白名單,重新加載模式等... – OpenSorceress 2011-06-10 12:00:16

0
public function add_project() { 
    $this->autoRender = false; 
    $this->layout = 'ajax'; 
    if ($this->RequestHandler->isAjax()) { 
     $this->Project->set($this->request->data); 
     $this->request->data['Project']['user_id'] = $this->Session->read('Auth.User.id'); 
     $this->request->data['Project']['created_by'] = $this->Session->read('Auth.User.id'); 
     $this->request->data['Project']['updated_by'] = $this->Session->read('Auth.User.id'); 
     //$this->request->data['Skill']['accept_decline'] = 0; 
     $this->User->set($this->request->data['Project']); 
     Configure::write('debug', 0); 
     if ($this->Project->validates(array('fieldList' => array('project_title', 'show_on', 'summary')))) { 

      if ($this->Project->save($this->request->data, false)) { 
       $response['status'] = 'succses'; 
       $response['message'] = 'data sent'; 
       echo json_encode($response); 
       exit(); 
      } else { 
       $response['status'] = 'error'; 
       $response['model'] = 'Project'; 
       $response['message'] = 'data not sent'; 
       echo json_encode($response); 
       exit(); 
      } 
     } else { 
      $response['status'] = 'invalid'; 
      $response['model'] = 'Project'; 
      $errors = $this->Project->validationErrors; 
      $response['errors'] = $errors; 
      echo json_encode($response); 
      exit(); 
     } 
    } 
} 
+0

在控制器中添加此代碼/ *** @akki ** / – 2014-07-17 05:04:05