. */ /** * CIA Database Access Object. This class provides functionality to * load and save CIA sentences. */ require_once(FILESYSTEMROOTPATH."include/classes/IDao.php"); require_once(FILESYSTEMROOTPATH."jc/include/model/Proposals_sentences.php"); require_once(FILESYSTEMROOTPATH."jc/images/Image_link.php"); class Proposals_sentencesDao implements IDao { /** MySQL object */ private $mysql; /*todo*/ /*load by proposal_id!*/ /** * Default constructor */ public function __construct(MySQL $mysql) { $this->mysql = $mysql; } /** * Load proposals_sentences object by id * * @param id * @return */ public function load($id) { $query = "SELECT * FROM proposals_sentences WHERE `id`='".$id."'"; if( $this->mysql->query($query) ) { return new Proposals_sentences ($this->mysql->fetchArray()); }else { return array(); } } /** * Load array of proposals_sentences objects by proposal_id * * @param id * @return */ public function loadByProposalId($proposal_id){ $query = "SELECT * FROM proposals_sentences WHERE `proposal_id`='".$proposal_id."' ORDER BY `order2`, `article`, `paragraph`, `sentence`"; if( $this->mysql->query($query) ) { $ret = array(); while( $row = $this->mysql->fetchArray() ) { $ret[ $row['id'] ] = new Proposals_sentences($row); } return $ret; }else { return array(); } } /** * Load array of proposals_sentences data by order, proposal_id * * @param id * @return */ public function loadByProposalId_Order($proposal_id, $order){ $query = "SELECT * FROM proposals_sentences WHERE `proposal_id`='".$proposal_id."' AND `order`=".$order." ORDER BY `order2`, `article`, `paragraph`, `sentence`"; if( $this->mysql->query($query) ) { $ret = array(); while( $row = $this->mysql->fetchArray() ) { $ret[ $row['id'] ] = $row; } return $ret; }else { return array(); } } /** * Load array of titles data by order, proposal_id * * @param id * @return */ public function loadTitlesByProposalId($proposal_id, $edit_link){ $query = "SELECT DISTINCT(`order`),`title`,`category`, `proposal_id` FROM `proposals_sentences` WHERE `proposal_id`=$proposal_id ORDER BY `order`"; if( $this->mysql->query($query) ) { $ret = array(); while( $row = $this->mysql->fetchArray() ) { if ($edit_link){ $row['edit']=img_edit('create_proposal3.php?proposal_id='.$proposal_id.'&order='.$row['order']); $row['delete']=img_del('create_proposal5.php?proposal_id='.$proposal_id.'&order='.$row['order']); }else{ $row['edit']='-'; $row['delete']='-'; } $row['view']=img_view('view_proposal2.php?proposal_id='.$proposal_id.'&order='.$row['order']); $row['review']='Review'; $ret[ $row['order'] ] = $row; } return $ret; }else { return array(); } } /** * Get next available `order` number * * @param id * @return */ public function getNextOrder(){ $query = "SELECT `order` FROM `proposals_sentences` GROUP BY `order` ORDER BY `order` DESC LIMIT 1"; if( $this->mysql->query($query) ) { $result1 = $this->mysql->fetchArray(); } $query2 = "SELECT `order` FROM `CIA` GROUP BY `order` ORDER BY `order` DESC LIMIT 1"; if( $this->mysql->query($query2) ) { $result2 = $this->mysql->fetchArray(); } if ($result1['order'] >= $result2['order']){ return $result1['order']+1; } else{ return $result2['order']+1; } } /** * Load all * * @return array of proposals_sentences objects */ public function loadAll() { $query = "SELECT * FROM `proposals_sentences`"; if( $this->mysql->query($query) ) { $ret = array(); while( $row = $this->mysql->fetchArray() ) { $ret[ $row['id'] ] = new Proposals_sentences($row); } return $ret; }else { return array(); } } /** * * delete proposals_sentences by id * @param $id */ public function delete($id){ $query = "DELETE FROM proposals_sentences WHERE `id`=".$id; return $this->mysql->query($query); } public function delete_order($pid, $order){ $query = "DELETE FROM proposals_sentences WHERE `proposal_id`=".$pid." AND `order`=".$order; return $this->mysql->query($query); } /** * must called before insert/delete a proposals_sentences object * */ public function renumber(Proposals_sentences $model){ if( $model->getChange_type()=="Delete"){ $number = $model->getSentence()+1; } else{ //new_^ || new v $number = $model->getSentence(); } /*get not modified sentences of the remaining paragraph and add them in proposals_sentences*/ $where = "`order`='".$model->getOrder()."' AND `order2`='".$model->getOrder2()."' AND `article`='".$model->getArticle()."' AND `paragraph`='".$model->getParagraph()."' AND `sentence` >= '".$number."' AND"; $result = $this->selectNotEdited($model->getProposal_id(), $where); foreach($result as $res1){ $result3 = new Proposals_sentences(''); $result3->copy_from_cia_array($res1); $result3->setProposal_id($model->getProposal_id()); $result3->setChange_type('Edit'); $this->saveOrUpdate($result3); } //Renumber $query3 = "UPDATE `proposals_sentences` SET `sentence`=`sentence`"; if($model->getChange_type()=="Delete"){ $query3 .='-1'; } else{ $query3 .='+1'; } $query3 .=" WHERE `proposal_id`='".$model->getProposal_id()."'"; $query3 .= " AND `order`='".$model->getOrder()."' AND `order2`='".$model->getOrder2(); $query3 .= "' AND `article`='".$model->getArticle()."' AND `paragraph`='".$model->getParagraph()."'"; $query3 .= " AND `sentence` >= '".$number."'"; if(!$this->mysql->query($query3)){ echo 'database error: query3 '.$query3; return false; } $this->deleteUnmodified($model); } /** * must called before undo insert/delete at a proposals_sentences object */ public function undo_number(Proposals_sentences $model){ $query3 = "UPDATE `proposals_sentences` SET `sentence`=`sentence`"; if($model->getChange_type()=="Delete"){ $query3 .='+1'; $query3 .=" WHERE `proposal_id`='".$model->getProposal_id()."'"; $query3 .= " AND `order`='".$model->getOrder()."' AND `order2`='".$model->getOrder2(); $query3 .= "' AND `article`='".$model->getArticle()."' AND `paragraph`='".$model->getParagraph()."'"; $query3 .= " AND `sentence` > '".$model->getSentence()."'"; } else{ $query3 .='-1'; $query3 .=" WHERE `proposal_id`='".$model->getProposal_id()."'"; $query3 .= " AND `order`='".$model->getOrder()."' AND `order2`='".$model->getOrder2(); $query3 .= "' AND `article`='".$model->getArticle()."' AND `paragraph`='".$model->getParagraph()."'"; $query3 .= " AND `sentence` > '".$model->getSentence()."'"; } if($this->mysql->query($query3)){ //ok } else{ echo 'database error: query3 '.$query3; return false; } //delete 'edit' sentences if not needed $this->deleteUnmodified($model); } public function deleteUnmodified(Proposals_sentences $model){ //delete 'edit' sentences if not needed //get original $query1 = "SELECT * FROM `CIA` WHERE `order`='".$model->getOrder()."'"; if($this->mysql->query($query1)){ $result1=array(); while( $row = $this->mysql->fetchArray() ) { $result1[$row['id']] = $row; } } else{ echo 'database error: query1'.$query1; return false; } //load 'Edit' changes in this section $query2 = "SELECT * FROM `proposals_sentences` WHERE `proposal_id`='".$model->getProposal_id()."'"; $query2 .= " AND `order`='".$model->getOrder()."' AND `change_type`='Edit'"; if($this->mysql->query($query2)){ $result2 = array(); while( $row = $this->mysql->fetchArray() ) { $result2 [] = $row; } foreach ($result2 as $row){ if(!$this->ismodified($row, $result1[$row['sentence_id']])){ $this->delete($row['id']); } } } else{ echo 'database error: query2'.$query2; return false; } return true; } /** * save changes in header text * * */ public function saveHeader(Proposals_sentences $model, $type){ $proposal_id = $model->getProposal_id(); if($type == 'title'){ //$query1 = "SELECT * FROM `CIA` WHERE `order`='".$model->getOrder()."'"; //1st version: query2 was select * from ... where ... $where = "`order`='".$model->getOrder()."' AND "; $query2 = "UPDATE `proposals_sentences` SET `title`='".$this->mysql->escape($model->getTitle())."', `title_status`='Edit' WHERE `proposal_id`='".$model->getProposal_id()."' AND `order`='".$model->getOrder()."'"; $getter='getTitle'; $setter='setTitle'; } elseif($type == 'title2'){ //$query1 = "SELECT * FROM `CIA` WHERE `order`='".$model->getOrder()."' AND `order2`='".$model->getOrder2()."'"; //1st version: query2 was select * from ... where ... $where = "`order`='".$model->getOrder()."' AND `order2`='".$model->getOrder2()."' AND "; $query2 = "UPDATE `proposals_sentences` SET `title2`='".$this->mysql->escape($model->getTitle2())."', `title2_status`='Edit' WHERE `proposal_id`='".$model->getProposal_id()."' AND `order`='".$model->getOrder(); $query2 .="' AND `order2`='".$model->getOrder2()."'"; $getter='getTitle2'; $setter='setTitle2'; } elseif($type == 'article_title'){ //$query1 = "SELECT * FROM `CIA` WHERE `order`='".$model->getOrder()."' AND `order2`='".$model->getOrder2()."' AND `article`='".$model->getArticle()."'"; //1st version: query2 was select * from ... where ... $where = "`order`='".$model->getOrder()."' AND `order2`='".$model->getOrder2()."' AND `article`='".$model->getArticle()."' AND "; $query2 = "UPDATE `proposals_sentences` SET `article_title`='".$this->mysql->escape($model->getArticle_title())."', `article_title_status`='Edit' WHERE `proposal_id`='".$model->getProposal_id()."' AND `order`='".$model->getOrder(); $query2 .="' AND `order2`='".$model->getOrder2()."' AND `article`='".$model->getArticle()."'"; $getter='getArticle_title'; $setter='setArticle_title'; } elseif($type == 'paragraph'){ //nothing to save in paragraph return true; } //insert not edited $result = $this->selectNotEdited($proposal_id, $where); foreach ($result as $res1){ $res = new Proposals_sentences(''); $res->copy_from_cia_array($res1); $res->setChange_type('Edit'); $res->setProposal_id($model->getProposal_id()); if (!$this->saveOrUpdate($res)){ // save it! echo mysql_error(); return false; } } //update all return $this->mysql->query($query2); } /** * resets changes in headers * * */ public function resetHeader(Proposals_sentences $model, $type, $original){ //if title is not modified-> do nothing: checked in save() //if new, reset to empty: in save() $getter = 'get'.ucfirst($type).'_status'; if ($model->$getter()=='Edit'){ $query = "UPDATE `proposals_sentences` SET `".$type."`='".$original[$type]."', `".$type."_status`='' WHERE `proposal_id`='".$model->getProposal_id()."' AND `order`='".$model->getOrder()."'"; if($type == 'title'){ //nothing more to add to query } elseif($type == 'title2'){ $query .= " AND `order2`='".$model->getOrder2()."'"; } elseif($type == 'article_title'){ $query .= " AND `order2`='".$model->getOrder2()."' AND `article`='".$model->getArticle()."'"; }elseif ($type == 'paragraph') { return true; //nothing to change } if($this->mysql->query($query)){ //ok } else{ echo 'resetHeader: db error'; return false; } return $this->deleteUnmodified($model); } elseif ($model->$getter()=='Delete'){ $query1 = "DELETE FROM `proposals_sentences` WHERE `proposal_id`='".$model->getProposal_id()."' AND `order`='".$model->getOrder()."'"; if($type == 'title'){ //nothing more to add to query } elseif($type == 'title2'){ $query1 .= " AND `order2`='".$model->getOrder2()."'"; } elseif($type == 'article_title'){ $query1 .= " AND `order2`='".$model->getOrder2()."' AND `article`='".$model->getArticle()."'"; } elseif($type == 'paragraph'){ $query1 .= " AND `order2`='".$model->getOrder2()."' AND `article`='".$model->getArticle()."' AND `paragraph`='".$model->getParagraph()."'"; } $x = $this->renumberAfterHeader($model, $type, true, false); if ($x && $this->mysql->query($query1)){ //ok } else{ echo 'resetHeader: db error'; return false; } return $this->deleteUnmodified($model); } } /** * deletes a header item * * */ public function deleteHeader(Proposals_sentences $model, $type){ //load original //load all changes if($type == 'title'){ $where = "`order`='".$model->getOrder()."' AND "; } elseif($type == 'title2'){ $where = "`order`='".$model->getOrder()."' AND `order2`='".$model->getOrder2()."' AND "; } elseif($type == 'article_title'){ $where = "`order`='".$model->getOrder()."' AND `order2`='".$model->getOrder2()."' AND `article`='".$model->getArticle()."' AND "; } elseif($type == 'paragraph'){ $where = "`order`='".$model->getOrder()."' AND `order2`='".$model->getOrder2()."' AND `article`='".$model->getArticle()."' AND `paragraph`='".$model->getParagraph()."' AND "; } $result = $this->selectNotEdited($model->getProposal_id(), $where); foreach ($result as $res1){ $res = new Proposals_sentences(''); $res->copy_from_cia_array($res1); $res->setChange_type('Delete'); $res->setSentence_text(''); $res->setProposal_id($model->getProposal_id()); if (!$this->saveOrUpdate($res)){ echo 'deleteHeader: db error'; return false; } } $query2 = "DELETE FROM proposals_sentences WHERE ".$where." (`change_type` = 'New_^' OR `change_type` = 'New_v')" ; $query3 = "UPDATE `proposals_sentences` SET `change_type`='Delete', `sentence_text`='', `sentence`='1' , `".$type."_status`='Delete' WHERE ".$where." 1"; $this->mysql->query($query2); $this->mysql->query($query3); $this->renumberAfterHeader($model, $type, false, false); $this->deleteUnmodified($model); return true; } /** * creates a header item after this [this= the model of which the form is submitted] * * */ public function header_after(Proposals_sentences $model, $type){ $new_model = new Proposals_sentences(''); $new_model->copy($model); //to copy headers from previous sentence $new_model->setSentence_text(''); $new_model->setChange_type('New_v'); $new_model->setId(''); //get original sentence $query = "SELECT * FROM `CIA` WHERE `id`='".$model->getSentence_id()."'"; $this->mysql->query($query); $cia = $this->mysql->fetchArray(); //get last sentence of this item if($type == 'title'){ echo 'Go Back to create a new title
'; return; } elseif($type == 'title2'){ $query2 = "SELECT * FROM `CIA` WHERE `order`='".$cia['order']."' AND `order2`='".$cia['order2']."'"; $new_model->setTitle2(''); $new_model->setOrder2($model->getOrder2()+1); $new_model->setArticle(1); $new_model->setArticle_title(''); $new_model->setParagraph(1); $new_model->setSentence(1); $new_model->setTitle2_status('New_v'); } elseif($type == 'article_title'){ $query2 = "SELECT * FROM `CIA` WHERE `order`='".$cia['order']."' AND `order2`='".$cia['order2']; $query2 .= "' AND `article`='".$cia['article']."'"; $new_model->setArticle($model->getArticle()+1); $new_model->setArticle_title(''); $new_model->setParagraph(1); $new_model->setSentence(1); $new_model->setArticle_title_status('New_v'); } elseif($type == 'paragraph'){ $query2 = "SELECT * FROM `CIA` WHERE `order`='".$cia['order']."' AND `order2`='".$cia['order2']; $query2 .= "' AND `article`='".$cia['article']."' AND `paragraph`='".$cia['paragraph']."'"; $new_model->setParagraph($model->getParagraph()+1); $new_model->setSentence(1); $new_model->setParagraph_status('New_v'); } $query2 .= ' ORDER BY `order` DESC, `order2` DESC, `article` DESC, `paragraph` DESC, `sentence` DESC LIMIT 1'; $this->mysql->query($query2); $last = $this->mysql->fetchArray(); $new_model->setSentence_id($last['id']); $this->renumberAfterHeader($new_model, $type, true, true); //must renumber original sentence return $this->saveOrUpdate($new_model); } /** * renumbers header items after deletion/creation * @param $model, $type, boolean $increase [true: add +1, false: subtract -1 ] */ public function renumberAfterHeader(Proposals_sentences $model, $type, $increase, $renumber_this){ $query1 = 'UPDATE `proposals_sentences` SET '; if ($increase){ $operation = ' + 1 '; } else{ //$query1 .= "-1 WHERE `proposal_id`='".$model->getProposal_id()."' AND `order` = '".$model->getOrder(); $operation = ' -1 '; } if ($renumber_this){ $operator = '>='; } else{ $operator = '>'; } if($type == 'title'){ return true; //nothing to do } elseif($type == 'title2'){ $query1 .= '`order2` = `order2`'.$operation.", `title2_status`='Edit' WHERE `proposal_id`='".$model->getProposal_id()."' AND `order` = '".$model->getOrder(); $query1 .= "' AND `order2` ".$operator." '".$model->getOrder2()."'"; $where = "`order` = '".$model->getOrder()."' AND `order2` ".$operator." '".$model->getOrder2()."' AND"; } elseif($type == 'article_title'){ $query1 .= '`article` = `article`'.$operation.", `article_title_status`='Edit' WHERE `proposal_id`='".$model->getProposal_id()."' AND `order` = '".$model->getOrder(); $query1 .= "' AND `order2`='".$model->getOrder2()."' AND `article` ".$operator." '".$model->getArticle()."'"; $where = "`order` = '".$model->getOrder()."' AND `order2`='".$model->getOrder2()."' AND `article` ".$operator." '".$model->getArticle()."' AND"; } elseif($type == 'paragraph'){ $query1 .= '`paragraph` = `paragraph`'.$operation.", `paragraph_status`='Edit' WHERE `proposal_id`='".$model->getProposal_id()."' AND `order` = '".$model->getOrder(); $query1 .= "' AND `order2`='".$model->getOrder2()."' AND `article`='".$model->getArticle()."' AND `paragraph` ".$operator." '".$model->getParagraph()."'"; $where = "`order` = '".$model->getOrder()."' AND `order2`='".$model->getOrder2()."' AND `article`='".$model->getArticle()."' AND `paragraph` ".$operator." '".$model->getParagraph()."' AND"; } //insert not edited $result = $this->selectNotEdited($model->getProposal_id(), $where); foreach ($result as $res1){ $res = new Proposals_sentences(''); $res->copy_from_cia_array($res1); $res->setChange_type('Edit'); $res->setProposal_id($model->getProposal_id()); if (!$this->saveOrUpdate($res)){ // save it! echo 'db error'; return false; } } //update numbers return $this->mysql->query($query1); } /** * * returns true if this proposal_sentence is modified compared to original * @param array $proposal_sentence, array $cia */ public function ismodified($proposal_sentence, $cia){ if ($cia == NULL){ $q = 'SELECT * FROM `CIA` WHERE `id`="'.$proposal_sentence['sentence_id'].'"'; $this->mysql->query($q); $cia = $this->mysql->fetchArray(); } $check = array('title','order','title2','order2','article', 'article_title','paragraph','sentence','sentence_text'); foreach($check as $c){ if (strcmp($proposal_sentence[$c], $cia[$c]) != 0 ){ return true; } } return false; } /** * if header is reset, the status is not, we need to check the real content, as in 'ismodified' public function ismodified2($proposal_sentence, $cia){ if ($cia == NULL){ $q = 'SELECT * FROM `CIA` WHERE `id`="'.$proposal_sentence['sentence_id'].'"'; $this->mysql->query($q); $cia = $this->mysql->fetchArray(); } $check = array('title_status','title2_status', 'article_title_status','paragraph_status'); if (strcmp($proposal_sentence['sentence'], $cia['sentence']) != 0 ){ return true; } if (strcmp($proposal_sentence['sentence_text'], $cia['sentence_text']) != 0 ){ return true; } foreach($check as $c){ if ($proposal_sentence[$c] != '' ){ return true; } } return false; } public function isHeaderModified($proposal_sentence){ $check = array('title_status','title2_status', 'article_title_status','paragraph_status'); foreach($check as $c){ if ($proposal_sentence[$c] != '' ){ return true; } } return false; } */ /** * returns array of original sentences that an edited version [Edit|Delete] doesn't exist * where should include order/order2/article/sentence * */ private function selectNotEdited($proposal_id, $where){ $q = "SELECT `CIA`.* FROM `CIA` WHERE ".$where." `id` NOT IN (SELECT `sentence_id` FROM `proposals_sentences` WHERE (`change_type`='Edit' OR `change_type`='Delete') AND `proposal_id`='".$proposal_id."')"; $this->mysql->query($q); $res = array(); while ($row = $this->mysql->fetchArray()){ $res[$row['id']] = $row; } return $res; } /** * Save or update Proposals_sentences: * @param Proposals_sentences object with the data * @return boolean true in case of success, false otherwise */ public function saveOrUpdate(IModel $proposals_sentence) { $query=""; $recordID=$proposals_sentence->getId(); if($recordID==NULL) { $query.="INSERT INTO `proposals_sentences` SET "; } else { $query.="UPDATE `proposals_sentences` SET "; } $query .="`proposal_id` = '".$this->mysql->escape($proposals_sentence->getProposal_id())."', "; $query .="`change_type` = '".$this->mysql->escape($proposals_sentence->getChange_type())."', "; $query .="`sentence_id` = '".$this->mysql->escape($proposals_sentence->getSentence_id())."', "; $query .="`jc_comment` = '".$this->mysql->escape($proposals_sentence->getJc_comment())."', "; $query .="`category` = '".$this->mysql->escape($proposals_sentence->getCategory())."', "; $query .="`title` = '".$this->mysql->escape($proposals_sentence->getTitle())."', "; $query .="`order` = '".$this->mysql->escape($proposals_sentence->getOrder())."', "; $query .="`last_change` = '".$this->mysql->escape($proposals_sentence->getLast_change())."', "; $query .="`title2` = '".$this->mysql->escape($proposals_sentence->getTitle2())."', "; $query .="`order2` = '".$this->mysql->escape($proposals_sentence->getOrder2())."', "; $query .="`article` = '".$this->mysql->escape($proposals_sentence->getArticle())."', "; $query .="`article_title` = '".$this->mysql->escape($proposals_sentence->getArticle_title())."', "; $query .="`paragraph` = '".$this->mysql->escape($proposals_sentence->getParagraph())."', "; $query .="`sentence` = '".$this->mysql->escape($proposals_sentence->getSentence())."', "; $query .="`sentence_text` = '".$this->mysql->escape($proposals_sentence->getSentence_text())."', "; $query .="`agora_id_start` = '".$this->mysql->escape($proposals_sentence->getAgora_id_start())."', "; $query .="`agora_id_end` = '".$this->mysql->escape($proposals_sentence->getAgora_id_end())."', "; $query .="`title_status` = '".$this->mysql->escape($proposals_sentence->getTitle_status())."', "; $query .="`title2_status` = '".$this->mysql->escape($proposals_sentence->getTitle2_status())."', "; $query .="`article_title_status` = '".$this->mysql->escape($proposals_sentence->getArticle_title_status())."', "; $query .="`paragraph_status` = '".$this->mysql->escape($proposals_sentence->getParagraph_status())."'"; if($recordID!=NULL) { $query.=" where `id` = ".$recordID; } //echo $query; return $this->mysql->query($query); } public function get_last_id(){ return $this->mysql->getInsertId(); } } ?>