jidaikobo-shibata/a11yc

View on GitHub
classes/Controller/Checklist.php

Summary

Maintainability
A
1 hr
Test Coverage
<?php
/**
 * A11yc\Controller\Checklist
 *
 * @package    part of A11yc
 * @author     Jidaikobo Inc.
 * @license    The MIT License (MIT)
 * @copyright  Jidaikobo Inc.
 * @link       http://www.jidaikobo.com
 */
namespace A11yc\Controller;

use A11yc\Model;
use A11yc\Validate;

class Checklist
{
    /**
     * action index
     *
     * @return Void
     */
    public static function actionCheck()
    {
//        $url = Util::enuniqueUri(Input::param('url', '', FILTER_VALIDATE_URL));
        $url = Util::enuniqueUri(Input::param('url', ''));
        static::check($url);
    }

    /**
     * check
     *
     * @param String $url
     * @return Void
     */
    public static function check($url)
    {
        // url
        if ( ! $url) Util::error('Invalid Access');

        // page existence
        if ($url != 'bulk' && ! Crawl::isPageExist($url))
        {
            Session::add('messages', 'errors', A11YC_LANG_CHECKLIST_PAGE_NOT_FOUND_ERR);
        }

        // users
        $users = Users::fetchUsersOpt();
        $current_user = Users::fetchCurrentUser();

        // title and page
        $page = array();
        if ($url == 'bulk')
        {
            $title = A11YC_LANG_BULK_TITLE;
        }
        else
        {
            $title = A11YC_LANG_CTRL_CHECK.':'.Model\Html::pageTitle($url);
            $page = Model\Page::fetch($url);
        }

        // assign
        View::assign('current_user', $current_user);
        View::assign('users',        $users);
        View::assign('url',          $url);
        View::assign('alt_url',      Arr::get($page, 'alt_url'));
        View::assign('page_id',      Arr::get($page, 'dbid', 0)); // zero is bulk
        View::assign('title',        $title);

        // core form
        self::form($url, $users, Arr::get($current_user, 'id'));

        View::assign('body', View::fetchTpl('checklist/checklist.php'), FALSE);
    }

    /**
     * dbio
     *
     * @param String $url
     * @return Void
     */
    public static function dbio($url)
    {
        $page    = self::getPage($url);
        $chk     = Input::postArr('chk');
        $iclchks = Input::postArr('iclchks');
        $results = Input::postArr('results');

        Model\Checklist::update($url, Arr::get($chk, $page['dbid'], array()));
        Model\Iclchk::update($url, Arr::get($iclchks, $page['dbid'], array()));
        Model\Result::update($url, Arr::get($results, $page['dbid'], array()));

        $page = array();
        $page['alt_url']          = Util::urldec(Input::post('alt_url'));
        $page['type']             = substr($url, -4) == '.pdf' ? 2 : 1; // 1: html
        $page['title']            = stripslashes(Input::post('page_title'));
        $page['level']            = Evaluate::getLevelByUrl($url);
        $page['done']             = intval(Input::post('done', 0));
        $page['date']             = Input::post('done_date') ?
                                                            date('Y-m-d', strtotime(Input::post('done_date'))) :
                                                            date('Y-m-d');
        $page['standard']         = intval(Input::post('standard'));
        $page['selection_reason'] = intval(Input::post('selection_reason'));
        $page['updated_at']       = date('Y-m-d H:i:s');
        foreach ($page as $key => $value)
        {
            Model\Page::updatePartial($url, $key, $value);
        }

        // message
        Session::add('messages', 'messages', A11YC_LANG_UPDATE_SUCCEED);
    }

    /**
     * form
     * need to wrap <form> and add a submit button
     * this method also used by bulk
     *
     * @param String $url
     * @param Array $users
     * @param Integer $current_user_id
     * @return Void
     */
    public static function form($url, $users = array(), $current_user_id = null)
    {
        // dbio
        if (Input::isPostExists())
        {
            static::dbio($url);
        }

        // is bulk
        $is_bulk = ($url == 'bulk');

        // page
        $page = array();
        if ( ! $is_bulk && $url)
        {
            $page = self::getPage($url);

            // automatic check
            Validate::$do_link_check = Input::post('do_link_check', false);
            Validate::$do_css_check  = Input::post('do_css_check', false);
            Validate::url($url);
        }

        // get basic values
        list($settings, $standards, $standard, $done_date, $issues) = self::getBasicValues($url, $page);

        // is new
        $is_new = is_array($page) && Arr::get($page, 'updated_at') !== NULL ? FALSE : TRUE;

        // reference url
        $refs = Values::getRefUrls();

        // assign
        View::assign('target_title', empty($page['title']) && $url != 'bulk' ?
            Model\Html::pageTitle($url) :
            Arr::get($page, 'title', '')
        );

        View::assign('focus', 'all');
        View::assign('url', $url);
        View::assign('issues', $issues);
        View::assign('refs', $refs[$standard]);
        View::assign('users', $users);
        View::assign('current_user_id', $current_user_id);
        View::assign('yml', Yaml::fetch(), FALSE);
        View::assign('standards', $standards);
        View::assign('settings', $settings);
        View::assign('done_date', $done_date);
        View::assign('target_level', intval(@$settings['target_level']));
        View::assign('page', $page);
        View::assign('is_new', $is_new);
        View::assign('is_bulk', $is_bulk);

        self::assginValidation($url, $is_bulk, $is_new);

        // form
        View::assign('form', View::fetchTpl('checklist/inc_form.php'), FALSE);
    }

    /**
     * get basic values
     *
     * @param String $url
     * @param Array $page
     * @return Array
     */
    private static function getBasicValues($url, $page)
    {
        // settings
        $settings = Model\Setting::fetchAll();

        // standards
        $standards = Yaml::each('standards');
        $standard = Arr::get($settings, 'standard', 0);
        $standards = array(Arr::get($standards, $standard, array()));

        // done
        $done_date = is_array($page) ? Arr::get($page, 'date') : 0;
        $done_date = $done_date == '0' ? '' : $done_date;
        if ($done_date)
        {
            $done_date = date('Y-m-d', strtotime($done_date));
        }

        // issues
        $yml = Yaml::fetch();
        $issues = array();
        foreach (array_keys($yml['criterions']) as $criterion)
        {
            $issues[$criterion] = Model\Issue::fetch4Checklist($url, $criterion);
        }

        return array($settings, $standards, $standard, $done_date, $issues);
    }

    /**
     * get page
     *
     * @param String $url
     * @return Array
     */
    private static function getPage($url)
    {
        $page = Model\Page::fetch($url, true);
        if (empty($page) && $url)
        {
            Model\Page::addPage($url);
            $force = true;
            $page = Model\Page::fetch($url, $force);
            if ($page === false)
            {
                Session::add('messages', 'errors', A11YC_LANG_ERROR_COULD_NOT_GET_HTML.Util::s($url));
            }
        }

        return is_array($page) ? $page : array();
    }

    /**
     * assgin vaidated value
     *
     * @param String $url
     * @param Bool $is_bulk
     * @param Bool $is_new
     * @return Void
     */
    private static function assginValidation($url, $is_bulk, $is_new)
    {
        if ($is_bulk || $is_new)
        {
            View::assign('results', Model\Bulk::fetchResults());
            View::assign('cs', Model\Bulk::fetchChecks());
            View::assign('iclchks', Model\Bulk::fetchIclchk());
        }
        else
        {
            View::assign('results', Model\Result::fetch($url));
            View::assign('cs', Model\Checklist::fetch($url));
            View::assign('iclchks', Model\Iclchk::fetch($url));
        }

        $errs = Validate\Get::errors($url) ?: array('errors' => array(), 'notices' => array());

        // validation
//        View::assign('is_call_from_post', true);
        View::assign('errs_cnts', Validate\Get::errorCnts($url));
        View::assign('errs', $errs, FALSE);
        View::assign('logs', Validate\Get::logs($url) ?: array());
        View::assign('raw', nl2br(Validate\Get::highLightedHtml($url)), FALSE);
        View::assign('validation_result', View::fetchTpl('checklist/validate.php'), FALSE);
    }
}