Формы

Тема в разделе "PHP Pro", создана пользователем untwist, 17 июл 2009.

Статус темы:
Закрыта.
  1. untwist

    untwist Постоялец

    Регистр.:
    30 сен 2006
    Сообщения:
    121
    Симпатии:
    35
    В общем суть такая.
    Нужно сделать поднятие анкет.

    1) авторизоваться на сайте
    2) открывает анкету
    3) и со всеми полями и т.п форму отправляет обратно на сервер.

    на серваке дата обновляется и анкете поднимается в топ 10

    Я в общем то это все сделал
    Авторизация (сURL) форма (регулярные + PHP Simple HTML DOM Parser)

    Но столкнулся с проблемой: данные в формах очень большие, заколебался писать регулярки под них, к тому же сайтов на которых нужно поднимать анкеты порядка 20 шт и для каждого писать шарнусь, плюс с кодировками не у всех все хорошо и т.п.

    в общем может у кого есть идеи как пересылать формы по быстрей. Думал покапаться в огороде jQuery form, к примеру во фрейм грузить форму а jquery будет кликать на отправку формы. но желательно сделать это все через крон ((
    В общем может у кого есть идеи ?
     
  2. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    735
    Симпатии:
    261
    У элемента <form> есть не так много возможных вложенных: select, input (он же textarea, input hidden и input password), file, input checkbox, input radio, input submit (он же input image).

    Через DOM Parser вытаскиваешь нужную тебе <form>, потом идешь по всем ее детям и если это что-то из полезного (а не <div> к примеру) - анализируешь и строишь массивчик key=>value.

    Потом в этот массивчик дописываешь, что именно ты хочешь сабмитнуть.

    Потом собираешь в массивчик в кучу и херачишь курлом. Все.

    После того, как у тебя будет готов такой костяк, ты сможешь на основе него очень быстро писать какие угодно сабмитилки, только лишь путем внесения изменений в массивчик.
     
    untwist нравится это.
  3. untwist

    untwist Постоялец

    Регистр.:
    30 сен 2006
    Сообщения:
    121
    Симпатии:
    35
    может у тебя есть пример подобного скриптика на php ?
     
  4. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    735
    Симпатии:
    261
    PHP:
    class Former {
     var 
    $formvars = array();
     var 
    $html;
     var 
    $action,$method;
     var 
    $submitfound false;

     function 
    form2arr($str,$path='form',$num=0) {
      
    $this->html str_get_html($str);
      
    $e $this->html->find($path,$num);
      
    $this->submitfound false;
      
    $this->action $e->action;
      
    $this->method = isset($e->method) ? $e->method 'GET';
      
    $this->formvars = array();
      
    $this->element2arr($e);
      
    $this->html->clear();
      return 
    $this->formvars;
     }

     function 
    element2arr($e) {
      if (
    $e->tag == 'input' && $e->type == 'hidden')   $this->formvars[$e->name] = isset($e->value)?$e->value:'';
      if (
    $e->tag == 'input' && $e->type == 'password'$this->formvars[$e->name] = isset($e->value)?$e->value:'';
      if (
    $e->tag == 'input' && $e->type == 'text')     $this->formvars[$e->name] = isset($e->value)?$e->value:'';
      if (
    $e->tag == 'input' && $e->type == '')         $this->formvars[$e->name] = isset($e->value)?$e->value:'';
      if (
    $e->tag == 'input' && $e->type == 'submit' && !$this->submitfound) {
        
    $this->formvars[$e->name] = isset($e->value) ? $e->value:'';
        
    $this->submitfound true;
      }
      if (
    $e->tag == 'input' && $e->type == 'image'  && !$this->submitfound) {
        
    $this->formvars[$e->name] = isset($e->value) ? $e->value:'';
        
    $this->formvars['x'] = 1;
        
    $this->formvars['y'] = 1;
        
    $this->submitfound true;
      }
      if (
    $e->tag == 'input' && $e->type == 'checkbox' && stristr($e->outertext,'checked')) $this->formvars[$e->name] = isset($e->value)?$e->value:'';
      if (
    $e->tag == 'input' && $e->type == 'radio'    && stristr($e->outertext,'checked')) $this->formvars[$e->name] = isset($e->value)?$e->value:'';

      if (
    $e->tag == 'textarea'$this->formvars[$e->name] = $e->innertext;

      if (
    $e->tag == 'select') {
        unset(
    $value);
        foreach(
    $e->children as $o) if ($o->tag=='option') {
        if (!isset(
    $value) || stristr($o->outertext,'selected')) 
            
    $value=(isset($o->value) ? $o->value $o->innertext);
        }
        
    $this->formvars[$e->name] = $value;
      }
      
    // input file не обрабатываем, т.к. значения по умолчанию там не бывает
      
    if (is_array($e->children)) foreach($e->children as $o$this->element2arr($o);
     }
    }

    $str '
     <form method=post>
       <input name=login></input>
       <INPUT type=hidden name=id value=1>
       <select name=loc>
        <option value=1>1</option>
        <option selected>haha</option>
       </select>
       <div id=1> <input type=checkbox name=aa value=1 checked> </div></form>
     '
    ;

    $former = new Former();
    $arr $former->form2arr($str);
    var_dump($arr);

     
Статус темы:
Закрыта.