soundwalk/libs/classes.php

372 lines
12 KiB
PHP

<?php
if(!class_exists('WP_List_Table')){
require_once( ABSPATH . 'wp-admin/includes/class-wp-list-table.php' );
}
if (!class_exists('Soundwalk_Paseos_List_Table')){
class Soundwalk_Paseos_List_Table extends WP_List_Table{
/** ************************************************************************
* REQUIRED. Set up a constructor that references the parent constructor. We
* use the parent reference to set some default configs.
***************************************************************************/
function __construct(){
global $status, $page;
//Set parent defaults
parent::__construct( array(
'singular' => 'walk', //singular name of the listed records
'plural' => 'walks', //plural name of the listed records
'ajax' => false //does this table support ajax?
) );
} //__construct
function prepare_items() {
/**
* First, lets decide how many records per page to show
*/
$per_page = 10;
$columns = $this->get_columns();
$hidden = array('id');
$sortable = $this->get_sortable_columns();
$this->_column_headers = array($columns, $hidden, $sortable);
/**
* Instead of querying a database, we're going to fetch the example data
* property we created for use in this plugin. This makes this example
* package slightly different than one you might build on your own. In
* this example, we'll be using array manipulation to sort and paginate
* our data. In a real-world implementation, you will probably want to
* use sort and pagination data to build a custom query instead, as you'll
* be able to use your precisely-queried data immediately.
*/
// $data = $this->example_data;
$db_helper = new Soundwalk_DB_Helper();
$data = $db_helper->get_array_walks();
/**
* This checks for sorting input and sorts the data in our array accordingly.
*
* In a real-world situation involving a database, you would probably want
* to handle sorting by passing the 'orderby' and 'order' values directly
* to a custom query. The returned data will be pre-sorted, and this array
* sorting technique would be unnecessary.
*/
function usort_reorder($a,$b){
$orderby = (!empty($_REQUEST['orderby'])) ? $_REQUEST['orderby'] : 'title'; //If no sort, default to title
$order = (!empty($_REQUEST['order'])) ? $_REQUEST['order'] : 'asc'; //If no order, default to asc
$result = strcmp($a[$orderby], $b[$orderby]); //Determine sort order
return ($order==='asc') ? $result : -$result; //Send final sort direction to usort
}
//usort($data, 'usort_reorder');
/***********************************************************************
* ---------------------------------------------------------------------
* vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
*
* In a real-world situation, this is where you would place your query.
*
* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
* ---------------------------------------------------------------------
**********************************************************************/
/**
* REQUIRED for pagination. Let's figure out what page the user is currently
* looking at. We'll need this later, so you should always include it in
* your own package classes.
*/
$current_page = $this->get_pagenum();
/**
* REQUIRED for pagination. Let's check how many items are in our data array.
* In real-world use, this would be the total number of items in your database,
* without filtering. We'll need this later, so you should always include it
* in your own package classes.
*/
$total_items = count($data);
/**
* The WP_List_Table class does not handle pagination for us, so we need
* to ensure that the data is trimmed to only the current page. We can use
* array_slice() to
*/
$data = array_slice($data,(($current_page-1)*$per_page),$per_page);
/**
* REQUIRED. Now we can add our *sorted* data to the items property, where
* it can be used by the rest of the class.
*/
$this->items = $data;
/**
* REQUIRED. We also have to register our pagination options & calculations.
*/
$this->set_pagination_args( array(
'total_items' => $total_items, //WE have to calculate the total number of items
'per_page' => $per_page, //WE have to determine how many items to show on a page
'total_pages' => ceil($total_items/$per_page) //WE have to calculate the total number of pages
) );
}//prepare_items
/** ************************************************************************
* REQUIRED! This method dictates the table's columns and titles. This should
* return an array where the key is the column slug (and class) and the value
* is the column's title text. If you need a checkbox for bulk actions, refer
* to the $columns array below.
*
* The 'cb' column is treated differently than the rest. If including a checkbox
* column in your table you must create a column_cb() method. If you don't need
* bulk actions or checkboxes, simply leave the 'cb' entry out of your array.
*
* @see WP_List_Table::::single_row_columns()
* @return array An associative array containing column information: 'slugs'=>'Visible Titles'
**************************************************************************/
function get_columns(){
$columns = array(
'id' => 'ID',
'name' => 'Title',
'excerpt' => 'Info',
'recordings' => 'Number of recordings'
);
return $columns;
}
/** ************************************************************************
* Recommended. This method is called when the parent class can't find a method
* specifically build for a given column. Generally, it's recommended to include
* one method for each column you want to render, keeping your package class
* neat and organized. For example, if the class needs to process a column
* named 'title', it would first see if a method named $this->column_title()
* exists - if it does, that method will be used. If it doesn't, this one will
* be used. Generally, you should try to use custom column methods as much as
* possible.
*
* Since we have defined a column_title() method later on, this method doesn't
* need to concern itself with any column with a name of 'title'. Instead, it
* needs to handle everything else.
*
* For more detailed insight into how columns are handled, take a look at
* WP_List_Table::single_row_columns()
*
* @param array $item A singular item (one full row's worth of data)
* @param array $column_name The name/slug of the column to be processed
* @return string Text or HTML to be placed inside the column <td>
**************************************************************************/
function column_default($item, $column_name){
switch($column_name){
case 'name':
case 'id':
case 'excerpt':
case 'recordings':
return $item[$column_name];
default:
return print_r($item,true); //Show the whole array for troubleshooting purposes
}
}
function column_name($item){
$actions = array(
'edit' => sprintf('<a href="?page=%s&action=%s&walk=%s">Edit</a>','soundwalk-manage-add','edit',$item['id']),
'delete' => sprintf('<a href="?page=%s&action=%s&walk=%s">Delete</a>',$_REQUEST['page'],'delete',$item['id']),
);
return sprintf('%1$s %2$s', $item['name'], $this->row_actions($actions,true) );
}
/** ************************************************************************
* Optional. If you want one or more columns to be sortable (ASC/DESC toggle),
* you will need to register it here. This should return an array where the
* key is the column that needs to be sortable, and the value is db column to
* sort by. Often, the key and value will be the same, but this is not always
* the case (as the value is a column name from the database, not the list table).
*
* This method merely defines which columns should be sortable and makes them
* clickable - it does not handle the actual sorting. You still need to detect
* the ORDERBY and ORDER querystring variables within prepare_items() and sort
* your data accordingly (usually by modifying your query).
*
* @return array An associative array containing all the columns that should be sortable: 'slugs'=>array('data_values',bool)
**************************************************************************/
function get_sortable_columns() {
$sortable_columns = array(
'name' => array('name',true), //true means its already sorted
'recordings' => array('recordings',false)
);
return $sortable_columns;
}
function no_items() {
echo "There are no walks.";
}
}//class Areago_List_Table
}
if (!class_exists('PclZip')){
require_once( ABSPATH . 'wp-admin/includes/class-pclzip.php');
}
if (!class_exists('Soundwalk_ZIP')){
class Soundwalk_ZIP{
function create_zip($id){
if ($id == NULL)
return FALSE;
$file_helper = new Soundwalk_File_Helper();
$path = $file_helper->get_Path($id);
$zip_file = new PclZip($path . "/data.zip");
//$zip_file->add(PCLZIP_CB_PRE_ADD,array($this,'myPreAddCallBack'));
$db_helper = new Soundwalk_DB_Helper();
$walk = $db_helper->get_walk($id, true);
if (!$walk)
return FALSE;
//$walk->points = json_decode($walk->points);
$d = json_encode($walk->geoJSONpoints);
$file_helper->save_data_file($path . "/info.json", $d);
$files = array();
$files[] = $path . "/info.json";
foreach ($walk->points as $point){
$files[] = get_attached_file($point->files);
};
$files[] = get_attached_file($walk->pic_id);
$tt = $zip_file->create($files,PCLZIP_OPT_REMOVE_ALL_PATH,PCLZIP_CB_PRE_ADD,'soundwalk_zipCallBack');
if ($tt == 0) {
die('Error : '.$zip_file->errorInfo(true));
}
unlink($path . '/info.json');
return true;
} //create_zip
}
}
if (!class_exists('Soundwalk_File_Helper')){
class Soundwalk_File_Helper{
function get_Path($id){
if ($this->check()===FALSE){
return FALSE;
}
$uploads = wp_upload_dir();
$uploads_basedir=$uploads["basedir"];
return $uploads_basedir . "/soundwalk/" . $id;
}
function check(){
//This function checks if the upload files is created, its is writeable, if the areago is created, and if it is writeable.
$uploads = wp_upload_dir();
$uploads_basedir=$uploads["basedir"];
$uploads_baseURL=$uploads["baseurl"];
$sound_walk_dir=$uploads_basedir . "/soundwalk";
$dir_exists=is_dir($uploads_basedir);
if (!$dir_exists){
return FALSE;
}
$is_writable=is_writable($uploads_basedir);
if (!$is_writable){
return FALSE;
}
$dir_exists=is_dir($sound_walk_dir);
if (!$dir_exists){
mkdir($sound_walk_dir);
}
$is_writable=is_writable($sound_walk_dir);
if (!$is_writable){
return FALSE;
}
return true;
}
function createFolder($id){
if ($this->check()===FALSE){
return FALSE;
}
$uploads = wp_upload_dir();
$uploads_basedir=$uploads["basedir"];
$sound_walk_dir=$uploads_basedir . "/soundwalk/" . $id;
$dir_exists=is_dir($sound_walk_dir);
if (!$dir_exists){
return mkdir($sound_walk_dir);
}
$is_writable=is_writable($sound_walk_dir);
if (!$is_writable){
return FALSE;
}
return TRUE;
}
function save_data_file($file, $data){
$fp = fopen($file, 'w');
fwrite($fp, $data);
fclose($fp);
}
}//class
}
function soundwalk_zipCallBack($p_event, &$p_header){
$info = pathinfo($p_header['stored_filename']);
// ----- bak files are skipped
if ($info['extension'] == 'jpg') {
$p_header['stored_filename'] = 'icono.jpg';
return 1;
}
// ----- all other files are simply added
else {
return 1;
}
}