Source for file OnpubArticles.php

Documentation is available at OnpubArticles.php

  1. <?php
  2.  
  3. /**
  4.  * Manage articles in an Onpub database.
  5.  *
  6.  * This class contains the methods to manage the data contained in an
  7.  * {@link http://onpub.com/pdfs/onpub_schema.pdf OnpubArticles table}.
  8.  *
  9.  * @author {@link mailto:corey@onpub.com Corey H.M. Taylor}
  10.  * @copyright Onpub (TM). Copyright 2012, Onpub.com.
  11.  *  {@link http://onpub.com/}
  12.  * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License
  13.  *  Version 2
  14.  * @package OnpubAPI
  15.  */
  16. {
  17.   private $pdo;
  18.   /**
  19.    * Controls whether or not the methods in this class use transactions when
  20.    * they access the database.
  21.    *
  22.    * By default, this is set to TRUE and database transactions will be used
  23.    * where necessary. Set this to FALSE if you want to manage transactions
  24.    * yourself.
  25.    * @var bool 
  26.    */
  27.   public $enableTransactions;
  28.  
  29.   /**
  30.    * Connect to an Onpub database.
  31.    *
  32.    * All the methods in this class which query the database use the database
  33.    * connection provided by the PDO object required by this constructor.
  34.    * Currently, Onpub only supports MySQL as a database for storing content.
  35.    * Therefore, when constructing the PDO object, only the
  36.    * {@link PHP_MANUAL#ref.pdo-mysql PDO_MYSQL} driver is supported
  37.    * as a PDO {@link PHP_MANUAL#ref.pdo-mysql.connection data source}.
  38.    *
  39.    * All the methods in this class require the
  40.    * {@link http://onpub.com/pdfs/onpub_schema.pdf Onpub schema}
  41.    * to be installed in the PDO-connected database. The {@link OnpubDatabase}
  42.    * class contains methods to manage the Onpub schema. The Onpub
  43.    * schema can also be installed by clicking the "Install the schema" link
  44.    * once logged in to the Onpub web interface. The schema generally only has
  45.    * to be installed once per database.
  46.    *
  47.    * @param PDO $pdo {@link PHP_MANUAL#function.pdo-construct PHP Data Object}.
  48.    * @param bool $enableTransactions If TRUE (the default), the methods in
  49.    *  this class that use database transactions will do so. If FALSE, methods
  50.    *  that by default use transactions, will not. Only pass FALSE to this
  51.    *  argument if you are managing transactions yourself.
  52.    *
  53.    */
  54.   function __construct(PDO $pdo$enableTransactions TRUE)
  55.   {
  56.     $this->pdo $pdo;
  57.     $this->enableTransactions = $enableTransactions;
  58.     $this->pdo->setAttribute(PDO::ATTR_EMULATE_PREPARESTRUE);
  59.   }
  60.  
  61.   /**
  62.    * Get the total number of articles in the database.
  63.    *
  64.    * @param int $sectionID Get the total number of articles in a section
  65.    *                        identified by its ID.
  66.    * @return int 
  67.    */
  68.   public function count($sectionID NULL)
  69.   {
  70.     $query $this->countQuery($sectionID);
  71.     $result $this->pdo->query($query);
  72.     OnpubDatabase::verifyQuery($this->pdo$resultFALSE);
  73.  
  74.     if (!($row $result->fetch(PDO::FETCH_ASSOC))) {
  75.       return 0;
  76.     }
  77.  
  78.     $result->closeCursor();
  79.     return $row["count"];
  80.   }
  81.  
  82.   private function countQuery($sectionID NULL)
  83.   {
  84.     if ($sectionID{
  85.       return "SELECT COUNT(articles.ID) AS count FROM OnpubArticles AS articles LEFT JOIN OnpubSAMaps as samaps ON articles.ID = samaps.articleID WHERE sectionID = $sectionID";
  86.     }
  87.     else {
  88.       return "SELECT COUNT(articles.ID) AS count FROM OnpubArticles AS articles";
  89.     }
  90.   }
  91.  
  92.   /**
  93.    * Delete an article from the database.
  94.    *
  95.    * @param int $ID ID of the article to delete.
  96.    * @return int 1 if the article was deleted, 0 if the article does not exist in the database.
  97.    */
  98.   public function delete($ID)
  99.   {
  100.     $oaamaps new OnpubAAMaps($this->pdoFALSE);
  101.     $osamaps new OnpubSAMaps($this->pdoFALSE);
  102.  
  103.     if ($this->enableTransactions{
  104.       $status $this->pdo->beginTransaction();
  105.       OnpubDatabase::verifyTransaction($this->pdo$status);
  106.     }
  107.  
  108.     try {
  109.       $oaamaps->delete($IDNULL);
  110.     }
  111.     catch (PDOException $e{
  112.       if ($this->enableTransactions)
  113.         $this->pdo->rollBack();
  114.  
  115.       throw $e;
  116.     }
  117.  
  118.     try {
  119.       $osamaps->delete(NULL$ID);
  120.     }
  121.     catch (PDOException $e{
  122.       if ($this->enableTransactions)
  123.         $this->pdo->rollBack();
  124.  
  125.       throw $e;
  126.     }
  127.  
  128.     $stmt $this->pdo->prepare("DELETE FROM OnpubArticles WHERE ID = :ID");
  129.     OnpubDatabase::verifyPrepare($this->pdo$stmt$this->enableTransactions);
  130.  
  131.     $stmt->bindParam(':ID'$ID);
  132.  
  133.     $result $stmt->execute();
  134.     OnpubDatabase::verifyExecute($this->pdo$result$this->enableTransactions$stmt->errorInfo());
  135.  
  136.     if ($this->enableTransactions{
  137.       $status $this->pdo->commit();
  138.       OnpubDatabase::verifyTransaction($this->pdo$status);
  139.     }
  140.  
  141.     return $stmt->rowCount();
  142.   }
  143.  
  144.   /**
  145.    * Search for articles in the database.
  146.    *
  147.    * @param string $keywords Keyword(s) to search for.
  148.    * @return array All the articles which were found as an array of {@link OnpubArticle} objects.
  149.    */
  150.   public function search($keywordsOnpubQueryOptions $queryOptions NULL)
  151.   {
  152.     if ($queryOptions === NULL)
  153.       $queryOptions new OnpubQueryOptions();
  154.  
  155.     $query $this->searchQuery($keywords$queryOptions);
  156.     $result $this->pdo->query($query);
  157.     OnpubDatabase::verifyQuery($this->pdo$resultFALSE);
  158.  
  159.     $rows $result->fetchAll(PDO::FETCH_ASSOC);
  160.  
  161.     $articles array();
  162.     $authors array();
  163.     $lastAID 0;
  164.     $lastArticle NULL;
  165.     $content "";
  166.  
  167.     if ($rows{
  168.       foreach ($rows as $row{
  169.         $currAID $row["ID"];
  170.         $currIID $row["imageID"];
  171.         $currAIID $row["authorImageID"];
  172.  
  173.         if ($lastAID != $currAID{
  174.           $authors array();
  175.         }
  176.  
  177.         $author new OnpubAuthor();
  178.  
  179.         $author->ID $row["authorID"];
  180.         $author->imageID $currAIID;
  181.         $author->givenNames $row["givenNames"];
  182.         $author->familyName $row["familyName"];
  183.         $author->displayAs $row["displayAs"];
  184.         $author->setCreated(new DateTime($row["authorCreated"]));
  185.         $author->setModified(new DateTime($row["authorModified"]));
  186.  
  187.         $authors[$author;
  188.  
  189.         if ($currAIID{
  190.           $s sizeof($authors);
  191.           $author $authors[($s 1)];
  192.  
  193.           $image new OnpubImage();
  194.  
  195.           $image->ID $currAIID;
  196.           $image->websiteID $row["authorImageWebsiteID"];
  197.           $image->fileName $row["authorImageFileName"];
  198.           $image->description $row["authorImageDescription"];
  199.           $image->setCreated(new DateTime($row["authorImageCreated"]));
  200.           $image->setModified(new DateTime($row["authorImageModified"]));
  201.  
  202.           $author->image $image;
  203.         }
  204.  
  205.         if ($queryOptions->includeContent{
  206.           $content $row["content"];
  207.         }
  208.         else {
  209.           $content "";
  210.         }
  211.  
  212.         $currArticle new OnpubArticle();
  213.  
  214.         $currArticle->ID $currAID;
  215.         $currArticle->imageID $currIID;
  216.         $currArticle->title $row["title"];
  217.         $currArticle->content $content;
  218.         $currArticle->url $row["url"];
  219.         $currArticle->setCreated(new DateTime($row["created"]));
  220.         $currArticle->setModified(new DateTime($row["modified"]));
  221.  
  222.         if ($currIID{
  223.           $image new OnpubImage();
  224.  
  225.           $image->ID $currIID;
  226.           $image->websiteID $row["websiteID"];
  227.           $image->fileName $row["fileName"];
  228.           $image->description $row["description"];
  229.           $image->url $row["articleImageURL"];
  230.           $image->setCreated(new DateTime($row["imageCreated"]));
  231.           $image->setModified(new DateTime($row["imageModified"]));
  232.  
  233.           $currArticle->image $image;
  234.         }
  235.  
  236.         if ($lastArticle != NULL{
  237.           if ($lastArticle->ID == $currArticle->ID{
  238.             $lastArticle->authors $authors;
  239.           }
  240.           else {
  241.             $articles[$currArticle;
  242.             $currArticle->authors $authors;
  243.           }
  244.         }
  245.         else {
  246.           $articles[$currArticle;
  247.           $currArticle->authors $authors;
  248.         }
  249.  
  250.         $lastAID $currAID;
  251.  
  252.         if ($lastArticle != NULL{
  253.           if ($lastArticle->ID != $currArticle->ID{
  254.             $lastArticle $currArticle;
  255.           }
  256.         }
  257.         else {
  258.           $lastArticle $currArticle;
  259.         }
  260.       }
  261.     }
  262.  
  263.     $result->closeCursor();
  264.     return $articles;
  265.   }
  266.  
  267.   private function searchQuery($keywordsOnpubQueryOptions $queryOptions NULL)
  268.   {
  269.     if ($queryOptions === NULL)
  270.       $queryOptions new OnpubQueryOptions();
  271.  
  272.     $keywords OnpubDatabase::utf8Decode(trim($keywords));
  273.     $where "";
  274.  
  275.     if ($keywords{
  276.       if ($queryOptions->fullTextSearch{
  277.         $where "WHERE articles.title LIKE '%$keywords%' OR authors.displayAS LIKE '%$keywords%' OR articles.created LIKE '%$keywords%' OR articles.modified LIKE '%$keywords%' OR articles.ID LIKE '%$keywords%' OR articles.content LIKE '%$keywords%' OR articles.url LIKE '%$keywords%'";
  278.       }
  279.       else {
  280.         $where "WHERE articles.title LIKE '%$keywords%' OR authors.displayAS LIKE '%$keywords%' OR articles.created LIKE '%$keywords%' OR articles.modified LIKE '%$keywords%' OR articles.ID LIKE '%$keywords%' OR articles.url LIKE '%$keywords%'";
  281.       }
  282.     }
  283.  
  284.     if ($queryOptions->orderBy{
  285.       $orderBy $queryOptions->orderBy;
  286.     }
  287.     else {
  288.       $orderBy "";
  289.     }
  290.  
  291.     if ($queryOptions->order{
  292.       $order $queryOptions->order;
  293.     }
  294.     else {
  295.       $order "";
  296.     }
  297.  
  298.     if ($queryOptions->includeContent{
  299.       $articleColumns "articles.ID, articles.imageID, title, content, articles.url, articles.created, articles.modified";
  300.     }
  301.     else {
  302.       $articleColumns "articles.ID, articles.imageID, title, articles.url,  articles.created, articles.modified";
  303.     }
  304.  
  305.     if ($queryOptions->dateLimit{
  306.       $dateLimit $queryOptions->dateLimit->format('Y-m-d H:i:s');
  307.  
  308.       if ($keywords{
  309.         $where .= " AND articles.created <= '$dateLimit'";
  310.       }
  311.       else {
  312.         $where "WHERE articles.created <= '$dateLimit'";
  313.       }
  314.     }
  315.  
  316.     if ($orderBy{
  317.       if ($order{
  318.         return
  319.           "SELECT $articleColumns, articleimages.websiteID, articleimages.fileName, articleimages.description, articleimages.url AS articleImageURL, articleimages.created AS imageCreated, articleimages.modified AS imageModified, authors.ID AS authorID, authors.imageID AS authorImageID, givenNames, familyName, displayAs, authors.created AS authorCreated, authors.modified AS authorModified, authorimages.websiteID AS authorImageWebsiteID, authorimages.fileName AS authorImageFileName, authorimages.description AS authorImageDescription, authorimages.url AS authorImageURL, authorimages.created AS authorImageCreated, authorimages.modified AS authorImageModified FROM OnpubArticles AS articles LEFT JOIN OnpubImages AS articleimages ON articles.imageID = articleimages.ID LEFT JOIN OnpubAAMaps AS aamaps ON articles.ID = aamaps.articleID LEFT JOIN OnpubAuthors AS authors ON aamaps.authorID = authors.ID LEFT JOIN OnpubImages AS authorimages ON authors.imageID = authorimages.ID $where ORDER BY articles.$orderBy $order";
  320.       }
  321.       else {
  322.         return "SELECT $articleColumns, articleimages.websiteID, articleimages.fileName, articleimages.description, articleimages.url AS articleImageURL, articleimages.created AS imageCreated, articleimages.modified AS imageModified, authors.ID AS authorID, authors.imageID AS authorImageID, givenNames, familyName, displayAs, authors.created AS authorCreated, authors.modified AS authorModified, authorimages.websiteID AS authorImageWebsiteID, authorimages.fileName AS authorImageFileName, authorimages.description AS authorImageDescription, authorimages.url AS authorImageURL, authorimages.created AS authorImageCreated, authorimages.modified AS authorImageModified FROM OnpubArticles AS articles LEFT JOIN OnpubImages AS articleimages ON articles.imageID = articleimages.ID LEFT JOIN OnpubAAMaps AS aamaps ON articles.ID = aamaps.articleID LEFT JOIN OnpubAuthors AS authors ON aamaps.authorID = authors.ID LEFT JOIN OnpubImages AS authorimages ON authors.imageID = authorimages.ID $where ORDER BY articles.$orderBy";
  323.       }
  324.     }
  325.     else {
  326.       return "SELECT $articleColumns, articleimages.websiteID, articleimages.fileName, articleimages.description, articleimages.url AS articleImageURL, articleimages.created AS imageCreated, articleimages.modified AS imageModified, authors.ID AS authorID, authors.imageID AS authorImageID, givenNames, familyName, displayAs, authors.created AS authorCreated, authors.modified AS authorModified, authorimages.websiteID AS authorImageWebsiteID, authorimages.fileName AS authorImageFileName, authorimages.description AS authorImageDescription, authorimages.url AS authorImageURL, authorimages.created AS authorImageCreated, authorimages.modified AS authorImageModified FROM OnpubArticles AS articles LEFT JOIN OnpubImages AS articleimages ON articles.imageID = articleimages.ID LEFT JOIN OnpubAAMaps AS aamaps ON articles.ID = aamaps.articleID LEFT JOIN OnpubAuthors AS authors ON aamaps.authorID = authors.ID LEFT JOIN OnpubImages AS authorimages ON authors.imageID = authorimages.ID $where";
  327.     }
  328.   }
  329.  
  330.   /**
  331.    * Get a single article from the database.
  332.    *
  333.    * @param int $ID ID of the article to get.
  334.    * @param OnpubQueryOptions $queryOptions Optional database query options.
  335.    * @return OnpubArticle An {@link OnpubArticle} object. NULL if the article does not exist in the database.
  336.    */
  337.   public function get($IDOnpubQueryOptions $queryOptions NULL)
  338.   {
  339.     if ($queryOptions === NULL)
  340.       $queryOptions new OnpubQueryOptions();
  341.  
  342.     $query $this->getQuery($ID$queryOptions);
  343.     $result $this->pdo->query($query);
  344.     OnpubDatabase::verifyQuery($this->pdo$resultFALSE);
  345.     $rows $result->fetchAll(PDO::FETCH_ASSOC);
  346.  
  347.     if (!$rows{
  348.       return NULL;
  349.     }
  350.  
  351.     $row $rows[0];
  352.  
  353.     if ($queryOptions->includeContent{
  354.       $content $row["content"];
  355.     }
  356.     else {
  357.       $content "";
  358.     }
  359.  
  360.     $article new OnpubArticle();
  361.  
  362.     $article->ID $row["ID"];
  363.     $article->imageID $row["imageID"];
  364.     $article->title $row["title"];
  365.     $article->content $content;
  366.     $article->url $row["url"];
  367.     $article->setCreated(new DateTime($row["created"]));
  368.     $article->setModified(new DateTime($row["modified"]));
  369.  
  370.     if (!$queryOptions->includeAuthors{
  371.       return $article;
  372.     }
  373.  
  374.     if ($row["imageID"]{
  375.       $image new OnpubImage();
  376.  
  377.       $image->ID $row["imageID"];
  378.       $image->websiteID $row["websiteID"];
  379.       $image->fileName $row["fileName"];
  380.       $image->description $row["description"];
  381.       $image->setCreated(new DateTime($row["imageCreated"]));
  382.       $image->setModified(new DateTime($row["imageModified"]));
  383.  
  384.       $article->image $image;
  385.     }
  386.  
  387.     $authorsassoc array();
  388.  
  389.     foreach ($rows as $row{
  390.       $authorID $row["authorID"];
  391.  
  392.       if ($authorID{
  393.         $author new OnpubAuthor();
  394.  
  395.         $author->ID $authorID;
  396.         $author->imageID $row["authorImageID"];
  397.         $author->givenNames $row["givenNames"];
  398.         $author->familyName $row["familyName"];
  399.         $author->displayAs $row["displayAs"];
  400.         $author->setCreated(new DateTime($row["authorCreated"]));
  401.         $author->setModified(new DateTime($row["authorModified"]));
  402.  
  403.         if (isset($authorsassoc["$authorID"])) {
  404.           $author $authorsassoc["$authorID"];
  405.         }
  406.         else {
  407.           $authorsassoc["$authorID"$author;
  408.         }
  409.  
  410.         if ($row["authorImageID"]{
  411.           $image new OnpubImage();
  412.  
  413.           $image->ID $row["authorImageID"];
  414.           $image->websiteID $row["authorImageWebsiteID"];
  415.           $image->fileName $row["authorImageFileName"];
  416.           $image->description $row["authorImageDescription"];
  417.           $image->setCreated(new DateTime($row["authorImageCreated"]));
  418.           $image->setModified(new DateTime($row["authorImageModified"]));
  419.  
  420.           $author->image $image;
  421.         }
  422.  
  423.         $authors $article->authors;
  424.         $exists FALSE;
  425.  
  426.         foreach ($authors as $a{
  427.           if ($a->ID == $author->ID{
  428.             $exists TRUE;
  429.           }
  430.         }
  431.  
  432.         if ($exists == FALSE{
  433.           $authors[$author;
  434.           $article->authors $authors;
  435.         }
  436.       }
  437.     }
  438.  
  439.     $result->closeCursor();
  440.     return $article;
  441.   }
  442.  
  443.   private function getQuery($IDOnpubQueryOptions $queryOptions NULL)
  444.   {
  445.     if ($queryOptions === NULL)
  446.       $queryOptions new OnpubQueryOptions();
  447.  
  448.     if ($queryOptions->orderBy{
  449.       $orderBy $queryOptions->orderBy;
  450.       $orderBy "articles.$orderBy";
  451.     }
  452.     else {
  453.       $orderBy "aamaps.ID";
  454.     }
  455.  
  456.     if ($queryOptions->order{
  457.       $order $queryOptions->order;
  458.     }
  459.     else {
  460.       $order "";
  461.     }
  462.  
  463.     $where "WHERE articles.ID = $ID";
  464.  
  465.     if ($queryOptions->dateLimit{
  466.       $dateLimit $queryOptions->dateLimit->format('Y-m-d H:i:s');
  467.       $where .= " AND articles.created <= '$dateLimit'";
  468.     }
  469.  
  470.     if ($queryOptions->includeContent{
  471.       $articleColumns "articles.ID, articles.imageID, title, content, " .
  472.                         "articles.url, articles.created, articles.modified";
  473.     }
  474.     else {
  475.       $articleColumns "articles.ID, articles.imageID, title, articles.url, " .
  476.                         "articles.created, articles.modified";
  477.     }
  478.  
  479.     if ($queryOptions->includeAuthors{
  480.       return "SELECT $articleColumns, articleimages.websiteID, .
  481.              "articleimages.fileName, articleimages.description, " .
  482.              "articleimages.url AS articleImageURL, articleimages.created AS " .
  483.              "imageCreated, articleimages.modified AS imageModified, " .
  484.              "authors.ID AS authorID, authors.imageID AS authorImageID, " .
  485.              "givenNames, familyName, displayAs, authors.created AS " .
  486.              "authorCreated, authors.modified AS authorModified, " .
  487.              "authorimages.websiteID AS authorImageWebsiteID, " .
  488.              "authorimages.fileName AS authorImageFileName, " .
  489.              "authorimages.description AS authorImageDescription, " .
  490.              "authorimages.url AS authorImageURL, authorimages.created AS " .
  491.              "authorImageCreated, authorimages.modified AS authorImageModified " .
  492.              "FROM OnpubArticles AS articles LEFT JOIN OnpubImages AS " .
  493.              "articleimages ON articles.imageID = articleimages.ID " .
  494.              "LEFT JOIN OnpubAAMaps AS aamaps ON articles.ID = aamaps.articleID " .
  495.              "LEFT JOIN OnpubAuthors AS authors ON aamaps.authorID = authors.ID " .
  496.              "LEFT JOIN OnpubImages AS authorimages ON " .
  497.              "authors.imageID = authorimages.ID $where ORDER BY $orderBy $order";
  498.     }
  499.     else {
  500.       return "SELECT $articleColumns FROM OnpubArticles as articles WHERE ID = $ID";
  501.     }
  502.   }
  503.  
  504.   /**
  505.    * Get the ID of an article in the database.
  506.    *
  507.    * Looks for an article in the database with the same title and content.
  508.    * If there's a match, the ID of the article is returned.
  509.    *
  510.    * @param OnpubArticle $article Article whose ID you want to get.
  511.    * @return int The ID of the article. NULL if the article does not exist in the database.
  512.    */
  513.   public function getID(OnpubArticle $article)
  514.   {
  515.     $stmt $this->pdo->prepare("SELECT ID FROM OnpubArticles WHERE title = :title AND content = :content");
  516.     OnpubDatabase::verifyPrepare($this->pdo$stmtFALSE);
  517.  
  518.     $title OnpubDatabase::utf8Decode(trim($article->title));
  519.     $content OnpubDatabase::utf8Decode(trim($article->content));
  520.  
  521.     $stmt->bindParam(':title'$title);
  522.     $stmt->bindParam(':content'$content);
  523.     $result $stmt->execute();
  524.     OnpubDatabase::verifyExecute($this->pdo$resultFALSE$stmt->errorInfo());
  525.  
  526.     if (($row $stmt->fetch(PDO::FETCH_ASSOC))) {
  527.       return $row["ID"];
  528.     }
  529.  
  530.     return NULL;
  531.   }
  532.  
  533.   /**
  534.    * Insert new article(s) into the database.
  535.    *
  536.    * @param mixed $articles A single {@link OnpubArticle} object or an array of {@link OnpubArticle} objects (to insert multiple articles at a time).
  537.    * @return mixed The ID(s) of the new article(s). An int will be returned if a single article was inserted. An array of ints will be returned if multiple articles were inserted.
  538.    * @throws PDOException if there's a database error.
  539.    */
  540.   public function insert($articles)
  541.   {
  542.     $oimages new OnpubImages($this->pdoFALSE);
  543.     $oauthors new OnpubAuthors($this->pdoFALSE);
  544.     $oaamaps new OnpubAAMaps($this->pdoFALSE);
  545.     $osamaps new OnpubSAMaps($this->pdoFALSE);
  546.     $IDs array();
  547.     $isArray TRUE;
  548.  
  549.     if (!is_array($articles)) {
  550.       $articles array ($articles);
  551.       $isArray FALSE;
  552.     }
  553.  
  554.     if ($this->enableTransactions{
  555.       $status $this->pdo->beginTransaction();
  556.       OnpubDatabase::verifyTransaction($this->pdo$status);
  557.     }
  558.  
  559.     $stmt $this->pdo->prepare("INSERT INTO OnpubArticles (ID, imageID, title, content, url, created, modified) VALUES (:ID, :imageID, :title, :content, :url, :created, :modified)");
  560.     OnpubDatabase::verifyPrepare($this->pdo$stmt$this->enableTransactions);
  561.  
  562.     foreach ($articles as $article{
  563.       if ($article->image{
  564.         try {
  565.           $imageID $oimages->insert($article->image);
  566.           $article->imageID $imageID;
  567.         }
  568.         catch (PDOException $e{
  569.           if ($this->enableTransactions)
  570.             $this->pdo->rollBack();
  571.  
  572.           throw $e;
  573.         }
  574.       }
  575.  
  576.       try {
  577.         $ID $this->getID($article);
  578.       }
  579.       catch (PDOException $e{
  580.         if ($this->enableTransactions)
  581.           $this->pdo->rollBack();
  582.  
  583.         throw $e;
  584.       }
  585.  
  586.       if ($ID{
  587.         $IDs[$ID;
  588.         $article->ID $ID;
  589.       }
  590.       else {
  591.         $ID $article->ID;
  592.         $imageID $article->imageID;
  593.         $title OnpubDatabase::utf8Decode(trim($article->title));
  594.         $content OnpubDatabase::utf8Decode(trim($article->content));
  595.         $url OnpubDatabase::utf8Decode(trim($article->url));
  596.         $created $article->getCreated()->format('Y-m-d H:i:s');
  597.         $modified $article->getModified()->format('Y-m-d H:i:s');
  598.  
  599.         $stmt->bindParam(':ID'$ID);
  600.         $stmt->bindParam(':imageID'$imageID);
  601.         $stmt->bindParam(':title'$title);
  602.         $stmt->bindParam(':content'$content);
  603.         $stmt->bindParam(':url'$url);
  604.         $stmt->bindParam(':created'$created);
  605.         $stmt->bindParam(':modified'$modified);
  606.         $result $stmt->execute();
  607.         OnpubDatabase::verifyExecute($this->pdo$result$this->enableTransactions$stmt->errorInfo());
  608.  
  609.         $IDs[$this->pdo->lastInsertId();
  610.         $article->ID $this->pdo->lastInsertId();
  611.       }
  612.  
  613.       $authors $article->authors;
  614.  
  615.       try {
  616.         $oauthors->insert($authors);
  617.       }
  618.       catch (PDOException $e{
  619.         if ($this->enableTransactions)
  620.           $this->pdo->rollBack();
  621.  
  622.         throw $e;
  623.       }
  624.  
  625.       $aamaps array();
  626.  
  627.       foreach ($authors as $author{
  628.         $aamap new OnpubAAMap();
  629.  
  630.         $aamap->articleID $article->ID;
  631.         $aamap->authorID $author->ID;
  632.         $aamap->setCreated($article->getCreated());
  633.         $aamap->setModified($article->getModified());
  634.  
  635.         $aamaps[$aamap;
  636.       }
  637.  
  638.       try {
  639.         $oaamaps->insert($aamaps);
  640.       }
  641.       catch (PDOException $e{
  642.         if ($this->enableTransactions)
  643.           $this->pdo->rollBack();
  644.  
  645.         throw $e;
  646.       }
  647.  
  648.       $sectionIDs $article->sectionIDs;
  649.       $samaps array();
  650.  
  651.       foreach ($sectionIDs as $sectionID{
  652.         $samap new OnpubSAMap();
  653.  
  654.         $samap->sectionID $sectionID;
  655.         $samap->articleID $article->ID;
  656.         $samap->setCreated($article->getCreated());
  657.         $samap->setModified($article->getModified());
  658.  
  659.         $samaps[$samap;
  660.       }
  661.  
  662.       try {
  663.         $osamaps->insert($samaps);
  664.       }
  665.       catch (PDOException $e{
  666.         if ($this->enableTransactions)
  667.           $this->pdo->rollBack();
  668.  
  669.         throw $e;
  670.       }
  671.     }
  672.  
  673.     if ($this->enableTransactions{
  674.       $status $this->pdo->commit();
  675.       OnpubDatabase::verifyTransaction($this->pdo$status);
  676.     }
  677.  
  678.     if ($isArray{
  679.       return $IDs;
  680.     }
  681.     else {
  682.       return end($IDs);
  683.     }
  684.   }
  685.  
  686.   /**
  687.    * Get multiple articles from the database.
  688.    *
  689.    * @param OnpubQueryOptions $queryOptions Database query options.
  690.    * @return array An array of {@link OnpubArticle} objects.
  691.    */
  692.   public function select(OnpubQueryOptions $queryOptions NULL$sectionID NULL$websiteID NULL)
  693.   {
  694.     if ($queryOptions === NULL)
  695.       $queryOptions new OnpubQueryOptions();
  696.  
  697.     $query $this->selectQuery($queryOptions$sectionID$websiteID);
  698.     $result $this->pdo->query($query);
  699.     OnpubDatabase::verifyQuery($this->pdo$resultFALSE);
  700.     $rows $result->fetchAll(PDO::FETCH_ASSOC);
  701.  
  702.     $articles array();
  703.  
  704.     if ($rows{
  705.       $lastID null;
  706.       $article new OnpubArticle();
  707.  
  708.       foreach ($rows as $row{
  709.         if ($lastID != $row["ID"]{
  710.           $article new OnpubArticle();
  711.         }
  712.  
  713.         if ($queryOptions->includeContent{
  714.           $content $row["content"];
  715.         }
  716.         else {
  717.           $content "";
  718.         }
  719.  
  720.         $article->ID $row["ID"];
  721.         $article->imageID $row["imageID"];
  722.         $article->title $row["title"];
  723.         $article->content $content;
  724.         $article->url $row["url"];
  725.         $article->setCreated(new DateTime($row["created"]));
  726.         $article->setModified(new DateTime($row["modified"]));
  727.  
  728.         if ($row["imageID"]{
  729.           $image new OnpubImage();
  730.     
  731.           $image->ID $row["imageID"];
  732.           $image->websiteID $row["imageWebsiteID"];
  733.           $image->fileName $row["imageFileName"];
  734.           $image->description $row["imageDescription"];
  735.           $image->setCreated(new DateTime($row["imageCreated"]));
  736.           $image->setModified(new DateTime($row["imageModified"]));
  737.     
  738.           $article->image $image;
  739.         }
  740.  
  741.         if ($sectionID || $websiteID{
  742.           $article->sectionIDs[$row["sectionID"];
  743.         }
  744.  
  745.         if ($lastID != $row["ID"]{
  746.           $articles[$article;
  747.         }
  748.  
  749.         $lastID $article->ID;
  750.       }
  751.     }
  752.  
  753.     $result->closeCursor();
  754.     return $articles;
  755.   }
  756.  
  757.   private function selectQuery(OnpubQueryOptions $queryOptions NULL$sectionID NULL$websiteID NULL)
  758.   {
  759.     if ($queryOptions === NULL)
  760.       $queryOptions new OnpubQueryOptions();
  761.  
  762.     $articleColumns "articles.ID, articles.imageID, articles.title, " .
  763.                       "articles.url, articles.created, articles.modified, " .
  764.                       "articleimages.websiteID AS imageWebsiteID, articleimages.fileName AS imageFileName, " .
  765.                       "articleimages.description AS imageDescription, articleimages.url AS " .
  766.                       "articleImageURL, articleimages.created AS imageCreated, " .
  767.                       "articleimages.modified AS imageModified";
  768.     $where "";
  769.     $orderBy "";
  770.     $limit "";
  771.  
  772.     if ($queryOptions->includeContent{
  773.       $articleColumns "articles.ID, articles.imageID, articles.title, " .
  774.                         "articles.content, articles.url, articles.created, " .
  775.                         "articles.modified, articleimages.websiteID AS " .
  776.                         "imageWebsiteID, articleimages.fileName AS " .
  777.                         "imageFileName, articleimages.description AS " .
  778.                         "imageDescription, articleimages.url AS " .
  779.                         "articleImageURL, articleimages.created AS " .
  780.                         "imageCreated, articleimages.modified AS imageModified";
  781.     }
  782.  
  783.     if ($sectionID || $websiteID{
  784.       $articleColumns .= ", samaps.sectionID AS sectionID";
  785.     }
  786.  
  787.     if ($queryOptions->dateLimit{
  788.       $where "WHERE articles.created <= " $this->pdo->quote($queryOptions->dateLimit->format('Y-m-d H:i:s'));
  789.  
  790.       if ($sectionID && !$websiteID{
  791.         $where .= " AND samaps.sectionID = $sectionID";
  792.       }
  793.  
  794.       if ($websiteID && !$sectionID{
  795.         $where .= " AND wsmaps.websiteID = $websiteID";
  796.       }
  797.     }
  798.     else {
  799.       if ($sectionID && !$websiteID{
  800.         $where "WHERE samaps.sectionID = $sectionID";
  801.       }
  802.  
  803.       if ($websiteID && !$sectionID{
  804.         $where "WHERE wsmaps.websiteID = $websiteID";
  805.       }
  806.     }
  807.  
  808.     if ($queryOptions->orderBy{
  809.       $orderBy "ORDER BY articles." $queryOptions->orderBy;
  810.  
  811.       if ($queryOptions->order{
  812.         $orderBy .= " " $queryOptions->order;
  813.       }
  814.     }
  815.     else {
  816.       if ($sectionID && !$websiteID{
  817.         $orderBy "ORDER BY samaps.ID ASC";
  818.       }
  819.     }
  820.  
  821.     if ($queryOptions->getPage(&& $queryOptions->rowLimit && $queryOptions->rowLimit 0{
  822.       $limit "LIMIT " (($queryOptions->getPage(1$queryOptions->rowLimit.
  823.                "," $queryOptions->rowLimit;
  824.     }
  825.     elseif ($queryOptions->rowLimit && $queryOptions->rowLimit 0{
  826.       $limit "LIMIT 0," $queryOptions->rowLimit;
  827.     }
  828.  
  829.     if ($sectionID && !$websiteID{
  830.       return "SELECT $articleColumns FROM OnpubArticles AS articles LEFT JOIN .
  831.              "OnpubImages AS articleimages ON articles.imageID = articleimages.ID LEFT JOIN " .
  832.              "OnpubSAMaps AS samaps ON articles.ID = samaps.articleID " .
  833.              "$where $orderBy $limit";
  834.     }
  835.     elseif ($websiteID && !$sectionID{
  836.       return "SELECT $articleColumns FROM OnpubArticles AS articles LEFT JOIN .
  837.              "OnpubImages AS articleimages ON articles.imageID = articleimages.ID LEFT JOIN " .
  838.              "OnpubSAMaps AS samaps ON articles.ID = samaps.articleID " .
  839.              "LEFT JOIN OnpubWSMaps AS wsmaps ON samaps.sectionID = " .
  840.              "wsmaps.sectionID $where $orderBy $limit";
  841.     }
  842.     else {
  843.       return "SELECT $articleColumns FROM OnpubArticles AS articles LEFT JOIN .
  844.              "OnpubImages AS articleimages ON articles.imageID = articleimages.ID " .
  845.              "$where $orderBy $limit";
  846.     }
  847.   }
  848.  
  849.   /**
  850.    * Update an article already in the database.
  851.    *
  852.    * If you set the article's sectionIDs to NULL, it will be unmapped from
  853.    * any sections it was previously mapped to.
  854.    *
  855.    * @param OnpubArticle $article The article to be updated.
  856.    * @param bool $overwriteAAMaps False by default. If set to TRUE, the
  857.    *  article-author maps for this article will be deleted and recreated, if
  858.    *  applicable.
  859.    * @return int 1 if the article was updated. 0 if the article does not exist in the database.
  860.    */
  861.   public function update(OnpubArticle $article$overwriteAAMaps FALSE)
  862.   {
  863.     $oaamaps new OnpubAAMaps($this->pdoFALSE);
  864.     $oauthors new OnpubAuthors($this->pdoFALSE);
  865.     $osamaps new OnpubSAMaps($this->pdoFALSE);
  866.     $oimages new OnpubImages($this->pdoFALSE);
  867.     $now new DateTime();
  868.  
  869.     if ($this->enableTransactions{
  870.       $status $this->pdo->beginTransaction();
  871.       OnpubDatabase::verifyTransaction($this->pdo$status);
  872.     }
  873.  
  874.     $stmt $this->pdo->prepare("UPDATE OnpubArticles SET imageID = :imageID, title = :title, content = :content, url = :url, created = :created, modified = :modified WHERE ID = :ID");
  875.     OnpubDatabase::verifyPrepare($this->pdo$stmt$this->enableTransactions);
  876.  
  877.     if ($article->image{
  878.       try {
  879.         $imageID $oimages->insert($article->image);
  880.         $article->imageID $imageID;
  881.       }
  882.       catch (PDOException $e{
  883.         if ($this->enableTransactions)
  884.           $this->pdo->rollBack();
  885.  
  886.         throw $e;
  887.       }
  888.     }
  889.  
  890.     $ID $article->ID;
  891.     $imageID $article->imageID;
  892.     $title OnpubDatabase::utf8Decode(trim($article->title));
  893.     $content OnpubDatabase::utf8Decode(trim($article->content));
  894.     $url OnpubDatabase::utf8Decode(trim($article->url));
  895.     $created $article->getCreated()->format('Y-m-d H:i:s');
  896.     $modified $now->format('Y-m-d H:i:s');
  897.  
  898.     $stmt->bindParam(':ID'$ID);
  899.     $stmt->bindParam(':imageID'$imageID);
  900.     $stmt->bindParam(':title'$title);
  901.     $stmt->bindParam(':content'$content);
  902.     $stmt->bindParam(':url'$url);
  903.     $stmt->bindParam(':created'$created);
  904.     $stmt->bindParam(':modified'$modified);
  905.     $result $stmt->execute();
  906.     OnpubDatabase::verifyExecute($this->pdo$result$this->enableTransactions$stmt->errorInfo());
  907.  
  908.     if ($overwriteAAMaps{
  909.       try {
  910.         $oaamaps->delete($article->IDNULL);
  911.       }
  912.       catch (PDOException $e{
  913.         if ($this->enableTransactions)
  914.           $this->pdo->rollBack();
  915.  
  916.         throw $e;
  917.       }
  918.     }
  919.  
  920.     $authors $article->authors;
  921.  
  922.     foreach ($authors as $author{
  923.       if ($author->ID{
  924.         try {
  925.           $oauthors->update($author);
  926.         }
  927.         catch (PDOException $e{
  928.           if ($this->enableTransactions)
  929.             $this->pdo->rollBack();
  930.  
  931.           throw $e;
  932.         }
  933.       }
  934.       else {
  935.         try {
  936.           $oauthors->insert($author);
  937.         }
  938.         catch (PDOException $e{
  939.           if ($this->enableTransactions)
  940.             $this->pdo->rollBack();
  941.  
  942.           throw $e;
  943.         }
  944.       }
  945.  
  946.       try {
  947.         $aamap new OnpubAAMap();
  948.         $aamap->articleID $article->ID;
  949.         $aamap->authorID $author->ID;
  950.         $oaamaps->insert($aamap);
  951.       }
  952.       catch (PDOException $e{
  953.         if ($this->enableTransactions)
  954.           $this->pdo->rollBack();
  955.  
  956.         throw $e;
  957.       }
  958.     }
  959.  
  960.     $sectionIDs $article->sectionIDs;
  961.  
  962.     if ($sectionIDs === NULL{
  963.       try {
  964.         $samaps $osamaps->delete(NULL$article->ID);
  965.       }
  966.       catch (PDOException $e{
  967.         if ($this->enableTransactions)
  968.           $this->pdo->rollBack();
  969.  
  970.         throw $e;
  971.       }
  972.     }
  973.     elseif (sizeof($sectionIDs)) {
  974.       $queryOptions new OnpubQueryOptions();
  975.       $queryOptions->orderBy "ID";
  976.       $queryOptions->order "ASC";
  977.  
  978.       try {
  979.         $samaps $osamaps->select($queryOptionsNULL$article->ID);
  980.       }
  981.       catch (PDOException $e{
  982.         if ($this->enableTransactions)
  983.           $this->pdo->rollBack();
  984.  
  985.         throw $e;
  986.       }
  987.  
  988.       // Unmap sections not included in $sectionIDs.
  989.       foreach ($samaps as $samap{
  990.         if (!in_array($samap->sectionID$sectionIDs)) {
  991.           try {
  992.             $osamaps->delete($samap->sectionID$article->ID);
  993.           }
  994.           catch (PDOException $e{
  995.             if ($this->enableTransactions)
  996.               $this->pdo->rollBack();
  997.  
  998.             throw $e;
  999.           }
  1000.         }
  1001.       }
  1002.  
  1003.       foreach ($sectionIDs as $sectionID{
  1004.         $samap new OnpubSAMap();
  1005.  
  1006.         $samap->sectionID $sectionID;
  1007.         $samap->articleID $article->ID;
  1008.         $samap->setCreated($article->getCreated());
  1009.         $samap->setModified($article->getModified());
  1010.  
  1011.         try {
  1012.           $samapID $osamaps->getID($samap);
  1013.         }
  1014.         catch (PDOException $e{
  1015.           if ($this->enableTransactions)
  1016.             $this->pdo->rollBack();
  1017.  
  1018.           throw $e;
  1019.         }
  1020.  
  1021.         if ($samapID{
  1022.           $samap->ID $samapID;
  1023.  
  1024.           try {
  1025.             $osamaps->update($samap);
  1026.           }
  1027.           catch (PDOException $e{
  1028.             if ($this->enableTransactions)
  1029.               $this->pdo->rollBack();
  1030.  
  1031.             throw $e;
  1032.           }
  1033.         }
  1034.         else {
  1035.           try {
  1036.             $osamaps->insert($samap);
  1037.           }
  1038.           catch (PDOException $e{
  1039.             if ($this->enableTransactions)
  1040.               $this->pdo->rollBack();
  1041.  
  1042.             throw $e;
  1043.           }
  1044.         }
  1045.       }
  1046.     }
  1047.  
  1048.     if ($this->enableTransactions{
  1049.       $status $this->pdo->commit();
  1050.       OnpubDatabase::verifyTransaction($this->pdo$status);
  1051.     }
  1052.  
  1053.     return $stmt->rowCount();
  1054.   }
  1055. }
  1056. ?>

Documentation generated on Fri, 08 Feb 2013 04:02:18 -0500 by phpDocumentor 1.4.4