Вход Регистрация
Файл: oc-includes/osclass/model/Page.php
Строк: 588
<?php if ( !defined('ABS_PATH') ) exit('ABS_PATH is not loaded. Direct access is not allowed.');

/*
 * Copyright 2014 Osclass
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

    /**
     * Page DAO
     */
    
class Page extends DAO
    
{
        
/**
         *
         * @var type
         */
        
private static $instance;

        public static function 
newInstance()
        {
            if( !
self::$instance instanceof self ) {
                
self::$instance = new self;
            }
            return 
self::$instance;
        }

        
/**
         *
         */
        
function __construct()
        {
            
parent::__construct();
            
$this->setTableName('t_pages');
            
$this->setPrimaryKey('pk_i_id');
            
$array_fields = array(
                
'pk_i_id',
                
's_internal_name',
                
'b_indelible',
                
'b_link',
                
'dt_pub_date',
                
'dt_mod_date',
                
'i_order',
                
's_meta');
            
$this->setFields($array_fields);
        }

        
/**
         * Find a page by page id.
         *
         * @access public
         * @since unknown
         * @param int $id Page id.
         * @param string $locale By default is null but you can specify locale code.
         * @return array Page information. If there's no information, return an empty array.
         */
        
function findByPrimaryKey($id$locale null)
        {
            
$this->dao->select();
            
$this->dao->from($this->getTableName());
            
$this->dao->where('pk_i_id'$id);
            
$result $this->dao->get();

            if( 
$result == false ) {
                return array();
            }

            if( 
$result->numRows() == ) {
                return array();
            }

            
$row $result->row();

            
// page_description
            
$this->dao->select();
            
$this->dao->from($this->getDescriptionTableName());
            
$this->dao->where('fk_i_pages_id'$id);
            if( !
is_null($locale) ) {
                
$this->dao->where('fk_c_locale_code'$locale);
            }
            
$result   $this->dao->get();
            
$aRows $result->result();

            
$row['locale'] = array();
            foreach(
$aRows as $r) {
                
$row['locale'][$r['fk_c_locale_code']] = $r;
            }

            return 
$row;
        }

        
/**
         * Find a page by internal name.
         *
         * @access public
         * @since unknown
         * @param string $intName Internal name of the page to find.
         * @param string $locale Locale string.
         * @return array It returns page fields. If it has no results, it returns an empty array.
         */
        
function findByInternalName($intName$locale null)
        {
            
$this->dao->select();
            
$this->dao->from($this->getTableName());
            
$this->dao->where('s_internal_name'$intName);
            
$result $this->dao->get();


            if( 
$result == false ) {
                return array();
            }

            if( 
$result->numRows() == ){
                return array();
            }

            
$row $result->row();
            return 
$this->extendDescription($row$locale);
        }

        
/**
         * Find a page by order.
         *
         * @access public
         * @since unknown
         * @param int order
         * @return array It returns page fields. If it has no results, it returns an empty array.
         */
        
function findByOrder($order$locale null)
        {
            
$this->dao->select();
            
$this->dao->from($this->getTableName());
            
$array_where = array(
                
'i_order'     => $order,
                
'b_indelible' => 0
            
);
            
$this->dao->where($array_where);
            
$result $this->dao->get();

            if( 
$result == false ) {
                return array();
            }

            if( 
$result->numRows() == ) {
                return array();
            }

            
$row    $result->row();
            
$result $this->extendDescription($row$locale);
            return 
$result;
        }

        
/**
         * Get all the pages with the parameters you choose.
         *
         * @access public
         * @since unknown
        *  @param bool $indelible true if the page is indelible
         * @param string $locale
         * @param int $start
         * @param int $limit
         * @return array Return all the pages that have been found with the criteria selected. If there's no pages, the
         * result is an empty array.
         */
        
public function listAll($indelible null$b_link null$locale null$start null$limit null)
        {
            
$this->dao->select();
            
$this->dao->from($this->getTableName());
            if( !
is_null($indelible) ) {
                
$this->dao->where('b_indelible'$indelible);
            }
            if( 
$b_link!=null) {
                
$this->dao->where('b_link'$b_link);
            }
            
$this->dao->orderBy('i_order''ASC');
            if( !
is_null($limit) ) {
                
$this->dao->limit($limit$start);
            }
            
$result $this->dao->get();
            if(
$result) {
                
$aPages $result->result();

                if( 
count($aPages) == ) {
                    return array();
                }

                
$resultPages = array();
                foreach(
$aPages as $aPage) {
                    
$data $this->extendDescription($aPage$locale);
                    if(
count($data) > 0) {
                        
$resultPages[] = $data;
                    }
                    unset(
$data);
                }

                return 
$resultPages;
            } else {
                return array();
            }
        }

        
/**
         * Return number of all pages, or only number of indelible pages
         *
         * @access public
         * @since 3.0
         * @param int $indelible
         * @return int
         */
        
public function count($indelible null)
        {
            
$this->dao->select('count(*) as total');
            
$this->dao->from($this->getTableName());
            if( !
is_null($indelible) ) {
                
$this->dao->where('b_indelible'$indelible);
            }

            
$result $this->dao->get();
            if(
$result) {
                
$aPages $result->result();
                return 
$aPages[0]['total'];
            } else {
                return 
0;
            }

        }

        
/**
         * An array with data of some page, returns the title and description in every language available
         *
         * @access public
         * @since unknown
         * @param array $aPage
         * @return array Page information, title and description in every language available
         */
        
public function extendDescription($aPage$locale null)
        {
            
$this->dao->select();
            
$this->dao->from($this->getDescriptionTableName());
            
$this->dao->where("fk_i_pages_id"$aPage['pk_i_id']);
            if( !
is_null($locale) ) {
                
$this->dao->where('fk_c_locale_code'$locale);
            }
            
$results       $this->dao->get();
            if(
$results===false) { return array(); }
            
$aDescriptions $results->result();

            if( 
count($aDescriptions) == ) {
                return array();
            }

            
$aPage['locale'] = array();
            foreach(
$aDescriptions as $description) {
                if( !empty(
$description['s_title']) || !empty($description['s_text']) ) {
                    
$aPage['locale'][$description['fk_c_locale_code']] = $description;
                }
            }

            return 
$aPage;
        }

        
/**
         * Delete a page by id number.
         *
         * @access public
         * @since unknown
         * @param int $id Page id which is going to be deleted
         * @return@return mixed It return the number of affected rows if the delete has been
         * correct or false if nothing has been modified
         */
        
public function deleteByPrimaryKey($id)
        {
            
$row $this->findByPrimaryKey($id);
            
$order $row['i_order'];

            
$this->reOrderPages($order);

            
$this->dao->delete($this->getDescriptionTableName(), array('fk_i_pages_id' => $id));
            return 
$this->dao->delete($this->tableName, array('pk_i_id' => $id));
        }

        
/**
         * Delete a page by internal name.
         *
         * @access public
         * @since unknown
         * @param string $intName Page internal name which is going to be deleted
         * @return bool True on successful removal, false on failure
         */
        
public function deleteByInternalName($intName)
        {
            
$row $this->findByInternalName($intName);
            return 
$this->deleteByPrimaryKey($row['pk_i_id']);
        }

        
/**
         * Order pages from $order
         *
         * @access private
         * @since unknown
         * @param int $order
         */
        
private function reOrderPages($order)
        {
            
$aPages $this->listAll(false);
            
$arows 0;
            foreach(
$aPages as $page){
                if(
$page['i_order'] > $order){
                    
$new_order $page['i_order']-1;
                    
$arows += $this->dao->update($this->tableName, array('i_order' => $new_order), array('pk_i_id' => $page['pk_i_id']) );
                }
            }
            return 
$arows;
        }

        
/**
         * Find previous page
         *
         * @access public
         * @since 2.4
         * @param int $order
         */
        
public function findPrevPage($order)
        {
            
$this->dao->select();
            
$this->dao->from($this->tableName);
            
$this->dao->where('b_indelible'0);
            
$this->dao->where('i_order < '.$order);
            
$this->dao->orderBy('i_order''DESC');
            
$this->dao->limit(1);
            
$result $this->dao->get();

            if( 
$result == false ) {
                return array();
            }

            if( 
$result->numRows() == ) {
                return array();
            }
            return 
$result->row();
        }

        
/**
         * Find next page
         *
         * @access public
         * @since 2.4
         * @param int $order
         */
        
public function findNextPage($order)
        {
            
$this->dao->select();
            
$this->dao->from($this->tableName);
            
$this->dao->where('b_indelible'0);
            
$this->dao->where('i_order > '.$order);
            
$this->dao->orderBy('i_order''ASC');
            
$this->dao->limit(1);
            
$result $this->dao->get();

            if( 
$result == false ) {
                return array();
            }

            if( 
$result->numRows() == ) {
                return array();
            }
            return 
$result->row();
        }

        
/**
         * Insert a new page. You have to pass all the parameters
         *
         * @access public
         * @since unknown
         * @param array $aFields Fields to be inserted in pages table
         * @param array $aFieldsDescription An array with the titles and descriptions in every language.
         * @return bool True if the insert has been done well and false if not.
         */
        
public function insert($aFields$aFieldsDescription null)
        {
            
$this->dao->select("MAX(i_order) as o");
            
$this->dao->from($this->tableName);
            
$results $this->dao->get();
            
$lastPage $results->row();

            
$order $lastPage['o'];
            if( 
is_null($order) ){
                
$order = -1;
            }

            if(!isset(
$aFields['b_link'])) {
                
$aFields['b_link'] = 0;
            }

            if(
$aFields['b_link'] == '') {
                if(
$aFields['b_indelible'] == 1) {
                    
$aFields['b_link'] = 0;
                }
            }

            
$this->dao->insert($this->tableName, array(
                
's_internal_name' => $aFields['s_internal_name']
                ,
'b_indelible' => $aFields['b_indelible']
                ,
'dt_pub_date' => date('Y-m-d H:i:s')
                ,
'dt_mod_date' => date('Y-m-d H:i:s')
                ,
'i_order' => ($order+1)
                ,
's_meta' => @$aFields['s_meta']
                ,
'b_link' => $aFields['b_link']
            ));


            
$id $this->dao->insertedId();

            if(
$this->dao->affectedRows() == 0) {
                return 
false;
            }

            foreach(
$aFieldsDescription as $k => $v) {
                
$affected_rows $this->insertDescription($id$k$v['s_title'], $v['s_text']);
                if(!
$affected_rows) {
                    return 
false;
                }
            }

            return 
true;
        }

        
/**
         * Insert the content (title and description) of a page.
         *
         * @access private
         * @since unknown
         * @param int $id Id of the page, it would be the foreign key
         * @param string $locale Locale code of the language
         * @param string $title Text to be inserted in s_title
         * @param string $text Text to be inserted in s_text
         * @return bool True if the insert has been done well and false if not.
         */
        
private function insertDescription($id$locale$title$text)
        {

            
$this->dao->insert($this->getDescriptionTableName() ,array(
                
'fk_i_pages_id' => $id
                
,'fk_c_locale_code' => $locale
                
,'s_title' => $title
                
,'s_text' => $text
            
));

            if(
$this->dao->affectedRows() == 0) {
                return 
false;
            }

            return 
true;
        }

        
/**
         * Update the content (title and description) of a page
         *
         * @access public
         * @since unknown
         * @param int $id Id of the page id is going to be modified
         * @param string $locale Locale code of the language
         * @param string $title Text to be updated in s_title
         * @param string $text Text to be updated in s_text
         * @return int Number of affected rows.
         */
        
public function updateDescription($id$locale$title$text)
        {
            
$conditions = array('fk_c_locale_code' => $locale'fk_i_pages_id' => $id);
            
$exist$this->existDescription($conditions);

            if(!
$exist) {
                
$result $this->insertDescription($id$locale$title$text);
                return 
$result;
            }

            return 
$this->dao->update($this->getDescriptionTableName(),
                    array(
                        
's_title' => $title
                        
,'s_text' => $text
                    
), array(
                        
'fk_c_locale_code' => $locale
                        
,'fk_i_pages_id' => $id
                    
));
        }

        
/**
         * Check if depending the conditions, the row exists in de DB.
         *
         * @access public
         * @since unknown
         * @param array $conditions
         * @return bool Return true if exists and false if not.
         */
        
public function existDescription($conditions){
            
$this->dao->select("COUNT(*) as total");
            
$this->dao->from($this->getDescriptionTableName());
            foreach(
$conditions as $key => $value) {
                
$this->dao->where($key$value);
            }

            
$result $this->dao->get();
            
$count $result->row();

            return (
$count['total']>0)?true:false;
        }

        
/**
         * It change the internal name of a page. Here you don't check if in indelible or not the page.
         *
         * @access public
         * @since unknown
         * @param int $id The id of the page to be changed.
         * @param string $intName The new internal name.
         * @return int Number of affected rows.
         */
        
public function updateInternalName($id$intName)
        {
            
$fields = array('s_internal_name' => $intName,
                             
'dt_mod_date'    => date('Y-m-d H:i:s'));
            
$where  = array('pk_i_id' => $id);

            return 
$this->dao->update($this->tableName$fields$where);
        }

        
/**
         * It changes the b_link of a page. Here you don't check if in indelible or not the page.
         *
         * @access public
         * @since unknown
         * @param int $id The id of the page to be changed.
         * @param string $bLink The show link status.
         * @return int Number of affected rows.
         */
        
public function updateLink($id$bLink)
        {
            
$fields = array('b_link' => $bLink,
                             
'dt_mod_date'    => date('Y-m-d H:i:s'));
            
$where  = array('pk_i_id' => $id);

            return 
$this->dao->update($this->tableName$fields$where);
        }

        
/**
         * It change the meta field of a page.
         *
         * @access public
         * @since 3.1
         * @param int $id The id of the page to be changed.
         * @param string $meta The meta field
         * @return int Number of affected rows.
         */
        
public function updateMeta($id$meta)
        {
            
$fields = array('s_meta' => $meta,
                             
'dt_mod_date'    => date('Y-m-d H:i:s'));
            
$where  = array('pk_i_id' => $id);

            return 
$this->dao->update($this->tableName$fields$where);
        }

        
/**
         * Check if a page id is indelible
         *
         * @access public
         * @since unknown
         * @param int $id Page id
         * @return true if it's indelible, false in case not
         */
        
function isIndelible($id)
        {
            
$page $this->findByPrimaryKey($id);
            if(
$page['b_indelible'] == 1) {
                return 
true;
            }
            return 
false;
        }

        
/**
         * Check if Internal Name exists with another id
         *
         * @access public
         * @since unknown
         * @param int $id page id
         * @param string $internalName page internal name
         * @return true if internal name exists, false if not
         */
        
function internalNameExists($id$internalName)
        {
            
$this->dao->select();
            
$this->dao->from($this->tableName);
            
$this->dao->where('s_internal_name'$internalName);
            
$this->dao->where('pk_i_id <> '.$id);
            
$result $this->dao->get();

            if(
$result->numRows() > 0) {
                return 
true;
            }
            return 
false;
        }

        function 
getDescriptionTableName()
        {
            return 
$this->getTablePrefix() . 't_pages_description';
        }
    }

    
/* file end: ./oc-includes/osclass/model/Page.php */
?>
Онлайн: 2
Реклама