Overview

Namespaces

  • None
  • swag

Classes

  • H5pSwagifact
  • H5pUtil
  • SettingsPageController
  • ShortcodeUtil
  • swag\ArrayUtil
  • swag\Singleton
  • swag\WpUtil
  • SwagMapController
  • SwagPageController
  • Swagpath
  • SwagpathController
  • SwagpathSyncer
  • SwagPlugin
  • SwagPostItem
  • SwagTgmpaController
  • SwagTrack
  • SwagTrackController
  • SwagUser
  • Template
  • Xapi
  • Overview
  • Namespace
  • Class
  1:   2:   3:   4:   5:   6:   7:   8:   9:  10:  11:  12:  13:  14:  15:  16:  17:  18:  19:  20:  21:  22:  23:  24:  25:  26:  27:  28:  29:  30:  31:  32:  33:  34:  35:  36:  37:  38:  39:  40:  41:  42:  43:  44:  45:  46:  47:  48:  49:  50:  51:  52:  53:  54:  55:  56:  57:  58:  59:  60:  61:  62:  63:  64:  65:  66:  67:  68:  69:  70:  71:  72:  73:  74:  75:  76:  77:  78:  79:  80:  81:  82:  83:  84:  85:  86:  87:  88:  89:  90:  91:  92:  93:  94:  95:  96:  97:  98:  99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: 226: 227: 228: 229: 230: 231: 232: 233: 234: 235: 236: 237: 238: 239: 240: 241: 242: 243: 244: 245: 246: 247: 248: 249: 250: 251: 252: 253: 254: 255: 256: 257: 258: 259: 260: 261: 262: 263: 264: 265: 266: 267: 268: 269: 270: 271: 272: 273: 274: 275: 276: 277: 278: 279: 280: 281: 282: 283: 284: 285: 286: 287: 288: 289: 290: 291: 292: 293: 294: 295: 296: 297: 298: 299: 300: 301: 302: 303: 304: 305: 306: 307: 308: 309: 310: 311: 312: 313: 314: 315: 316: 317: 318: 319: 320: 321: 322: 323: 324: 325: 326: 327: 328: 329: 330: 331: 332: 333: 334: 335: 336: 337: 338: 339: 340: 341: 342: 343: 344: 345: 346: 347: 348: 349: 350: 351: 352: 353: 354: 355: 356: 357: 358: 359: 360: 361: 362: 363: 364: 365: 366: 367: 368: 369: 370: 371: 372: 373: 374: 375: 376: 377: 378: 379: 380: 381: 382: 383: 384: 385: 386: 387: 388: 389: 390: 391: 392: 393: 394: 395: 396: 397: 398: 399: 400: 401: 402: 403: 404: 405: 406: 407: 408: 409: 410: 411: 412: 413: 414: 415: 416: 417: 418: 419: 420: 421: 422: 423: 424: 425: 426: 427: 428: 429: 430: 431: 432: 433: 434: 435: 436: 437: 438: 439: 440: 441: 442: 
<?php

require_once __DIR__."/../utils/ArrayUtil.php";
require_once __DIR__."/../plugin/SwagPlugin.php";
require_once __DIR__."/../model/SwagPostItem.php";

use swag\ArrayUtil;

/**
 * Represents a Swagpath.
 * Has an underlying post of the "swagpath" post type.
 */
class Swagpath {

    private $post;
    private $swagPostItems;
    private $relatedStatementsByEmail;

    private static $swagpathById=array();
    private static $swagpathBySlug=array();
    private static $all=array();

    /**
     * Construct.
     */
    private function __construct($post) {
        $this->post=$post;
        $this->relatedStatementsByEmail=array();
        $this->swagPostItems=NULL;

        Swagpath::$swagpathById[$post->ID]=$this;
        Swagpath::$swagpathBySlug[$post->post_name]=$this;
    }

    /**
     * Get id.
     */
    public function getId() {
        return $this->getPost()->ID;
    }

    /**
     * Get display color.
     */
    public function getDisplayColor() {
        $track=$this->getTrack();

        if (!$track)
            return SwagTrack::DEFAULT_COLOR;

        return $track->getDisplayColor();
    }

    /**
     * Get track.
     */
    public function getTrack() {
        $trackIds=wp_get_object_terms($this->post->ID,"swagtrack");
        if (!$trackIds)
            return NULL;

        return SwagTrack::getById($trackIds[0]);
    }

    /**
     * Get slug for top level track.
     */
    public function getTopLevelTrack() {
        $tracks=wp_get_object_terms($this->post->ID,"swagtrack");
        if (!$tracks)
            return NULL;

        $track=$tracks[0];
        while ($track->parent)
            $track=get_term($track->parent);

        return $track->slug;
    }

    /**
     * Get underlying post.
     */
    public function getPost() {
        return $this->post;
    }

    /**
     * Get lesson plan url, if any.
     */
    public function getLessonPlanUrl() {
        $lessonPlanPostId=get_post_meta($this->post->ID,"lessonplan",TRUE);
        if (!$lessonPlanPostId)
            return NULL;

        return wp_get_attachment_url($lessonPlanPostId);
    }

    /**
     * Get items.
     */
    public function getSwagPostItems() {
        if (!is_array($this->swagPostItems)) {
            $this->swagPostItems=array();

            $swagifactSlugs=get_post_meta($this->post->ID,"swagifact",TRUE);
            foreach ($swagifactSlugs as $swagifactSlug) {
                $parts=explode(":",$swagifactSlug);
                $type=$parts[0];
                $slug=$parts[1];

                $item=SwagPostItem::create($type,$slug);
                
                if ($item) {
                    $item->setSwagPost($this);
                    $item->setIndex(sizeof($this->swagPostItems));
                    $this->swagPostItems[]=$item;
                }
            }
        }

        return $this->swagPostItems;
    }

    /**
     * Get selected item based on $_REQUEST["tab"]
     */
    public function getSelectedItem() {
        $tab=intval($_REQUEST["tab"]);
        $swagPostItems=$this->getSwagPostItems();
        return $swagPostItems[$tab];
    }

    /**
     * Get prerequisite swagpaths.
     */
    public function getPrerequisites() {
        $prerequisites=array();

        $slugs=ArrayUtil::flattenArray(get_post_meta($this->post->ID,"prerequisites"));
        foreach ($slugs as $slug) {
            $swagpath=Swagpath::getBySlug($slug);

            if ($swagpath)
                $prerequisites[]=$swagpath;
        }

        return $prerequisites;
    }

    /**
     * Get the current swag path, created from the current
     * Wordpress post.
     */
    public static function getCurrent() {
        static $current;

        if (!$current) {
            $post=get_post();
            if ($post->post_type!="swagpath")
                throw new Exception("Current post is not a swagpath.");

            $current=new Swagpath($post);
        }

        return $current;
    }

    /**
     * Get related statements for the given user.
     */
    public function getRelatedStatements($swagUser) {
        $email=$swagUser->getEmail();

        if (array_key_exists($email,$this->relatedStatementsByEmail))
            return $this->relatedStatementsByEmail[$email];

        $xapi=SwagPlugin::instance()->getXapi();
        if (!$xapi)
            return array();

        $this->relatedStatementsByEmail[$email]=$xapi->getStatements(array(
            "agentEmail"=>$swagUser->getEmail(),
            "activity"=>get_permalink($this->getPost()->ID),
//          "verb"=>"http://adlnet.gov/expapi/verbs/completed",
            "related_activities"=>"true"
        ));

        return $this->relatedStatementsByEmail[$email];
    }

    /**
     * Get object id.
     */
    public function getXapiObjectId() {
        return "http://swag.tunapanda.org/".$this->post->post_name;
    }

    /**
     * Is the current user prepared for the prerequisites?
     */
    public function isCurrentUserPreparedForPrerequisites() {
        if ($this->isCompletedByCurrentUser())
            return TRUE;

        if ($this->isCurrentUserPrepared())
            return TRUE;

        foreach ($this->getPrerequisites() as $p)
            if (!$p->isCurrentUserPrepared())
                return FALSE;

        return TRUE;
    }

    /**
     * Does the current user have all prerequisites?
     */
    public function isCurrentUserPrepared() {
        if ($this->isCompletedByCurrentUser())
            return TRUE;

        foreach ($this->getPrerequisites() as $p)
            if (!$p->isCompletedByCurrentUser())
                return FALSE;

        return TRUE;
    }

    /**
     * Is this swagpath completed by the user?
     */
    public function isCompletedByUser($swagUser) {
        return $swagUser->isSwagpathCompleted($this);
    } 

    /**
     * Is this swagpath completed by the current user?
     */
    public function isCompletedByCurrentUser() {
        return SwagUser::getCurrent()->isSwagpathCompleted($this);
    }

    /**
     * Get by track id.
     */
    public static function getByTrackId($parentTrackId) {
        if ($parentTrackId) {
            $q=new WP_Query(array(
                "post_type"=>"swagpath",
                "tax_query"=>array(
                    array(
                        "taxonomy"=>"swagtrack",
                        "include_children"=>false,
                        "field"=>"term_id",
                        "terms"=>$parentTrackId
                    )
                ),
                "posts_per_page"=>-1
            ));
        }

        else {
            $notTerms=get_terms(array(
                'taxonomy'=>'swagtrack',
                'hide_empty'=>false,
                "fields"=>'ids'
            ));

            $q=new WP_Query(array(
                "post_type"=>"swagpath",
                "tax_query"=>array(
                    array(
                        "taxonomy"=>"swagtrack",
                        "include_children"=>false,
                        "field"=>"term_id",
                        "terms"=>$notTerms,
                        "operator"=>"NOT IN"
                    )
                ),
                "posts_per_page"=>-1
            ));
        }

        $posts=$q->get_posts();
        $res=array();
        foreach ($posts as $post)
            $res[]=new Swagpath($post);

        return $res;
    }

    /**
     * Get Swagpath by id.
     */
    public static function getById($postId) {
        if (!$postId)
            return NULL;

        if (isset(Swagpath::$swagpathById[$postId]))
            return Swagpath::$swagpathById[$postId];

        $post=get_post($postId);

        if (!$post)
            return NULL;

        if ($post->post_type!="swagpath")
            throw new Exception("This is not a swagpath post.");

        return new Swagpath($post);
    }

    /**
     * Get Swagpath by slug.
     */
    public static function getBySlug($slug) {
        if (isset(Swagpath::$swagpathBySlug[$slug]))
            return Swagpath::$swagpathBySlug[$slug];

        $posts=get_posts(array(
            'name'=>$slug,
            'post_type'=>'swagpath',
            'post_status'=>'publish',
            'numberposts'=>1
        ));

        if (!$posts)
            return NULL;

        return new Swagpath($posts[0]);
    }

    /**
     * Find all for a certain top level track.
     */
    public static function findAllForTopLevelTrack($slug) {
        $all=Swagpath::findAll();

        $res=array();
        foreach ($all as $swagpath)
            if ($swagpath->getTopLevelTrack()==$slug)
                $res[]=$swagpath;

        return $res;
    }

    /**
     * Find all swagpaths.
     */
    public static function findAll() {
        if (Swagpath::$all)
            return Swagpath::$all;

        $q=new WP_Query(array(
            "post_type"=>"swagpath",
            "post_status"=>"publish",
            "posts_per_page"=>-1
        ));

        Swagpath::$all=array();
        foreach ($q->get_posts() as $post)
            Swagpath::$all[]=new Swagpath($post);

        return Swagpath::$all;
    }

    /**
     * Save xapi statements for provided swag for current user.
     * If there is already a matching statement, a new one will
     * not be saved.
     */
    public function saveProvidedSwag($swagUser) {
        $xapi=SwagPlugin::instance()->getXapi();
        if (!$xapi)
            return array();

        $current=$xapi->getStatements(array(
            "agentEmail"=>$swagUser->getEmail(),
            "activity"=>$this->getXapiObjectId(),
            "verb"=>"http://adlnet.gov/expapi/verbs/completed",
        ));

        if ($current)
            return;

        $statement=array(
            "actor"=>array(
                "mbox"=>"mailto:".$swagUser->getEmail(),
                "name"=>$swagUser->getDisplayName(),
            ),

            "object"=>array(
                "objectType"=>"Activity",
                "id"=>$this->getXapiObjectId(),
                "definition"=>array(
                    "name"=>array(
                        "en-US"=>$this->post->post_title
                    )
                )
            ),

            "verb"=>array(
                "id"=>"http://adlnet.gov/expapi/verbs/completed"
            ),

            "context"=>array(
                "contextActivities"=>array(
                    "category"=>array(
                        array(
                            "objectType"=>"Activity",
                            "id"=>"http://swag.tunapanda.org/"
                        )
                    )
                )
            ),
        );

        $xapi->putStatement($statement);
        $swagUser->clearFetchedStatements();
    }

    /**
     * Are all the swag post items completed?
     */
    public function isAllSwagPostItemsCompleted($swagUser) {
        foreach ($this->getSwagPostItems() as $swagPostItem) {
            if (!$swagPostItem->isCompleted($swagUser))
                return FALSE;
        }

        return TRUE;
    }

    /**
     * Save provided swag if the user has completed all
     * swagifacts for the swagpath.
     */
    public function saveProvidedSwagIfCompleted($swagUser) {
        if ($this->isAllSwagPostItemsCompleted($swagUser))
            $this->saveProvidedSwag($swagUser);
    }
}
Swag API documentation generated by ApiGen