Вызов PHP кода из rails приложения

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);
?>
Вот и всё. Для теста я выводил переменные окружения.

Вот такое соревнование намечается

Posted on August 21, 2007

мне только не понятно почему Engines не нравятся

Множественный аплоад файлов с помощью Acts As Attachment

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х минут