Наверх

Пара советов о том, как писать свои сниппеты

MODX не предъявляет высоких требований к разработчику. Если ты немного знаешь HTML, то можешь сделать свой сайт без труда:

Менюшки — Wayfinder
Вывод новостей — getResources

Просто правильно пропиши параметры вызовов и вставь в шаблон HTML — вот и готов сайт.

Но как только сайтостроителю надо сделать что-то чуть-чуть другое, он начинает писать свои сниппеты. Вот тут и возникают такие творения

Хотелось бы дать начинающим программистам пару советов. Надеюсь, в комментариях вы предложите еще советы, которые будут полезны. Да и сам я планирую этот топик расширять, добавлять в него решения, советы и прочее, чтобы качество кода на MODX отличалось от того же на Joomla и пр.

Не нужно подключаться к базе и писать свои запросы


MODX построен на xPDO. Это эдакая прослойка между кодом программиста и базой данных. PHP позволяет работать с MySQL, записывать в базу данные, брать их оттуда, но вам не нужно самостоятельно подключаться к базе, писать запросы и прочее. xPDO помимо фильтрации данных (что убережет вас от взлома с использованием SQL-инъекций) предоставляет еще и удобные функции для работы с данными. Для того, чтобы получить данные из базы используйте getObject и getCollection. Используйте API, задавайте вопросы, подскажем, расскажем. Вообще, думаю надо будет расписать в примерах, как использовать getObject и getCollection именно для начинающих.

Ваш сниппет должен что-то возвращать


Допустим, в сниппете вы просто проверяете какое-то значение и на основе его выводите текст:

// Плохо                                     // Хорошо
if ($_SESSION['theme']) {                    if ($_SESSION['theme']) {
 echo $_SESSION['theme'];                      $output = $_SESSION['theme'];
} else {                                     } else {
 echo "none";                                  $output = "none";
}                                            }
                                             return $output;
Да, оба сниппета будут работать, но если код оформлен вторым способом, то этот сниппет можно будет использовать в любом другом месте, например:

$fields = $profile->get('extended');
$fields['theme'] = $modx->runSnippet('getTheme'); // Здесь вызываем наш сниппет
$profile->set('extended',$fields);
$profile->save();
Таким образом, сниппет getTheme может как выводить значение на страницу, так и подставлять его в значение переменной в любом другом сниппете. Все из-за волшебного слова return.

О кешировании


Обязательно прочитайте еще и статью Вызов кешируемых и некешируемых сниппетов в примерах, чтобы понять, как нужно вызывать сниппеты: так [[snippet]] или так [[!snippet]]

P.S.


Предлагаю в комментариях приводить еще примеры наиболее часто встречающихся ошибок.

Оригинал статьи: community.modx-cms.ru/blog/9141.html


10 комментариев

  1. Мурад 16 июня 2014, 11:31 # 0
    Здравствуйте, подскажите пожалуйста как подключиться к БД в снипете?

    на php то я знаю как это делается:
    $sdd_db_host='localhost';//Имя хоста
    $sdd_db_name='namebd';//Название бд
    $sdd_db_user='user';//Пользователь
    $sdd_db_pass='pass';//Пароль
    @mysql_connect($sdd_db_host,$sdd_db_user,$sdd_db_pass);//Подключение
    @mysql_select_db($sdd_db_name);//Выбор базы

    Но как сделать тоже самое в MODX Revo, чтобы не светить данные для входа в БД в снипете?
    1. Илья Уткин 16 июня 2014, 11:32 # 0
      А в MODX не надо к БД подключаться. Просто используете getObject или getCollection
    2. Мурад 16 июня 2014, 11:33 # 0
      Вот мне например нужно вывести данные из какой то таблицы, там то какая то своя MODX конструкция должна быть для выборки?
      1. Илья Уткин 16 июня 2014, 11:42 # 0
        Да. Почитайте уроки по xPDO. Когда все для начинающих усвоите, почитайте как работать с посторонними таблицами (не из MODX, а которые сами можете добавить)

        Но в любом случае, в MODX можно и как обычно подключаться и выбирать, хоть это небезопасно и не принято так делать.
      2. Slava 10 марта 2017, 17:52 # 0
        Объявлять в сниппетах функции тоже не рекомендуется? Для обработки текста, например, которая в сниппете выполняется неск. раз. Нужно еще один сниппет создавать?
        1. Илья Уткин 13 марта 2017, 10:50 # 0
          Да, не рекомендуется. Дело в том, что сниппет при выполнении становится функцией, и нужно следить за тем, чтобы не было повторного объявления функции. Но в принциипе, на работоспособность это не влияет. Например, вот так будет работать:

          <?php
          if(!function_exists('myFunction')) {
            function myFunction () {
              return 'hello';
            }
          }
          return $modx->getChunk('tpl', array('text' => myFunction()));
          1. Александр 15 марта 2017, 21:37 # 0
            Доброго времени суток, хотелось бы услышать совет по одной проблеме. Требуется вписать многомерный массив в таблицу, которая через форму обратной связи отправляется на почту. Как лучше сделать?..
            1. Илья Уткин 20 марта 2017, 09:15 # 0
              Ну, логично, что нужно пройтись по этому массиву, например, с помощью foreach

              $output = array();
              foreach($data as $row) {
                $output[] = "<tr><td>{$row['name']}</td><td>{$row['price']}</td></tr>";
              }
              return '<table>' . implode(PHP_EOL, $output) . '</table>';
        2. Александр 20 марта 2017, 13:45 # 0
          я примерно понял, спасибо, если не затруднит, то подскажите пожалуйста как передать значения с двух текстовых полей в сниппет?
          1. Илья Уткин 08 апреля 2017, 08:08 # 0
            В сниппет поля передаются примерно так:
            [[snippet? &first=`[[*first]]` & second=`Text`]]
            И там они будут доступны в соответствующих переменных ($first, $second)

          Авторизация

          через сервис Loginza:


          Шаблоны MODX

          1 2 Дальше »

          Объектная
          модель
          MODX