.
*/
/**
* 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();
}
}
?>