We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 22301
    • 1,084 Posts
    Часто приходится запиперивать оформление вывода в сниппет.
    а что делать, если надо по-быстрому вывод переделать? или если вообще требуется сразу несколько выводов да ещё нескольких переменных?
    я тут поковырял документацию, сниппеты порассматривал... в общем, думаю, это будет полезно для чайников (типа меня).
    ниже примитивная реализация:)

    к примеру, сниппет чё-то там "делает", в результате чего имеем:

    $snatch_1 = "кусочек_1";
    $snatch_2 = "кусочек_2";
    $snatch_3 = "кусочек_3";
    


    есть парочка способов вывести кусочки в определённом формате из сниппета.

    можно так:

    $output  .=<<<EOD
    
            <h1>$snatch_1</h1>
            <h2>$snatch_2</h2>
            <h3>$snatch_3</h3>
    
    EOD;
    
    echo $output;
    


    можно так:

    
    $output  .= "<h1>".$snatch_1."</h1><h2>".$snatch_2."</h2><h3>".$snatch_3."</h3>";
    
    echo $output;  
    
    


    элементарный php, хотя я и здесь мог ошибиться:)

    а можно сделать так:

    создаём chunk, в который впихиваем следующее:

    <h1>[vr_1+]</h1>
    <h2>[vr_2+]</h2>
    <h3>[vr_3+]</h3>
    


    называем его как-нить типа chunk_1.

    внутри сниппета делаем следующее:

    /*тут чего-то сниппет делает, вычисляя нам значения кусочков*/
    $snatch_1 = "кусочек_1";
    $snatch_2 = "кусочек_2";
    $snatch_3 = "кусочек_3"; // пусть будет так:)
    
    $modx->setPlaceholder('snatch_1', $snatch_1); // это мы определили, что $snatch_1 выводить в поле [+snatch_1+] в чанке 
    $modx->setPlaceholder('snatch_2', $snatch_2);
    $modx->setPlaceholder('snatch_3', $snatch_3);
    
    $output = $modx->getChunk(chunk_1); // это мы заполучили чанк и впихнули туда кусочки
    
    return $output; 
    


    чанков может быть несколько, с разными именами, понятное дело... с разными выводами.

    делается так:

    вставляем в страницу сниппет [[snippet_name?chunk_name=`chunk_1`]]
    внутри сниппета делаем следующее:

    $output = $modx->getChunk($chunk_name); // получаем внешний параметр
    


    понятно, что если надо сделать другой вывод, то создаём chunk_2, впипериваем [[snippet_name?chunk_name=`chunk_2`]] и всё.

    я не стал усложнять, я опустил задание дефолтного чанка и т.д. и т.п., т.е., если вы не задали чанк, то и вывода не будет.

    я могу и ошибаться где-то, поправки принимаются на ура, я просто изложил принцип, сам так делаю:)


    UPD: особенность!!!

    есть одна неудобная особенность, выше я внёс корректировки.

    суть: задание плейсхолдеров должно происходить после вычисления функций, то есть, cначала получаем значение $snatch, затем задаём для него место $modx->setPlaceholder(’snatch’, $snatch), а потом вызываем чанк $output = $modx->getChunk($chunk)

    не слишком удобно, ибо нельзя тупо определить в начале сниппета местечки под каждую функцию.
    не знаю, почему так, это вопрос к php-программерам, надо ковырнуть парсер.
    ещё сейчас озабочен, как теперь вывод в цикле производить?
      [img]http://jurist-info.ru/pic/rrr.jpg[/img]

      Безжалостный пияр!
      Artima -- неуч!
      Осторожно: преступная локализация -- modx-cms.ru
      Баштанник Андрей -- мегапрограммер из Белоруссии и поедатель говна, очень критично настроенный молодой человек!

      Дисклеймер для общительных: даю сам себе право транслировать в открытый эфир содержание лички, just for fun
      • 897
      • 1,620 Posts
      респект! grin
        "Und wenn du lange in einen Abgrund blickst, blickt der Abgrund auch in dich hinein."

        Не используйте Revo для "просто сайтов". Используйте Evo

        Who can defeat the Russian bear?
        • 22301
        • 1,084 Posts
        чёрт:) выше я ошибся и исправил, надо так:

        $output = $modx->getChunk($chunk_name);
          [img]http://jurist-info.ru/pic/rrr.jpg[/img]

          Безжалостный пияр!
          Artima -- неуч!
          Осторожно: преступная локализация -- modx-cms.ru
          Баштанник Андрей -- мегапрограммер из Белоруссии и поедатель говна, очень критично настроенный молодой человек!

          Дисклеймер для общительных: даю сам себе право транслировать в открытый эфир содержание лички, just for fun
          • 33114
          • 518 Posts
          ну да плэйсхолдеры это сила
            http://modx.ru - российская поддержка MODx
            http://newscup.ru - экспериментальный проект
            http://yentsun.com - персональный сайт
            • 31113
            • 45 Posts
            Не понял ничего...
            Т.е. ты хочешь написать
            $modx->setPlaceholder('snatch_1', $snatch_1);

            вверху, а переменную $snatch_1 изменять потом?
            Это как сначала поесть, а потом вымыть руки перед едой?

            Во-первых, не понятно зачем это...
            Во-воторых, непонятно, что необычного в таком поведении.
            Когда мы пишем setPlaceholder(’snatch_1’, $snatch_1), то плейсхолдеру устанавливается значение, которое лежит в переменной $snatch_1. Если менять значение этой переменной потом, то значение самого плейсхолдера не поменяется.

            Или я что-то не понял? huh
              • 22301
              • 1,084 Posts
              Quote from: ur001

              Во-первых, не понятно зачем это...
              Во-воторых, непонятно, что необычного в таком поведении.
              Когда мы пишем setPlaceholder(’snatch_1’, $snatch_1), то плейсхолдеру устанавливается значение, которое лежит в переменной $snatch_1. Если менять значение этой переменной потом, то значение самого плейсхолдера не поменяется.

              всё правильно понял smiley но я не руки хотел после еды помыть, а скорее -- разложить столовые приборы перед трапезой smiley

              я думал, надеялся grin , что setplaceholder’ом мы не устанавливаем значение, а скорее закрепляем за каким-либо полем определённое соответствие, мне трудно объясняться, потмоу что к программированию я имею опосредованное отношение... в общем, поскольку мы именно устанавливаем значение плейсхолдеру, то нам и приходится это делать каждый раз, как у нас поменяется переменная, я думал, что всё несколько проще...

              в связи с этим у меня и появились проблемы, когда я попытался в цикле цеплять чанк, мой пост на эту тему висит тут
              http://modxcms.com/forums/index.php/topic,6121.msg43242.html#msg43242

              как я хотел, наивно:

              1. задать плейсхолдеры все, определив и переменные заодно.
              2. потом вычислить переменные, полагая, что по п. 1 автоматом они заплейсхолдятся.
              3. запиперить все переменные в шаблон чанка.

              рыбку съесть и на лошадке покататься не вышло, как видно из другого поста.

                [img]http://jurist-info.ru/pic/rrr.jpg[/img]

                Безжалостный пияр!
                Artima -- неуч!
                Осторожно: преступная локализация -- modx-cms.ru
                Баштанник Андрей -- мегапрограммер из Белоруссии и поедатель говна, очень критично настроенный молодой человек!

                Дисклеймер для общительных: даю сам себе право транслировать в открытый эфир содержание лички, just for fun
                • 31113
                • 45 Posts
                Ну если ОООчень хочется, то всегда можно smiley

                function SetPlaceholder($name, &$value){
                    global $modx;
                    $modx->placeholders[$name] = &$value;    
                }
                
                SetPlaceholder('test',$value);
                $value='12345';


                Это для PHP5, не помню, есть ли в PHP4 возможность передачи аргументов с амперсандом, если нет, то можно еще так:

                function SetPlaceholder($name, $value){
                    global $modx;
                    $modx->placeholders[$name] = &$value;    
                }
                
                SetPlaceholder('test',&$value);
                $value='12345';


                grin

                А можно еще в самом ядре изменить (document.parser.class.php):

                # sets a value for a placeholder
                  function setPlaceholder($name,&$value){
                    $this->placeholders[$name] = &$value;
                  }
                  • 22301
                  • 1,084 Posts
                  Отлично!

                  Я тут как-то наткнулся на рассуждения по поводу документации, так, может, с этого случая и начать. думаю, что это полезно будет и чайникам, и сведущим (но ленивым)?

                  почему я зацепился за modxcms, так потому, что разделены оформление, программинг и администрирование... по этой же причине я и за placeholder’ы так цепляюсь. при этом не выстраивается стрёмная и громоздкая система шаблонирования.
                    [img]http://jurist-info.ru/pic/rrr.jpg[/img]

                    Безжалостный пияр!
                    Artima -- неуч!
                    Осторожно: преступная локализация -- modx-cms.ru
                    Баштанник Андрей -- мегапрограммер из Белоруссии и поедатель говна, очень критично настроенный молодой человек!

                    Дисклеймер для общительных: даю сам себе право транслировать в открытый эфир содержание лички, just for fun
                    • 31113
                    • 45 Posts
                    По-поводу документации: Янсон вроде на сайте решил сделать возможность документирования. Пусть с этого и начинается. Просто хочется так: поработал с какой-нибудь функцией, решил, что есть чем с людьми поделился, зашел на сайт, дополнил. С нуля совсем не хочется.

                    Хотя для начала, думаю, можно постить в форуме http://modxcms.com/forums/index.php/topic,6019.0/topicseen.html
                      • 31738
                      • 20 Posts
                      Не получилось вынести на экран

                      грешу на

                      [[snippet_name?chunk_name=`chunk_1`]]

                      параметра "chunk_name=" - не нашёл нигде в описаниях
                      я, конечно, буду рыть дальше, но если кто-то даст ссылку на описание сниппетов, буду благодарен