【问题标题】:custom PHP in MODX with a snippet在 MODX 中使用代码段自定义 PHP
【发布时间】:2013-08-29 06:46:36
【问题描述】:

好的,所以我用 PHP 制作了一个计算器,并试图通过 sn-p 将它移植到 MODX。我尝试将所有这些代码放入 sn-p 中,但它不起作用。它一直给我一条错误消息,我无法查看 sn-p 所在的资源。有没有人有任何想法?谢谢。

<?php
function selected( $val = "")
{
$units = isset( $_POST['units'] ) ? $_POST['units'] : null;
echo ( $units == $val ) ? "CHECKED='CHECKED'" : "";
}
$units = isset( $_POST['units'] ) ? $_POST['units'] : null;
$dia = isset( $_POST['dia'] ) ? $_POST['dia'] : null;
$depth = isset( $_POST['depth'] ) ? $_POST['depth'] : null;
$L = isset( $_POST['L'] ) ? $_POST['L'] : null;
$num = isset($_POST['num']) ? $_POST['num'] : null;
$waste = isset($_POST['waste']) ? $_POST['waste'] : null;
$knownvolume = isset($_POST['knownvolume']) ? $_POST['knownvolume'] : null;
$hw = isset($_POST['hw']) ? $_POST['hw'] : null;
//$denom = ( ( $units == "US" ) ? 12 : 100 );
$tubecoverage = ( ( $units == "US" ) ? 18.59 : 304.65);
$onegalcoverage = ( ( $units == "US" ) ? 231 : 3785.41);
$twogalcoverage = ( ( $units == "US" ) ? 462 : 7470.82);
$fivegalcoverage = ( ( $units == "US" ) ? 1155 : 18927.06);

$measurements = 'in or cm';
    if( $units == 'US' ){
    $measurements = 'in';
}
    if($units == 'Metric')
{
    $measurements = 'cm';
}

if($units == 'US')
    $length = 'feet';
    else if($units == 'Metric')
    $length = 'meters';
    else 
    $length = 'feet or meters';

$tubes = ($tubes);
    if($knownvolume == TRUE)
    $tubes = (($knownvolume / $tubecoverage) * ($waste + 1) * 1.05);
    else 
    $tubes = (((($dia / 2) * ($dia / 2) * pi()) / $tubecoverage) * ($waste + 1) * 1.05);

$onegal = ($tubes);
    if($knownvolume == TRUE)
    $onegal = (($knownvolume / $onegalcoverage) * ($waste + 1) * 1.05);
    else 
    $onegal = (((($dia / 2) * ($dia / 2) * pi()) / $onegalcoverage) * ($waste + 1) *     1.05);

$twogal = ($tubes);
    if($knownvolume == TRUE)
    $twogal = (($knownvolume / $twogalcoverage) * ($waste + 1) * 1.05);
    else 
    $twogal = (((($dia / 2) * ($dia / 2) * pi()) / $twogalcoverage) * ($waste + 1) * 1.05);

$fivegal = ($tubes);
    if($knownvolume == TRUE)
    $fivegal = (($knownvolume / $fivegalcoverage) * ($waste + 1) * 1.05);
    else 
$fivegal = (((($dia / 2) * ($dia / 2) * pi()) / $fivegalcoverage) * ($waste + 1) * 1.05);

?>
<form method='post' action=''>
<table border='0' width='500px' cellpadding='2' cellspacing='1' class="calculator">
<tr class="calcheading"><td><label><input type="radio" name="units" 
<?php  selected("US")?> value="US" />S.A.E.</label>
<label><input type="radio" name="units" <?php selected("Metric")?> value="Metric"   />Metric</label> </td></tr>

<tr class="calcheading"><td colspan="2"><strong>Cicular Volume Area</strong></td></tr>

<tr class="calcrow"><td>Known Volume (<?php echo $measurements ?>):</td><td align="center"><input type='text' name='knownvolume' value="<?php echo $knownvolume ?>"/>     </td></tr>

<tr class="calcrow2"><td>Dia (<?php echo $measurements ?>):</td><td align="center"><input type='text' name='dia' value="<?php echo $dia ?>"/></td></tr>

<tr class="calcrow"><td>Length (<?php echo $measurements ?>):</td><td align="center"><input type='text' name='L' value="<?php echo $L ?>"/></td></tr>

<tr class="calcrow"><td>Waste Variance % (Please add in decimal form):</td><td     align="center"><input type='text' name='waste' value="<?php echo $waste ?>"/></td></tr>

<tr class="submit"><td colspan="2"><input type='submit' value='Calculate'/></td></tr>

<tr class="calcrow">
<td><i>10.3 oz Tube(s) (CS-1500):</td>
<td align="center"><input type="text" value="<?php echo round($tubes, 2)?>"/></td></i>
</tr>
<tr class="calcrow">
<td><i>1 Gallon Bucket(s) (CS-1000):</td>
<td align="center"><input type="text" value="<?php echo round($onegal, 2)?>"/></td></i>
</tr>
<tr class="calcrow">
<td><i>2 Gallon Bucket(s) (CS-1800):</td>
<td align="center"><input type="text" value="<?php echo round($twogal, 2)?>"/></td></i>
</tr>
<tr class="calcrow">
<td><i>5 Gallon Bucket(s) (CS-1000/CS-1500):</td>
<td align="center"><input type="text" value="<?php echo round($fivegal, 2)?>"/></td></i>
</tr>
</table>
</form>          

【问题讨论】:

  • 当我在 MODX 之外测试它时它可以正常工作

标签: php code-snippets modx


【解决方案1】:

这不会像你期望的那样工作。

Modx 中的代码片段是纯 php,所以不能使用多个 &lt;?php?&gt; 来分隔代码。此外,由于 sn-ps 的缓存方式,您必须将每个函数包装在 if (!function_exists('nameoffunction') 中。

这里我重写了一些代码。这个想法是将您在 html 中需要的所有信息都放在一个数组中。我称之为$parse_arr。在脚本的底部,我使用 Modx 的方法将块中的所有占位符替换为数组中的值。

<?php
$parse_arr = array();


if (!function_exists('selected')) {
    function selected( $val = "") {
        $units = isset( $_POST['units'] ) ? $_POST['units'] : null;
        return ( $units == $val ) ? "CHECKED='CHECKED'" : "";
    }
}

$units = isset( $_POST['units'] ) ? $_POST['units'] : null;
$dia = isset( $_POST['dia'] ) ? $_POST['dia'] : null;
$depth = isset( $_POST['depth'] ) ? $_POST['depth'] : null;
$L = isset( $_POST['L'] ) ? $_POST['L'] : null;
$num = isset($_POST['num']) ? $_POST['num'] : null;
$waste = isset($_POST['waste']) ? $_POST['waste'] : null;
$knownvolume = isset($_POST['knownvolume']) ? $_POST['knownvolume'] : null;
$hw = isset($_POST['hw']) ? $_POST['hw'] : null;
//$denom = ( ( $units == "US" ) ? 12 : 100 );
$tubecoverage = ( ( $units == "US" ) ? 18.59 : 304.65);
$onegalcoverage = ( ( $units == "US" ) ? 231 : 3785.41);
$twogalcoverage = ( ( $units == "US" ) ? 462 : 7470.82);
$fivegalcoverage = ( ( $units == "US" ) ? 1155 : 18927.06);

$measurements = 'in or cm';
    if( $units == 'US' ){
    $measurements = 'in';
}
    if($units == 'Metric')
{
    $measurements = 'cm';
}

if($units == 'US')
    $length = 'feet';
    else if($units == 'Metric')
    $length = 'meters';
    else 
    $length = 'feet or meters';

$tubes = ($tubes);
    if($knownvolume == TRUE)
    $tubes = (($knownvolume / $tubecoverage) * ($waste + 1) * 1.05);
    else 
    $tubes = (((($dia / 2) * ($dia / 2) * pi()) / $tubecoverage) * ($waste + 1) * 1.05);

$onegal = ($tubes);
    if($knownvolume == TRUE)
    $onegal = (($knownvolume / $onegalcoverage) * ($waste + 1) * 1.05);
    else 
    $onegal = (((($dia / 2) * ($dia / 2) * pi()) / $onegalcoverage) * ($waste + 1) *     1.05);

$twogal = ($tubes);
    if($knownvolume == TRUE)
    $twogal = (($knownvolume / $twogalcoverage) * ($waste + 1) * 1.05);
    else 
    $twogal = (((($dia / 2) * ($dia / 2) * pi()) / $twogalcoverage) * ($waste + 1) * 1.05);

$fivegal = ($tubes);
    if($knownvolume == TRUE)
    $fivegal = (($knownvolume / $fivegalcoverage) * ($waste + 1) * 1.05);
    else 
$fivegal = (((($dia / 2) * ($dia / 2) * pi()) / $fivegalcoverage) * ($waste + 1) * 1.05);


$parse_arr['selected_us'] = selected("US");
$parse_arr['selected_metric'] = selected("Metric");
$parse_arr['measurements'] = $measurements;

$parse_arr['knownvolume'] = $knownvolume;
$parse_arr['dia'] = $dia;

// And so on

return $modx->getChunk('name-of-chunk', $parse_arr, '[[+', ']]');

这是 html 的一部分。将其保存为一个块。该名称必须与 sn-p 底部的块名称相同。 (在这种情况下,我在示例中将其命名为 name-of-chunk)。

<form method='post' action=''>
<table border='0' width='500px' cellpadding='2' cellspacing='1' class="calculator">
<tr class="calcheading"><td><label><input type="radio" name="units" [[+selected_us]] value="US" />S.A.E.</label>
<label><input type="radio" name="units" [[+selected_metric]] value="Metric"   />Metric</label> </td></tr>

<tr class="calcheading"><td colspan="2"><strong>Cicular Volume Area</strong></td></tr>

<tr class="calcrow"><td>Known Volume [[+measurements]]</td><td align="center"><input type='text' name='knownvolume' value="[[+knownvolume]]"/>     </td></tr>

<tr class="calcrow2"><td>Dia [[+measurements]]</td><td align="center"><input type='text' name='dia' value="[[+dia]]"/></td></tr>

你明白了。您可以使用占位符 [[+name-that-correspond-with-parse-arr-key]],而不是 &lt;?php echo SOMETHING; ?&gt;

你还必须为你在这个块底部附近调用的舍入函数编写一个 sn-p。

玩得开心。

【讨论】:

  • 哦,谢谢,我很感激,你让我朝着正确的方向前进
  • 我假设返回的 $parse_arr 看起来像 '[['+dia','+knownvolume','+depth']]' 对吗?
  • 嘿,仅供参考,我想出了如何在不创建额外 sn-p 的情况下将所有数字四舍五入。我只是用 ceil() 调用包装了整个方程。我的客户希望将任何小数四舍五入到下一个整数,所以没什么大不了的。
【解决方案2】:

多年后,它仍然有帮助

if(!function_exists('process_the_files')) {
  function process_the_files() {

global $modx;

需要在里面

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-13
    相关资源
    最近更新 更多