Posted on August 26, 2007
Иногда необходимо вызвать PHP код из приложения
Не спрашивайте почему мне этого захотелос. Ответ банальный - лень :)
Итак, в lib/ проекта кидаем файл php_bridge.rb следующего содержания
module PHPBridge
def self.send_to_php(file,req)
require 'uri'
req1 = []
req.env.each do |name,value|
req1.push("#{name}[=]#{value}")
end
params = URI.escape(req1.join("[|]"))
req1 = []
req.parameters.each do |name,value|
req1.push("#{name}[=]#{value}")
end
param = URI.escape(req1.join("[|]"))
`/usr/bin/php #{RAILS_ROOT}/wrappers/php-wrapper.php #{file} "#{params}" "#{param}"`
end
end
А в контроллер который должен вызвать необходимо написать что-то похожее на:
class TestController < ApplicationController
include PHPBridge
def index
@output = PHPBridge::send_to_php('test.php',request)
end
end
После этого при запросе вызовется файл wrappers/php-wrapper.php в который необходимо написать следующий код:
<?
$file = $argv[1];
$params = $argv[2];
$params = urldecode($params);
$params = explode("[|]",$params);
$params2 = array();
foreach($params as $value)
{
$tt = explode('[=]',$value);
$params2[$tt[0]] = $tt[1];
}
$_SERVER = $params2;
$params = $argv[3];
$params = urldecode($params);
$params = explode("[|]",$params);
$params2 = array();
foreach($params as $value)
{
$tt = explode('[=]',$value);
$params2[$tt[0]] = $tt[1];
}
$_GET = $params2;
$_POST = $params2;
require_once('php-code/' . $file);
?>
Вот и всё. Для теста я выводил переменные окружения.
Tagged with: php rails |
Posted on August 21, 2007

мне только не понятно почему Engines не нравятся
Tagged with: rails |
Posted on August 11, 2007
Иногда с одной формы необходимо закачать несколько файлов сразу ... Недавно мне пришлось столкнуться с этой проблемой для написания простенькой текстовой CMS.
Был выбран acts_as_attachment (я его люблю) и написано небольшое количество кода.
Во первых, в страницу для закачки был вставлен яваскрипт который динамически добавлял, удалял поля типа файл:
<script type="text/javascript">
var file_index = 0;
function add_file()
{
var smb = document.createElement("input");
smb.type = "file";
smb.name = "file[" + file_index + "]";
smb.id = "file_" + file_index;
document.getElementById("files").appendChild(smb);
var a = document.createElement("a");
a.href = "javascript:remove_file(" + file_index + ");";
a.id = "remove_file_" + file_index;
a.appendChild(document.createTextNode("Удалить"));
document.getElementById("files").appendChild(a);
var br = document.createElement("br");
br.id = "br_file_" + file_index;
document.getElementById("files").appendChild(br);
file_index++;
}
function remove_file(id)
{
var container = document.getElementById("files");
var input_f = document.getElementById("file_" + id);
var a = document.getElementById("remove_file_" + id);
var br = document.getElementById("br_file_" + id);
container.removeChild(input_f);
container.removeChild(a);
container.removeChild(br);
}
</script>
При вызове add_file внутрь дива с id "files" добавляется новый набор из поля воода, ссылки на удаление этого поля и переноса строки.
В код контроллера был вставлен следующий фрагмент для обработки:
params[:file].each do |f|
p = Hash["attachment" => {"uploaded_data" => ""}]
p["attachment"]["uploaded_data"] = f[1]
att = Attachment.create!p["attachment"]
@page.attachments << att
end
Конечно обработки на правильность файлов нет, но добавить её дело 2х минут
Tagged with: javascript rails |