Бетон 5 областей с динамическими именами

Я унаследовал конкретный проект 5 и отлаживаю, почему определенные «области» на странице не отображают функцию «встроенного редактирования».

Версия 5.5.1.

По сути, есть страница, на которой перечислены некоторые элементы, и каждый элемент имеет несколько элементов div, содержащих некоторую информацию о каждом из них, например, имя, описание:

<div class = "description"></div>

Проблема в том, что только один из элементов описания доступен для редактирования - я понял, что это может быть связано с тем, что «область» имеет статическое имя, таким образом:

<div class = "description"> $a = new Area('Property Details'); $cont = Page::getByID($page->getCollectionID()); $regexMatchThis = $a->display($cont); </div>

Таким образом, есть только одна область под названием «Сведения о собственности», которую можно редактировать. Я прав, и как я могу назвать область, чтобы она считывала правильные данные, но могла иметь уникальное имя, чтобы ее можно было редактировать?

Помощь приветствуется.


person Sphere    schedule 05.03.2013    source источник


Ответы (2)


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

Области являются динамическими в зависимости от имени. Таким образом, «Сведения о свойстве 1» отличаются от «Сведения о свойстве 01».

Вы можете сделать что-то вроде:

for ($i = 1; $i <= 10; $i++) {
   $a = new Area('Property Details ' + $i); 
   $a->display();
}

И вы получите 10 последовательно названных областей «Сведения о собственности x» от 1 до 10.

Допустим, вы добавляете к ним блок контента. Пока они остаются с теми же именами, блоки будут работать как положено. Вы даже можете изменить первую строку на:

for ($i = 10; $i >= 1; $i--) {

В этом случае вы получите области, названные последовательно вниз (10, 9, 8...), а C5 сохранит блоки контента в их исходных областях — так что все они будут в обратном порядке.

Но допустим, вы делаете:

for ($i = 11; $i <= 20; $i++) {

Теперь у вас есть 10 областей (11, 12, 13...), и все они пусты. Блоки контента практически исчезли. Вы можете создавать новые блоки контента, если хотите. Но затем вернитесь к исходному циклу (1, 2, 3...). Ваши исходные блоки контента вернулись, как и раньше.

Это очень длинное объяснение просто показывает, что C5 создает блок на основе имени, и это имя становится ключом. Это может быть что угодно. Вы можете основывать его на имени страницы или динамически генерировать его или что-то еще. Вы просто не можете изменить его после того, как он был создан (если вы не хотите «потерять» блоки).

Но... тут я снова соглашусь с Пеккой... наверное, ты не хочешь этого делать. Не зная своей цели, вы создаете (или продлеваете) очень хрупкое решение, которое трудно поддерживать. Пекка предлагает создавать подстраницы для каждого свойства, после чего вы можете использовать блок списка страниц, чтобы «вытащить» соответствующие атрибуты. Или, если вы не хотите создавать отдельные страницы, используйте блок Jordan Designer Content — http://www.concrete5.org/marketplace/addons/designer-content/. Имейте одну область («Сведения о собственности») и добавляйте блок для каждой собственности. Гораздо проще удалить, изменить порядок и т. д.

Редактировать, чтобы ответить на первые два вопроса Sphere: добавлять блоки в области очень просто. Пока у областей нет повторяющихся имен, вы щелкаете по ним так же, как пытались ранее, и добавляете блок. Я не уверен, какой тип блока нужен вашему конкретному сайту — это зависит от вашего сайта. Это может быть просто блок Content или, может быть, блок Pagelist с определенным шаблоном, где предыдущий разработчик настроил его так, чтобы он «перечислял» одну страницу для каждого экземпляра блока за каждый экземпляр. область (что было бы ДЕЙСТВИТЕЛЬНО странно, но кто знает...). Или, может быть, это тип блока, созданный из блока Designer Content, о котором я упоминал ранее. Покопавшись в существующих блоках, вы должны получить представление. Кроме того, я обнаружил, что иногда они выписывают какой-то идентификационный идентификатор в HTML. Итак, источник что-то вроде .

Что касается вашего примера кода: да, $cont — это страница. Код, который мы с Пеккой предоставили ($a->display()), в основном делает:

  1. Инициализируйте область под названием «Сведения о свойствах» (или 1, или 2, или что-то еще). Это ключ, как обсуждалось.
  2. Отобразите его, по умолчанию отображая его «для» текущей страницы. Это отличается от "на" текущей странице. Он всегда будет отображаться на текущей странице... то, что вы передаете в качестве аргумента ->display(), больше похоже на "страницу, из которой должна быть извлечена область". Итак, если бы вы могли теоретически передать $thePageObjectForPropertyOnMainStreet, он отобразил бы область «Сведения о собственности» на этой странице. Использование $cont необязательно. Как он его создает (он уже существует). Но... теперь, когда я об этом думаю, возможно, именно это он и пытался сделать. $cont мог быть ссылкой на отдельные страницы свойств. Эти страницы могут иметь область под названием "Сведения о собственности", и этот его цикл служит для "вытягивания области" из этих страниц. Но $cont выглядел бы иначе. Вы можете жестко закодировать это, выполнив что-то вроде $cont = Page::getByID(x);, где x — это cID для страницы свойств, которая имеет область под названием «Сведения о свойствах». Вы можете получить cID в URL-адресе после того, как отредактируете и сохраните его.
person James S    schedule 07.03.2013
comment
Спасибо. Кажется, мне не хватает бита «добавить блок в область». Из нового кода Area() не очевидно, как создается эта ссылка. По сути, я хочу поддерживать систему, созданную другим разработчиком, и клиент не хочет, чтобы мы тратили время/цены на очевидные ошибки. Быстрым/грязным решением было бы сделать «области» динамически названными, но я не уверен, где они связаны с блоками — я не вижу блока под названием «Сведения о собственности» или подобного. Признаюсь, я немного запутался, но спасибо за терпение. - person Sphere; 07.03.2013
comment
$cont = Page::getByID($page-›getCollectionID()); $regexMatchThis = $a-›display($cont); Разве эта переменная $cont не является «страницей», как вы упомянули? - person Sphere; 07.03.2013

Да, этот код, кажется, определяет только одну область (и делает некоторые несвязанные вещи между ними).

Если вторая область, которую вы хотите, еще не существует, просто создайте вторую, например:

 <div class = "description">
   <?php
    $a = new Area('Some more info'); 
    $a->display(); `
    ?>
 </div>
person Pekka    schedule 05.03.2013
comment
Спасибо, но эта область должна быть частью цикла php while, поэтому область «Сведения о свойствах» должна быть на странице для каждого свойства. Следовательно, «область» будет присутствовать в каждом проходе цикла и иметь одно и то же имя. Однако я предполагаю, что, поскольку он определен (более одного раза) как «Сведения о свойстве», а не, скажем, «Сведения о свойстве x», именно поэтому функция редактирования работает только в первой области «Сведения о свойстве»? Я думаю, я спрашиваю, может ли «область» иметь динамическое «имя» и по-прежнему ссылаться на соответствующий контент «области»? - person Sphere; 05.03.2013
comment
@Sphere да, вам нужно назвать поля property details 1, 2 и так далее. Но относится ли это к потенциально бесконечному списку свойств? Если это так, этот подход вас не обрадует: что, если вам нужно удалить свойство no. 5? В этом случае вы могли бы, например. использовать подстраницы и извлекать данные из них... хотя это сложнее - person Pekka; 05.03.2013
comment
Да исправить. Это то, как это было настроено первоначальным разработчиком. Я так понимаю, я прав в своем предположении, почему функция редактирования не работает, потому что на странице есть повторяющаяся область? Нет ли способа динамически ссылаться на область, чтобы сделать ее уникальной для редактирования? - person Sphere; 05.03.2013
comment
@Sphere да, похоже, это причина, по которой это не работает - это всего лишь одна область, и вы не можете иметь ее там несколько раз. Может быть, в старых версиях C5 это работало по-другому, без понятия.... Я не совсем понял ваше последнее предложение, можете пояснить? - person Pekka; 05.03.2013
comment
Существует несколько экземпляров области, которая называется «Сведения о собственности». Только одна из этих «областей» доступна для редактирования при входе в систему (т.е. имеет красный контур вокруг нее, чтобы ее можно было редактировать прямо в процессе). Я предполагаю, что это связано с тем, что каждая область должна иметь уникальное имя, поэтому наличие ее в цикле while с одним и тем же именем каждый раз вызовет эту проблему? - person Sphere; 05.03.2013
comment
Итак, мой вопрос действительно заключается в том, могу ли я назвать «область» динамически, например: «Сведения о свойстве». $id (где id — это экземпляр элемента в цикле). Кажется, это не работает таким образом. - person Sphere; 05.03.2013
comment
@Sphere, конечно, ты сможешь это сделать. $a = new Area("Property". $i); должно работать нормально. Просто это не очень гибко - а вдруг нужно удалить собственно нет. 4, или добавить еще один между №. 2 и нет. 3? - person Pekka; 05.03.2013
comment
Нет, похоже, это не работает. Кажется, он полагается на область, называемую «Сведения о собственности», чтобы отображать там какие-либо данные. - person Sphere; 05.03.2013
comment
Большое спасибо за ваше время, Пекка, но я думаю, что эта проблема не может быть решена путем настройки «области». Я не знаком с C5, поэтому, если есть простой/быстрый/грязный способ справиться с этим, отлично, в противном случае, еще раз, спасибо за ваше время :) - person Sphere; 05.03.2013
comment
@Sphere вы можете создавать Области на лету. Если вы сделаете $a = new Area("Property5"); $a->display(), это должно дать вам новую прямоугольную область, которую вы можете заполнить контентом. Если вы добавите 10 областей с именами Property1-Property10, вы должны получить 10 пустых контейнеров, которые вы можете заполнить. Это не происходит с вами? Или вы хотите отобразить существующие данные? - person Pekka; 05.03.2013
comment
Если я изменю название области, например, как вы предлагаете выше, то содержимое исчезнет, ​​поэтому я предполагаю, что содержимое как-то привязано к названию области? - person Sphere; 06.03.2013
comment
@Sphere да, это ожидаемое поведение. Если это проблема, то я не уверен, что понимаю, что вы пытаетесь здесь сделать? - person Pekka; 06.03.2013
comment
Хорошо, тогда я не понимаю, как «область» связана с ее содержимым. - person Sphere; 06.03.2013
comment
@Сфера автоматически. Если вы создадите область с именем xyz, она автоматически отобразится как редактируемая; если вы поместите в него что-то, оно будет сохранено под xyz. - person Pekka; 06.03.2013
comment
В приведенном выше ответе, например, где будет установлен контент для области под названием «Дополнительная информация»? - person Sphere; 06.03.2013
comment
@Sphere вы имеете в виду, где физически или где в контексте CMS? Если второе - страница, на которой вы находитесь, получит новую запись в базе данных с именем Some More Info, и содержимое области будет там (очень грубо говоря) - person Pekka; 06.03.2013