We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 1208
    • 79 Posts
    Использую MODx не так давно и о подобной необходимости задумался впервые. До сих пор пишу обработчики форм в виде "классических" отдельных скриптов, но это не позволяет использовать всю мощь и красоту MODx API для их реализации. Может кто-нибудь подсказать, как это можно сделать?

      • 1788
      • 1,103 Posts
      Quote from: almaron at Mar 23, 2010, 02:28 AM

      Использую MODx не так давно и о подобной необходимости задумался впервые. До сих пор пишу обработчики форм в виде "классических" отдельных скриптов, но это не позволяет использовать всю мощь и красоту MODx API для их реализации. Может кто-нибудь подсказать, как это можно сделать?


      Использовать стандартный eForm
        • 1208
        • 79 Posts
        Quote from: antey at Mar 23, 2010, 03:10 AM

        Использовать стандартный eForm

        Почитал про него в Вики.. это, мягко говоря, не совсем то, что нужно. У меня обработка данных другого рода требуется, работа с базой, файлами. Просто хранить все это в виде отдельных скриптов, когда есть такой замечательный инструмент, как сниппеты, не хочется. Да и, как уже было сказано, больно удобный у modx API.
        Все таки хотелось бы знать, как отправить данные методом post сниппету. Как это, к примеру, делает eForm?

        я вот даже не могу получить доступ к сессии, организованной системой и авторизацию сделать без использования WebLogin.
          • 1788
          • 1,103 Posts
          Обычная форма отправляет post.

          Как я делал обработку форм сниппетом + фильтрация данных для дитто.

          Создаем сниппет и прописываем в начале шаблона:
          <?php
          
          // zagonjaem s formy v sessiju
          if (isset($_POST['typedom'])) { $_SESSION['typedom'] = $_POST['typedom']; } else { $_SESSION['typedom'] = $_SESSION['typedom'];}
          if (isset($_POST['city'])) {$_SESSION['city'] = $_POST['city'];} else { $_SESSION['city'] = $_SESSION['city'];}
          if (isset($_POST['room'])) { $_SESSION['room'] = $_POST['room'];} else { $_SESSION['room'] = $_SESSION['room'];}
          ?>

          далее выводим через дитто фильтр. Но т.к. у меня видимо конфликт ditto и phx использовал подстановку в дитто через &documents=`[[vibor]]`

          Сниппет vibor с помощью 1 запроса к базе создает список выбранных фильтром документов.
          <?php
          $table = $modx->getFullTableName("site_content");
          $table2 = $modx->getFullTableName("site_tmplvar_contentvalues");
          $table3 = $modx->getFullTableName("site_tmplvar_templates");
          
          $city = $_SESSION['city'];
          $room = $_SESSION['room'];
          $typedom = $_SESSION['typedom'];
          
          $sqlcity = empty($_POST['city']) ? " " : "and id in (select contentid from $table2 where tmplvarid=20 and value='$city') ";
          $sqlroom = empty($_POST['room']) ? " " : "and id in (select contentid from $table2 where tmplvarid=28 and value='$room') ";
          $sqltypedom = empty($_POST['typedom']) ? " " : "and id in (select contentid from $table2 where tmplvarid=32 and value='$typedom') ";
          
          // sostavlenie zaprosa
          $where = "template=4 $sqlcity $sqlroom $sqltypedom";
          $dbQuery = "SELECT id FROM $table WHERE $where";
          
          // vivod id
          $rs = $modx->db->query($dbQuery);
          $row = $modx->db->getColumn("id",$rs);
          $res = implode(",", $row);
          return $res;
          ?>
          tmplvarid=номер tv параметра в базе (n).

          Итого, получаем меньше поползновений дитто в базу.

          В фильтре уже от лени smiley испоьзую phx. На примере:
          <select name="typedom">
          <option [*phx:if=`[*phx:session=`typedom`*]`:is=``:then=` value="" SELECTED`:else=`value=""`*] >любой</option>
          <option [*phx:if=`[*phx:session=`typedom`*]`:is=`Вилла`:then=` value="Вилла" SELECTED`:else=`value="Вилла"`*] >Вилла</option>
          <option [*phx:if=`[*phx:session=`typedom`*]`:is=`Квартира`:then=` value="Квартира" SELECTED`:else=`value="Квартира"`*] >Квартира</option>
          <option [*phx:if=`[*phx:session=`typedom`*]`:is=`Бунгало`:then=` value="Бунгало" SELECTED`:else=`value="Бунгало"`*] >Бунгало</option>
          </select>
          Получаю зафиксированную сессией строку селектора.

          Не идеально, но работает. smiley

          UPD: phx:session
          <?php
          return $_SESSION[$options];
          ?>
            • 15286
            • 79 Posts
            Спасибо, добрый человек!

            Работает прекрасно, но на одной странице. При переходе на другую - [[vibor]] теряет данные сессии. Видимо отрабатывает только $POST...

            Что делать?
              • 1788
              • 1,103 Posts
              Quote from: kalina at Jun 22, 2010, 10:40 AM

              Спасибо, добрый человек!

              Работает прекрасно, но на одной странице. При переходе на другую - [[vibor]] теряет данные сессии. Видимо отрабатывает только $POST...

              Что делать?
              session_start(); ненужна.
                • 15286
                • 79 Posts
                Всё равно траблы есть, победить не могу. sad
                Правда нашел на мой взгляд неплохое решение. Нужна помощь...
                1. Пишем данные в сессию (работает)
                2. Вытаскиваем данные из сеcсии с помощью Снипета, формируем фильтр для Ditto, Запускаем Ditto с параметрами.

                Есть необходимый Снипет, но он к сожалению формирует только 2 фильтра, а требуется выборка по 4-7 значениям.

                <?php
                global $modx;
                $flt ="";
                 
                // Poluchaem dannye
                $param_one=mysql_escape_string($_SESSION['type_article']);
                $param_two=mysql_escape_string($_SESSION['color_article']);
                 
                // Filtruem
                $param_one = htmlspecialchars(stripslashes($param_one));
                $param_two = htmlspecialchars(stripslashes($param_two));
                 
                // Esli "EMPTY" stavim  NULL
                if($param_one==""){$param_one=NULL;}
                if($param_two==""){$param_two=NULL;}
                 
                // Formiruem filtr
                $flt_one="tvtype_article,$param_one,1";
                $flt_two="tvcolor_article,$param_two,1";
                 
                // Esli "EMPTY" 
                if(empty($param_one) AND $param_two)
                {
                $flt="$flt_two";
                }
                // Esli "EMPTY"
                if(empty($param_two) AND $param_one){
                $flt="$flt_one";
                }
                // Formiruem filtry s razelitelem  "|"
                if($param_two AND $param_one){
                $flt="$flt_one"."|"."$flt_two";
                }
                // Esli "EMPTY" vivodim vse
                if($param_two=="" AND $param_one==""){
                $flt="";
                }
                // Go Ditto
                $result=$modx->runSnippet('Ditto', array('id' => 'viborka', 'startID'=>'16','tpl'=>'viborka','filter'=>$flt,'noResults'=>'Empty...'));  
                $modx->setPlaceholder('search_rezult',$D); 
                 
                // Return
                return $result;
                
                ?>
                



                Нelp!