WIP file upload and validation
authorSteve Sutton <steve@gaslightmedia.com>
Mon, 5 Jun 2017 20:23:59 +0000 (16:23 -0400)
committerSteve Sutton <steve@gaslightmedia.com>
Mon, 5 Jun 2017 20:23:59 +0000 (16:23 -0400)
Upload test files.
Validating them from their headers.

models/admin/import/index.php
views/admin/import/index.html
views/admin/import/validate.html [new file with mode: 0644]

index 0eda98e..c0e2a4e 100644 (file)
@@ -92,26 +92,99 @@ class GlmMembersAdmin_import_index
      */
     public function modelAction ($actionData = false)
     {
-
-
         $view    = 'index.html';
         $failure = false;
         $option  = '';
+        $fileData = array(
+            'City'   => array(
+                'field'    => 'city_file',
+                'name'     => 'cityData.csv',
+                'exists'   => false,
+                'validate' => function( $row ) {
+                    return ( $row === array( 'id', 'name' ) );
+                },
+            ),
+            'Region' => array(
+                'field'    => 'region_file',
+                'name'     => 'regionData.csv',
+                'exists'   => false,
+                'validate' => function( $row ) {
+                    return ( $row === array( 'id', 'name' ) );
+                },
+            ),
+            'County' => array(
+                'field'    => 'county_file',
+                'name'     => 'countyData.csv',
+                'exists'   => false,
+                'validate' => function( $row ) {
+                    return ( $row === array( 'id', 'name' ) );
+                },
+            ),
+            'Member' => array(
+                'field'    => 'member_file',
+                'name'     => 'memberData.csv',
+                'exists'   => false,
+                'validate' => function( $row ) {
+                    return ( $row === array( 'id', 'member_name', 'status', 'descr', 'short_descr', 'addr1', 'addr2', 'city', 'state', 'country', 'zip', 'region', 'county', 'lat', 'lon', 'phone', 'toll_free', 'url', 'reservation_url', 'email', 'logo' ) );
+                },
+            ),
+        );
 
         if (isset($_REQUEST['option']) && $_REQUEST['option'] != '') {
             $option = $_REQUEST['option'];
         }
 
-        switch($option) {
+        $wpUploadDir = wp_get_upload_dir();
+        $uploadPath  = $wpUploadDir['basedir'] . '/' . 'glm-member-import';
+        if ( !is_dir( $uploadPath ) ) {
+            $oldMask = umask(0);
+            mkdir( $uploadPath, 0770 );
+            umask( $oldMask );
+        }
+
+        switch( $option ) {
+
+            case 'import_files';
+                $view = 'validate.html';
+                // Move any files uploaded
+                //echo '<pre>$_FILES: ' . print_r( $_FILES, true ) . '</pre>';
+                if ( isset( $_FILES ) ) {
+                    foreach ( $fileData as $fileHeader => $file ) {
+                        if ( !$_FILES[$file['field']]['error'] ) {
+                            move_uploaded_file( $_FILES[$file['field']]['tmp_name'], $uploadPath . '/'. $file['name'] );
+                        }
+                    }
+                }
+                // Check that each file exists
+                foreach ( $fileData as $fileHeader => $file ) {
+                    if ( is_file( $uploadPath . '/' . $file['name'] ) ) {
+                        $fileData[$fileHeader]['exists']  = true;
+                        $fData = $this->readCSVFileHeaders( $uploadPath . '/' . $file['name'] );
+                        $fileData[$fileHeader]['data']    = $fData;
+                        $fileData[$fileHeader]['isValid'] = call_user_func( $file['validate'], $fData );
+                    }
+                }
+
+                break;
 
             default:
+                $view = 'index.html';
+                // check upload dir to see if they have any files in yet
+                foreach ( $fileData as $fileHeader => $file ) {
+                    if ( is_file( $uploadPath . '/' . $file['name'] ) ) {
+                        $fileData[$fileHeader]['exists'] = true;
+                        $fileData[$fileHeader]['mtime']  = filemtime( $uploadPath . '/' . $file['name'] );
+                    }
+                }
 
                 break;
 
         }
 
         $templateData = array(
-            'data'    => false,
+            'data'     => false,
+            'fileData' => $fileData,
+            'csvData'  => '<pre>$fileData: ' . print_r( $fileData, true ) . '</pre>',
         );
         // Return status, suggested view, and data to controller
         return array(
@@ -124,4 +197,38 @@ class GlmMembersAdmin_import_index
 
     }
 
+    public function readCSVFileHeaders( $fileName )
+    {
+        $fileHeaders = array();
+        if ( ( $fp = fopen( $fileName, 'r' ) ) !== false ) {
+            // get first line to use as headers
+            $fileHeaders = fgetcsv( $fp, 1000, ',' );
+            fclose( $fp );
+        }
+
+        return $fileHeaders;
+    }
+
+    public function readCSVFile( $fileName )
+    {
+        $fileData    = array();
+        $fileHeaders = array();
+        if ( ( $fp = fopen( $fileName, 'r' ) ) !== false ) {
+            // get first line to use as headers
+            $rowNumber = 0;
+            while ( ( $data = fgetcsv( $fp, 1000, ',' ) ) !== false ) {
+                if ( $rowNumber == 0 ) {
+                    $fileHeaders = $data;
+                } else {
+                    for ( $index = 0; $index < count( $data ); ++$index ) {
+                        $fileData[$rowNumber][$fileHeaders[$index]] = $data[$index];
+                    }
+                }
+                $rowNumber++;
+            }
+            fclose( $fp );
+        }
+        return $fileData;
+    }
+
 }
index 2d9bb76..4ce1eea 100644 (file)
@@ -4,20 +4,27 @@
 
     <form action="{$thisUrl}?page={$thisPage}" method="post" enctype="multipart/form-data">
         <input type="hidden" name="glm_action" value="index" />
+        <input type="hidden" name="option" value="import_files" />
 
         <table class="glm-admin-table">
+            {foreach $fileData as $fileHeader => $file}
             <tr>
-                <th>City Data</th>
-                <td><input type="file" name="member_city_file" /></td>
-            </tr>
-            <tr>
-                <th>State Data</th>
-                <td><input type="file" name="member_state_file" /></td>
-            </tr>
-            <tr>
-                <th>Member Profile Data</th>
-                <td><input type="file" name="member_profile_file" /></td>
+                <td>{$fileHeader}</td>
+                <td>
+                    <input type="file" name="{$file.field}">
+                </td>
+                <td>
+                    {if $file.exists}
+                        {$fileHeader} File
+                    {/if}
+                </td>
+                <td>
+                    {if $file.exists}
+                        {$file.mtime|date_format:"%D %I:%M %p"}
+                    {/if}
+                </td>
             </tr>
+            {/foreach}
         </table>
 
         <input type="submit" value="Continue" class="button button-primary submit-import">
diff --git a/views/admin/import/validate.html b/views/admin/import/validate.html
new file mode 100644 (file)
index 0000000..bd22882
--- /dev/null
@@ -0,0 +1,26 @@
+{include file='admin/import/header.html'}
+
+    <h2>Data Import Step 2: Validate files</h2>
+
+    <table class="glm-admin-table">
+        {foreach $fileData as $fileHeader => $file}
+        <tr>
+            <td>
+                {if $file.exists}
+                    {$fileHeader} File
+                {/if}
+            </td>
+            <td>
+                {if $file.isValid}
+                    Is Valid
+                {else}
+                    Not Valid
+                {/if}
+            </td>
+        </tr>
+        {/foreach}
+
+        <a href="#" class="button">Process Files</a>
+    </table>
+
+{include file='admin/footer.html'}