Что отдать в метод parse чтобы поле не выводилось

#1 3 мая 2016 в 23:51
Инстант 2.5.1. Стоит задача, при сохранении определенного значения поля пользователем не выводить поле при просмотре.
В моем случае это список, одно из значений которого — пустое.
До 2.5.0 сохранял ноль и все было ок.

В 2.5.1 в шаблоне ввели проверку на ноль (чтобы можно было выводить нулевые значения)

  1. <?php if ((empty($item[$field['name']]) || empty($field['html'])) && $item[$field['name']] !== '0') { continue; } ?>
и теперь финт с нулем в поле не работает. Как быть? Попытка в методе parse() вернуть false приводит к такому



Т.е. заголовок поля выводится все равно.

Что отдать в метод parse типа поля, чтобы поле совсем не выводилось?
#2 3 мая 2016 в 23:59
С верху перед циклом foreach($fields as $field), надо удалить ключ
  1. unset($item['КЛЮЧ'])
#3 4 мая 2016 в 00:11
Evanescence, это я знаю. Задача стоит решить вопрос именно полем. Т.е. выбрал юзер вариант "нет в списке", значит и не выводим ничего.
Расписал немного подробнее исходные данные задачи.
#4 4 мая 2016 в 08:58
Zau4man, пустую строку пробовали?
По идее, без unset() будет работать одно из значений проверки empty(). Тут описание что считается пустым значением.
Но более правильным вариантом, IMHO, будет проверка в экшене поля на "пустое" значение, в вашем случае на "ноль", и непосредственное удаление этого поля из выдачи если там "0", далее передача результата в шаблон вывода. Этим вы гарантированно обеспечите необходимое поведение поля в будущих версиях, например, если вдруг установят проверку на пустую строку =)
#5 4 мая 2016 в 09:22
Val, смотрите. Берем любой тип поля. И правим или добавляем в него такой метод parse

  1. public function parse($value){
  2. return false;
  3. }
Получаем: в записи все ок. В списке как выше

Иллюстрация


Следующие значения воспринимаются как пустые:
"" (пустая строка)
0 (целое число)
0.0 (дробное число)
"0" (строка)
NULL
FALSE
array() (пустой массив)
$var; (переменная объявлена, но не имеет значения)

В примере как раз false
Никак не могу понять. Что же такое сделать, чтобы при выводе поля при определенном значении $value (0, -1) не вывести это поле. Логика мне подсказывает отдать false, но не работает в списке :(
#6 4 мая 2016 в 09:39
Да, не работает в списке. В самой записи идёт проверка на пустое значение html поля
  1. empty($field['html'])
А в списке, это значение поля, видимо вовсе не заполняется.
#7 4 мая 2016 в 10:08
Сейчас нет возможности проверить...
Loadырь, в списке выводятся поля без проверок на наличие значения?
Zau4man, return false — должен запрещать вывод поля и в списке и в записи. Попробуйте или через отладку посмотреть какое значение имеет ваше поле в списке или через var_dump($field['key']); гляньте.
#8 4 мая 2016 в 12:23
Val, не совсем понял, что нужно. Сделал в типе поля пустой вариант с option = -1.
В parse прописал

  1. public function parse($value){
  2. if($value == -1) return FALSE;
  3. }
Затем в шаблоне вывода списка

  1. <?php
  2. if($field['name'] == 'city'){
  3. var_dump($field);
  4. }?>
  1. array(24) {
  2. ["id"]=>
  3. string(1) "9"
  4. ["ctype_id"]=>
  5. string(2) "10"
  6. ["name"]=>
  7. string(4) "city"
  8. ["title"]=>
  9. string(10) "Город"
  10. ["hint"]=>
  11. NULL
  12. ["ordering"]=>
  13. string(1) "7"
  14. ["fieldset"]=>
  15. NULL
  16. ["type"]=>
  17. string(5) "cityf"
  18. ["is_in_list"]=>
  19. string(1) "1"
  20. ["is_in_item"]=>
  21. string(1) "1"
  22. ["is_in_filter"]=>
  23. string(1) "1"
  24. ["is_private"]=>
  25. NULL
  26. ["is_fixed"]=>
  27. NULL
  28. ["is_fixed_type"]=>
  29. NULL
  30. ["is_system"]=>
  31. NULL
  32. ["values"]=>
  33. NULL
  34. ["options"]=>
  35. array(10) {
  36. ["is_required"]=>
  37. NULL
  38. ["is_digits"]=>
  39. NULL
  40. ["is_number"]=>
  41. int(0)
  42. ["is_alphanumeric"]=>
  43. NULL
  44. ["is_email"]=>
  45. NULL
  46. ["is_unique"]=>
  47. NULL
  48. ["label_pos"]=>
  49. string(4) "left"
  50. ["label_in_list"]=>
  51. string(4) "left"
  52. ["label_in_item"]=>
  53. string(4) "left"
  54. ["profile_value"]=>
  55. string(0) ""
  56. }
  57. ["groups_read"]=>
  58. array(1) {
  59. [0]=>
  60. int(0)
  61. }
  62. ["groups_edit"]=>
  63. array(1) {
  64. [0]=>
  65. int(0)
  66. }
  67. ["filter_view"]=>
  68. array(1) {
  69. [0]=>
  70. int(0)
  71. }
  72. ["default"]=>
  73. NULL
  74. ["rules"]=>
  75. array(0) {
  76. }
  77. ["handler_title"]=>
  78. string(27) "Фильтр городов"
  79. ["handler"]=>
  80. object(fieldCityf)#22 (38) {
  81. ["title"]=>
  82. string(10) "Город"
  83. ["sql"]=>
  84. string(29) "varchar(30) NULL DEFAULT NULL"
  85. ["filter_type"]=>
  86. string(3) "int"
  87. ["filter_hint"]=>
  88. string(27) "Номер варианта"
  89. ["var_type"]=>
  90. string(6) "string"
  91. ["name"]=>
  92. string(4) "city"
  93. ["element_name"]=>
  94. string(4) "city"
  95. ["element_title"]=>
  96. string(10) "Город"
  97. ["is_public"]=>
  98. bool(true)
  99. ["cache_sql"]=>
  100. NULL
  101. ["allow_index"]=>
  102. bool(true)
  103. ["is_denormalization"]=>
  104. bool(false)
  105. ["item"]=>
  106. array(35) {
  107. ["id"]=>
  108. string(1) "9"
  109. ["title"]=>
  110. string(77) "Россияне стали первыми на Чемпионате Мира"
  111. ["content"]=>
  112. string(842) "
  113. Ударение, соприкоснувшись в чем-то со своим главным антагонистом в постструктурной поэтике, диссонирует коммунальный модернизм, туда же попадает и еще недавно вызывавший безусловную симпатию гетевский Вертер. Скрытый смысл вызывает глубокий контрапункт, но не рифмами. Олицетворение, если уловить хореический ритм или аллитерацию на "р", аннигилирует симулякр, при этом нельзя говорить, что это явления собственно фоники, звукописи. Матрица параллельна.
  114.  
  115. "
  116. ["slug"]=>
  117. string(45) "9-rossijane-stali-pervymi-na-chempionate-mira"
  118. ["seo_keys"]=>
  119. string(202) "ударение, попадает, модернизм, вызывавший, безусловную, вертер, гетевский, симпатию, коммунальный, диссонирует"
  120. ["seo_desc"]=>
  121. string(386) "Ударение, соприкоснувшись в чем-то со своим главным антагонистом в постструктурной поэтике, диссонирует коммунальный модернизм, туда же попадает и еще недавно вызывавший безусловную симпатию гетевский Вертер"
  122. ["seo_title"]=>
  123. NULL
  124. ["tags"]=>
  125. string(1) "0"
  126. ["date_pub"]=>
  127. string(19) "2016-05-01 20:48:44"
  128. ["date_last_modified"]=>
  129. string(19) "2016-05-04 09:09:12"
  130. ["date_pub_end"]=>
  131. NULL
  132. ["is_pub"]=>
  133. string(1) "1"
  134. ["hits_count"]=>
  135. string(1) "0"
  136. ["user_id"]=>
  137. string(1) "1"
  138. ["parent_id"]=>
  139. NULL
  140. ["parent_type"]=>
  141. NULL
  142. ["parent_title"]=>
  143. NULL
  144. ["parent_url"]=>
  145. NULL
  146. ["is_parent_hidden"]=>
  147. NULL
  148. ["category_id"]=>
  149. string(1) "7"
  150. ["folder_id"]=>
  151. NULL
  152. ["is_comments_on"]=>
  153. string(1) "1"
  154. ["comments"]=>
  155. string(1) "0"
  156. ["rating"]=>
  157. string(1) "0"
  158. ["is_approved"]=>
  159. string(1) "1"
  160. ["approved_by"]=>
  161. NULL
  162. ["date_approved"]=>
  163. string(19) "2016-05-03 21:33:22"
  164. ["is_private"]=>
  165. string(1) "0"
  166. ["teaser"]=>
  167. string(81) "Наша команда не оставила шансов конкурентам"
  168. ["city"]=>
  169. string(1) "2"
  170. ["user_nickname"]=>
  171. string(5) "admin"
  172. ["folder_title"]=>
  173. NULL
  174. ["user"]=>
  175. array(3) {
  176. ["id"]=>
  177. string
#9 4 мая 2016 в 14:32
Zau4man, теперь я уже не совсем понимаю))
Вы написали что возвращаете false из поля:
  1. public function parse($value){
  2. return false;
  3. }
И оно все равно выводится в списке!
Я предложил проверить тогда почему оно выводится (либо через отладку либо через var_dump('city');). В приведенных вами данных ["city"]=>string(1) "2", т.е. город выбирается и он не равен false, поэтому и выводится в списке.

Опишите немного подробнее что вы делаете и что наблюдаете?
#10 4 мая 2016 в 18:07
Val, а попробовать?)
В любом типе поля пропишите
  1. public function parse($value){
  2. return false;
  3. }
и все увидите.
Например, в поле number. И в списке объявлений увидите, что значение в списке пропало



но название поля выводится. При просмотре записи ничего не выводится.

т.е. город выбирается и он не равен false, поэтому и выводится в списке.

Val

Пусть так. Скажите, как, имея не NULL в значении поля, запретить его вывод? Что нужно прописать в parse. Я не знаю как еще подробнее объяснить...

Имеем поле типа select. В нем

  1. <select name="city" id="city">
  2. <option value="-1">-- выберите город --</option>
  3. <option value="1">Москва</option>
  4. <option value="2" selected="">Санкт-Петербург</option>
  5. <option value="3">Екатеринбург</option>
  6. </select>
Пользователь не выбирает город и оставляет
  1. <option value="-1">-- выберите город --</option>
. Как не показывать поле в таком случае?
Возврат false в методе parse работает некорректно. Ну или неправильно интерпретируется шаблоном, а именно списком материалов default_list.tpl.php и название поля все равно выводится, хотя и без значения.

До 2.5.0 работало
  1. <option value="0">-- выберите город --</option>
, теперь нет, так как появилась проверка на нулевое значение и оно теперь выводится.
#11 4 мая 2016 в 20:25

а попробовать?)

Zau4man
Я же во втором своём посте написал что не было возможности попробовать… ))

Немного подебажил вывод записей. parse($value) отрабатывает только при выводе самой записи, а не списка, следовательно

Что нужно прописать в parse.

Zau4man
править надо вывод шаблона.

Как вариант предлагаю такое решение:
в файле ..\templates\default\content\default_list.tpl.php
после строки 47 <?php if (empty($item[$field['name']])) { continue; } ?> добавить проверку:
  1. <?php if ($field['type']=='city' && $item[$field['name']]=='-1') { continue; } ?>
UPD. При рендере списка записей отрабатывает функция parseTeaser($value)!
Поэтому можно добавить её в поле city:
  1. public function parseTeaser($value) {
  2. return false;
  3. }
Понятно, что в $value находится текущее значение поля, в вашем случае '-1' по проверку которого можно возвращать false или true))
#12 4 мая 2016 в 20:58
Val, а попробовать?)

Добавляем в тип поля

  1. public function parseTeaser($value){
  2. if($value == '-1') return FALSE;
  3. }
И получаем знакомую картину

#13 4 мая 2016 в 22:02
Посыпаю голову пеплом😊вариант с parseTeaser() я не проверял — понадеялся что он будет вести себя аналогично с parse() для записи.
Воспроизвел поле-список с набором полей, как вы описали.
Работает вариант с правкой шаблона:
  1. <?php if ($field['type']=='list' && $item[$field['name']]=='-1') { continue; } ?>
parseTeaser() вызывается из шаблона здесь (88 строка):
  1. <?php echo $field['handler']->setItem($item)->parseTeaser($item[$field['name']]); ?>
т.е. уже после вывода заголовка поля и всех проверок. Выводится только содержимое поля =(
Можно, конечно извратиться и выводить js-скрипт удаляющий заголовок, но как-то это не комильфо...

Можно сделать такой "финт ушами":
В настройках поля устанавливаем не выводить заголовок в списке. А в parseTeaser() уже либо return false где $value == '-1', а в остальных местах ретурним html: <div class="title_left">Город: </div> и само значение
  1. public function parseTeaser($value){
  2.  
  3. if ($value == '-1') {
  4. return false;
  5. }
  6.  
  7. $items = $this->getListItems();
  8. $item = '';
  9.  
  10. if (isset($items[$value])) { $item = $items[$value]; }
  11.  
  12. return '</div><div class="title_left">Город: </div><div class="value">'.htmlspecialchars($item);
  13.  
  14. }
#14 5 мая 2016 в 12:43

Работает вариант с правкой шаблона:

Val
я так и поступил еще вчера утром. Хотел найти более изящное решение. Но тоже, пройдя по пути от поля шаблона, понял что никак...
Придумать бы что-то для решения этой задачи и закоммитить, но ума не приложу, что бы это могло быть.
#15 5 мая 2016 в 20:05

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

Zau4man
Как вариант (..\templates\default\content\default_list.tpl.php):
  1. ...
  2. <?php foreach($fields as $field){ ?>
  3.  
  4. <?php if ($stop === 2) { break; } ?>
  5. <?php if (empty($item[$field['name']])) { continue; } ?>
  6.  
  7. <!-- вставка -->
  8. <?php $field_content = $field['handler']->setItem($item)->parseTeaser($item[$field['name']]); ?>
  9. <?php if (empty($field_content) && $field_content !== '0') { continue; } ?>
  10.  
  11. <!-- стандартный код -->
  12.  
  13. <?php } else { ?>
  14.  
  15. <?php if ($is_private) { $stop++; ?>
  16. <!--noindex--><div class="private_field_hint"><?php echo LANG_PRIVACY_PRIVATE_HINT; ?></div><!--/noindex-->
  17. <?php } else { ?>
  18. <!-- выводим контент поля полученный ранее -->
  19. <?php echo $field_content; ?>
  20. <?php } ?>
  21.  
  22. <?php } ?>
  23. ...
т.е. получаем контент поля в начале цикла перебора всех полей записи, и если вернулся false переходим к следующему полю.
Теперь в parseTeaser(); будет работать return false; как мы этого хотели ранее =)
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.