Add the functionality to add a photo remotely. Refactor the url_connection class to handle multipar/form-data posts.
This commit is contained in:
parent
7451323165
commit
44c441a33a
@ -43,9 +43,9 @@ class G3_Client_Controller extends Template_Controller {
|
||||
try {
|
||||
$token = G3Remote::instance()->get_access_token($post["user"], $post["password"]);
|
||||
Session::instance()->set("g3_client_access_token", $token);
|
||||
$resource = G3Remote::instance()->get_resource("gallery");
|
||||
$response = G3Remote::instance()->get_resource("gallery");
|
||||
$valid = true;
|
||||
$content = $this->_get_main_view($resource);
|
||||
$content = $this->_get_main_view($response->resource);
|
||||
} catch (Exception $e) {
|
||||
Kohana_Log::add("error", Kohana_Exception::text($e));
|
||||
$valid = false;
|
||||
|
@ -22,7 +22,7 @@ class G3_Handlers_Controller extends Controller {
|
||||
$path = $this->input->get("path");
|
||||
if ($_POST) {
|
||||
try {
|
||||
unset($_POST["submit"]);
|
||||
unset($_POST["do_edit"]);
|
||||
$result = G3Remote::instance()->update_resource("gallery/$path", $_POST);
|
||||
if ($result->status == "OK") {
|
||||
$form = null;
|
||||
@ -53,12 +53,25 @@ class G3_Handlers_Controller extends Controller {
|
||||
public function add($type) {
|
||||
$path = $this->input->get("path");
|
||||
if ($_POST) {
|
||||
unset($_POST["submit"]);
|
||||
$_POST["name"] = empty($_POST["name"]) ? $_POST["title"] : $_POST["name"];
|
||||
$_POST["name"] = g3_client::sanitize_filename($_POST["name"]);
|
||||
$_POST["slug"] = empty($_POST["slug"]) ? $_POST["title"] : $_POST["slug"];
|
||||
$_POST["slug"] = g3_client::sanitize_slug($_POST["slug"]);
|
||||
$result = G3Remote::instance()->add_resource("gallery/$path/{$_POST['slug']}", $_POST);
|
||||
try {
|
||||
unset($_POST["do_edit"]);
|
||||
$data = array(
|
||||
"title" => $_POST["title"],
|
||||
"name" => g3_client::sanitize_title($_POST["name"], $_POST["title"]),
|
||||
"slug" => g3_client::sanitize_title($_POST["slug"], $_POST["title"]),
|
||||
"description" => $_POST["description"]);
|
||||
|
||||
if ($_FILES) {
|
||||
if (empty($_FILES["image"]["error"])) {
|
||||
unset($_FILES["image"]["error"]);
|
||||
$data["image"] = (object)$_FILES["image"];
|
||||
} else {
|
||||
throw new Exception("File upload failed for reason: {$_FILES['image']['error']}");
|
||||
}
|
||||
}
|
||||
|
||||
$path = !empty($path) ? $path . "/" : $path;
|
||||
$result = G3Remote::instance()->add_resource("gallery/$path{$data['slug']}", $data);
|
||||
if ($result->status == "OK") {
|
||||
$form = null;
|
||||
$result = "success";
|
||||
@ -71,6 +84,12 @@ class G3_Handlers_Controller extends Controller {
|
||||
}
|
||||
$result = "display";
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
Kohana_Log::add("error", (string)$e);
|
||||
$form = g3_client::get_form($type, true, $path, (object)$_POST);
|
||||
$form->errors["form_error"] = $e->getMessage();
|
||||
$result = "error";
|
||||
}
|
||||
} else {
|
||||
$form = g3_client::get_form($type, true, $path);
|
||||
$result = "display";
|
||||
|
@ -28,8 +28,8 @@ class g3_client_Core {
|
||||
// @todo add sort column sort order fields
|
||||
$form->errors = array("title" => "", "name" => "", "description" => "", "slug" => "");
|
||||
if ($type != "album" && $add_form) {
|
||||
$form->form["image_file"] = (object)array("value" => "", "label" => "Image File");
|
||||
$form->errors["image_file"] = "";
|
||||
$form->form["image"] = (object)array("value" => "", "label" => "Image File");
|
||||
$form->errors["image"] = "";
|
||||
}
|
||||
|
||||
if (empty($path) && !$add_form) {
|
||||
@ -52,6 +52,7 @@ class g3_client_Core {
|
||||
$json->form = new View("edit.html");
|
||||
$json->form->title = ($form->adding ? "Add " : "Update ") . ucwords($type);
|
||||
$json->form->url = $form->adding ? "add" : "edit";
|
||||
$json->form->button_text = $form->adding ? "Add" : "Update";
|
||||
$json->form->path = $path;
|
||||
$json->form->type = $type;
|
||||
$json->form->form = (object)$form->form;
|
||||
@ -70,19 +71,8 @@ class g3_client_Core {
|
||||
* @param string $filename
|
||||
* @return string sanitized filename
|
||||
*/
|
||||
static function sanitize_filename($filename) {
|
||||
$filename = empty($filename) ? $title : $filename;
|
||||
$filename = strtr($filename, " ", "_");
|
||||
$filename = preg_replace("/\..*?$/", "", $filename);
|
||||
return preg_replace("/ +/", " ", $filename);
|
||||
}
|
||||
|
||||
/**
|
||||
* Santize the input url into something safe we can us as the url component.
|
||||
* @param string $filename
|
||||
*/
|
||||
static function sanitize_slug($uri) {
|
||||
$result = preg_replace("/[^A-Za-z0-9-_]+/", "-", $uri);
|
||||
static function sanitize_title($field, $title) {
|
||||
$result = preg_replace("/[^A-Za-z0-9-_]+/", "-", empty($field) ? $title : $field);
|
||||
return trim($result, "-");
|
||||
}
|
||||
}
|
||||
|
@ -19,20 +19,66 @@
|
||||
*/
|
||||
class url_connection {
|
||||
static function post($url, $post_data_array, $extra_headers=array()) {
|
||||
$_data_raw = self::_encode_data($post_data_array, $extra_headers);
|
||||
//$_data_raw = self::_encode_data($post_data_array, $extra_headers);
|
||||
$boundary = str_repeat("-", 9) . md5(microtime());
|
||||
$boundary_length = strlen($boundary);
|
||||
|
||||
$extra_headers['Content-Type'] = 'application/x-www-form-urlencoded';
|
||||
$extra_headers['Content-Length'] = strlen($_data_raw);
|
||||
$extra_headers['Content-Type'] = "multipart/form-data; boundary=$boundary";
|
||||
$length = 0;
|
||||
$fields = array();
|
||||
foreach ($post_data_array as $field => $value) {
|
||||
$fields[$field] = array();
|
||||
if (is_string($value)) {
|
||||
$fields[$field]["disposition"] = "Content-Disposition: form-data; name=\"$field\"\r\n\r\n";
|
||||
$fields[$field]["type"] = "";
|
||||
$fields[$field]["value"] = "$value\r\n";
|
||||
} else {
|
||||
$fields[$field]["disposition"] =
|
||||
"Content-Disposition: form-data; name=\"$field\"; filename=\"{$value->name}\"\r\n";
|
||||
$fields[$field]["type"] = "Content-Type: {$value->type}\r\n\r\n";
|
||||
$fields[$field]["value"] = "\r\n";
|
||||
$fields[$field]["local_file"] = $value->tmp_name;
|
||||
$length += $value->size;
|
||||
}
|
||||
$length += strlen($fields[$field]["disposition"]) + strlen($fields[$field]["value"]) +
|
||||
strlen($fields[$field]["type"]) + $boundary_length + 4;
|
||||
}
|
||||
$length += $boundary_length + 6; // boundary terminator and last crlf
|
||||
$extra_headers['Content-Length'] = $length;
|
||||
|
||||
$socket = url_connection::_open_socket($url, 'POST', $extra_headers);
|
||||
|
||||
$sent_length = 0;
|
||||
foreach ($fields as $field => $value) {
|
||||
$sent_length += fwrite($socket, "--$boundary\r\n");
|
||||
$sent_length += fwrite($socket, $value["disposition"]);
|
||||
if (!empty($value["type"])) {
|
||||
$sent_length += fwrite($socket, $value["type"]);
|
||||
$file = fopen($value["local_file"], "rb");
|
||||
while (!feof($file)) {
|
||||
$buffer = fread($file, 8192);
|
||||
$sent_length += fwrite($socket, $buffer);
|
||||
fflush($socket);
|
||||
}
|
||||
}
|
||||
$sent_length += fwrite($socket, $value["value"]);
|
||||
fflush($socket);
|
||||
}
|
||||
|
||||
$sent_length += fwrite($socket, "--$boundary--\r\n");
|
||||
fflush($socket);
|
||||
|
||||
/* Read the web page into a buffer */
|
||||
return self::do_request($url, 'POST', $extra_headers, $_data_raw);
|
||||
return url_connection::_get_response($socket);
|
||||
}
|
||||
|
||||
static function get($url, $_data_array=array(), $extra_headers=array()) {
|
||||
$_data_raw = self::_encode_data($_data_array, $extra_headers);
|
||||
|
||||
$handle = url_connection::_open_socket("{$url}?$_data_raw", "GET", $extra_headers);
|
||||
|
||||
/* Read the web page into a buffer */
|
||||
return self::do_request("{$url}?$_data_raw", "GET", $extra_headers);
|
||||
return url_connection::_get_response($handle);
|
||||
}
|
||||
|
||||
static function success($response_status) {
|
||||
@ -60,12 +106,9 @@ class url_connection {
|
||||
}
|
||||
|
||||
/**
|
||||
* A single request, without following redirects
|
||||
*
|
||||
* @todo: Handle redirects? If so, only for GET (i.e. not for POST), and use G2's
|
||||
* WebHelper_simple::_parseLocation logic.
|
||||
* Open the socket to server
|
||||
*/
|
||||
static function do_request($url, $method='GET', $headers=array(), $body='') {
|
||||
static function _open_socket($url, $method='GET', $headers=array()) {
|
||||
/* Convert illegal characters */
|
||||
$url = str_replace(' ', '%20', $url);
|
||||
|
||||
@ -81,18 +124,19 @@ class url_connection {
|
||||
$header_lines[] = $key . ': ' . $value;
|
||||
}
|
||||
|
||||
$success = fwrite($handle, sprintf("%s %s HTTP/1.0\r\n%s\r\n\r\n%s",
|
||||
$success = fwrite($handle, sprintf("%s %s HTTP/1.0\r\n%s\r\n\r\n",
|
||||
$method,
|
||||
$url_components['uri'],
|
||||
implode("\r\n", $header_lines),
|
||||
$body));
|
||||
if (!$success) {
|
||||
// Zero bytes written or false was returned
|
||||
// log "fwrite failed in requestWebPage($url)" . ($success === false ? ' - false' : ''
|
||||
return array(null, null, null);
|
||||
}
|
||||
implode("\r\n", $header_lines)));
|
||||
fflush($handle);
|
||||
|
||||
return $handle;
|
||||
}
|
||||
|
||||
/**
|
||||
* Read the http response
|
||||
*/
|
||||
static function _get_response($handle) {
|
||||
/*
|
||||
* Read the status line. fgets stops after newlines. The first line is the protocol
|
||||
* version followed by a numeric status code and its associated textual phrase.
|
||||
|
@ -26,9 +26,9 @@
|
||||
</li>
|
||||
<? if ($function == "add_photo"): ?>
|
||||
<li>
|
||||
<?= form::label("image_file", "Image File:") ?><br/>
|
||||
<?= form::upload("image_file", $form["image_file"]) ?>
|
||||
<?= empty($errors["image_file"]) ? "" : "<span class=\"error\">{$errors["image_file"]}</span>" ?>
|
||||
<?= form::label("image", "Image File:") ?><br/>
|
||||
<?= form::upload("image", $form["image_file"]) ?>
|
||||
<?= empty($errors["image"]) ? "" : "<span class=\"error\">{$errors["image"]}</span>" ?>
|
||||
</li>
|
||||
<? endif ?>
|
||||
<li style="text-align: center">
|
||||
|
@ -27,11 +27,11 @@
|
||||
empty($form->slug->readonly) ? "" : "readonly={$form->slug->readonly}") ?>
|
||||
<?= empty($errors->slug) ? "" : "<span class=\"error\">{$errors->slug}</span>" ?>
|
||||
</li>
|
||||
<? if (!empty($form->image_file)): ?>
|
||||
<? if (!empty($form->image)): ?>
|
||||
<li>
|
||||
<?= form::label("image_file", "{$form->image_file->label}:") ?><br/>
|
||||
<?= form::upload("image_file") ?>
|
||||
<?= empty($errors->image_file) ? "" : "<span class=\"error\">{$errors->image_file}</span>" ?>
|
||||
<?= form::label("image", "{$form->image->label}:") ?><br/>
|
||||
<?= form::upload("image") ?>
|
||||
<?= empty($errors->image) ? "" : "<span class=\"error\">{$errors->image}</span>" ?>
|
||||
</li>
|
||||
<? endif ?>
|
||||
<? if (!empty($errors->form_error)): ?>
|
||||
@ -40,7 +40,7 @@
|
||||
</li>
|
||||
<? endif ?>
|
||||
<li style="text-align: center">
|
||||
<?= form::submit("submit", "Update") ?>
|
||||
<?= form::submit("do_edit", $button_text) ?>
|
||||
<?= form::input(array('type'=>'reset','name'=>'reset'), "Reset") ?>
|
||||
</li>
|
||||
</ul>
|
||||
|
@ -192,12 +192,13 @@
|
||||
$.getJSON("/g3_client/index.php/" + dialog, {path: resource_path}, function(data) {
|
||||
$("#g-dialog").html(data.form);
|
||||
|
||||
$("#g-dialog").dialog("open");
|
||||
if ($("#g-dialog fieldset legend").length) {
|
||||
$("#g-dialog").dialog('option', 'title', $("#g-dialog fieldset legend:eq(0)").html());
|
||||
}
|
||||
_ajaxifyDialog();
|
||||
|
||||
$("#g-dialog").dialog("open");
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
@ -206,7 +207,7 @@
|
||||
$("#g-dialog form").ajaxForm({
|
||||
dataType: "json",
|
||||
beforeSubmit: function(formData, form, options) {
|
||||
form.find(":submit")
|
||||
form.find(":submit, :reset")
|
||||
.addClass("ui-state-disabled")
|
||||
.attr("disabled", "disabled");
|
||||
return true;
|
||||
|
Reference in New Issue
Block a user