Вход Регистрация
Файл: cobisja/BootHelp/src/Table.php
Строк: 427
<?php

/**
 * The MIT License
 *
 * Copyright 2015 cobisja.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

namespace cobisjaBootHelp;

use 
cobisjaBootHelpBase;
use 
cobisjaBootHelpHelpersContentTag;

/**
 * Generates an HTML block tag that follows the Bootstrap documentation
 * on how to display <strong>Table</strong> component.
 *
 * See {@link http://getbootstrap.com/css/#tables} for more information.
 */
class Table extends Base
{
    
/**
     * Initializes the Table instance.
     *
     * @param mixed    $content_or_options_with_block the display options for Table.
     * @param Callable $block Block to generate customized Table's content.
     */
    
public function __construct($content_or_options_with_block$block null)
    {
        
$num_args $this->getFunctionNumArgs(func_get_args());
        
$content_block is_callable(func_get_arg($num_args-1)) ? func_get_arg($num_args-1) : null;

        if (
=== $num_args) {
            
$options = [];
            
$content is_null($content_block) ? $content_or_options_with_block call_user_func($content_block);
        } else {
            if (
is_array($content_or_options_with_block) && is_array($block)) {
                
$content $content_or_options_with_block;
                
$options $block;
            } else {
                
$options $content_or_options_with_block;
                
$content call_user_func($content_block);
            }
        }

        
$table $this->buildTable($content$options);
        
$this->setHtmlObject($table->getHtmlObject());
    }
    
    
/**
     * Builds the Table component.
     * 
     * @param mixed $content Table's content
     * @param array $options Table's options to customize the component generation.
     * 
     * @return ContentTag a ContentTag instance that represents the Table group.
     */
    
private function buildTable($content, array $options)
    {
        !
is_array($content) ? $content = [$content] : null;
        
$is_responsive Base::getAndUnset('responsive'$options);
        
        
$table_content $this->buildTableContent($content$options);
        
        
$this->getTableClass($options);
        
Base::appendClass($options'table');
        
$table = new ContentTag('table'$table_content$options);
        
        if (
$is_responsive) {
            
$table = new ContentTag('div'$table, ['class'=>'table-responsive']);
        }
        
        return 
$table;
    }
    
    
/**
     * Builds the Table's content
     * 
     * @param mixed $content list of elements that makes the Table's content.
     * @param array $options options for building the Table's component.
     * 
     * @return array Table's content as array.
     */
    
private function buildTableContent($content, &$options)
    {
        return 
array_filter(
            [
                
$this->buildTableCaption($options),
                
$this->buildTableHeading($content$options),
                
$this->buildTableRows($content$options)
            ],
            
'strlen'
        
);
    }
    
    
/**
     * Gets and builds the optional Table's caption.
     * 
     * @param mixed $options options for building the Table's component.
     * 
     * @return ContenTag a ContentTag instance that represents the Table's caption.
     */
    
private function buildTableCaption(&$options)
    {
        
$caption Base::getAndUnset('caption'$options);
        return !
is_null($caption) ? new ContentTag('caption'$caption) : null;
    }
    
    
/**
     * Builds the optional Table's head.
     * 
     * @param mixed $content list of elements that makes the Table's content.
     * @param array $options options for building the Table's component.
     * @param mixed $heading a boolean value indicates if the first rows of the content will be the table head.
     * 
     * @return ContentTag a ContentTag instance that represents the Table's head.
     */
    
private function buildTableHeading(&$content, array &$options)
    {
        
$header_options Base::getAndUnset('header_options'$options);
        
$header Base::getAndUnset('header'$options);
        
        if (
is_bool($header) && $header) {
            
$header array_shift($content);
        }
        if (
is_null($header)) {
            return 
null;
        }
        
        
$head_object = new ContentTag(
            
'tr',
            
array_map(
                function (
$cell_head) {
                    return new 
ContentTag('th'$cell_head);
                },
                
$header
            
)
        );

        return new 
ContentTag('thead'$head_object$header_options);
    }
    
    
/**
     * Builds the Table's content.
     * 
     * @param mixed $content list of elements that makes the Table's content.
     * @param array $options options for building the Table's component.
     * 
     * @return ContentTag a ContentTag instance that represents the Table's content.
     */
    
private function buildTableRows($content, array &$options)
    {
        
$global_row_options Base::getAndUnset('rows_options'$options);
        
$body_options Base::getAndUnset('body_options'$options);
        
$rows = [];
        
        foreach (
$content as $row) {
            
$row_options is_null($global_row_options) ? [] : $global_row_options;
            
$cells = [];
            
$local_row_options $this->getRowOptions($row);
            
            foreach (
$row as $cell) {
                if (!
is_array($cell)) {
                    
$cell_content $cell;
                    
$cell_options = [];
                } else {
                    
$cell_content array_shift($cell);
                    
$cell_options $cell;
                    
Base::appendClass($cell_optionsBase::getAndUnset('context'$cell_options));
                }
                
$cell_options['scope'] = Base::getAndUnset('scope'$cell_options);
                
$cell = new ContentTag(
                    (
is_null($cell_options['scope']) ? 'td''th'),
                    
$cell_content,
                    
$cell_options
                
);
                
$cells[] = $cell;
            }

            
Base::setOptions($row_options$local_row_options);
            
Base::appendClass($local_row_optionsBase::getAndUnset('context'$local_row_options));
            
$rows[] = new ContentTag('tr'$cells$local_row_options);
        }
        
        
$table_body = new ContentTag('tbody'$rows$body_options);
        
        return 
$table_body;
    }
    
    
/**
     * Sets the specific table's class for options 'striped', 'bordered', 'hover' and/or 'condensed'.
     * 
     * @param array $options options for building the Table's component.
     */
    
private function getTableClass(array &$options)
    {
        foreach ([
'striped''bordered''hover''condensed'] as $klass) {
            if (
Base::getAndUnset($klass$options)) {
                
Base::appendClass($options'table-' $klass);
            }
        }
    }
    
    
/**
     * Gets the specific options for a specific table row.
     * 
     * @param array $content list of elements that makes the Table's content.
     * 
     * @return array row's options.
     */
    
private function getRowOptions(array &$content)
    {
        
$row_options = [];
        foreach (
$content as $option => $value) {
            if (!
is_numeric($option)) {
                
$row_options[$option] = $value;
                unset(
$content[$option]);
            }
        }
        
        return 
$row_options;
    }
}
Онлайн: 0
Реклама